Compare commits

..

1 Commits

Author SHA1 Message Date
tommoor 33307c636a chore: Compressed inefficient images automatically 2025-09-01 09:13:04 +00:00
40 changed files with 544 additions and 1358 deletions
+8 -4
View File
@@ -7,7 +7,8 @@
"roots": ["<rootDir>/server", "<rootDir>/plugins"],
"moduleNameMapper": {
"^@server/(.*)$": "<rootDir>/server/$1",
"^@shared/(.*)$": "<rootDir>/shared/$1"
"^@shared/(.*)$": "<rootDir>/shared/$1",
"react-medium-image-zoom": "<rootDir>/__mocks__/react-medium-image-zoom.js"
},
"setupFiles": ["<rootDir>/__mocks__/console.js"],
"setupFilesAfterEnv": ["<rootDir>/server/test/setup.ts"],
@@ -21,7 +22,8 @@
"^~/(.*)$": "<rootDir>/app/$1",
"^@shared/(.*)$": "<rootDir>/shared/$1",
"^.*[.](gif|ttf|eot|svg)$": "<rootDir>/__test__/fileMock.js",
"^uuid$": "<rootDir>/node_modules/uuid/dist/index.js"
"^uuid$": "<rootDir>/node_modules/uuid/dist/index.js",
"react-medium-image-zoom": "<rootDir>/__mocks__/react-medium-image-zoom.js"
},
"modulePaths": ["<rootDir>/app"],
"setupFiles": ["<rootDir>/__mocks__/window.js"],
@@ -36,7 +38,8 @@
"roots": ["<rootDir>/shared"],
"moduleNameMapper": {
"^@server/(.*)$": "<rootDir>/server/$1",
"^@shared/(.*)$": "<rootDir>/shared/$1"
"^@shared/(.*)$": "<rootDir>/shared/$1",
"react-medium-image-zoom": "<rootDir>/__mocks__/react-medium-image-zoom.js"
},
"setupFiles": ["<rootDir>/__mocks__/console.js"],
"setupFilesAfterEnv": ["<rootDir>/shared/test/setup.ts"],
@@ -49,7 +52,8 @@
"^~/(.*)$": "<rootDir>/app/$1",
"^@shared/(.*)$": "<rootDir>/shared/$1",
"^.*[.](gif|ttf|eot|svg)$": "<rootDir>/__test__/fileMock.js",
"^uuid$": "<rootDir>/node_modules/uuid/dist/index.js"
"^uuid$": "<rootDir>/node_modules/uuid/dist/index.js",
"react-medium-image-zoom": "<rootDir>/__mocks__/react-medium-image-zoom.js"
},
"setupFiles": ["<rootDir>/__mocks__/window.js"],
"testEnvironment": "jsdom",
+2 -2
View File
@@ -3,7 +3,7 @@ Business Source License 1.1
Parameters
Licensor: General Outline, Inc.
Licensed Work: Outline 0.87.3
Licensed Work: Outline 0.87.1
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-09-01
Change Date: 2029-08-31
Change License: Apache License, Version 2.0
-840
View File
@@ -1,840 +0,0 @@
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);
+1 -1
View File
@@ -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, dictionary);
items = getFormattingMenuItems(state, isTemplate, isMobile, dictionary);
}
// Some extensions may be disabled, remove corresponding items
-17
View File
@@ -54,7 +54,6 @@ 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 */
@@ -146,8 +145,6 @@ 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;
};
/**
@@ -177,7 +174,6 @@ export class Editor extends React.PureComponent<
isRTL: false,
isEditorFocused: false,
selectionToolbarOpen: false,
activeLightboxImgPos: null,
};
isInitialized = false;
@@ -716,13 +712,6 @@ 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.
*
@@ -842,12 +831,6 @@ export class Editor extends React.PureComponent<
)}
</Observer>
</Flex>
{this.state.activeLightboxImgPos && (
<Lightbox
onUpdate={this.updateActiveLightbox}
activePos={this.state.activeLightboxImgPos}
/>
)}
</EditorContext.Provider>
</PortalContext.Provider>
);
+5 -10
View File
@@ -30,22 +30,17 @@ 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,
@@ -203,7 +198,7 @@ export default function formattingMenuItems(
shortcut: `⇧+Tab`,
icon: <OutdentIcon />,
visible:
isTouch && isInList(state, { types: ["ordered_list", "bullet_list"] }),
isMobile && isInList(state, { types: ["ordered_list", "bullet_list"] }),
},
{
name: "indentList",
@@ -211,21 +206,21 @@ export default function formattingMenuItems(
shortcut: `Tab`,
icon: <IndentIcon />,
visible:
isTouch && isInList(state, { types: ["ordered_list", "bullet_list"] }),
isMobile && isInList(state, { types: ["ordered_list", "bullet_list"] }),
},
{
name: "outdentCheckboxList",
tooltip: dictionary.outdent,
shortcut: `⇧+Tab`,
icon: <OutdentIcon />,
visible: isTouch && isInList(state, { types: ["checkbox_list"] }),
visible: isMobile && isInList(state, { types: ["checkbox_list"] }),
},
{
name: "indentCheckboxList",
tooltip: dictionary.indent,
shortcut: `Tab`,
icon: <IndentIcon />,
visible: isTouch && isInList(state, { types: ["checkbox_list"] }),
visible: isMobile && isInList(state, { types: ["checkbox_list"] }),
},
{
name: "separator",
+4 -4
View File
@@ -204,10 +204,10 @@ export default class DocumentsStore extends Store<Document> {
}
get(id: string): Document | undefined {
return id
? (this.data.get(id) ??
this.orderedData.find((doc) => id.endsWith(doc.urlId)))
: undefined;
return (
this.data.get(id) ??
this.orderedData.find((doc) => id.endsWith(doc.urlId))
);
}
@computed
+4 -4
View File
@@ -167,9 +167,9 @@ export default class SharesStore extends Store<Share> {
find(this.orderedData, (share) => share.documentId === documentId);
get(id: string): Share | undefined {
return id
? (this.data.get(id) ??
this.orderedData.find((share) => id.endsWith(share.urlId)))
: undefined;
return (
this.data.get(id) ??
this.orderedData.find((share) => id.endsWith(share.urlId))
);
}
}
+1 -1
View File
@@ -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 id ? this.data.get(id) : undefined;
return this.data.get(id);
}
@action
+12 -11
View File
@@ -51,11 +51,11 @@
"> 0.25%, not dead"
],
"dependencies": {
"@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",
"@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",
"@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.64.0",
"dd-trace": "^5.63.0",
"diff": "^5.2.0",
"email-providers": "^1.14.0",
"emoji-mart": "^5.6.0",
"emoji-regex": "^10.5.0",
"emoji-regex": "^10.4.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.16.3",
"pg": "^8.15.6",
"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.3",
"prosemirror-keymap": "^1.2.2",
"prosemirror-markdown": "^1.13.2",
"prosemirror-model": "^1.25.2",
"prosemirror-schema-list": "^1.5.1",
@@ -220,6 +220,7 @@
"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",
@@ -257,7 +258,7 @@
"tiny-cookie": "^2.5.1",
"tmp": "^0.2.5",
"tunnel-agent": "^0.6.0",
"turndown": "^7.2.1",
"turndown": "^7.2.0",
"ukkonen": "^2.2.0",
"umzug": "^3.8.2",
"utility-types": "^3.11.0",
@@ -381,6 +382,6 @@
"qs": "6.9.7",
"prismjs": "1.30.0"
},
"version": "0.87.3",
"version": "0.87.1",
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}
+1 -17
View File
@@ -16,7 +16,6 @@ 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();
@@ -109,22 +108,7 @@ 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) {
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");
return ctx.redirectOnClient(ctx.request.href + "&follow=true", "POST");
}
let user!: User;
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 874 B

After

Width:  |  Height:  |  Size: 922 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 713 B

After

Width:  |  Height:  |  Size: 759 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1010 B

After

Width:  |  Height:  |  Size: 1.0 KiB

-11
View File
@@ -755,17 +755,6 @@ 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
*/
+3 -9
View File
@@ -150,12 +150,6 @@ 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);
@@ -177,15 +171,15 @@ function buildAgent(
proxyURL.username = parsedProxyURL.username;
proxyURL.password = parsedProxyURL.password;
}
agent = useFilteringAgent(proxyURL.toString(), filteringOptions);
agent = useFilteringAgent(proxyURL.toString(), agentOptions);
} else {
// Note request filtering agent does not support https tunneling via a proxy
agent =
buildTunnel(parsedProxyURL, agentOptions) ||
useFilteringAgent(parsedURL.toString(), filteringOptions);
useFilteringAgent(parsedURL.toString(), agentOptions);
}
} else {
agent = useFilteringAgent(parsedURL.toString(), filteringOptions);
agent = useFilteringAgent(parsedURL.toString(), agentOptions);
}
if (options.signal) {
-2
View File
@@ -24,7 +24,6 @@ export default abstract class OAuthClient {
try {
response = await fetch(this.endpoints.userinfo, {
method: "GET",
allowPrivateIPAddress: true,
headers: {
Authorization: `Bearer ${accessToken}`,
"Content-Type": "application/json",
@@ -60,7 +59,6 @@ export default abstract class OAuthClient {
response = await fetch(endpoint, {
method: "POST",
allowPrivateIPAddress: true,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
-1
View File
@@ -98,7 +98,6 @@ export async function request(
) {
const response = await fetch(endpoint, {
method,
allowPrivateIPAddress: true,
headers: {
Authorization: `Bearer ${accessToken}`,
"Content-Type": "application/json",
+1 -1
View File
@@ -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 "); // 4 space indent
.replace(/\n/gm, "\n "); // 2 space indent
let prefix = options.bulletListMarker + " ";
const parent = node.parentNode;
+7 -32
View File
@@ -7,13 +7,11 @@ 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 */
@@ -24,15 +22,13 @@ type Props = ComponentProps & {
};
const Image = (props: Props) => {
const { isSelected, node, isEditable, onChangeSize, onClick } = props;
const { isSelected, node, isEditable, onChangeSize } = 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(
{
@@ -69,25 +65,6 @@ 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
@@ -98,11 +75,11 @@ const Image = (props: Props) => {
{!dragging && width > 60 && isDownloadable && (
<Actions>
{isExternalUrl(src) && (
<Button onClick={handleOpen} aria-label={t("Open")}>
<Button onClick={handleOpen}>
<GlobeIcon />
</Button>
)}
<Button onClick={props.onDownload} aria-label={t("Download")}>
<Button onClick={props.onDownload}>
<DownloadIcon />
</Button>
</Actions>
@@ -112,7 +89,7 @@ const Image = (props: Props) => {
<CrossIcon size={16} /> Image failed to load
</Error>
) : (
<>
<ImageZoom caption={props.node.attrs.alt}>
<img
className={EditorStyleHelper.imageHandle}
style={{
@@ -146,8 +123,6 @@ const Image = (props: Props) => {
}));
}
}}
onClick={handleImageClick}
onTouchStart={handleImageTouchStart}
/>
{!loaded && width && height && (
<img
@@ -160,7 +135,7 @@ const Image = (props: Props) => {
)}`}
/>
)}
</>
</ImageZoom>
)}
{isEditable && !isFullWidth && isResizable && (
<>
@@ -186,7 +161,7 @@ function getPlaceholder(width: number, height: number) {
return `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" />`;
}
export const Error = styled(Flex)`
const Error = styled(Flex)`
max-width: 100%;
color: ${s("textTertiary")};
font-size: 14px;
+176
View File
@@ -0,0 +1,176 @@
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;
}
}
`;
-3
View File
@@ -693,9 +693,6 @@ img.ProseMirror-separator {
.component-image + img.ProseMirror-separator + br.ProseMirror-trailingBreak {
display: none;
}
.component-image img {
cursor: zoom-in;
}
.${EditorStyleHelper.imageCaption} {
border: 0;
+19
View File
@@ -1,7 +1,26 @@
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" />;
}
+10 -16
View File
@@ -31,18 +31,13 @@ export type EmbedProps = {
};
};
const Img = styled(Image)<{ invertable?: boolean }>`
const Img = styled(Image)`
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 {
@@ -230,7 +225,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" invertable />,
icon: <Img src="/images/codepen.png" alt="Codepen" />,
}),
new EmbedDescriptor({
title: "DBDiagram",
@@ -293,7 +288,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" invertable />,
icon: <Img src="/images/framer.png" alt="Framer" />,
}),
new EmbedDescriptor({
title: "GitHub Gist",
@@ -303,7 +298,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" invertable />,
icon: <Img src="/images/github-gist.png" alt="GitHub" />,
component: Gist,
}),
new EmbedDescriptor({
@@ -451,7 +446,6 @@ 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\/.*)$/,
@@ -464,7 +458,7 @@ const embeds: EmbedDescriptor[] = [
keywords: "code",
defaultHidden: true,
regexMatch: [new RegExp("^https?://jsfiddle\\.net/(.*)/(.*)$")],
icon: <Img src="/images/jsfiddle.png" alt="JSFiddle" invertable />,
icon: <Img src="/images/jsfiddle.png" alt="JSFiddle" />,
component: JSFiddle,
}),
new EmbedDescriptor({
@@ -609,7 +603,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" invertable />,
icon: <Img src="/images/tldraw.png" alt="Tldraw" />,
}),
new EmbedDescriptor({
title: "Trello",
@@ -627,7 +621,7 @@ const embeds: EmbedDescriptor[] = [
),
],
transformMatch: (matches: RegExpMatchArray) => matches[0],
icon: <Img src="/images/typeform.png" alt="Typeform" invertable />,
icon: <Img src="/images/typeform.png" alt="Typeform" />,
}),
new EmbedDescriptor({
title: "Valtown",
@@ -635,7 +629,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" invertable />,
icon: <Img src="/images/valtown.png" alt="Valtown" />,
}),
new EmbedDescriptor({
title: "Vimeo",
+5 -12
View File
@@ -55,7 +55,7 @@ const parseTitleAttribute = (tokenTitle: string): TitleAttributes => {
return attributes;
};
export const downloadImageNode = async (node: ProsemirrorNode) => {
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 }: ComponentProps) =>
({ node, getPos }: { node: ProsemirrorNode; getPos: () => number }) =>
({ 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 }: ComponentProps) =>
({ node }: { node: ProsemirrorNode }) =>
(event: React.MouseEvent) => {
event.preventDefault();
event.stopPropagation();
@@ -264,7 +264,7 @@ export default class Image extends SimpleImage {
};
handleCaptionKeyDown =
({ node, getPos }: ComponentProps) =>
({ node, getPos }: { node: ProsemirrorNode; getPos: () => number }) =>
(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 }: ComponentProps) =>
({ node, getPos }: { node: ProsemirrorNode; getPos: () => number }) =>
(event: React.FocusEvent<HTMLParagraphElement>) => {
const caption = event.currentTarget.innerText;
if (caption === node.attrs.alt) {
@@ -316,16 +316,9 @@ 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)}
>
+1 -9
View File
@@ -76,15 +76,7 @@ export default class SimpleImage extends Node {
};
}
handleClick =
({ getPos }: ComponentProps) =>
() => {
this.editor.updateActiveLightbox(getPos());
};
component = (props: ComponentProps) => (
<ImageComponent {...props} onClick={this.handleClick(props)} />
);
component = (props: ComponentProps) => <ImageComponent {...props} />;
keys(): Record<string, Command> {
return {
+1 -7
View File
@@ -315,12 +315,6 @@
"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",
"Youre offline.": "Youre offline.",
"Sorry, an error occurred.": "Sorry, an error occurred.",
"Click to retry": "Click to retry",
@@ -720,6 +714,7 @@
"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>.",
@@ -1260,6 +1255,5 @@
"{{ 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"
}
+12 -66
View File
@@ -1,72 +1,18 @@
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", () => {
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");
});
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");
});
});
+8 -15
View File
@@ -1,8 +1,5 @@
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
@@ -12,23 +9,19 @@ export function bytesToHumanReadable(bytes: number | undefined) {
return "0 Bytes";
}
// 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;
const out = ("0".repeat((bytes.toString().length * 2) % 3) + bytes).match(
/.{3}/g
);
if (bytes < threshold) {
if (!out || bytes < 1000) {
return bytes + " Bytes";
}
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);
const f = (out[1] ?? "").substring(0, 2);
// Format to 2 decimal places and remove trailing zeros
const formatted = parseFloat(value.toFixed(2));
return `${formatted} ${units[exponent]}`;
return `${Number(out[0])}${f === "00" ? "" : `.${f}`} ${
" kMGTPEZY"[out.length]
}B`;
}
/**
+263 -263
View File
@@ -100,35 +100,35 @@
"@smithy/util-utf8" "^2.0.0"
tslib "^2.6.2"
"@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==
"@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==
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.879.0"
"@aws-sdk/credential-provider-node" "3.879.0"
"@aws-sdk/core" "3.873.0"
"@aws-sdk/credential-provider-node" "3.873.0"
"@aws-sdk/middleware-bucket-endpoint" "3.873.0"
"@aws-sdk/middleware-expect-continue" "3.873.0"
"@aws-sdk/middleware-flexible-checksums" "3.879.0"
"@aws-sdk/middleware-flexible-checksums" "3.873.0"
"@aws-sdk/middleware-host-header" "3.873.0"
"@aws-sdk/middleware-location-constraint" "3.873.0"
"@aws-sdk/middleware-logger" "3.876.0"
"@aws-sdk/middleware-logger" "3.873.0"
"@aws-sdk/middleware-recursion-detection" "3.873.0"
"@aws-sdk/middleware-sdk-s3" "3.879.0"
"@aws-sdk/middleware-sdk-s3" "3.873.0"
"@aws-sdk/middleware-ssec" "3.873.0"
"@aws-sdk/middleware-user-agent" "3.879.0"
"@aws-sdk/middleware-user-agent" "3.873.0"
"@aws-sdk/region-config-resolver" "3.873.0"
"@aws-sdk/signature-v4-multi-region" "3.879.0"
"@aws-sdk/signature-v4-multi-region" "3.873.0"
"@aws-sdk/types" "3.862.0"
"@aws-sdk/util-endpoints" "3.879.0"
"@aws-sdk/util-endpoints" "3.873.0"
"@aws-sdk/util-user-agent-browser" "3.873.0"
"@aws-sdk/util-user-agent-node" "3.879.0"
"@aws-sdk/util-user-agent-node" "3.873.0"
"@aws-sdk/xml-builder" "3.873.0"
"@smithy/config-resolver" "^4.1.5"
"@smithy/core" "^3.9.0"
"@smithy/core" "^3.8.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.19"
"@smithy/middleware-retry" "^4.1.20"
"@smithy/middleware-endpoint" "^4.1.18"
"@smithy/middleware-retry" "^4.1.19"
"@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.5.0"
"@smithy/smithy-client" "^4.4.10"
"@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.27"
"@smithy/util-defaults-mode-node" "^4.0.27"
"@smithy/util-defaults-mode-browser" "^4.0.26"
"@smithy/util-defaults-mode-node" "^4.0.26"
"@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.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==
"@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==
dependencies:
"@aws-crypto/sha256-browser" "5.2.0"
"@aws-crypto/sha256-js" "5.2.0"
"@aws-sdk/core" "3.879.0"
"@aws-sdk/core" "3.873.0"
"@aws-sdk/middleware-host-header" "3.873.0"
"@aws-sdk/middleware-logger" "3.876.0"
"@aws-sdk/middleware-logger" "3.873.0"
"@aws-sdk/middleware-recursion-detection" "3.873.0"
"@aws-sdk/middleware-user-agent" "3.879.0"
"@aws-sdk/middleware-user-agent" "3.873.0"
"@aws-sdk/region-config-resolver" "3.873.0"
"@aws-sdk/types" "3.862.0"
"@aws-sdk/util-endpoints" "3.879.0"
"@aws-sdk/util-endpoints" "3.873.0"
"@aws-sdk/util-user-agent-browser" "3.873.0"
"@aws-sdk/util-user-agent-node" "3.879.0"
"@aws-sdk/util-user-agent-node" "3.873.0"
"@smithy/config-resolver" "^4.1.5"
"@smithy/core" "^3.9.0"
"@smithy/core" "^3.8.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.19"
"@smithy/middleware-retry" "^4.1.20"
"@smithy/middleware-endpoint" "^4.1.18"
"@smithy/middleware-retry" "^4.1.19"
"@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.5.0"
"@smithy/smithy-client" "^4.4.10"
"@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.27"
"@smithy/util-defaults-mode-node" "^4.0.27"
"@smithy/util-defaults-mode-browser" "^4.0.26"
"@smithy/util-defaults-mode-node" "^4.0.26"
"@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.879.0":
version "3.879.0"
resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.879.0.tgz#c6ee6b927347b2f89419bfbff77844cdff2b8c10"
integrity sha512-AhNmLCrx980LsK+SfPXGh7YqTyZxsK0Qmy18mWmkfY0TSq7WLaSDB5zdQbgbnQCACCHy8DUYXbi4KsjlIhv3PA==
"@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==
dependencies:
"@aws-sdk/types" "3.862.0"
"@aws-sdk/xml-builder" "3.873.0"
"@smithy/core" "^3.9.0"
"@smithy/core" "^3.8.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.5.0"
"@smithy/smithy-client" "^4.4.10"
"@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.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==
"@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==
dependencies:
"@aws-sdk/core" "3.879.0"
"@aws-sdk/core" "3.873.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.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==
"@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==
dependencies:
"@aws-sdk/core" "3.879.0"
"@aws-sdk/core" "3.873.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.5.0"
"@smithy/smithy-client" "^4.4.10"
"@smithy/types" "^4.3.2"
"@smithy/util-stream" "^4.2.4"
tslib "^2.6.2"
"@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==
"@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==
dependencies:
"@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/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/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.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==
"@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==
dependencies:
"@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/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/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.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==
"@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==
dependencies:
"@aws-sdk/core" "3.879.0"
"@aws-sdk/core" "3.873.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.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==
"@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==
dependencies:
"@aws-sdk/client-sso" "3.879.0"
"@aws-sdk/core" "3.879.0"
"@aws-sdk/token-providers" "3.879.0"
"@aws-sdk/client-sso" "3.873.0"
"@aws-sdk/core" "3.873.0"
"@aws-sdk/token-providers" "3.873.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.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==
"@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==
dependencies:
"@aws-sdk/core" "3.879.0"
"@aws-sdk/nested-clients" "3.879.0"
"@aws-sdk/core" "3.873.0"
"@aws-sdk/nested-clients" "3.873.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.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==
"@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==
dependencies:
"@aws-sdk/util-user-agent-node" "3.879.0"
"@aws-sdk/util-user-agent-node" "3.873.0"
aws-crt "^1.24.0"
tslib "^2.6.2"
"@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==
"@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==
dependencies:
"@smithy/abort-controller" "^4.0.5"
"@smithy/middleware-endpoint" "^4.1.19"
"@smithy/smithy-client" "^4.5.0"
"@smithy/middleware-endpoint" "^4.1.18"
"@smithy/smithy-client" "^4.4.10"
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.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==
"@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==
dependencies:
"@aws-crypto/crc32" "5.2.0"
"@aws-crypto/crc32c" "5.2.0"
"@aws-crypto/util" "5.2.0"
"@aws-sdk/core" "3.879.0"
"@aws-sdk/core" "3.873.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.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==
"@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==
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.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==
"@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==
dependencies:
"@aws-sdk/core" "3.879.0"
"@aws-sdk/core" "3.873.0"
"@aws-sdk/types" "3.862.0"
"@aws-sdk/util-arn-parser" "3.873.0"
"@smithy/core" "^3.9.0"
"@smithy/core" "^3.8.0"
"@smithy/node-config-provider" "^4.1.4"
"@smithy/protocol-http" "^5.1.3"
"@smithy/signature-v4" "^5.1.3"
"@smithy/smithy-client" "^4.5.0"
"@smithy/smithy-client" "^4.4.10"
"@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.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==
"@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==
dependencies:
"@aws-sdk/core" "3.879.0"
"@aws-sdk/core" "3.873.0"
"@aws-sdk/types" "3.862.0"
"@aws-sdk/util-endpoints" "3.879.0"
"@smithy/core" "^3.9.0"
"@aws-sdk/util-endpoints" "3.873.0"
"@smithy/core" "^3.8.0"
"@smithy/protocol-http" "^5.1.3"
"@smithy/types" "^4.3.2"
tslib "^2.6.2"
"@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==
"@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==
dependencies:
"@aws-crypto/sha256-browser" "5.2.0"
"@aws-crypto/sha256-js" "5.2.0"
"@aws-sdk/core" "3.879.0"
"@aws-sdk/core" "3.873.0"
"@aws-sdk/middleware-host-header" "3.873.0"
"@aws-sdk/middleware-logger" "3.876.0"
"@aws-sdk/middleware-logger" "3.873.0"
"@aws-sdk/middleware-recursion-detection" "3.873.0"
"@aws-sdk/middleware-user-agent" "3.879.0"
"@aws-sdk/middleware-user-agent" "3.873.0"
"@aws-sdk/region-config-resolver" "3.873.0"
"@aws-sdk/types" "3.862.0"
"@aws-sdk/util-endpoints" "3.879.0"
"@aws-sdk/util-endpoints" "3.873.0"
"@aws-sdk/util-user-agent-browser" "3.873.0"
"@aws-sdk/util-user-agent-node" "3.879.0"
"@aws-sdk/util-user-agent-node" "3.873.0"
"@smithy/config-resolver" "^4.1.5"
"@smithy/core" "^3.9.0"
"@smithy/core" "^3.8.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.19"
"@smithy/middleware-retry" "^4.1.20"
"@smithy/middleware-endpoint" "^4.1.18"
"@smithy/middleware-retry" "^4.1.19"
"@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.5.0"
"@smithy/smithy-client" "^4.4.10"
"@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.27"
"@smithy/util-defaults-mode-node" "^4.0.27"
"@smithy/util-defaults-mode-browser" "^4.0.26"
"@smithy/util-defaults-mode-node" "^4.0.26"
"@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.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==
"@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==
dependencies:
"@aws-sdk/client-s3" "3.879.0"
"@aws-sdk/client-s3" "3.873.0"
"@aws-sdk/types" "3.862.0"
"@aws-sdk/util-format-url" "3.873.0"
"@smithy/middleware-endpoint" "^4.1.19"
"@smithy/middleware-endpoint" "^4.1.18"
"@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.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==
"@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==
dependencies:
"@aws-sdk/signature-v4-multi-region" "3.879.0"
"@aws-sdk/signature-v4-multi-region" "3.873.0"
"@aws-sdk/types" "3.862.0"
"@aws-sdk/util-format-url" "3.873.0"
"@smithy/middleware-endpoint" "^4.1.19"
"@smithy/middleware-endpoint" "^4.1.18"
"@smithy/protocol-http" "^5.1.3"
"@smithy/smithy-client" "^4.5.0"
"@smithy/smithy-client" "^4.4.10"
"@smithy/types" "^4.3.2"
tslib "^2.6.2"
"@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==
"@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==
dependencies:
"@aws-sdk/crt-loader" "3.879.0"
"@aws-sdk/signature-v4-multi-region" "3.879.0"
"@aws-sdk/crt-loader" "3.873.0"
"@aws-sdk/signature-v4-multi-region" "3.873.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.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==
"@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==
dependencies:
"@aws-sdk/middleware-sdk-s3" "3.879.0"
"@aws-sdk/middleware-sdk-s3" "3.873.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.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==
"@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==
dependencies:
"@aws-sdk/core" "3.879.0"
"@aws-sdk/nested-clients" "3.879.0"
"@aws-sdk/core" "3.873.0"
"@aws-sdk/nested-clients" "3.873.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.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==
"@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==
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.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==
"@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==
dependencies:
"@aws-sdk/middleware-user-agent" "3.879.0"
"@aws-sdk/middleware-user-agent" "3.873.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.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==
"@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==
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.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==
"@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==
dependencies:
"@smithy/core" "^3.9.0"
"@smithy/core" "^3.8.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.20":
version "4.1.20"
resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.1.20.tgz#7fa8617b424f813ab71025712094e61e0f31b0a3"
integrity sha512-T3maNEm3Masae99eFdx1Q7PIqBBEVOvRd5hralqKZNeIivnoGNx5OFtI3DiZ5gCjUkl0mNondlzSXeVxkinh7Q==
"@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==
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.5.0"
"@smithy/smithy-client" "^4.4.10"
"@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.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==
"@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==
dependencies:
"@smithy/core" "^3.9.0"
"@smithy/middleware-endpoint" "^4.1.19"
"@smithy/core" "^3.8.0"
"@smithy/middleware-endpoint" "^4.1.18"
"@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.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==
"@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==
dependencies:
"@smithy/property-provider" "^4.0.5"
"@smithy/smithy-client" "^4.5.0"
"@smithy/smithy-client" "^4.4.10"
"@smithy/types" "^4.3.2"
bowser "^2.11.0"
tslib "^2.6.2"
"@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==
"@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==
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.5.0"
"@smithy/smithy-client" "^4.4.10"
"@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.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==
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==
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.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@*, 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@^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.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-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-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-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-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.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-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-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-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-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.2.0:
pg-types@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
integrity "sha1-LQJQ1jZFT3z6O2rgOC/fqAYyVKM= sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="
dependencies:
pg-int8 "1.0.1"
postgres-array "~2.0.0"
@@ -12006,25 +12006,25 @@ pg-types@2.2.0:
postgres-date "~1.0.4"
postgres-interval "^1.1.0"
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==
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==
dependencies:
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"
pg-connection-string "^2.8.5"
pg-pool "^3.9.6"
pg-protocol "^1.9.5"
pg-types "^2.1.0"
pgpass "1.x"
optionalDependencies:
pg-cloudflare "^1.2.7"
pg-cloudflare "^1.2.5"
pgpass@1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d"
integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==
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=="
dependencies:
split2 "^4.1.0"
split2 "^3.1.1"
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, 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==
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=="
dependencies:
prosemirror-state "^1.0.0"
w3c-keyname "^2.2.0"
@@ -12634,6 +12634,11 @@ 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"
@@ -13704,18 +13709,13 @@ 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.0, split2@^3.1.1:
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.1:
version "7.2.1"
resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.2.1.tgz#633ff4ff88951fe1db58f7dd32a25ba3f6ff2c48"
integrity sha512-7YiPJw6rLClQL3oUKN3KgMaXeJJ2lAyZItclgKDurqnH61so4k4IH/qwmMva0zpuJc/FhRExBBnk7EbeFANlgQ==
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==
dependencies:
"@mixmark-io/domino" "^2.2.0"