Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5c7b84ff0e | |||
| a4ff9aa45c | |||
| 1777e9b556 | |||
| 59e57d6171 | |||
| 9b17f91c9a | |||
| 9854ce7c31 | |||
| e28dfbe0bc | |||
| e0e00bd93d | |||
| 9df6b9d1a5 | |||
| e2dfc4dd00 | |||
| 80f48152de | |||
| 57ae4fd4fb | |||
| be9a2b120b | |||
| 6c190ec308 | |||
| e326e6c8f3 | |||
| 46401701a0 | |||
| 2f2e7c3556 | |||
| fedd983649 | |||
| 3b2833c752 | |||
| f1dee53dc4 |
@@ -7,8 +7,7 @@
|
||||
"roots": ["<rootDir>/server", "<rootDir>/plugins"],
|
||||
"moduleNameMapper": {
|
||||
"^@server/(.*)$": "<rootDir>/server/$1",
|
||||
"^@shared/(.*)$": "<rootDir>/shared/$1",
|
||||
"react-medium-image-zoom": "<rootDir>/__mocks__/react-medium-image-zoom.js"
|
||||
"^@shared/(.*)$": "<rootDir>/shared/$1"
|
||||
},
|
||||
"setupFiles": ["<rootDir>/__mocks__/console.js"],
|
||||
"setupFilesAfterEnv": ["<rootDir>/server/test/setup.ts"],
|
||||
@@ -22,8 +21,7 @@
|
||||
"^~/(.*)$": "<rootDir>/app/$1",
|
||||
"^@shared/(.*)$": "<rootDir>/shared/$1",
|
||||
"^.*[.](gif|ttf|eot|svg)$": "<rootDir>/__test__/fileMock.js",
|
||||
"^uuid$": "<rootDir>/node_modules/uuid/dist/index.js",
|
||||
"react-medium-image-zoom": "<rootDir>/__mocks__/react-medium-image-zoom.js"
|
||||
"^uuid$": "<rootDir>/node_modules/uuid/dist/index.js"
|
||||
},
|
||||
"modulePaths": ["<rootDir>/app"],
|
||||
"setupFiles": ["<rootDir>/__mocks__/window.js"],
|
||||
@@ -38,8 +36,7 @@
|
||||
"roots": ["<rootDir>/shared"],
|
||||
"moduleNameMapper": {
|
||||
"^@server/(.*)$": "<rootDir>/server/$1",
|
||||
"^@shared/(.*)$": "<rootDir>/shared/$1",
|
||||
"react-medium-image-zoom": "<rootDir>/__mocks__/react-medium-image-zoom.js"
|
||||
"^@shared/(.*)$": "<rootDir>/shared/$1"
|
||||
},
|
||||
"setupFiles": ["<rootDir>/__mocks__/console.js"],
|
||||
"setupFilesAfterEnv": ["<rootDir>/shared/test/setup.ts"],
|
||||
@@ -52,8 +49,7 @@
|
||||
"^~/(.*)$": "<rootDir>/app/$1",
|
||||
"^@shared/(.*)$": "<rootDir>/shared/$1",
|
||||
"^.*[.](gif|ttf|eot|svg)$": "<rootDir>/__test__/fileMock.js",
|
||||
"^uuid$": "<rootDir>/node_modules/uuid/dist/index.js",
|
||||
"react-medium-image-zoom": "<rootDir>/__mocks__/react-medium-image-zoom.js"
|
||||
"^uuid$": "<rootDir>/node_modules/uuid/dist/index.js"
|
||||
},
|
||||
"setupFiles": ["<rootDir>/__mocks__/window.js"],
|
||||
"testEnvironment": "jsdom",
|
||||
|
||||
@@ -3,7 +3,7 @@ Business Source License 1.1
|
||||
Parameters
|
||||
|
||||
Licensor: General Outline, Inc.
|
||||
Licensed Work: Outline 0.87.1
|
||||
Licensed Work: Outline 0.87.3
|
||||
The Licensed Work is (c) 2025 General Outline, Inc.
|
||||
Additional Use Grant: You may make use of the Licensed Work, provided that
|
||||
you may not use the Licensed Work for a Document
|
||||
@@ -15,7 +15,7 @@ Additional Use Grant: You may make use of the Licensed Work, provided that
|
||||
Licensed Work by creating teams and documents
|
||||
controlled by such third parties.
|
||||
|
||||
Change Date: 2029-08-31
|
||||
Change Date: 2029-09-01
|
||||
|
||||
Change License: Apache License, Version 2.0
|
||||
|
||||
|
||||
@@ -0,0 +1,840 @@
|
||||
import { useEditor } from "~/editor/components/EditorContext";
|
||||
import { observer } from "mobx-react";
|
||||
import * as Dialog from "@radix-ui/react-dialog";
|
||||
import { findChildren } from "@shared/editor/queries/findChildren";
|
||||
import findIndex from "lodash/findIndex";
|
||||
import styled, { css, Keyframes, keyframes } from "styled-components";
|
||||
import { forwardRef, useEffect, useMemo, useRef, useState } from "react";
|
||||
import { sanitizeUrl } from "@shared/utils/urls";
|
||||
import { Error } from "@shared/editor/components/Image";
|
||||
import {
|
||||
BackIcon,
|
||||
CloseIcon,
|
||||
CrossIcon,
|
||||
DownloadIcon,
|
||||
NextIcon,
|
||||
} from "outline-icons";
|
||||
import { depths, extraArea, s } from "@shared/styles";
|
||||
import NudeButton from "./NudeButton";
|
||||
import useIdle from "~/hooks/useIdle";
|
||||
import { Second } from "@shared/utils/time";
|
||||
import { downloadImageNode } from "@shared/editor/nodes/Image";
|
||||
import * as VisuallyHidden from "@radix-ui/react-visually-hidden";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import Tooltip from "~/components/Tooltip";
|
||||
import LoadingIndicator from "./LoadingIndicator";
|
||||
import Fade from "./Fade";
|
||||
import Button from "./Button";
|
||||
|
||||
export enum LightboxStatus {
|
||||
READY_TO_OPEN,
|
||||
OPENING,
|
||||
OPENED,
|
||||
READY_TO_CLOSE,
|
||||
CLOSING,
|
||||
CLOSED,
|
||||
}
|
||||
|
||||
export enum ImageStatus {
|
||||
LOADING,
|
||||
ERROR,
|
||||
LOADED,
|
||||
}
|
||||
type Status = {
|
||||
lightbox: LightboxStatus | null;
|
||||
image: ImageStatus | null;
|
||||
};
|
||||
|
||||
type Animation = {
|
||||
fadeIn?: { apply: () => Keyframes; duration: number };
|
||||
fadeOut?: { apply: () => Keyframes; duration: number };
|
||||
zoomIn?: { apply: () => Keyframes; duration: number };
|
||||
zoomOut?: { apply: () => Keyframes; duration: number };
|
||||
startTime?: number;
|
||||
};
|
||||
|
||||
const ANIMATION_DURATION = 0.3 * Second.ms;
|
||||
|
||||
type Props = {
|
||||
/** Callback triggered when the active image position is updated */
|
||||
onUpdate: (pos: number | null) => void;
|
||||
/** The position of the currently active image in the document */
|
||||
activePos: number | null;
|
||||
};
|
||||
|
||||
function Lightbox({ onUpdate, activePos }: Props) {
|
||||
const { view } = useEditor();
|
||||
const isIdle = useIdle(3 * Second.ms);
|
||||
const { t } = useTranslation();
|
||||
const imgRef = useRef<HTMLImageElement | null>(null);
|
||||
const overlayRef = useRef<HTMLDivElement | null>(null);
|
||||
const [status, setStatus] = useState<Status>({ lightbox: null, image: null });
|
||||
const [imageElements] = useState(
|
||||
view?.dom.querySelectorAll(".component-image img")
|
||||
);
|
||||
const animation = useRef<Animation | null>(null);
|
||||
const finalImage = useRef<{
|
||||
center: { x: number; y: number };
|
||||
width: number;
|
||||
height: number;
|
||||
} | null>(null);
|
||||
|
||||
const imageNodes = useMemo(
|
||||
() =>
|
||||
view
|
||||
? findChildren(
|
||||
view.state.doc,
|
||||
(child) => child.type === view.state.schema.nodes.image,
|
||||
true
|
||||
)
|
||||
: [],
|
||||
[view]
|
||||
);
|
||||
const currentImageIndex = findIndex(
|
||||
imageNodes,
|
||||
(node) => node.pos === activePos
|
||||
);
|
||||
const currentImageNode =
|
||||
currentImageIndex >= 0 ? imageNodes[currentImageIndex].node : undefined;
|
||||
|
||||
// Debugging status changes
|
||||
// useEffect(() => {
|
||||
// console.log(
|
||||
// `lstat:${status.lightbox === null ? status.lightbox : LightboxStatus[status.lightbox]}, istat:${status.image === null ? status.image : ImageStatus[status.image]}`
|
||||
// );
|
||||
// }, [status]);
|
||||
|
||||
useEffect(() => () => view.focus(), []);
|
||||
|
||||
useEffect(() => {
|
||||
!!activePos &&
|
||||
setStatus({
|
||||
lightbox: LightboxStatus.READY_TO_OPEN,
|
||||
image: status.image,
|
||||
});
|
||||
}, [!!activePos]);
|
||||
|
||||
useEffect(() => {
|
||||
if (status.image === ImageStatus.LOADED) {
|
||||
rememberImagePosition();
|
||||
}
|
||||
}, [status.image]);
|
||||
|
||||
useEffect(() => {
|
||||
if (
|
||||
(status.image === ImageStatus.ERROR ||
|
||||
status.image === ImageStatus.LOADED) &&
|
||||
status.lightbox === LightboxStatus.READY_TO_OPEN
|
||||
) {
|
||||
setupFadeIn();
|
||||
setupZoomIn();
|
||||
setStatus({
|
||||
lightbox: LightboxStatus.OPENING,
|
||||
image: status.image,
|
||||
});
|
||||
}
|
||||
}, [status.image, status.lightbox]);
|
||||
|
||||
useEffect(() => {
|
||||
if (status.lightbox === LightboxStatus.READY_TO_CLOSE) {
|
||||
setupFadeOut();
|
||||
setupZoomOut();
|
||||
setStatus({
|
||||
lightbox: LightboxStatus.CLOSING,
|
||||
image: status.image,
|
||||
});
|
||||
}
|
||||
}, [status.lightbox]);
|
||||
|
||||
useEffect(() => {
|
||||
if (status.lightbox === LightboxStatus.CLOSED) {
|
||||
onUpdate(null);
|
||||
}
|
||||
}, [status.lightbox]);
|
||||
|
||||
const rememberImagePosition = () => {
|
||||
if (imgRef.current) {
|
||||
const lightboxImgDOMRect = imgRef.current.getBoundingClientRect();
|
||||
const {
|
||||
top: lightboxImgTop,
|
||||
left: lightboxImgLeft,
|
||||
width: lightboxImgWidth,
|
||||
height: lightboxImgHeight,
|
||||
} = lightboxImgDOMRect;
|
||||
finalImage.current = {
|
||||
center: {
|
||||
x: lightboxImgLeft + lightboxImgWidth / 2,
|
||||
y: lightboxImgTop + lightboxImgHeight / 2,
|
||||
},
|
||||
width: lightboxImgWidth,
|
||||
height: lightboxImgHeight,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const setupZoomIn = () => {
|
||||
if (imgRef.current) {
|
||||
// in editor
|
||||
const editorImageEl = imageElements[currentImageIndex];
|
||||
if (!editorImageEl) {
|
||||
return;
|
||||
}
|
||||
|
||||
const editorImgDOMRect = editorImageEl.getBoundingClientRect();
|
||||
const {
|
||||
top: editorImgTop,
|
||||
left: editorImgLeft,
|
||||
width: editorImgWidth,
|
||||
height: editorImgHeight,
|
||||
} = editorImgDOMRect;
|
||||
|
||||
const from = {
|
||||
center: {
|
||||
x: editorImgLeft + editorImgWidth / 2,
|
||||
y: editorImgTop + editorImgHeight / 2,
|
||||
},
|
||||
width: editorImgWidth,
|
||||
height: editorImgHeight,
|
||||
};
|
||||
|
||||
// in lightbox
|
||||
const lightboxImgDOMRect = imgRef.current.getBoundingClientRect();
|
||||
const {
|
||||
top: lightboxImgTop,
|
||||
left: lightboxImgLeft,
|
||||
width: lightboxImgWidth,
|
||||
height: lightboxImgHeight,
|
||||
} = lightboxImgDOMRect;
|
||||
const to = {
|
||||
center: {
|
||||
x: lightboxImgLeft + lightboxImgWidth / 2,
|
||||
y: lightboxImgTop + lightboxImgHeight / 2,
|
||||
},
|
||||
width: lightboxImgWidth,
|
||||
height: lightboxImgHeight,
|
||||
};
|
||||
|
||||
const zoomIn = () => {
|
||||
const tx = from.center.x - to.center.x;
|
||||
const ty = from.center.y - to.center.y;
|
||||
return keyframes`
|
||||
from {
|
||||
translate: ${tx}px ${ty}px;
|
||||
scale: ${from.width / to.width};
|
||||
}
|
||||
to {
|
||||
translate: 0;
|
||||
scale: 1;
|
||||
}
|
||||
`;
|
||||
};
|
||||
animation.current = {
|
||||
...(animation.current ?? {}),
|
||||
zoomOut: undefined,
|
||||
zoomIn: { apply: zoomIn, duration: ANIMATION_DURATION },
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const setupFadeIn = () => {
|
||||
const fadeIn = () => keyframes`
|
||||
from { opacity: 0; }
|
||||
to { opacity: 1; }
|
||||
`;
|
||||
animation.current = {
|
||||
...(animation.current ?? {}),
|
||||
fadeIn: { apply: fadeIn, duration: ANIMATION_DURATION },
|
||||
fadeOut: undefined,
|
||||
};
|
||||
};
|
||||
|
||||
const setupFadeOut = () => {
|
||||
const fadeOut = () => keyframes`
|
||||
from { opacity: ${overlayRef.current ? window.getComputedStyle(overlayRef.current).opacity : 1}; }
|
||||
to { opacity: 0; }
|
||||
`;
|
||||
animation.current = {
|
||||
...(animation.current ?? {}),
|
||||
fadeIn: undefined,
|
||||
fadeOut: {
|
||||
apply: fadeOut,
|
||||
duration: animation.current?.startTime
|
||||
? Date.now() - animation.current.startTime
|
||||
: ANIMATION_DURATION,
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
const setupZoomOut = () => {
|
||||
if (imgRef.current) {
|
||||
// in lightbox
|
||||
const lightboxImgDOMRect = imgRef.current.getBoundingClientRect();
|
||||
const {
|
||||
top: lightboxImgTop,
|
||||
left: lightboxImgLeft,
|
||||
width: lightboxImgWidth,
|
||||
height: lightboxImgHeight,
|
||||
} = lightboxImgDOMRect;
|
||||
const from = {
|
||||
center: {
|
||||
x: lightboxImgLeft + lightboxImgWidth / 2,
|
||||
y: lightboxImgTop + lightboxImgHeight / 2,
|
||||
},
|
||||
width: lightboxImgWidth,
|
||||
height: lightboxImgHeight,
|
||||
};
|
||||
|
||||
// in editor
|
||||
const editorImageEl = imageElements[currentImageIndex];
|
||||
let to;
|
||||
if (editorImageEl) {
|
||||
const editorImgDOMRect = editorImageEl.getBoundingClientRect();
|
||||
const {
|
||||
top: editorImgTop,
|
||||
left: editorImgLeft,
|
||||
width: editorImgWidth,
|
||||
height: editorImgHeight,
|
||||
} = editorImgDOMRect;
|
||||
|
||||
to = {
|
||||
center: {
|
||||
x: editorImgLeft + editorImgWidth / 2,
|
||||
y:
|
||||
editorImgTop + editorImgHeight / 2 >
|
||||
window.innerHeight + editorImgHeight / 2
|
||||
? window.innerHeight + editorImgHeight / 2
|
||||
: editorImgTop + editorImgHeight / 2 < -editorImgHeight / 2
|
||||
? -editorImgHeight / 2
|
||||
: editorImgTop + editorImgHeight / 2,
|
||||
},
|
||||
width: editorImgWidth,
|
||||
height: editorImgHeight,
|
||||
};
|
||||
} else {
|
||||
to = {
|
||||
center: {
|
||||
x: from.center.x,
|
||||
y: window.innerHeight + lightboxImgHeight / 2,
|
||||
},
|
||||
width: lightboxImgWidth,
|
||||
height: lightboxImgHeight,
|
||||
};
|
||||
}
|
||||
|
||||
const zoomOut = () => {
|
||||
const final = finalImage.current;
|
||||
if (!final) {
|
||||
return keyframes``;
|
||||
}
|
||||
|
||||
const fromTx = from.center.x - final.center.x;
|
||||
const fromTy = from.center.y - final.center.y;
|
||||
const toTx = to.center.x - final.center.x;
|
||||
const toTy = to.center.y - final.center.y;
|
||||
|
||||
const fromSx = from.width / final.width;
|
||||
const fromSy = from.height / final.height;
|
||||
const toSx = to.width / final.width;
|
||||
const toSy = to.height / final.height;
|
||||
return keyframes`
|
||||
from {
|
||||
translate: ${fromTx}px ${fromTy}px;
|
||||
scale: ${fromSx} ${fromSy};
|
||||
}
|
||||
to {
|
||||
translate: ${toTx}px ${toTy}px;
|
||||
scale: ${toSx} ${toSy};
|
||||
}
|
||||
`;
|
||||
};
|
||||
animation.current = {
|
||||
...(animation.current ?? {}),
|
||||
zoomIn: undefined,
|
||||
zoomOut: {
|
||||
apply: zoomOut,
|
||||
duration: animation.current?.startTime
|
||||
? Date.now() - animation.current.startTime
|
||||
: ANIMATION_DURATION,
|
||||
},
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
if (!activePos) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const prev = () => {
|
||||
if (status.lightbox === LightboxStatus.OPENED) {
|
||||
if (!activePos) {
|
||||
return;
|
||||
}
|
||||
const prevIndex = currentImageIndex - 1;
|
||||
if (prevIndex < 0) {
|
||||
return;
|
||||
}
|
||||
onUpdate(imageNodes[prevIndex].pos);
|
||||
}
|
||||
};
|
||||
|
||||
const next = () => {
|
||||
if (status.lightbox === LightboxStatus.OPENED) {
|
||||
if (!activePos) {
|
||||
return;
|
||||
}
|
||||
const nextIndex = currentImageIndex + 1;
|
||||
if (nextIndex >= imageNodes.length) {
|
||||
return;
|
||||
}
|
||||
onUpdate(imageNodes[nextIndex].pos);
|
||||
}
|
||||
};
|
||||
|
||||
const close = () => {
|
||||
if (
|
||||
status.lightbox === LightboxStatus.OPENING ||
|
||||
status.lightbox === LightboxStatus.OPENED
|
||||
) {
|
||||
setStatus({
|
||||
lightbox: LightboxStatus.READY_TO_CLOSE,
|
||||
image: status.image,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const download = () => {
|
||||
if (currentImageNode && status.lightbox === LightboxStatus.OPENED) {
|
||||
void downloadImageNode(currentImageNode);
|
||||
}
|
||||
};
|
||||
|
||||
const handleKeyDown = (ev: React.KeyboardEvent<HTMLDivElement>) => {
|
||||
ev.preventDefault();
|
||||
switch (ev.key) {
|
||||
case "ArrowLeft": {
|
||||
prev();
|
||||
break;
|
||||
}
|
||||
case "ArrowRight": {
|
||||
next();
|
||||
break;
|
||||
}
|
||||
case "Escape": {
|
||||
close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const handleFadeStart = () => {
|
||||
if (animation.current?.fadeIn) {
|
||||
animation.current = {
|
||||
...(animation.current ?? {}),
|
||||
startTime: Date.now(),
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const handleFadeEnd = () => {
|
||||
if (animation.current?.fadeIn) {
|
||||
animation.current = {
|
||||
...(animation.current ?? {}),
|
||||
startTime: undefined,
|
||||
};
|
||||
setStatus({
|
||||
lightbox: LightboxStatus.OPENED,
|
||||
image: status.image,
|
||||
});
|
||||
} else if (animation.current?.fadeOut) {
|
||||
setStatus({
|
||||
lightbox: LightboxStatus.CLOSED,
|
||||
image: null,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
if (!currentImageNode) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Dialog.Root open={!!activePos}>
|
||||
<Dialog.Portal>
|
||||
<StyledOverlay
|
||||
ref={overlayRef}
|
||||
animation={animation.current}
|
||||
onAnimationStart={handleFadeStart}
|
||||
onAnimationEnd={handleFadeEnd}
|
||||
/>
|
||||
<StyledContent onKeyDown={handleKeyDown}>
|
||||
<VisuallyHidden.Root>
|
||||
<Dialog.Title>{t("Lightbox")}</Dialog.Title>
|
||||
<Dialog.Description>
|
||||
{t("View, navigate, or download images in the document")}
|
||||
</Dialog.Description>
|
||||
</VisuallyHidden.Root>
|
||||
<Actions animation={animation.current}>
|
||||
<Tooltip content={t("Download")} placement="bottom">
|
||||
<Button
|
||||
tabIndex={-1}
|
||||
onClick={download}
|
||||
aria-label={t("Download")}
|
||||
size={32}
|
||||
icon={<DownloadIcon />}
|
||||
borderOnHover
|
||||
neutral
|
||||
/>
|
||||
</Tooltip>
|
||||
<Dialog.Close asChild>
|
||||
<Tooltip content={t("Close")} shortcut="Esc" placement="bottom">
|
||||
<Button
|
||||
tabIndex={-1}
|
||||
onClick={close}
|
||||
aria-label={t("Close")}
|
||||
size={32}
|
||||
icon={<CloseIcon />}
|
||||
borderOnHover
|
||||
neutral
|
||||
/>
|
||||
</Tooltip>
|
||||
</Dialog.Close>
|
||||
</Actions>
|
||||
{currentImageIndex > 0 && (
|
||||
<Nav dir="left" $hidden={isIdle} animation={animation.current}>
|
||||
<NavButton onClick={prev} size={32} aria-label={t("Previous")}>
|
||||
<BackIcon size={32} />
|
||||
</NavButton>
|
||||
</Nav>
|
||||
)}
|
||||
<Image
|
||||
ref={imgRef}
|
||||
src={sanitizeUrl(currentImageNode.attrs.src) ?? ""}
|
||||
alt={currentImageNode.attrs.alt ?? ""}
|
||||
onLoading={() =>
|
||||
setStatus({
|
||||
lightbox: status.lightbox,
|
||||
image: ImageStatus.LOADING,
|
||||
})
|
||||
}
|
||||
onLoad={() =>
|
||||
setStatus({
|
||||
lightbox: status.lightbox,
|
||||
image: ImageStatus.LOADED,
|
||||
})
|
||||
}
|
||||
onError={() =>
|
||||
setStatus({
|
||||
lightbox: status.lightbox,
|
||||
image: ImageStatus.ERROR,
|
||||
})
|
||||
}
|
||||
onSwipeRight={prev}
|
||||
onSwipeLeft={next}
|
||||
onSwipeUpOrDown={close}
|
||||
status={status}
|
||||
animation={animation.current}
|
||||
/>
|
||||
{currentImageIndex < imageNodes.length - 1 && (
|
||||
<Nav dir="right" $hidden={isIdle} animation={animation.current}>
|
||||
<NavButton onClick={next} size={32} aria-label={t("Next")}>
|
||||
<NextIcon size={32} />
|
||||
</NavButton>
|
||||
</Nav>
|
||||
)}
|
||||
</StyledContent>
|
||||
</Dialog.Portal>
|
||||
</Dialog.Root>
|
||||
);
|
||||
}
|
||||
|
||||
type ImageProps = {
|
||||
src: string;
|
||||
alt: string;
|
||||
onLoading: () => void;
|
||||
onLoad: () => void;
|
||||
onError: () => void;
|
||||
onSwipeRight: () => void;
|
||||
onSwipeLeft: () => void;
|
||||
onSwipeUpOrDown: () => void;
|
||||
status: Status;
|
||||
animation: Animation | null;
|
||||
};
|
||||
|
||||
const Image = forwardRef<HTMLImageElement, ImageProps>(function _Image(
|
||||
{
|
||||
src,
|
||||
alt,
|
||||
onLoading,
|
||||
onLoad,
|
||||
onError,
|
||||
onSwipeRight,
|
||||
onSwipeLeft,
|
||||
onSwipeUpOrDown,
|
||||
status,
|
||||
animation,
|
||||
}: ImageProps,
|
||||
ref
|
||||
) {
|
||||
const { t } = useTranslation();
|
||||
const touchXStart = useRef<number>();
|
||||
const touchXEnd = useRef<number>();
|
||||
const touchYStart = useRef<number>();
|
||||
const touchYEnd = useRef<number>();
|
||||
|
||||
const handleTouchStart = (e: React.TouchEvent<HTMLImageElement>) => {
|
||||
touchXStart.current = e.changedTouches[0].screenX;
|
||||
touchYStart.current = e.changedTouches[0].screenY;
|
||||
};
|
||||
|
||||
const handleTouchMove = (e: React.TouchEvent<HTMLImageElement>) => {
|
||||
touchXEnd.current = e.changedTouches[0].screenX;
|
||||
touchYEnd.current = e.changedTouches[0].screenY;
|
||||
const dx = touchXEnd.current - (touchXStart.current ?? 0);
|
||||
const dy = touchYEnd.current - (touchYStart.current ?? 0);
|
||||
|
||||
const swipeRight = dx > 0 && Math.abs(dy) < Math.abs(dx);
|
||||
if (swipeRight) {
|
||||
return onSwipeRight();
|
||||
}
|
||||
|
||||
const swipeLeft = dx < 0 && Math.abs(dy) < Math.abs(dx);
|
||||
if (swipeLeft) {
|
||||
return onSwipeLeft();
|
||||
}
|
||||
|
||||
const swipeDown = dy > 0 && Math.abs(dy) > Math.abs(dx);
|
||||
const swipeUp = dy < 0 && Math.abs(dy) > Math.abs(dx);
|
||||
if (swipeUp || swipeDown) {
|
||||
return onSwipeUpOrDown();
|
||||
}
|
||||
};
|
||||
|
||||
const handleTouchEnd = () => {
|
||||
touchXStart.current = undefined;
|
||||
touchXEnd.current = undefined;
|
||||
touchYStart.current = undefined;
|
||||
touchYEnd.current = undefined;
|
||||
};
|
||||
|
||||
const handleTouchCancel = () => {
|
||||
touchXStart.current = undefined;
|
||||
touchXEnd.current = undefined;
|
||||
touchYStart.current = undefined;
|
||||
touchYEnd.current = undefined;
|
||||
};
|
||||
|
||||
const [hidden, setHidden] = useState(
|
||||
status.image === null || status.image === ImageStatus.LOADING
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
onLoading();
|
||||
}, [src]);
|
||||
|
||||
useEffect(() => {
|
||||
if (status.image === null || status.image === ImageStatus.LOADING) {
|
||||
setHidden(true);
|
||||
} else if (status.image === ImageStatus.LOADED) {
|
||||
setHidden(false);
|
||||
}
|
||||
}, [status.image]);
|
||||
|
||||
return status.image === ImageStatus.ERROR ? (
|
||||
<StyledError animation={animation}>
|
||||
<CrossIcon size={16} /> {t("Image failed to load")}
|
||||
</StyledError>
|
||||
) : (
|
||||
<>
|
||||
{status.image === ImageStatus.LOADING && <LoadingIndicator />}
|
||||
<Figure>
|
||||
<StyledImg
|
||||
ref={ref}
|
||||
src={src}
|
||||
alt={alt}
|
||||
animation={animation}
|
||||
onAnimationStart={() => setHidden(false)}
|
||||
onTouchStart={handleTouchStart}
|
||||
onTouchMove={handleTouchMove}
|
||||
onTouchEnd={handleTouchEnd}
|
||||
onTouchCancel={handleTouchCancel}
|
||||
onError={onError}
|
||||
onLoad={onLoad}
|
||||
$hidden={hidden}
|
||||
/>
|
||||
<Caption>
|
||||
{status.image === ImageStatus.LOADED &&
|
||||
status.lightbox === LightboxStatus.OPENED ? (
|
||||
<Fade>{alt}</Fade>
|
||||
) : null}
|
||||
</Caption>
|
||||
</Figure>
|
||||
</>
|
||||
);
|
||||
});
|
||||
|
||||
const Figure = styled("figure")`
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
`;
|
||||
|
||||
const Caption = styled("figcaption")`
|
||||
font-size: 14px;
|
||||
min-height: 1.5em;
|
||||
font-weight: normal;
|
||||
margin-top: 8px;
|
||||
color: ${s("textSecondary")};
|
||||
flex-shrink: 0;
|
||||
`;
|
||||
|
||||
const StyledOverlay = styled(Dialog.Overlay)<{
|
||||
animation: Animation | null;
|
||||
}>`
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background-color: ${s("background")};
|
||||
z-index: ${depths.overlay};
|
||||
${(props) =>
|
||||
props.animation === null
|
||||
? css`
|
||||
opacity: 0;
|
||||
`
|
||||
: props.animation.fadeIn
|
||||
? css`
|
||||
animation: ${props.animation.fadeIn.apply()}
|
||||
${props.animation.fadeIn.duration}ms;
|
||||
`
|
||||
: props.animation.fadeOut
|
||||
? css`
|
||||
animation: ${props.animation.fadeOut.apply()}
|
||||
${props.animation.fadeOut.duration}ms;
|
||||
`
|
||||
: ""}
|
||||
`;
|
||||
|
||||
const StyledImg = styled.img<{
|
||||
$hidden: boolean;
|
||||
animation: Animation | null;
|
||||
}>`
|
||||
visibility: ${(props) => (props.$hidden ? "hidden" : "visible")};
|
||||
max-width: 100%;
|
||||
min-height: 0;
|
||||
object-fit: contain;
|
||||
${(props) =>
|
||||
props.animation?.zoomIn
|
||||
? css`
|
||||
animation: ${props.animation.zoomIn.apply()}
|
||||
${props.animation.zoomIn.duration}ms;
|
||||
`
|
||||
: props.animation?.zoomOut
|
||||
? css`
|
||||
animation: ${props.animation.zoomOut.apply()}
|
||||
${props.animation.zoomOut.duration}ms;
|
||||
`
|
||||
: ""}
|
||||
`;
|
||||
|
||||
const StyledContent = styled(Dialog.Content)`
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: ${depths.modal};
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
outline: none;
|
||||
padding: 56px;
|
||||
`;
|
||||
|
||||
const Actions = styled.div<{
|
||||
animation: Animation | null;
|
||||
}>`
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
margin: 16px 12px;
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
|
||||
${(props) =>
|
||||
props.animation === null
|
||||
? css`
|
||||
opacity: 0;
|
||||
`
|
||||
: props.animation.fadeIn
|
||||
? css`
|
||||
animation: ${props.animation.fadeIn.apply()}
|
||||
${props.animation.fadeIn.duration}ms;
|
||||
`
|
||||
: props.animation.fadeOut
|
||||
? css`
|
||||
animation: ${props.animation.fadeOut.apply()}
|
||||
${props.animation.fadeOut.duration}ms;
|
||||
`
|
||||
: ""}
|
||||
`;
|
||||
|
||||
const Nav = styled.div<{
|
||||
$hidden: boolean;
|
||||
dir: "left" | "right";
|
||||
animation: Animation | null;
|
||||
}>`
|
||||
position: absolute;
|
||||
${(props) => (props.dir === "left" ? "left: 0;" : "right: 0;")}
|
||||
transition: opacity 500ms ease-in-out;
|
||||
${(props) => props.$hidden && "opacity: 0;"}
|
||||
${(props) =>
|
||||
props.animation === null
|
||||
? css`
|
||||
opacity: 0;
|
||||
`
|
||||
: props.animation.fadeIn
|
||||
? css`
|
||||
animation: ${props.animation.fadeIn.apply()}
|
||||
${props.animation.fadeIn.duration}ms;
|
||||
`
|
||||
: props.animation.fadeOut
|
||||
? css`
|
||||
animation: ${props.animation.fadeOut.apply()}
|
||||
${props.animation.fadeOut.duration}ms;
|
||||
`
|
||||
: ""}
|
||||
`;
|
||||
|
||||
const StyledError = styled(Error)<{
|
||||
animation: Animation | null;
|
||||
}>`
|
||||
${(props) =>
|
||||
props.animation === null
|
||||
? css`
|
||||
opacity: 0;
|
||||
`
|
||||
: props.animation.fadeIn
|
||||
? css`
|
||||
animation: ${props.animation.fadeIn.apply()}
|
||||
${props.animation.fadeIn.duration}ms;
|
||||
`
|
||||
: props.animation.fadeOut
|
||||
? css`
|
||||
animation: ${props.animation.fadeOut.apply()}
|
||||
${props.animation.fadeOut.duration}ms;
|
||||
`
|
||||
: ""}
|
||||
`;
|
||||
|
||||
const NavButton = styled(NudeButton)`
|
||||
margin: 16px;
|
||||
opacity: 0.75;
|
||||
color: ${s("text")};
|
||||
outline: none;
|
||||
${extraArea(12)}
|
||||
|
||||
&:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
`;
|
||||
|
||||
export default observer(Lightbox);
|
||||
@@ -221,7 +221,7 @@ export default function SelectionToolbar(props: Props) {
|
||||
} else if (isNoticeSelection && selection.empty) {
|
||||
items = getNoticeMenuItems(state, readOnly, dictionary);
|
||||
} else {
|
||||
items = getFormattingMenuItems(state, isTemplate, isMobile, dictionary);
|
||||
items = getFormattingMenuItems(state, isTemplate, dictionary);
|
||||
}
|
||||
|
||||
// Some extensions may be disabled, remove corresponding items
|
||||
|
||||
@@ -54,6 +54,7 @@ import EditorContext from "./components/EditorContext";
|
||||
import { NodeViewRenderer } from "./components/NodeViewRenderer";
|
||||
import SelectionToolbar from "./components/SelectionToolbar";
|
||||
import WithTheme from "./components/WithTheme";
|
||||
import Lightbox from "~/components/Lightbox";
|
||||
|
||||
export type Props = {
|
||||
/** An optional identifier for the editor context. It is used to persist local settings */
|
||||
@@ -145,6 +146,8 @@ type State = {
|
||||
isEditorFocused: boolean;
|
||||
/** If the toolbar for a text selection is visible */
|
||||
selectionToolbarOpen: boolean;
|
||||
/** Position of image in doc that's being currently viewed in Lightbox */
|
||||
activeLightboxImgPos: number | null;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -174,6 +177,7 @@ export class Editor extends React.PureComponent<
|
||||
isRTL: false,
|
||||
isEditorFocused: false,
|
||||
selectionToolbarOpen: false,
|
||||
activeLightboxImgPos: null,
|
||||
};
|
||||
|
||||
isInitialized = false;
|
||||
@@ -712,6 +716,13 @@ export class Editor extends React.PureComponent<
|
||||
dispatch(tr);
|
||||
};
|
||||
|
||||
public updateActiveLightbox = (pos: number | null) => {
|
||||
this.setState((state) => ({
|
||||
...state,
|
||||
activeLightboxImgPos: pos,
|
||||
}));
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the plain text content of the current editor.
|
||||
*
|
||||
@@ -831,6 +842,12 @@ export class Editor extends React.PureComponent<
|
||||
)}
|
||||
</Observer>
|
||||
</Flex>
|
||||
{this.state.activeLightboxImgPos && (
|
||||
<Lightbox
|
||||
onUpdate={this.updateActiveLightbox}
|
||||
activePos={this.state.activeLightboxImgPos}
|
||||
/>
|
||||
)}
|
||||
</EditorContext.Provider>
|
||||
</PortalContext.Provider>
|
||||
);
|
||||
|
||||
@@ -30,17 +30,22 @@ import { MenuItem } from "@shared/editor/types";
|
||||
import { metaDisplay } from "@shared/utils/keyboard";
|
||||
import CircleIcon from "~/components/Icons/CircleIcon";
|
||||
import { Dictionary } from "~/hooks/useDictionary";
|
||||
import {
|
||||
isMobile as isMobileDevice,
|
||||
isTouchDevice,
|
||||
} from "@shared/utils/browser";
|
||||
|
||||
export default function formattingMenuItems(
|
||||
state: EditorState,
|
||||
isTemplate: boolean,
|
||||
isMobile: boolean,
|
||||
dictionary: Dictionary
|
||||
): MenuItem[] {
|
||||
const { schema } = state;
|
||||
const isCode = isInCode(state);
|
||||
const isCodeBlock = isInCode(state, { onlyBlock: true });
|
||||
const isEmpty = state.selection.empty;
|
||||
const isMobile = isMobileDevice();
|
||||
const isTouch = isTouchDevice();
|
||||
|
||||
const highlight = getMarksBetween(
|
||||
state.selection.from,
|
||||
@@ -198,7 +203,7 @@ export default function formattingMenuItems(
|
||||
shortcut: `⇧+Tab`,
|
||||
icon: <OutdentIcon />,
|
||||
visible:
|
||||
isMobile && isInList(state, { types: ["ordered_list", "bullet_list"] }),
|
||||
isTouch && isInList(state, { types: ["ordered_list", "bullet_list"] }),
|
||||
},
|
||||
{
|
||||
name: "indentList",
|
||||
@@ -206,21 +211,21 @@ export default function formattingMenuItems(
|
||||
shortcut: `Tab`,
|
||||
icon: <IndentIcon />,
|
||||
visible:
|
||||
isMobile && isInList(state, { types: ["ordered_list", "bullet_list"] }),
|
||||
isTouch && isInList(state, { types: ["ordered_list", "bullet_list"] }),
|
||||
},
|
||||
{
|
||||
name: "outdentCheckboxList",
|
||||
tooltip: dictionary.outdent,
|
||||
shortcut: `⇧+Tab`,
|
||||
icon: <OutdentIcon />,
|
||||
visible: isMobile && isInList(state, { types: ["checkbox_list"] }),
|
||||
visible: isTouch && isInList(state, { types: ["checkbox_list"] }),
|
||||
},
|
||||
{
|
||||
name: "indentCheckboxList",
|
||||
tooltip: dictionary.indent,
|
||||
shortcut: `Tab`,
|
||||
icon: <IndentIcon />,
|
||||
visible: isMobile && isInList(state, { types: ["checkbox_list"] }),
|
||||
visible: isTouch && isInList(state, { types: ["checkbox_list"] }),
|
||||
},
|
||||
{
|
||||
name: "separator",
|
||||
|
||||
@@ -204,10 +204,10 @@ export default class DocumentsStore extends Store<Document> {
|
||||
}
|
||||
|
||||
get(id: string): Document | undefined {
|
||||
return (
|
||||
this.data.get(id) ??
|
||||
this.orderedData.find((doc) => id.endsWith(doc.urlId))
|
||||
);
|
||||
return id
|
||||
? (this.data.get(id) ??
|
||||
this.orderedData.find((doc) => id.endsWith(doc.urlId)))
|
||||
: undefined;
|
||||
}
|
||||
|
||||
@computed
|
||||
|
||||
@@ -167,9 +167,9 @@ export default class SharesStore extends Store<Share> {
|
||||
find(this.orderedData, (share) => share.documentId === documentId);
|
||||
|
||||
get(id: string): Share | undefined {
|
||||
return (
|
||||
this.data.get(id) ??
|
||||
this.orderedData.find((share) => id.endsWith(share.urlId))
|
||||
);
|
||||
return id
|
||||
? (this.data.get(id) ??
|
||||
this.orderedData.find((share) => id.endsWith(share.urlId)))
|
||||
: undefined;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,7 +276,7 @@ export default abstract class Store<T extends Model> {
|
||||
* @param id The ID of the item to get.
|
||||
*/
|
||||
get(id: string): T | undefined {
|
||||
return this.data.get(id);
|
||||
return id ? this.data.get(id) : undefined;
|
||||
}
|
||||
|
||||
@action
|
||||
|
||||
@@ -51,11 +51,11 @@
|
||||
"> 0.25%, not dead"
|
||||
],
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "3.873.0",
|
||||
"@aws-sdk/lib-storage": "3.873.0",
|
||||
"@aws-sdk/s3-presigned-post": "3.873.0",
|
||||
"@aws-sdk/s3-request-presigner": "3.873.0",
|
||||
"@aws-sdk/signature-v4-crt": "^3.873.0",
|
||||
"@aws-sdk/client-s3": "3.879.0",
|
||||
"@aws-sdk/lib-storage": "3.879.0",
|
||||
"@aws-sdk/s3-presigned-post": "3.879.0",
|
||||
"@aws-sdk/s3-request-presigner": "3.879.0",
|
||||
"@aws-sdk/signature-v4-crt": "^3.879.0",
|
||||
"@babel/core": "^7.28.3",
|
||||
"@babel/plugin-proposal-decorators": "^7.28.0",
|
||||
"@babel/plugin-transform-class-properties": "^7.27.1",
|
||||
@@ -128,11 +128,11 @@
|
||||
"crypto-js": "^4.2.0",
|
||||
"datadog-metrics": "^0.12.1",
|
||||
"date-fns": "^3.6.0",
|
||||
"dd-trace": "^5.63.0",
|
||||
"dd-trace": "^5.64.0",
|
||||
"diff": "^5.2.0",
|
||||
"email-providers": "^1.14.0",
|
||||
"emoji-mart": "^5.6.0",
|
||||
"emoji-regex": "^10.4.0",
|
||||
"emoji-regex": "^10.5.0",
|
||||
"es6-error": "^4.1.1",
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"fetch-retry": "^5.0.6",
|
||||
@@ -187,7 +187,7 @@
|
||||
"passport-oauth2": "^1.8.0",
|
||||
"passport-slack-oauth2": "^1.2.0",
|
||||
"patch-package": "^8.0.0",
|
||||
"pg": "^8.15.6",
|
||||
"pg": "^8.16.3",
|
||||
"pg-tsquery": "^8.4.2",
|
||||
"pluralize": "^8.0.0",
|
||||
"png-chunks-extract": "^1.0.0",
|
||||
@@ -198,7 +198,7 @@
|
||||
"prosemirror-gapcursor": "^1.3.2",
|
||||
"prosemirror-history": "^1.4.1",
|
||||
"prosemirror-inputrules": "^1.5.0",
|
||||
"prosemirror-keymap": "^1.2.2",
|
||||
"prosemirror-keymap": "^1.2.3",
|
||||
"prosemirror-markdown": "^1.13.2",
|
||||
"prosemirror-model": "^1.25.2",
|
||||
"prosemirror-schema-list": "^1.5.1",
|
||||
@@ -220,7 +220,6 @@
|
||||
"react-helmet-async": "^2.0.5",
|
||||
"react-hook-form": "^7.54.2",
|
||||
"react-i18next": "^12.3.1",
|
||||
"react-medium-image-zoom": "5.2.14",
|
||||
"react-merge-refs": "^2.1.1",
|
||||
"react-portal": "^4.3.0",
|
||||
"react-router-dom": "^5.3.4",
|
||||
@@ -258,7 +257,7 @@
|
||||
"tiny-cookie": "^2.5.1",
|
||||
"tmp": "^0.2.5",
|
||||
"tunnel-agent": "^0.6.0",
|
||||
"turndown": "^7.2.0",
|
||||
"turndown": "^7.2.1",
|
||||
"ukkonen": "^2.2.0",
|
||||
"umzug": "^3.8.2",
|
||||
"utility-types": "^3.11.0",
|
||||
@@ -382,6 +381,6 @@
|
||||
"qs": "6.9.7",
|
||||
"prismjs": "1.30.0"
|
||||
},
|
||||
"version": "0.87.1",
|
||||
"version": "0.87.3",
|
||||
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import { VerificationCode } from "@server/utils/VerificationCode";
|
||||
import { signIn } from "@server/utils/authentication";
|
||||
import { getUserForEmailSigninToken } from "@server/utils/jwt";
|
||||
import * as T from "./schema";
|
||||
import { CSRF } from "@shared/constants";
|
||||
|
||||
const router = new Router();
|
||||
|
||||
@@ -108,7 +109,22 @@ const emailCallback = async (ctx: APIContext<T.EmailCallbackReq>) => {
|
||||
// and spending the token before the user clicks on it. Instead we redirect
|
||||
// to the same URL with the follow query param added from the client side.
|
||||
if (!follow) {
|
||||
return ctx.redirectOnClient(ctx.request.href + "&follow=true", "POST");
|
||||
const csrfToken = ctx.cookies.get(CSRF.cookieName);
|
||||
|
||||
// Parse the current URL to extract existing query parameters
|
||||
const url = new URL(ctx.request.href);
|
||||
const searchParams = url.searchParams;
|
||||
|
||||
// Add new parameters
|
||||
searchParams.set("follow", "true");
|
||||
if (csrfToken) {
|
||||
searchParams.set(CSRF.fieldName, csrfToken);
|
||||
}
|
||||
|
||||
// Reconstruct the URL with merged parameters
|
||||
url.search = searchParams.toString();
|
||||
|
||||
return ctx.redirectOnClient(url.toString(), "POST");
|
||||
}
|
||||
|
||||
let user!: User;
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 922 B After Width: | Height: | Size: 874 B |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 759 B After Width: | Height: | Size: 713 B |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1010 B |
@@ -755,6 +755,17 @@ export class Environment {
|
||||
public WEBHOOK_FAILURE_RATE_THRESHOLD =
|
||||
this.toOptionalNumber(environment.WEBHOOK_FAILURE_RATE_THRESHOLD) ?? 80;
|
||||
|
||||
/**
|
||||
* Comma-separated list of IP addresses that are allowed to be accessed
|
||||
* even if they are private IP addresses. This is useful for allowing
|
||||
* connections to OIDC providers or webhooks on private networks.
|
||||
* Example: "10.0.0.1,192.168.1.100"
|
||||
*/
|
||||
@IsOptional()
|
||||
public ALLOWED_PRIVATE_IP_ADDRESSES = this.toOptionalCommaList(
|
||||
environment.ALLOWED_PRIVATE_IP_ADDRESSES
|
||||
);
|
||||
|
||||
/**
|
||||
* The product name
|
||||
*/
|
||||
|
||||
@@ -150,6 +150,12 @@ function buildAgent(
|
||||
const proxyURL = getProxyForUrl(parsedURL.href);
|
||||
let agent: https.Agent | http.Agent | undefined;
|
||||
|
||||
// Add allowIPAddressList from environment configuration
|
||||
const filteringOptions = {
|
||||
...agentOptions,
|
||||
allowIPAddressList: env.ALLOWED_PRIVATE_IP_ADDRESSES,
|
||||
};
|
||||
|
||||
if (proxyURL) {
|
||||
const parsedProxyURL = parseProxy(parsedURL, proxyURL);
|
||||
|
||||
@@ -171,15 +177,15 @@ function buildAgent(
|
||||
proxyURL.username = parsedProxyURL.username;
|
||||
proxyURL.password = parsedProxyURL.password;
|
||||
}
|
||||
agent = useFilteringAgent(proxyURL.toString(), agentOptions);
|
||||
agent = useFilteringAgent(proxyURL.toString(), filteringOptions);
|
||||
} else {
|
||||
// Note request filtering agent does not support https tunneling via a proxy
|
||||
agent =
|
||||
buildTunnel(parsedProxyURL, agentOptions) ||
|
||||
useFilteringAgent(parsedURL.toString(), agentOptions);
|
||||
useFilteringAgent(parsedURL.toString(), filteringOptions);
|
||||
}
|
||||
} else {
|
||||
agent = useFilteringAgent(parsedURL.toString(), agentOptions);
|
||||
agent = useFilteringAgent(parsedURL.toString(), filteringOptions);
|
||||
}
|
||||
|
||||
if (options.signal) {
|
||||
|
||||
@@ -24,6 +24,7 @@ export default abstract class OAuthClient {
|
||||
try {
|
||||
response = await fetch(this.endpoints.userinfo, {
|
||||
method: "GET",
|
||||
allowPrivateIPAddress: true,
|
||||
headers: {
|
||||
Authorization: `Bearer ${accessToken}`,
|
||||
"Content-Type": "application/json",
|
||||
@@ -59,6 +60,7 @@ export default abstract class OAuthClient {
|
||||
|
||||
response = await fetch(endpoint, {
|
||||
method: "POST",
|
||||
allowPrivateIPAddress: true,
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
},
|
||||
|
||||
@@ -98,6 +98,7 @@ export async function request(
|
||||
) {
|
||||
const response = await fetch(endpoint, {
|
||||
method,
|
||||
allowPrivateIPAddress: true,
|
||||
headers: {
|
||||
Authorization: `Bearer ${accessToken}`,
|
||||
"Content-Type": "application/json",
|
||||
|
||||
@@ -16,7 +16,7 @@ export default function sanitizeLists(turndownService: TurndownService) {
|
||||
content = content
|
||||
.replace(/^\n+/, "") // remove leading newlines
|
||||
.replace(/\n+$/, "\n") // replace trailing newlines with just a single one
|
||||
.replace(/\n/gm, "\n "); // 2 space indent
|
||||
.replace(/\n/gm, "\n "); // 4 space indent
|
||||
|
||||
let prefix = options.bulletListMarker + " ";
|
||||
const parent = node.parentNode;
|
||||
|
||||
@@ -7,11 +7,13 @@ import { s } from "../../styles";
|
||||
import { isExternalUrl, sanitizeUrl } from "../../utils/urls";
|
||||
import { EditorStyleHelper } from "../styles/EditorStyleHelper";
|
||||
import { ComponentProps } from "../types";
|
||||
import { ImageZoom } from "./ImageZoom";
|
||||
import { ResizeLeft, ResizeRight } from "./ResizeHandle";
|
||||
import useDragResize from "./hooks/useDragResize";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
type Props = ComponentProps & {
|
||||
/** Callback triggered when the image is clicked */
|
||||
onClick: () => void;
|
||||
/** Callback triggered when the download button is clicked */
|
||||
onDownload?: (event: React.MouseEvent<HTMLButtonElement>) => void;
|
||||
/** Callback triggered when the image is resized */
|
||||
@@ -22,13 +24,15 @@ type Props = ComponentProps & {
|
||||
};
|
||||
|
||||
const Image = (props: Props) => {
|
||||
const { isSelected, node, isEditable, onChangeSize } = props;
|
||||
const { isSelected, node, isEditable, onChangeSize, onClick } = props;
|
||||
const { src, layoutClass } = node.attrs;
|
||||
const { t } = useTranslation();
|
||||
const className = layoutClass ? `image image-${layoutClass}` : "image";
|
||||
const [loaded, setLoaded] = React.useState(false);
|
||||
const [error, setError] = React.useState(false);
|
||||
const [naturalWidth, setNaturalWidth] = React.useState(node.attrs.width);
|
||||
const [naturalHeight, setNaturalHeight] = React.useState(node.attrs.height);
|
||||
const lastTapTimeRef = React.useRef(0);
|
||||
const ref = React.useRef<HTMLDivElement>(null);
|
||||
const { width, height, setSize, handlePointerDown, dragging } = useDragResize(
|
||||
{
|
||||
@@ -65,6 +69,25 @@ const Image = (props: Props) => {
|
||||
? { width: "var(--container-width)" }
|
||||
: { width: width || "auto" };
|
||||
|
||||
const handleImageTouchStart = (ev: React.TouchEvent<HTMLDivElement>) => {
|
||||
const currentTime = Date.now();
|
||||
const timeSinceLastTap = currentTime - lastTapTimeRef.current;
|
||||
|
||||
if (timeSinceLastTap < 300 && isSelected) {
|
||||
ev.preventDefault();
|
||||
onClick();
|
||||
}
|
||||
|
||||
lastTapTimeRef.current = currentTime;
|
||||
};
|
||||
|
||||
const handleImageClick = (ev: React.MouseEvent<HTMLDivElement>) => {
|
||||
if (!isEditable || isSelected) {
|
||||
ev.preventDefault();
|
||||
onClick();
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div contentEditable={false} className={className} ref={ref}>
|
||||
<ImageWrapper
|
||||
@@ -75,11 +98,11 @@ const Image = (props: Props) => {
|
||||
{!dragging && width > 60 && isDownloadable && (
|
||||
<Actions>
|
||||
{isExternalUrl(src) && (
|
||||
<Button onClick={handleOpen}>
|
||||
<Button onClick={handleOpen} aria-label={t("Open")}>
|
||||
<GlobeIcon />
|
||||
</Button>
|
||||
)}
|
||||
<Button onClick={props.onDownload}>
|
||||
<Button onClick={props.onDownload} aria-label={t("Download")}>
|
||||
<DownloadIcon />
|
||||
</Button>
|
||||
</Actions>
|
||||
@@ -89,7 +112,7 @@ const Image = (props: Props) => {
|
||||
<CrossIcon size={16} /> Image failed to load
|
||||
</Error>
|
||||
) : (
|
||||
<ImageZoom caption={props.node.attrs.alt}>
|
||||
<>
|
||||
<img
|
||||
className={EditorStyleHelper.imageHandle}
|
||||
style={{
|
||||
@@ -123,6 +146,8 @@ const Image = (props: Props) => {
|
||||
}));
|
||||
}
|
||||
}}
|
||||
onClick={handleImageClick}
|
||||
onTouchStart={handleImageTouchStart}
|
||||
/>
|
||||
{!loaded && width && height && (
|
||||
<img
|
||||
@@ -135,7 +160,7 @@ const Image = (props: Props) => {
|
||||
)}`}
|
||||
/>
|
||||
)}
|
||||
</ImageZoom>
|
||||
</>
|
||||
)}
|
||||
{isEditable && !isFullWidth && isResizable && (
|
||||
<>
|
||||
@@ -161,7 +186,7 @@ function getPlaceholder(width: number, height: number) {
|
||||
return `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" />`;
|
||||
}
|
||||
|
||||
const Error = styled(Flex)`
|
||||
export const Error = styled(Flex)`
|
||||
max-width: 100%;
|
||||
color: ${s("textTertiary")};
|
||||
font-size: 14px;
|
||||
|
||||
@@ -1,176 +0,0 @@
|
||||
import { transparentize } from "polished";
|
||||
import * as React from "react";
|
||||
import styled, { createGlobalStyle } from "styled-components";
|
||||
import EventBoundary from "../../components/EventBoundary";
|
||||
import { s } from "../../styles";
|
||||
import { EditorStyleHelper } from "../styles/EditorStyleHelper";
|
||||
|
||||
const Zoom = React.lazy(() => import("react-medium-image-zoom"));
|
||||
|
||||
type Props = {
|
||||
/** An optional caption to display below the image */
|
||||
caption?: string;
|
||||
children: React.ReactNode;
|
||||
};
|
||||
|
||||
/**
|
||||
* Component that wraps an image with the ability to zoom in
|
||||
*/
|
||||
export const ImageZoom = ({ caption, children }: Props) => {
|
||||
const [isActivated, setIsActivated] = React.useState(false);
|
||||
|
||||
const handleActivated = React.useCallback(() => {
|
||||
setIsActivated(true);
|
||||
}, []);
|
||||
|
||||
const fallback = (
|
||||
<span onPointerEnter={handleActivated} onFocus={handleActivated}>
|
||||
{children}
|
||||
</span>
|
||||
);
|
||||
|
||||
const ZoomContent = React.useMemo(
|
||||
() =>
|
||||
function ZoomContentComponent(
|
||||
props: Omit<React.ComponentProps<typeof Lightbox>, "caption">
|
||||
) {
|
||||
return <Lightbox caption={caption} {...props} />;
|
||||
},
|
||||
[caption]
|
||||
);
|
||||
|
||||
if (!isActivated) {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
return (
|
||||
<React.Suspense fallback={fallback}>
|
||||
<Styles />
|
||||
<EventBoundary captureEvents="click">
|
||||
<Zoom zoomMargin={EditorStyleHelper.padding} ZoomContent={ZoomContent}>
|
||||
<div>{children}</div>
|
||||
</Zoom>
|
||||
</EventBoundary>
|
||||
</React.Suspense>
|
||||
);
|
||||
};
|
||||
|
||||
const Lightbox = ({
|
||||
caption,
|
||||
modalState,
|
||||
img,
|
||||
}: {
|
||||
caption: string | undefined;
|
||||
modalState: string;
|
||||
img: React.ReactNode;
|
||||
}) => (
|
||||
<Figure>
|
||||
{img}
|
||||
<Caption $loaded={modalState === "LOADED"}>{caption}</Caption>
|
||||
</Figure>
|
||||
);
|
||||
|
||||
const Figure = styled("figure")`
|
||||
margin: 0;
|
||||
`;
|
||||
|
||||
const Caption = styled("figcaption")<{ $loaded: boolean }>`
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
margin-bottom: 8px;
|
||||
font-size: 14px;
|
||||
opacity: ${(props) => (props.$loaded ? 1 : 0)};
|
||||
transition: opacity 250ms;
|
||||
|
||||
font-weight: normal;
|
||||
color: ${s("textSecondary")};
|
||||
`;
|
||||
|
||||
const Styles = createGlobalStyle`
|
||||
[data-rmiz-ghost] {
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
}
|
||||
[data-rmiz-btn-zoom],
|
||||
[data-rmiz-btn-unzoom] {
|
||||
display: none;
|
||||
}
|
||||
[data-rmiz-btn-zoom]:not(:focus):not(:active) {
|
||||
position: absolute;
|
||||
clip: rect(0 0 0 0);
|
||||
clip-path: inset(50%);
|
||||
height: 1px;
|
||||
overflow: hidden;
|
||||
pointer-events: none;
|
||||
white-space: nowrap;
|
||||
width: 1px;
|
||||
}
|
||||
[data-rmiz-btn-zoom] {
|
||||
position: absolute;
|
||||
inset: 10px 10px auto auto;
|
||||
cursor: zoom-in;
|
||||
}
|
||||
[data-rmiz-btn-unzoom] {
|
||||
position: absolute;
|
||||
inset: 20px 20px auto auto;
|
||||
cursor: zoom-out;
|
||||
z-index: 1;
|
||||
}
|
||||
[data-rmiz-content="found"] img,
|
||||
[data-rmiz-content="found"] svg,
|
||||
[data-rmiz-content="found"] [role="img"],
|
||||
[data-rmiz-content="found"] [data-zoom] {
|
||||
cursor: zoom-in;
|
||||
}
|
||||
[data-rmiz-modal] {
|
||||
outline: none;
|
||||
}
|
||||
[data-rmiz-modal]::backdrop {
|
||||
display: none;
|
||||
}
|
||||
[data-rmiz-modal][open] {
|
||||
position: fixed;
|
||||
width: 100vw;
|
||||
width: 100dvw;
|
||||
height: 100vh;
|
||||
height: 100dvh;
|
||||
max-width: none;
|
||||
max-height: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
overflow: hidden;
|
||||
}
|
||||
[data-rmiz-modal-overlay] {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
[data-rmiz-modal-overlay="hidden"] {
|
||||
background-color: ${(props) => transparentize(1, props.theme.background)};
|
||||
}
|
||||
[data-rmiz-modal-overlay="visible"] {
|
||||
background-color: ${s("background")};
|
||||
}
|
||||
[data-rmiz-modal-content] {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
[data-rmiz-modal-img] {
|
||||
position: absolute;
|
||||
cursor: zoom-out;
|
||||
image-rendering: high-quality;
|
||||
transform-origin: top left;
|
||||
transition: transform 0.3s;
|
||||
}
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
[data-rmiz-modal-overlay],
|
||||
[data-rmiz-modal-img] {
|
||||
transition-duration: 0.01ms !important;
|
||||
}
|
||||
}
|
||||
`;
|
||||
@@ -693,6 +693,9 @@ img.ProseMirror-separator {
|
||||
.component-image + img.ProseMirror-separator + br.ProseMirror-trailingBreak {
|
||||
display: none;
|
||||
}
|
||||
.component-image img {
|
||||
cursor: zoom-in;
|
||||
}
|
||||
|
||||
.${EditorStyleHelper.imageCaption} {
|
||||
border: 0;
|
||||
|
||||
@@ -1,26 +1,7 @@
|
||||
import * as React from "react";
|
||||
import Frame from "../components/Frame";
|
||||
import { ImageZoom } from "../components/ImageZoom";
|
||||
import { EmbedProps as Props } from ".";
|
||||
|
||||
function InVision({ matches, ...props }: Props) {
|
||||
if (/opal\.invisionapp\.com/.test(props.attrs.href)) {
|
||||
return (
|
||||
<div className={props.isSelected ? "ProseMirror-selectednode" : ""}>
|
||||
<ImageZoom>
|
||||
<img
|
||||
src={props.attrs.href}
|
||||
alt="InVision Embed"
|
||||
style={{
|
||||
maxWidth: "100%",
|
||||
maxHeight: "75vh",
|
||||
}}
|
||||
/>
|
||||
</ImageZoom>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return <Frame {...props} src={props.attrs.href} title="InVision Embed" />;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,13 +31,18 @@ export type EmbedProps = {
|
||||
};
|
||||
};
|
||||
|
||||
const Img = styled(Image)`
|
||||
const Img = styled(Image)<{ invertable?: boolean }>`
|
||||
border-radius: 3px;
|
||||
background: #fff;
|
||||
box-shadow: 0 0 0 1px ${(props) => props.theme.divider};
|
||||
margin: 3px;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
|
||||
${(props) =>
|
||||
props.invertable &&
|
||||
props.theme.isDark &&
|
||||
`
|
||||
filter: invert(1);
|
||||
`}
|
||||
`;
|
||||
|
||||
export class EmbedDescriptor {
|
||||
@@ -225,7 +230,7 @@ const embeds: EmbedDescriptor[] = [
|
||||
regexMatch: [new RegExp("^https://codepen.io/(.*?)/(pen|embed)/(.*)$")],
|
||||
transformMatch: (matches) =>
|
||||
`https://codepen.io/${matches[1]}/embed/${matches[3]}`,
|
||||
icon: <Img src="/images/codepen.png" alt="Codepen" />,
|
||||
icon: <Img src="/images/codepen.png" alt="Codepen" invertable />,
|
||||
}),
|
||||
new EmbedDescriptor({
|
||||
title: "DBDiagram",
|
||||
@@ -288,7 +293,7 @@ const embeds: EmbedDescriptor[] = [
|
||||
keywords: "design prototyping",
|
||||
regexMatch: [new RegExp("^https://framer.cloud/(.*)$")],
|
||||
transformMatch: (matches) => matches[0],
|
||||
icon: <Img src="/images/framer.png" alt="Framer" />,
|
||||
icon: <Img src="/images/framer.png" alt="Framer" invertable />,
|
||||
}),
|
||||
new EmbedDescriptor({
|
||||
title: "GitHub Gist",
|
||||
@@ -298,7 +303,7 @@ const embeds: EmbedDescriptor[] = [
|
||||
"^https://gist\\.github\\.com/([a-zA-Z\\d](?:[a-zA-Z\\d]|-(?=[a-zA-Z\\d])){0,38})/(.*)$"
|
||||
),
|
||||
],
|
||||
icon: <Img src="/images/github-gist.png" alt="GitHub" />,
|
||||
icon: <Img src="/images/github-gist.png" alt="GitHub" invertable />,
|
||||
component: Gist,
|
||||
}),
|
||||
new EmbedDescriptor({
|
||||
@@ -446,6 +451,7 @@ const embeds: EmbedDescriptor[] = [
|
||||
title: "InVision",
|
||||
keywords: "design prototype",
|
||||
defaultHidden: true,
|
||||
visible: false,
|
||||
regexMatch: [
|
||||
/^https:\/\/(invis\.io\/.*)|(projects\.invisionapp\.com\/share\/.*)$/,
|
||||
/^https:\/\/(opal\.invisionapp\.com\/static-signed\/live-embed\/.*)$/,
|
||||
@@ -458,7 +464,7 @@ const embeds: EmbedDescriptor[] = [
|
||||
keywords: "code",
|
||||
defaultHidden: true,
|
||||
regexMatch: [new RegExp("^https?://jsfiddle\\.net/(.*)/(.*)$")],
|
||||
icon: <Img src="/images/jsfiddle.png" alt="JSFiddle" />,
|
||||
icon: <Img src="/images/jsfiddle.png" alt="JSFiddle" invertable />,
|
||||
component: JSFiddle,
|
||||
}),
|
||||
new EmbedDescriptor({
|
||||
@@ -603,7 +609,7 @@ const embeds: EmbedDescriptor[] = [
|
||||
new RegExp("^https?://(beta|www|old)\\.tldraw\\.com/[rsvopf]+/(.*)"),
|
||||
],
|
||||
transformMatch: (matches: RegExpMatchArray) => matches[0],
|
||||
icon: <Img src="/images/tldraw.png" alt="Tldraw" />,
|
||||
icon: <Img src="/images/tldraw.png" alt="Tldraw" invertable />,
|
||||
}),
|
||||
new EmbedDescriptor({
|
||||
title: "Trello",
|
||||
@@ -621,7 +627,7 @@ const embeds: EmbedDescriptor[] = [
|
||||
),
|
||||
],
|
||||
transformMatch: (matches: RegExpMatchArray) => matches[0],
|
||||
icon: <Img src="/images/typeform.png" alt="Typeform" />,
|
||||
icon: <Img src="/images/typeform.png" alt="Typeform" invertable />,
|
||||
}),
|
||||
new EmbedDescriptor({
|
||||
title: "Valtown",
|
||||
@@ -629,7 +635,7 @@ const embeds: EmbedDescriptor[] = [
|
||||
regexMatch: [/^https?:\/\/(?:www.)?val\.town\/(?:v|embed)\/(.*)$/],
|
||||
transformMatch: (matches: RegExpMatchArray) =>
|
||||
`https://www.val.town/embed/${matches[1]}`,
|
||||
icon: <Img src="/images/valtown.png" alt="Valtown" />,
|
||||
icon: <Img src="/images/valtown.png" alt="Valtown" invertable />,
|
||||
}),
|
||||
new EmbedDescriptor({
|
||||
title: "Vimeo",
|
||||
|
||||
@@ -55,7 +55,7 @@ const parseTitleAttribute = (tokenTitle: string): TitleAttributes => {
|
||||
return attributes;
|
||||
};
|
||||
|
||||
const downloadImageNode = async (node: ProsemirrorNode) => {
|
||||
export const downloadImageNode = async (node: ProsemirrorNode) => {
|
||||
const image = await fetch(node.attrs.src);
|
||||
const imageBlob = await image.blob();
|
||||
const imageURL = URL.createObjectURL(imageBlob);
|
||||
@@ -240,7 +240,7 @@ export default class Image extends SimpleImage {
|
||||
}
|
||||
|
||||
handleChangeSize =
|
||||
({ node, getPos }: { node: ProsemirrorNode; getPos: () => number }) =>
|
||||
({ node, getPos }: ComponentProps) =>
|
||||
({ width, height }: { width: number; height?: number }) => {
|
||||
const { view, commands } = this.editor;
|
||||
const { doc, tr } = view.state;
|
||||
@@ -256,7 +256,7 @@ export default class Image extends SimpleImage {
|
||||
};
|
||||
|
||||
handleDownload =
|
||||
({ node }: { node: ProsemirrorNode }) =>
|
||||
({ node }: ComponentProps) =>
|
||||
(event: React.MouseEvent) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
@@ -264,7 +264,7 @@ export default class Image extends SimpleImage {
|
||||
};
|
||||
|
||||
handleCaptionKeyDown =
|
||||
({ node, getPos }: { node: ProsemirrorNode; getPos: () => number }) =>
|
||||
({ node, getPos }: ComponentProps) =>
|
||||
(event: React.KeyboardEvent<HTMLParagraphElement>) => {
|
||||
// Pressing Enter in the caption field should move the cursor/selection
|
||||
// below the image and create a new paragraph.
|
||||
@@ -297,7 +297,7 @@ export default class Image extends SimpleImage {
|
||||
};
|
||||
|
||||
handleCaptionBlur =
|
||||
({ node, getPos }: { node: ProsemirrorNode; getPos: () => number }) =>
|
||||
({ node, getPos }: ComponentProps) =>
|
||||
(event: React.FocusEvent<HTMLParagraphElement>) => {
|
||||
const caption = event.currentTarget.innerText;
|
||||
if (caption === node.attrs.alt) {
|
||||
@@ -316,9 +316,16 @@ export default class Image extends SimpleImage {
|
||||
view.dispatch(transaction);
|
||||
};
|
||||
|
||||
handleClick =
|
||||
({ getPos }: ComponentProps) =>
|
||||
() => {
|
||||
this.editor.updateActiveLightbox(getPos());
|
||||
};
|
||||
|
||||
component = (props: ComponentProps) => (
|
||||
<ImageComponent
|
||||
{...props}
|
||||
onClick={this.handleClick(props)}
|
||||
onDownload={this.handleDownload(props)}
|
||||
onChangeSize={this.handleChangeSize(props)}
|
||||
>
|
||||
|
||||
@@ -76,7 +76,15 @@ export default class SimpleImage extends Node {
|
||||
};
|
||||
}
|
||||
|
||||
component = (props: ComponentProps) => <ImageComponent {...props} />;
|
||||
handleClick =
|
||||
({ getPos }: ComponentProps) =>
|
||||
() => {
|
||||
this.editor.updateActiveLightbox(getPos());
|
||||
};
|
||||
|
||||
component = (props: ComponentProps) => (
|
||||
<ImageComponent {...props} onClick={this.handleClick(props)} />
|
||||
);
|
||||
|
||||
keys(): Record<string, Command> {
|
||||
return {
|
||||
|
||||
@@ -315,6 +315,12 @@
|
||||
"Permission": "Permission",
|
||||
"Change Language": "Change Language",
|
||||
"Dismiss": "Dismiss",
|
||||
"Lightbox": "Lightbox",
|
||||
"View, navigate, or download images in the document": "View, navigate, or download images in the document",
|
||||
"Close": "Close",
|
||||
"Previous": "Previous",
|
||||
"Next": "Next",
|
||||
"Image failed to load": "Image failed to load",
|
||||
"You’re offline.": "You’re offline.",
|
||||
"Sorry, an error occurred.": "Sorry, an error occurred.",
|
||||
"Click to retry": "Click to retry",
|
||||
@@ -714,7 +720,6 @@
|
||||
"Deleted by {{userName}}": "Deleted by {{userName}}",
|
||||
"Observing {{ userName }}": "Observing {{ userName }}",
|
||||
"Backlinks": "Backlinks",
|
||||
"Close": "Close",
|
||||
"This document is large which may affect performance": "This document is large which may affect performance",
|
||||
"Are you sure you want to delete the <em>{{ documentTitle }}</em> template?": "Are you sure you want to delete the <em>{{ documentTitle }}</em> template?",
|
||||
"Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history</em>.": "Are you sure about that? Deleting the <em>{{ documentTitle }}</em> document will delete all of its history</em>.",
|
||||
@@ -1255,5 +1260,6 @@
|
||||
"{{ user }} updated {{ timeAgo }}": "{{ user }} updated {{ timeAgo }}",
|
||||
"You created {{ timeAgo }}": "You created {{ timeAgo }}",
|
||||
"{{ user }} created {{ timeAgo }}": "{{ user }} created {{ timeAgo }}",
|
||||
"Open": "Open",
|
||||
"Error loading data": "Error loading data"
|
||||
}
|
||||
|
||||
@@ -1,18 +1,72 @@
|
||||
import { bytesToHumanReadable, getFileNameFromUrl } from "./files";
|
||||
import * as browser from "./browser";
|
||||
|
||||
// Mock the browser detection
|
||||
jest.mock("./browser", () => ({
|
||||
isMac: jest.fn(),
|
||||
}));
|
||||
|
||||
const mockIsMac = browser.isMac as jest.MockedFunction<typeof browser.isMac>;
|
||||
|
||||
describe("bytesToHumanReadable", () => {
|
||||
it("outputs readable string", () => {
|
||||
expect(bytesToHumanReadable(0)).toBe("0 Bytes");
|
||||
expect(bytesToHumanReadable(0.0)).toBe("0 Bytes");
|
||||
expect(bytesToHumanReadable(33)).toBe("33 Bytes");
|
||||
expect(bytesToHumanReadable(500)).toBe("500 Bytes");
|
||||
expect(bytesToHumanReadable(1000)).toBe("1 kB");
|
||||
expect(bytesToHumanReadable(15000)).toBe("15 kB");
|
||||
expect(bytesToHumanReadable(12345)).toBe("12.34 kB");
|
||||
expect(bytesToHumanReadable(123456)).toBe("123.45 kB");
|
||||
expect(bytesToHumanReadable(1234567)).toBe("1.23 MB");
|
||||
expect(bytesToHumanReadable(1234567890)).toBe("1.23 GB");
|
||||
expect(bytesToHumanReadable(undefined)).toBe("0 Bytes");
|
||||
afterEach(() => {
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
|
||||
describe("on macOS (decimal units)", () => {
|
||||
beforeEach(() => {
|
||||
mockIsMac.mockReturnValue(true);
|
||||
});
|
||||
|
||||
it("outputs readable string using decimal units", () => {
|
||||
expect(bytesToHumanReadable(0)).toBe("0 Bytes");
|
||||
expect(bytesToHumanReadable(0.0)).toBe("0 Bytes");
|
||||
expect(bytesToHumanReadable(33)).toBe("33 Bytes");
|
||||
expect(bytesToHumanReadable(500)).toBe("500 Bytes");
|
||||
expect(bytesToHumanReadable(1000)).toBe("1 KB");
|
||||
expect(bytesToHumanReadable(15000)).toBe("15 KB");
|
||||
expect(bytesToHumanReadable(12345)).toBe("12.35 KB");
|
||||
expect(bytesToHumanReadable(123456)).toBe("123.46 KB");
|
||||
expect(bytesToHumanReadable(1234567)).toBe("1.23 MB");
|
||||
expect(bytesToHumanReadable(1234567890)).toBe("1.23 GB");
|
||||
expect(bytesToHumanReadable(undefined)).toBe("0 Bytes");
|
||||
});
|
||||
});
|
||||
|
||||
describe("on Windows/other platforms (binary units)", () => {
|
||||
beforeEach(() => {
|
||||
mockIsMac.mockReturnValue(false);
|
||||
});
|
||||
|
||||
it("outputs readable string using binary units", () => {
|
||||
expect(bytesToHumanReadable(0)).toBe("0 Bytes");
|
||||
expect(bytesToHumanReadable(0.0)).toBe("0 Bytes");
|
||||
expect(bytesToHumanReadable(33)).toBe("33 Bytes");
|
||||
expect(bytesToHumanReadable(500)).toBe("500 Bytes");
|
||||
expect(bytesToHumanReadable(1000)).toBe("1000 Bytes");
|
||||
expect(bytesToHumanReadable(1024)).toBe("1 KB");
|
||||
expect(bytesToHumanReadable(1536)).toBe("1.5 KB");
|
||||
expect(bytesToHumanReadable(15360)).toBe("15 KB");
|
||||
expect(bytesToHumanReadable(12345)).toBe("12.06 KB");
|
||||
expect(bytesToHumanReadable(126464)).toBe("123.5 KB");
|
||||
expect(bytesToHumanReadable(1048576)).toBe("1 MB");
|
||||
expect(bytesToHumanReadable(1073741824)).toBe("1 GB");
|
||||
expect(bytesToHumanReadable(undefined)).toBe("0 Bytes");
|
||||
});
|
||||
});
|
||||
|
||||
describe("platform-specific behavior for issue #10085", () => {
|
||||
const fileSize = 91435827; // 87.2MB in binary, ~91.44MB in decimal
|
||||
|
||||
it("displays correctly on macOS (decimal)", () => {
|
||||
mockIsMac.mockReturnValue(true);
|
||||
expect(bytesToHumanReadable(fileSize)).toBe("91.44 MB");
|
||||
});
|
||||
|
||||
it("displays correctly on Windows (binary)", () => {
|
||||
mockIsMac.mockReturnValue(false);
|
||||
expect(bytesToHumanReadable(fileSize)).toBe("87.2 MB");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import { isMac } from "./browser";
|
||||
|
||||
/**
|
||||
* Converts bytes to human readable string for display
|
||||
* Uses binary units (1024-based) on Windows and decimal units (1000-based) on macOS
|
||||
*
|
||||
* @param bytes filesize in bytes
|
||||
* @returns Human readable filesize as a string
|
||||
@@ -9,19 +12,23 @@ export function bytesToHumanReadable(bytes: number | undefined) {
|
||||
return "0 Bytes";
|
||||
}
|
||||
|
||||
const out = ("0".repeat((bytes.toString().length * 2) % 3) + bytes).match(
|
||||
/.{3}/g
|
||||
);
|
||||
// Use decimal units (base 1000) on macOS, binary units (base 1024) on other platforms
|
||||
const useMacUnits = isMac();
|
||||
const base = useMacUnits ? 1000 : 1024;
|
||||
const threshold = useMacUnits ? 1000 : 1024;
|
||||
|
||||
if (!out || bytes < 1000) {
|
||||
if (bytes < threshold) {
|
||||
return bytes + " Bytes";
|
||||
}
|
||||
|
||||
const f = (out[1] ?? "").substring(0, 2);
|
||||
const units = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
||||
const exponent = Math.floor(Math.log(bytes) / Math.log(base));
|
||||
const value = bytes / Math.pow(base, exponent);
|
||||
|
||||
return `${Number(out[0])}${f === "00" ? "" : `.${f}`} ${
|
||||
" kMGTPEZY"[out.length]
|
||||
}B`;
|
||||
// Format to 2 decimal places and remove trailing zeros
|
||||
const formatted = parseFloat(value.toFixed(2));
|
||||
|
||||
return `${formatted} ${units[exponent]}`;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -100,35 +100,35 @@
|
||||
"@smithy/util-utf8" "^2.0.0"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/client-s3@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.873.0.tgz#60f6e6a4e6c6de249b133c31e078ca483cd3802a"
|
||||
integrity sha512-b+1lSEf+obcC508blw5qEDR1dyTiHViZXbf8G6nFospyqLJS0Vu2py+e+LG2VDVdAouZ8+RvW+uAi73KgsWl0w==
|
||||
"@aws-sdk/client-s3@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.879.0.tgz#18876b8106da8ed29b2cb0d9b239241abb7cc50f"
|
||||
integrity sha512-1bD2Do/OdCIzl72ncHKYamDhPijUErLYpuLvciyYD4Ywt4cVLHjWtVIqb22XOOHYYHE3NqHMd4uRhvXMlsBRoQ==
|
||||
dependencies:
|
||||
"@aws-crypto/sha1-browser" "5.2.0"
|
||||
"@aws-crypto/sha256-browser" "5.2.0"
|
||||
"@aws-crypto/sha256-js" "5.2.0"
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/credential-provider-node" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/credential-provider-node" "3.879.0"
|
||||
"@aws-sdk/middleware-bucket-endpoint" "3.873.0"
|
||||
"@aws-sdk/middleware-expect-continue" "3.873.0"
|
||||
"@aws-sdk/middleware-flexible-checksums" "3.873.0"
|
||||
"@aws-sdk/middleware-flexible-checksums" "3.879.0"
|
||||
"@aws-sdk/middleware-host-header" "3.873.0"
|
||||
"@aws-sdk/middleware-location-constraint" "3.873.0"
|
||||
"@aws-sdk/middleware-logger" "3.873.0"
|
||||
"@aws-sdk/middleware-logger" "3.876.0"
|
||||
"@aws-sdk/middleware-recursion-detection" "3.873.0"
|
||||
"@aws-sdk/middleware-sdk-s3" "3.873.0"
|
||||
"@aws-sdk/middleware-sdk-s3" "3.879.0"
|
||||
"@aws-sdk/middleware-ssec" "3.873.0"
|
||||
"@aws-sdk/middleware-user-agent" "3.873.0"
|
||||
"@aws-sdk/middleware-user-agent" "3.879.0"
|
||||
"@aws-sdk/region-config-resolver" "3.873.0"
|
||||
"@aws-sdk/signature-v4-multi-region" "3.873.0"
|
||||
"@aws-sdk/signature-v4-multi-region" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@aws-sdk/util-endpoints" "3.873.0"
|
||||
"@aws-sdk/util-endpoints" "3.879.0"
|
||||
"@aws-sdk/util-user-agent-browser" "3.873.0"
|
||||
"@aws-sdk/util-user-agent-node" "3.873.0"
|
||||
"@aws-sdk/util-user-agent-node" "3.879.0"
|
||||
"@aws-sdk/xml-builder" "3.873.0"
|
||||
"@smithy/config-resolver" "^4.1.5"
|
||||
"@smithy/core" "^3.8.0"
|
||||
"@smithy/core" "^3.9.0"
|
||||
"@smithy/eventstream-serde-browser" "^4.0.5"
|
||||
"@smithy/eventstream-serde-config-resolver" "^4.1.3"
|
||||
"@smithy/eventstream-serde-node" "^4.0.5"
|
||||
@@ -139,21 +139,21 @@
|
||||
"@smithy/invalid-dependency" "^4.0.5"
|
||||
"@smithy/md5-js" "^4.0.5"
|
||||
"@smithy/middleware-content-length" "^4.0.5"
|
||||
"@smithy/middleware-endpoint" "^4.1.18"
|
||||
"@smithy/middleware-retry" "^4.1.19"
|
||||
"@smithy/middleware-endpoint" "^4.1.19"
|
||||
"@smithy/middleware-retry" "^4.1.20"
|
||||
"@smithy/middleware-serde" "^4.0.9"
|
||||
"@smithy/middleware-stack" "^4.0.5"
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
"@smithy/node-http-handler" "^4.1.1"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
"@smithy/url-parser" "^4.0.5"
|
||||
"@smithy/util-base64" "^4.0.0"
|
||||
"@smithy/util-body-length-browser" "^4.0.0"
|
||||
"@smithy/util-body-length-node" "^4.0.0"
|
||||
"@smithy/util-defaults-mode-browser" "^4.0.26"
|
||||
"@smithy/util-defaults-mode-node" "^4.0.26"
|
||||
"@smithy/util-defaults-mode-browser" "^4.0.27"
|
||||
"@smithy/util-defaults-mode-node" "^4.0.27"
|
||||
"@smithy/util-endpoints" "^3.0.7"
|
||||
"@smithy/util-middleware" "^4.0.5"
|
||||
"@smithy/util-retry" "^4.0.7"
|
||||
@@ -164,63 +164,63 @@
|
||||
tslib "^2.6.2"
|
||||
uuid "^9.0.1"
|
||||
|
||||
"@aws-sdk/client-sso@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.873.0.tgz#e51e7105ef47aa2675490ad602dc266637587403"
|
||||
integrity sha512-EmcrOgFODWe7IsLKFTeSXM9TlQ80/BO1MBISlr7w2ydnOaUYIiPGRRJnDpeIgMaNqT4Rr2cRN2RiMrbFO7gDdA==
|
||||
"@aws-sdk/client-sso@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.879.0.tgz#44b7bcc051af7e89ffff7346bd5f5b0672b48390"
|
||||
integrity sha512-+Pc3OYFpRYpKLKRreovPM63FPPud1/SF9vemwIJfz6KwsBCJdvg7vYD1xLSIp5DVZLeetgf4reCyAA5ImBfZuw==
|
||||
dependencies:
|
||||
"@aws-crypto/sha256-browser" "5.2.0"
|
||||
"@aws-crypto/sha256-js" "5.2.0"
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/middleware-host-header" "3.873.0"
|
||||
"@aws-sdk/middleware-logger" "3.873.0"
|
||||
"@aws-sdk/middleware-logger" "3.876.0"
|
||||
"@aws-sdk/middleware-recursion-detection" "3.873.0"
|
||||
"@aws-sdk/middleware-user-agent" "3.873.0"
|
||||
"@aws-sdk/middleware-user-agent" "3.879.0"
|
||||
"@aws-sdk/region-config-resolver" "3.873.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@aws-sdk/util-endpoints" "3.873.0"
|
||||
"@aws-sdk/util-endpoints" "3.879.0"
|
||||
"@aws-sdk/util-user-agent-browser" "3.873.0"
|
||||
"@aws-sdk/util-user-agent-node" "3.873.0"
|
||||
"@aws-sdk/util-user-agent-node" "3.879.0"
|
||||
"@smithy/config-resolver" "^4.1.5"
|
||||
"@smithy/core" "^3.8.0"
|
||||
"@smithy/core" "^3.9.0"
|
||||
"@smithy/fetch-http-handler" "^5.1.1"
|
||||
"@smithy/hash-node" "^4.0.5"
|
||||
"@smithy/invalid-dependency" "^4.0.5"
|
||||
"@smithy/middleware-content-length" "^4.0.5"
|
||||
"@smithy/middleware-endpoint" "^4.1.18"
|
||||
"@smithy/middleware-retry" "^4.1.19"
|
||||
"@smithy/middleware-endpoint" "^4.1.19"
|
||||
"@smithy/middleware-retry" "^4.1.20"
|
||||
"@smithy/middleware-serde" "^4.0.9"
|
||||
"@smithy/middleware-stack" "^4.0.5"
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
"@smithy/node-http-handler" "^4.1.1"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
"@smithy/url-parser" "^4.0.5"
|
||||
"@smithy/util-base64" "^4.0.0"
|
||||
"@smithy/util-body-length-browser" "^4.0.0"
|
||||
"@smithy/util-body-length-node" "^4.0.0"
|
||||
"@smithy/util-defaults-mode-browser" "^4.0.26"
|
||||
"@smithy/util-defaults-mode-node" "^4.0.26"
|
||||
"@smithy/util-defaults-mode-browser" "^4.0.27"
|
||||
"@smithy/util-defaults-mode-node" "^4.0.27"
|
||||
"@smithy/util-endpoints" "^3.0.7"
|
||||
"@smithy/util-middleware" "^4.0.5"
|
||||
"@smithy/util-retry" "^4.0.7"
|
||||
"@smithy/util-utf8" "^4.0.0"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/core@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.873.0.tgz#d0c2d4e890ff268c0d0c5ed9883203ef9197ab4b"
|
||||
integrity sha512-WrROjp8X1VvmnZ4TBzwM7RF+EB3wRaY9kQJLXw+Aes0/3zRjUXvGIlseobGJMqMEGnM0YekD2F87UaVfot1xeQ==
|
||||
"@aws-sdk/core@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.879.0.tgz#c6ee6b927347b2f89419bfbff77844cdff2b8c10"
|
||||
integrity sha512-AhNmLCrx980LsK+SfPXGh7YqTyZxsK0Qmy18mWmkfY0TSq7WLaSDB5zdQbgbnQCACCHy8DUYXbi4KsjlIhv3PA==
|
||||
dependencies:
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@aws-sdk/xml-builder" "3.873.0"
|
||||
"@smithy/core" "^3.8.0"
|
||||
"@smithy/core" "^3.9.0"
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/signature-v4" "^5.1.3"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
"@smithy/util-base64" "^4.0.0"
|
||||
"@smithy/util-body-length-browser" "^4.0.0"
|
||||
@@ -229,45 +229,45 @@
|
||||
fast-xml-parser "5.2.5"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/credential-provider-env@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.873.0.tgz#6558387cc937c689d5e2a4d0d4e34798d526986f"
|
||||
integrity sha512-FWj1yUs45VjCADv80JlGshAttUHBL2xtTAbJcAxkkJZzLRKVkdyrepFWhv/95MvDyzfbT6PgJiWMdW65l/8ooA==
|
||||
"@aws-sdk/credential-provider-env@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.879.0.tgz#8de1561de6de585bffb8b7ff13ec7a88cb696de6"
|
||||
integrity sha512-JgG7A8SSbr5IiCYL8kk39Y9chdSB5GPwBorDW8V8mr19G9L+qd6ohED4fAocoNFaDnYJ5wGAHhCfSJjzcsPBVQ==
|
||||
dependencies:
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/credential-provider-http@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.873.0.tgz#efa22f1a5fcf74c5a19b9857fe7205853eaa3191"
|
||||
integrity sha512-0sIokBlXIsndjZFUfr3Xui8W6kPC4DAeBGAXxGi9qbFZ9PWJjn1vt2COLikKH3q2snchk+AsznREZG8NW6ezSg==
|
||||
"@aws-sdk/credential-provider-http@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.879.0.tgz#d01b8d32f27c25fd27fb92758b0f0470223df7a9"
|
||||
integrity sha512-2hM5ByLpyK+qORUexjtYyDZsgxVCCUiJQZRMGkNXFEGz6zTpbjfTIWoh3zRgWHEBiqyPIyfEy50eIF69WshcuA==
|
||||
dependencies:
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/fetch-http-handler" "^5.1.1"
|
||||
"@smithy/node-http-handler" "^4.1.1"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
"@smithy/util-stream" "^4.2.4"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/credential-provider-ini@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.873.0.tgz#49ddf51deb23842e91975f88e198b75a9e7cc68f"
|
||||
integrity sha512-bQdGqh47Sk0+2S3C+N46aNQsZFzcHs7ndxYLARH/avYXf02Nl68p194eYFaAHJSQ1re5IbExU1+pbums7FJ9fA==
|
||||
"@aws-sdk/credential-provider-ini@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.879.0.tgz#67a2ad53b37f2d713bb49cbfcc7283fccdc140b9"
|
||||
integrity sha512-07M8zfb73KmMBqVO5/V3Ea9kqDspMX0fO0kaI1bsjWI6ngnMye8jCE0/sIhmkVAI0aU709VA0g+Bzlopnw9EoQ==
|
||||
dependencies:
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/credential-provider-env" "3.873.0"
|
||||
"@aws-sdk/credential-provider-http" "3.873.0"
|
||||
"@aws-sdk/credential-provider-process" "3.873.0"
|
||||
"@aws-sdk/credential-provider-sso" "3.873.0"
|
||||
"@aws-sdk/credential-provider-web-identity" "3.873.0"
|
||||
"@aws-sdk/nested-clients" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/credential-provider-env" "3.879.0"
|
||||
"@aws-sdk/credential-provider-http" "3.879.0"
|
||||
"@aws-sdk/credential-provider-process" "3.879.0"
|
||||
"@aws-sdk/credential-provider-sso" "3.879.0"
|
||||
"@aws-sdk/credential-provider-web-identity" "3.879.0"
|
||||
"@aws-sdk/nested-clients" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/credential-provider-imds" "^4.0.7"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
@@ -275,17 +275,17 @@
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/credential-provider-node@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.873.0.tgz#c33201aef628474056aad029f69255d94f5d990c"
|
||||
integrity sha512-+v/xBEB02k2ExnSDL8+1gD6UizY4Q/HaIJkNSkitFynRiiTQpVOSkCkA0iWxzksMeN8k1IHTE5gzeWpkEjNwbA==
|
||||
"@aws-sdk/credential-provider-node@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.879.0.tgz#379a7edadd8fdfe72fe768d44ee323871b80a2f9"
|
||||
integrity sha512-FYaAqJbnSTrVL2iZkNDj2hj5087yMv2RN2GA8DJhe7iOJjzhzRojrtlfpWeJg6IhK0sBKDH+YXbdeexCzUJvtA==
|
||||
dependencies:
|
||||
"@aws-sdk/credential-provider-env" "3.873.0"
|
||||
"@aws-sdk/credential-provider-http" "3.873.0"
|
||||
"@aws-sdk/credential-provider-ini" "3.873.0"
|
||||
"@aws-sdk/credential-provider-process" "3.873.0"
|
||||
"@aws-sdk/credential-provider-sso" "3.873.0"
|
||||
"@aws-sdk/credential-provider-web-identity" "3.873.0"
|
||||
"@aws-sdk/credential-provider-env" "3.879.0"
|
||||
"@aws-sdk/credential-provider-http" "3.879.0"
|
||||
"@aws-sdk/credential-provider-ini" "3.879.0"
|
||||
"@aws-sdk/credential-provider-process" "3.879.0"
|
||||
"@aws-sdk/credential-provider-sso" "3.879.0"
|
||||
"@aws-sdk/credential-provider-web-identity" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/credential-provider-imds" "^4.0.7"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
@@ -293,61 +293,61 @@
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/credential-provider-process@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.873.0.tgz#2c75a8c7ab86af5cffb767e3652db6203c441513"
|
||||
integrity sha512-ycFv9WN+UJF7bK/ElBq1ugWA4NMbYS//1K55bPQZb2XUpAM2TWFlEjG7DIyOhLNTdl6+CbHlCdhlKQuDGgmm0A==
|
||||
"@aws-sdk/credential-provider-process@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.879.0.tgz#7db16b740833005758e60c6c7f18a49a635dc700"
|
||||
integrity sha512-7r360x1VyEt35Sm1JFOzww2WpnfJNBbvvnzoyLt7WRfK0S/AfsuWhu5ltJ80QvJ0R3AiSNbG+q/btG2IHhDYPQ==
|
||||
dependencies:
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
"@smithy/shared-ini-file-loader" "^4.0.5"
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/credential-provider-sso@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.873.0.tgz#d208878a955b74829cb36d70492f7e27f70995cd"
|
||||
integrity sha512-SudkAOZmjEEYgUrqlUUjvrtbWJeI54/0Xo87KRxm4kfBtMqSx0TxbplNUAk8Gkg4XQNY0o7jpG8tK7r2Wc2+uw==
|
||||
"@aws-sdk/credential-provider-sso@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.879.0.tgz#a9891cb0d74ab8e665e08b84c6caf1be55db87c8"
|
||||
integrity sha512-gd27B0NsgtKlaPNARj4IX7F7US5NuU691rGm0EUSkDsM7TctvJULighKoHzPxDQlrDbVI11PW4WtKS/Zg5zPlQ==
|
||||
dependencies:
|
||||
"@aws-sdk/client-sso" "3.873.0"
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/token-providers" "3.873.0"
|
||||
"@aws-sdk/client-sso" "3.879.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/token-providers" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
"@smithy/shared-ini-file-loader" "^4.0.5"
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/credential-provider-web-identity@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.873.0.tgz#f03d730c1395b6dbdc0a5e121ca4de4deeb586cc"
|
||||
integrity sha512-Gw2H21+VkA6AgwKkBtTtlGZ45qgyRZPSKWs0kUwXVlmGOiPz61t/lBX0vG6I06ZIz2wqeTJ5OA1pWZLqw1j0JQ==
|
||||
"@aws-sdk/credential-provider-web-identity@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.879.0.tgz#743bf63f85370ec98df67987e36b131ae0854b6b"
|
||||
integrity sha512-Jy4uPFfGzHk1Mxy+/Wr43vuw9yXsE2yiF4e4598vc3aJfO0YtA2nSfbKD3PNKRORwXbeKqWPfph9SCKQpWoxEg==
|
||||
dependencies:
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/nested-clients" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/nested-clients" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/crt-loader@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/crt-loader/-/crt-loader-3.873.0.tgz#628468b43a41ed80c9912d3aefb0f3b353cd274f"
|
||||
integrity sha512-e7S68QGIRjPO8ibg8dKssf4m0udlB4upsLZhCdo2ZdafWMGpkfDxtv/+UXb1Lez2FWjQ3Mtnww1z8g38bmZ6dw==
|
||||
"@aws-sdk/crt-loader@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/crt-loader/-/crt-loader-3.879.0.tgz#dd054b56384c99f35575fa0b9e2cbb067ed4ab13"
|
||||
integrity sha512-OqAb+VopEKEp3Jie0kFI9jqJ6xzKKt/A3YHldX1CP/qo/P5+l/K1KeFQvw+VbQl5yndD7nwCEP1s5GL/qBigBQ==
|
||||
dependencies:
|
||||
"@aws-sdk/util-user-agent-node" "3.873.0"
|
||||
"@aws-sdk/util-user-agent-node" "3.879.0"
|
||||
aws-crt "^1.24.0"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/lib-storage@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.873.0.tgz#d8cddea60ec903d8b1e63576890c0bf2c5c1c590"
|
||||
integrity sha512-TcR15G+DOzniMProb+JtifLyAPORVcRw5hks6VPZg/KVOXGtOyXEG7yqnXV+pidc1xWLVvKlG3K+4r72f+zjLw==
|
||||
"@aws-sdk/lib-storage@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.879.0.tgz#62c8b6ad53e0d8e595d5ba486def140de413b0d1"
|
||||
integrity sha512-FAb3vOfLIrf8lPuDoxKRu18DxXfQLEFm7MoXi0jd8ooFjD09jpVCQGNrRuMCqc688wrx7zJSovWObtn4LRjvrg==
|
||||
dependencies:
|
||||
"@smithy/abort-controller" "^4.0.5"
|
||||
"@smithy/middleware-endpoint" "^4.1.18"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/middleware-endpoint" "^4.1.19"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
buffer "5.6.0"
|
||||
events "3.3.0"
|
||||
stream-browserify "3.0.0"
|
||||
@@ -376,15 +376,15 @@
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/middleware-flexible-checksums@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.873.0.tgz#c0134235249902d2f266383feca459f2657a7642"
|
||||
integrity sha512-NNiy2Y876P5cgIhsDlHopbPZS3ugdfBW1va0WdpVBviwAs6KT4irPNPAOyF1/33N/niEDKx0fKQV7ROB70nNPA==
|
||||
"@aws-sdk/middleware-flexible-checksums@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.879.0.tgz#021ccda37c1195221aa8a6e3209e562b7c4a52dd"
|
||||
integrity sha512-U1rcWToy2rlQPQLsx5h73uTC1XYo/JpnlJGCc3Iw7b1qrK8Mke4+rgMPKCfnXELD5TTazGrbT03frxH4Y1Ycvw==
|
||||
dependencies:
|
||||
"@aws-crypto/crc32" "5.2.0"
|
||||
"@aws-crypto/crc32c" "5.2.0"
|
||||
"@aws-crypto/util" "5.2.0"
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/is-array-buffer" "^4.0.0"
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
@@ -414,10 +414,10 @@
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/middleware-logger@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.873.0.tgz#dc6e858ad1a2be56963a36bf7538e8c79a782a7a"
|
||||
integrity sha512-QhNZ8X7pW68kFez9QxUSN65Um0Feo18ZmHxszQZNUhKDsXew/EG9NPQE/HgYcekcon35zHxC4xs+FeNuPurP2g==
|
||||
"@aws-sdk/middleware-logger@3.876.0":
|
||||
version "3.876.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz#16ee45f7bcd887badc8f12d80eef9ba18a0ac97c"
|
||||
integrity sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==
|
||||
dependencies:
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
@@ -433,19 +433,19 @@
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/middleware-sdk-s3@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.873.0.tgz#aba1782bfcaf2b8b8fc545827bb5a1f23949a227"
|
||||
integrity sha512-bOoWGH57ORK2yKOqJMmxBV4b3yMK8Pc0/K2A98MNPuQedXaxxwzRfsT2Qw+PpfYkiijrrNFqDYmQRGntxJ2h8A==
|
||||
"@aws-sdk/middleware-sdk-s3@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.879.0.tgz#41fe59a1d902ae1c92731c7ef8aa0e1df2d6dfe0"
|
||||
integrity sha512-ZTpLr2AbZcCsEzu18YCtB8Tp8tjAWHT0ccfwy3HiL6g9ncuSMW+7BVi1hDYmBidFwpPbnnIMtM0db3pDMR6/WA==
|
||||
dependencies:
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@aws-sdk/util-arn-parser" "3.873.0"
|
||||
"@smithy/core" "^3.8.0"
|
||||
"@smithy/core" "^3.9.0"
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/signature-v4" "^5.1.3"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
"@smithy/util-config-provider" "^4.0.0"
|
||||
"@smithy/util-middleware" "^4.0.5"
|
||||
@@ -462,57 +462,57 @@
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/middleware-user-agent@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.873.0.tgz#a882cd2fb4b992e5b3c2eb0251fd95f44b3dae44"
|
||||
integrity sha512-gHqAMYpWkPhZLwqB3Yj83JKdL2Vsb64sryo8LN2UdpElpS+0fT4yjqSxKTfp7gkhN6TCIxF24HQgbPk5FMYJWw==
|
||||
"@aws-sdk/middleware-user-agent@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.879.0.tgz#e207d6ae2a82059d843200d92a2f7ccbaa3cbc67"
|
||||
integrity sha512-DDSV8228lQxeMAFKnigkd0fHzzn5aauZMYC3CSj6e5/qE7+9OwpkUcjHfb7HZ9KWG6L2/70aKZXHqiJ4xKhOZw==
|
||||
dependencies:
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@aws-sdk/util-endpoints" "3.873.0"
|
||||
"@smithy/core" "^3.8.0"
|
||||
"@aws-sdk/util-endpoints" "3.879.0"
|
||||
"@smithy/core" "^3.9.0"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/nested-clients@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.873.0.tgz#cf9c5c04e25666024d9fc805e768f7b6267ef877"
|
||||
integrity sha512-yg8JkRHuH/xO65rtmLOWcd9XQhxX1kAonp2CliXT44eA/23OBds6XoheY44eZeHfCTgutDLTYitvy3k9fQY6ZA==
|
||||
"@aws-sdk/nested-clients@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.879.0.tgz#478f7c54c26d40dc564747a1caa6b2d10c1ba471"
|
||||
integrity sha512-7+n9NpIz9QtKYnxmw1fHi9C8o0GrX8LbBR4D50c7bH6Iq5+XdSuL5AFOWWQ5cMD0JhqYYJhK/fJsVau3nUtC4g==
|
||||
dependencies:
|
||||
"@aws-crypto/sha256-browser" "5.2.0"
|
||||
"@aws-crypto/sha256-js" "5.2.0"
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/middleware-host-header" "3.873.0"
|
||||
"@aws-sdk/middleware-logger" "3.873.0"
|
||||
"@aws-sdk/middleware-logger" "3.876.0"
|
||||
"@aws-sdk/middleware-recursion-detection" "3.873.0"
|
||||
"@aws-sdk/middleware-user-agent" "3.873.0"
|
||||
"@aws-sdk/middleware-user-agent" "3.879.0"
|
||||
"@aws-sdk/region-config-resolver" "3.873.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@aws-sdk/util-endpoints" "3.873.0"
|
||||
"@aws-sdk/util-endpoints" "3.879.0"
|
||||
"@aws-sdk/util-user-agent-browser" "3.873.0"
|
||||
"@aws-sdk/util-user-agent-node" "3.873.0"
|
||||
"@aws-sdk/util-user-agent-node" "3.879.0"
|
||||
"@smithy/config-resolver" "^4.1.5"
|
||||
"@smithy/core" "^3.8.0"
|
||||
"@smithy/core" "^3.9.0"
|
||||
"@smithy/fetch-http-handler" "^5.1.1"
|
||||
"@smithy/hash-node" "^4.0.5"
|
||||
"@smithy/invalid-dependency" "^4.0.5"
|
||||
"@smithy/middleware-content-length" "^4.0.5"
|
||||
"@smithy/middleware-endpoint" "^4.1.18"
|
||||
"@smithy/middleware-retry" "^4.1.19"
|
||||
"@smithy/middleware-endpoint" "^4.1.19"
|
||||
"@smithy/middleware-retry" "^4.1.20"
|
||||
"@smithy/middleware-serde" "^4.0.9"
|
||||
"@smithy/middleware-stack" "^4.0.5"
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
"@smithy/node-http-handler" "^4.1.1"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
"@smithy/url-parser" "^4.0.5"
|
||||
"@smithy/util-base64" "^4.0.0"
|
||||
"@smithy/util-body-length-browser" "^4.0.0"
|
||||
"@smithy/util-body-length-node" "^4.0.0"
|
||||
"@smithy/util-defaults-mode-browser" "^4.0.26"
|
||||
"@smithy/util-defaults-mode-node" "^4.0.26"
|
||||
"@smithy/util-defaults-mode-browser" "^4.0.27"
|
||||
"@smithy/util-defaults-mode-node" "^4.0.27"
|
||||
"@smithy/util-endpoints" "^3.0.7"
|
||||
"@smithy/util-middleware" "^4.0.5"
|
||||
"@smithy/util-retry" "^4.0.7"
|
||||
@@ -531,42 +531,42 @@
|
||||
"@smithy/util-middleware" "^4.0.5"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/s3-presigned-post@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/s3-presigned-post/-/s3-presigned-post-3.873.0.tgz#c023eb59c2a74f35906a5f144333a68b4b252ddb"
|
||||
integrity sha512-z9vmkVpB2rnC9aNLWb08QHVUxpNUOHSNy3+MQMZqd7qBbuhN5Z+ihSMXzWpl6D4L4zOLSS4KrwMHl+xxNAhfyA==
|
||||
"@aws-sdk/s3-presigned-post@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/s3-presigned-post/-/s3-presigned-post-3.879.0.tgz#ecd14815f55334404a403d905cc4431bad0db74d"
|
||||
integrity sha512-cBoe8AiVRixIpxZtQNxnTJ3vq0d6lMxZTvjr3AWvGF+LcfiQHjThzt4lZIVlGCtojy3OYnYLE64pvJm9MvrJgw==
|
||||
dependencies:
|
||||
"@aws-sdk/client-s3" "3.873.0"
|
||||
"@aws-sdk/client-s3" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@aws-sdk/util-format-url" "3.873.0"
|
||||
"@smithy/middleware-endpoint" "^4.1.18"
|
||||
"@smithy/middleware-endpoint" "^4.1.19"
|
||||
"@smithy/signature-v4" "^5.1.3"
|
||||
"@smithy/types" "^4.3.2"
|
||||
"@smithy/util-hex-encoding" "^4.0.0"
|
||||
"@smithy/util-utf8" "^4.0.0"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/s3-request-presigner@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.873.0.tgz#a89f09c97dc61a62ba9d988b89abc3c9bf687e3c"
|
||||
integrity sha512-DiVlfCpdR7EaZSNPQwBB1jq8INWezKMWb3BUOWxrOcIcS3p2WpKbYl0H76D6TCHvQzXRVgKSSM6tHuWPoJtUHA==
|
||||
"@aws-sdk/s3-request-presigner@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.879.0.tgz#39e6406a2b4441cc78b4520b0c9faade25beebeb"
|
||||
integrity sha512-WNUrY4UW1ZAkBiSq9HnhJcG/1NdrEy37DDxqE8u0OdIZHhbgU1x1r4iXgQssAZhV6D+Ib70oiQGtPSH/lXeMKg==
|
||||
dependencies:
|
||||
"@aws-sdk/signature-v4-multi-region" "3.873.0"
|
||||
"@aws-sdk/signature-v4-multi-region" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@aws-sdk/util-format-url" "3.873.0"
|
||||
"@smithy/middleware-endpoint" "^4.1.18"
|
||||
"@smithy/middleware-endpoint" "^4.1.19"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/signature-v4-crt@^3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.873.0.tgz#d105ec19753bed95ad459b1cec54082f7000674b"
|
||||
integrity sha512-IEEN1vGK90EDewE9gikbnM5maZ8j/k7vxqxZ+6mysWStW8eEeDYWW5MJ7o7h0AfLNqDvbFT/GkX7beB3a1UgHg==
|
||||
"@aws-sdk/signature-v4-crt@^3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.879.0.tgz#02ed9d6717055e09c85096c9988eb80a2d4d3e1d"
|
||||
integrity sha512-Xrl6blxa+NEtnbMAfkcUCd7HlgJkcQ0/dDkxnoIa9n+U/ZldVpOSQEwjiM06dyTJf0pyA1LoHakPQOA8EYv2Vg==
|
||||
dependencies:
|
||||
"@aws-sdk/crt-loader" "3.873.0"
|
||||
"@aws-sdk/signature-v4-multi-region" "3.873.0"
|
||||
"@aws-sdk/crt-loader" "3.879.0"
|
||||
"@aws-sdk/signature-v4-multi-region" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/querystring-parser" "^4.0.5"
|
||||
"@smithy/signature-v4" "^5.1.3"
|
||||
@@ -574,25 +574,25 @@
|
||||
"@smithy/util-middleware" "^4.0.5"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/signature-v4-multi-region@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.873.0.tgz#f202aa6bfd6ab465cffb8be611a57de04cd0d6ee"
|
||||
integrity sha512-FQ5OIXw1rmDud7f/VO9y2Mg9rX1o4MnngRKUOD8mS9ALK4uxKrTczb4jA+uJLSLwTqMGs3bcB1RzbMW1zWTMwQ==
|
||||
"@aws-sdk/signature-v4-multi-region@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.879.0.tgz#ce164fe2a7f417bf341237ca017973d79910ecba"
|
||||
integrity sha512-MDsw0EWOHyKac75X3gD8tLWtmPuRliS/s4IhWRhsdDCU13wewHIs5IlA5B65kT6ISf49yEIalEH3FHUSVqdmIQ==
|
||||
dependencies:
|
||||
"@aws-sdk/middleware-sdk-s3" "3.873.0"
|
||||
"@aws-sdk/middleware-sdk-s3" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/signature-v4" "^5.1.3"
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/token-providers@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.873.0.tgz#43e239d1e6de7d1aa059accfe948a5d8d430b74b"
|
||||
integrity sha512-BWOCeFeV/Ba8fVhtwUw/0Hz4wMm9fjXnMb4Z2a5he/jFlz5mt1/rr6IQ4MyKgzOaz24YrvqsJW2a0VUKOaYDvg==
|
||||
"@aws-sdk/token-providers@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.879.0.tgz#7c2806f23dc740853da6fe6b7d8a76ef19d4b428"
|
||||
integrity sha512-47J7sCwXdnw9plRZNAGVkNEOlSiLb/kR2slnDIHRK9NB/ECKsoqgz5OZQJ9E2f0yqOs8zSNJjn3T01KxpgW8Qw==
|
||||
dependencies:
|
||||
"@aws-sdk/core" "3.873.0"
|
||||
"@aws-sdk/nested-clients" "3.873.0"
|
||||
"@aws-sdk/core" "3.879.0"
|
||||
"@aws-sdk/nested-clients" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
"@smithy/shared-ini-file-loader" "^4.0.5"
|
||||
@@ -614,10 +614,10 @@
|
||||
dependencies:
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/util-endpoints@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.873.0.tgz#11afbcf503bdbcf10c0ed08c81696303b8bb5fb0"
|
||||
integrity sha512-YByHrhjxYdjKRf/RQygRK1uh0As1FIi9+jXTcIEX/rBgN8mUByczr2u4QXBzw7ZdbdcOBMOkPnLRjNOWW1MkFg==
|
||||
"@aws-sdk/util-endpoints@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.879.0.tgz#e30c15beede883d327dbd290c47512d6d700a2e9"
|
||||
integrity sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A==
|
||||
dependencies:
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
@@ -652,12 +652,12 @@
|
||||
bowser "^2.11.0"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@aws-sdk/util-user-agent-node@3.873.0":
|
||||
version "3.873.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.873.0.tgz#3ebc4a7460eb10aba213d9ffc04aeb1bd613a7e1"
|
||||
integrity sha512-9MivTP+q9Sis71UxuBaIY3h5jxH0vN3/ZWGxO8ADL19S2OIfknrYSAfzE5fpoKROVBu0bS4VifHOFq4PY1zsxw==
|
||||
"@aws-sdk/util-user-agent-node@3.879.0":
|
||||
version "3.879.0"
|
||||
resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.879.0.tgz#e14001b5fd08d14dab2dd12d08ecd1322ec99615"
|
||||
integrity sha512-A5KGc1S+CJRzYnuxJQQmH1BtGsz46AgyHkqReKfGiNQA8ET/9y9LQ5t2ABqnSBHHIh3+MiCcQSkUZ0S3rTodrQ==
|
||||
dependencies:
|
||||
"@aws-sdk/middleware-user-agent" "3.873.0"
|
||||
"@aws-sdk/middleware-user-agent" "3.879.0"
|
||||
"@aws-sdk/types" "3.862.0"
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
"@smithy/types" "^4.3.2"
|
||||
@@ -3912,10 +3912,10 @@
|
||||
"@smithy/util-middleware" "^4.0.5"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@smithy/core@^3.8.0":
|
||||
version "3.8.0"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.8.0.tgz#321d03564b753025b92e4476579efcd5c505ab1f"
|
||||
integrity sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==
|
||||
"@smithy/core@^3.9.0":
|
||||
version "3.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.9.0.tgz#0d0c05136143d5207afc7bbed2367b6baf8de388"
|
||||
integrity sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==
|
||||
dependencies:
|
||||
"@smithy/middleware-serde" "^4.0.9"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
@@ -4065,12 +4065,12 @@
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@smithy/middleware-endpoint@^4.1.18":
|
||||
version "4.1.18"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz#81b2f85e3c72b0f1a2d8776e01b0a2968af62c0a"
|
||||
integrity sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==
|
||||
"@smithy/middleware-endpoint@^4.1.19":
|
||||
version "4.1.19"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz#613b843a274b7511862a73867b44cafe8a0a0d3c"
|
||||
integrity sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==
|
||||
dependencies:
|
||||
"@smithy/core" "^3.8.0"
|
||||
"@smithy/core" "^3.9.0"
|
||||
"@smithy/middleware-serde" "^4.0.9"
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
"@smithy/shared-ini-file-loader" "^4.0.5"
|
||||
@@ -4079,15 +4079,15 @@
|
||||
"@smithy/util-middleware" "^4.0.5"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@smithy/middleware-retry@^4.1.19":
|
||||
version "4.1.19"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.1.19.tgz#19c013c1a548e1185cc1bfabfab3f498667c9e89"
|
||||
integrity sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==
|
||||
"@smithy/middleware-retry@^4.1.20":
|
||||
version "4.1.20"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.1.20.tgz#7fa8617b424f813ab71025712094e61e0f31b0a3"
|
||||
integrity sha512-T3maNEm3Masae99eFdx1Q7PIqBBEVOvRd5hralqKZNeIivnoGNx5OFtI3DiZ5gCjUkl0mNondlzSXeVxkinh7Q==
|
||||
dependencies:
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/service-error-classification" "^4.0.7"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
"@smithy/util-middleware" "^4.0.5"
|
||||
"@smithy/util-retry" "^4.0.7"
|
||||
@@ -4195,13 +4195,13 @@
|
||||
"@smithy/util-utf8" "^4.0.0"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@smithy/smithy-client@^4.4.10":
|
||||
version "4.4.10"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.4.10.tgz#c4b49c1d1ff9eb813f88f1e425a5dfac25a03180"
|
||||
integrity sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==
|
||||
"@smithy/smithy-client@^4.5.0":
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.5.0.tgz#d8663d757d590a5049818f138ff024784eba9577"
|
||||
integrity sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==
|
||||
dependencies:
|
||||
"@smithy/core" "^3.8.0"
|
||||
"@smithy/middleware-endpoint" "^4.1.18"
|
||||
"@smithy/core" "^3.9.0"
|
||||
"@smithy/middleware-endpoint" "^4.1.19"
|
||||
"@smithy/middleware-stack" "^4.0.5"
|
||||
"@smithy/protocol-http" "^5.1.3"
|
||||
"@smithy/types" "^4.3.2"
|
||||
@@ -4270,27 +4270,27 @@
|
||||
dependencies:
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@smithy/util-defaults-mode-browser@^4.0.26":
|
||||
version "4.0.26"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.26.tgz#fc04cd466bbb0d80e41930af8d6a8c33c48490f2"
|
||||
integrity sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==
|
||||
"@smithy/util-defaults-mode-browser@^4.0.27":
|
||||
version "4.0.27"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.27.tgz#2ad80730a6e90ff82872d20ea7ea05b9d3b0f175"
|
||||
integrity sha512-i/Fu6AFT5014VJNgWxKomBJP/GB5uuOsM4iHdcmplLm8B1eAqnRItw4lT2qpdO+mf+6TFmf6dGcggGLAVMZJsQ==
|
||||
dependencies:
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
bowser "^2.11.0"
|
||||
tslib "^2.6.2"
|
||||
|
||||
"@smithy/util-defaults-mode-node@^4.0.26":
|
||||
version "4.0.26"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.26.tgz#adfee8c54301ec4cbabed58cd604995a81b4a8dc"
|
||||
integrity sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==
|
||||
"@smithy/util-defaults-mode-node@^4.0.27":
|
||||
version "4.0.27"
|
||||
resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.27.tgz#119793c1ba38e1b6dcc9b7ccc17f2ab4cd56f653"
|
||||
integrity sha512-3W0qClMyxl/ELqTA39aNw1N+pN0IjpXT7lPFvZ8zTxqVFP7XCpACB9QufmN4FQtd39xbgS7/Lekn7LmDa63I5w==
|
||||
dependencies:
|
||||
"@smithy/config-resolver" "^4.1.5"
|
||||
"@smithy/credential-provider-imds" "^4.0.7"
|
||||
"@smithy/node-config-provider" "^4.1.4"
|
||||
"@smithy/property-provider" "^4.0.5"
|
||||
"@smithy/smithy-client" "^4.4.10"
|
||||
"@smithy/smithy-client" "^4.5.0"
|
||||
"@smithy/types" "^4.3.2"
|
||||
tslib "^2.6.2"
|
||||
|
||||
@@ -7425,10 +7425,10 @@ dc-polyfill@^0.1.10:
|
||||
resolved "https://registry.yarnpkg.com/dc-polyfill/-/dc-polyfill-0.1.10.tgz#6f2ada1a9e449587c363ca98cfb79b443cf74b70"
|
||||
integrity sha512-9iSbB8XZ7aIrhUtWI5ulEOJ+IyUN+axquodHK+bZO4r7HfY/xwmo6I4fYYf+aiDom+WMcN/wnzCz+pKvHDDCug==
|
||||
|
||||
dd-trace@^5.63.0:
|
||||
version "5.63.0"
|
||||
resolved "https://registry.yarnpkg.com/dd-trace/-/dd-trace-5.63.0.tgz#654a6f700ad5860b417464c0f20e022f6cb34395"
|
||||
integrity sha512-gmvcqeJ71BqbPvEDDd+vvED1ByjcnQJ60UJGParxOW0PrHCOmoGUK57K9vZDAfUIsduZLBcfkYtAgr0YWjpciA==
|
||||
dd-trace@^5.64.0:
|
||||
version "5.64.0"
|
||||
resolved "https://registry.yarnpkg.com/dd-trace/-/dd-trace-5.64.0.tgz#057ee30a6e1817820009e36b332a8cde1cc0db10"
|
||||
integrity sha512-24vovvBujJ6zMv5CSro0X29YN8DkoSLd4IVEGUtIWA6ypltU38q+PtPngwRhjb/v11/jvJ+U0P0zyNjfP9FZWg==
|
||||
dependencies:
|
||||
"@datadog/libdatadog" "0.7.0"
|
||||
"@datadog/native-appsec" "10.1.0"
|
||||
@@ -7827,10 +7827,10 @@ emoji-mart@^5.6.0:
|
||||
resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-5.6.0.tgz#71b3ed0091d3e8c68487b240d9d6d9a73c27f023"
|
||||
integrity sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==
|
||||
|
||||
emoji-regex@*, emoji-regex@^10.4.0:
|
||||
version "10.4.0"
|
||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4"
|
||||
integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==
|
||||
emoji-regex@*, emoji-regex@^10.5.0:
|
||||
version "10.5.0"
|
||||
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.5.0.tgz#be23498b9e39db476226d8e81e467f39aca26b78"
|
||||
integrity sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==
|
||||
|
||||
emoji-regex@^8.0.0:
|
||||
version "8.0.0"
|
||||
@@ -11965,40 +11965,40 @@ pend@~1.2.0:
|
||||
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
||||
integrity "sha1-elfrVQpng/kRUzH89GY9XI4AelA= sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
|
||||
|
||||
pg-cloudflare@^1.2.5:
|
||||
version "1.2.5"
|
||||
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz#2e3649c38a7a9c74a7e5327c8098a2fd9af595bd"
|
||||
integrity sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==
|
||||
pg-cloudflare@^1.2.7:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz#a1f3d226bab2c45ae75ea54d65ec05ac6cfafbef"
|
||||
integrity sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==
|
||||
|
||||
pg-connection-string@^2.6.1, pg-connection-string@^2.8.5:
|
||||
version "2.8.5"
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.8.5.tgz#82cefd0269cb64a09603342d9b69e8392e6eb6cd"
|
||||
integrity sha512-Ni8FuZ8yAF+sWZzojvtLE2b03cqjO5jNULcHFfM9ZZ0/JXrgom5pBREbtnAw7oxsxJqHw9Nz/XWORUEL3/IFow==
|
||||
pg-connection-string@^2.6.1, pg-connection-string@^2.9.1:
|
||||
version "2.9.1"
|
||||
resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.9.1.tgz#bb1fd0011e2eb76ac17360dc8fa183b2d3465238"
|
||||
integrity sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==
|
||||
|
||||
pg-int8@1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
|
||||
integrity "sha1-lDvUY79bcbQXARX4D478mgwOt4w= sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
|
||||
|
||||
pg-pool@^3.9.6:
|
||||
version "3.9.6"
|
||||
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.9.6.tgz#c6fde89dee615d6c262724e68a3a37e9593157fc"
|
||||
integrity sha512-rFen0G7adh1YmgvrmE5IPIqbb+IgEzENUm+tzm6MLLDSlPRoZVhzU1WdML9PV2W5GOdRA9qBKURlbt1OsXOsPw==
|
||||
pg-pool@^3.10.1:
|
||||
version "3.10.1"
|
||||
resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.10.1.tgz#481047c720be2d624792100cac1816f8850d31b2"
|
||||
integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==
|
||||
|
||||
pg-protocol@^1.9.5:
|
||||
version "1.9.5"
|
||||
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.9.5.tgz#e544eff37d6ab79c26281d7c0b59ac9be4862686"
|
||||
integrity sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==
|
||||
pg-protocol@^1.10.3:
|
||||
version "1.10.3"
|
||||
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.3.tgz#ac9e4778ad3f84d0c5670583bab976ea0a34f69f"
|
||||
integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==
|
||||
|
||||
pg-tsquery@^8.4.2:
|
||||
version "8.4.2"
|
||||
resolved "https://registry.yarnpkg.com/pg-tsquery/-/pg-tsquery-8.4.2.tgz#f28e6242f15f4d8535ac08a0f9083ce04e42e1e4"
|
||||
integrity sha512-waJSlBIKE+shDhuDpuQglTH6dG5zakDhnrnxu8XB8V5c7yoDSuy4pOxY6t2dyoxTjaKMcMmlByJN7n9jx9eqMA==
|
||||
|
||||
pg-types@^2.1.0:
|
||||
pg-types@2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
|
||||
integrity "sha1-LQJQ1jZFT3z6O2rgOC/fqAYyVKM= sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="
|
||||
integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
|
||||
dependencies:
|
||||
pg-int8 "1.0.1"
|
||||
postgres-array "~2.0.0"
|
||||
@@ -12006,25 +12006,25 @@ pg-types@^2.1.0:
|
||||
postgres-date "~1.0.4"
|
||||
postgres-interval "^1.1.0"
|
||||
|
||||
pg@^8.15.6:
|
||||
version "8.15.6"
|
||||
resolved "https://registry.yarnpkg.com/pg/-/pg-8.15.6.tgz#2a28e98fb6cab18b886ce58b2c184d712a94880a"
|
||||
integrity sha512-yvao7YI3GdmmrslNVsZgx9PfntfWrnXwtR+K/DjI0I/sTKif4Z623um+sjVZ1hk5670B+ODjvHDAckKdjmPTsg==
|
||||
pg@^8.16.3:
|
||||
version "8.16.3"
|
||||
resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.3.tgz#160741d0b44fdf64680e45374b06d632e86c99fd"
|
||||
integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==
|
||||
dependencies:
|
||||
pg-connection-string "^2.8.5"
|
||||
pg-pool "^3.9.6"
|
||||
pg-protocol "^1.9.5"
|
||||
pg-types "^2.1.0"
|
||||
pgpass "1.x"
|
||||
pg-connection-string "^2.9.1"
|
||||
pg-pool "^3.10.1"
|
||||
pg-protocol "^1.10.3"
|
||||
pg-types "2.2.0"
|
||||
pgpass "1.0.5"
|
||||
optionalDependencies:
|
||||
pg-cloudflare "^1.2.5"
|
||||
pg-cloudflare "^1.2.7"
|
||||
|
||||
pgpass@1.x:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.4.tgz#85eb93a83800b20f8057a2b029bf05abaf94ea9c"
|
||||
integrity "sha1-heuTqDgAsg+AV6KwKb8Fq6+U6pw= sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w=="
|
||||
pgpass@1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d"
|
||||
integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==
|
||||
dependencies:
|
||||
split2 "^3.1.1"
|
||||
split2 "^4.1.0"
|
||||
|
||||
picocolors@^1.1.1:
|
||||
version "1.1.1"
|
||||
@@ -12333,10 +12333,10 @@ prosemirror-inputrules@^1.5.0:
|
||||
prosemirror-state "^1.0.0"
|
||||
prosemirror-transform "^1.0.0"
|
||||
|
||||
prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.2.2:
|
||||
version "1.2.2"
|
||||
resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz#14a54763a29c7b2704f561088ccf3384d14eb77e"
|
||||
integrity "sha1-FKVHY6KceycE9WEIjM8zhNFOt34= sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ=="
|
||||
prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.2.2, prosemirror-keymap@^1.2.3:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz#c0f6ab95f75c0b82c97e44eb6aaf29cbfc150472"
|
||||
integrity sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==
|
||||
dependencies:
|
||||
prosemirror-state "^1.0.0"
|
||||
w3c-keyname "^2.2.0"
|
||||
@@ -12634,11 +12634,6 @@ react-is@^17.0.1:
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
|
||||
integrity "sha1-GZQx7qqi4J+GQn77tPFHPttHYJs= sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
|
||||
|
||||
react-medium-image-zoom@5.2.14:
|
||||
version "5.2.14"
|
||||
resolved "https://registry.yarnpkg.com/react-medium-image-zoom/-/react-medium-image-zoom-5.2.14.tgz#87032d079fce4a21a17770d6709f739872580906"
|
||||
integrity sha512-nfTVYcAUnBzXQpPDcZL+cG/e6UceYUIG+zDcnemL7jtAqbJjVVkA85RgneGtJeni12dTyiRPZVM6Szkmwd/o8w==
|
||||
|
||||
react-merge-refs@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-2.1.1.tgz#e46763f8f1b881c0226ee54a1a2a10ffefba0233"
|
||||
@@ -13709,13 +13704,18 @@ split-on-first@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
|
||||
integrity "sha1-9hCv7uOxK84dDDBCXnY5i3gkml8= sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="
|
||||
|
||||
split2@^3.1.0, split2@^3.1.1:
|
||||
split2@^3.1.0:
|
||||
version "3.2.2"
|
||||
resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
|
||||
integrity "sha1-vyzyo32DgxLCSciSBv16F90SNl8= sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg=="
|
||||
dependencies:
|
||||
readable-stream "^3.0.0"
|
||||
|
||||
split2@^4.1.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
|
||||
integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==
|
||||
|
||||
sprintf-js@^1.0.3, sprintf-js@^1.1.1:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
|
||||
@@ -14342,10 +14342,10 @@ tunnel-agent@^0.6.0:
|
||||
dependencies:
|
||||
safe-buffer "^5.0.1"
|
||||
|
||||
turndown@^7.2.0:
|
||||
version "7.2.0"
|
||||
resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.2.0.tgz#67d614fe8371fb511079a93345abfd156c0ffcf4"
|
||||
integrity sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==
|
||||
turndown@^7.2.1:
|
||||
version "7.2.1"
|
||||
resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.2.1.tgz#633ff4ff88951fe1db58f7dd32a25ba3f6ff2c48"
|
||||
integrity sha512-7YiPJw6rLClQL3oUKN3KgMaXeJJ2lAyZItclgKDurqnH61so4k4IH/qwmMva0zpuJc/FhRExBBnk7EbeFANlgQ==
|
||||
dependencies:
|
||||
"@mixmark-io/domino" "^2.2.0"
|
||||
|
||||
|
||||