Merge branch 'xyflow' of github.com:wbkd/react-flow into xyflow
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { ReactFlow, Background, BackgroundVariant, Node, Edge, SelectionMode } from '@xyflow/react';
|
||||
import { ReactFlow, Background, BackgroundVariant, Node, Edge, SelectionMode, Controls, Panel } from '@xyflow/react';
|
||||
|
||||
const MULTI_SELECT_KEY = ['Meta', 'Shift'];
|
||||
|
||||
@@ -21,6 +21,10 @@ const onPaneContextMenu = (e: any) => {
|
||||
|
||||
const panOnDrag = [1, 2];
|
||||
|
||||
const onMoveStart = (e: any) => console.log('move start', e);
|
||||
const onMove = (e: any) => console.log('move', e);
|
||||
const onMoveEnd = (e: any) => console.log('move end', e);
|
||||
|
||||
const BasicFlow = () => {
|
||||
return (
|
||||
<ReactFlow
|
||||
@@ -36,11 +40,15 @@ const BasicFlow = () => {
|
||||
fitView
|
||||
selectNodesOnDrag={false}
|
||||
onSelectionContextMenu={onPaneContextMenu}
|
||||
onMoveStart={onMoveStart}
|
||||
onMove={onMove}
|
||||
onMoveEnd={onMoveEnd}
|
||||
>
|
||||
<Background variant={BackgroundVariant.Cross} />
|
||||
<div style={{ position: 'absolute', right: 10, top: 10, zIndex: 4 }}>
|
||||
<Controls />
|
||||
<Panel position="top-right">
|
||||
<input type={'text'} placeholder={'name'} />
|
||||
</div>
|
||||
</Panel>
|
||||
</ReactFlow>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -16,8 +16,17 @@
|
||||
],
|
||||
"source": "src/index.ts",
|
||||
"main": "dist/umd/index.js",
|
||||
"module": "dist/esm/index.js",
|
||||
"module": "dist/esm/index.mjs",
|
||||
"types": "dist/esm/index.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./dist/esm/index.d.ts",
|
||||
"import": "./dist/esm/index.mjs",
|
||||
"require": "./dist/umd/index.js"
|
||||
},
|
||||
"./dist/base.css": "./dist/base.css",
|
||||
"./dist/style.css": "./dist/style.css"
|
||||
},
|
||||
"sideEffects": [
|
||||
"*.css"
|
||||
],
|
||||
@@ -48,7 +57,7 @@
|
||||
"d3-drag": "^3.0.0",
|
||||
"d3-selection": "^3.0.0",
|
||||
"d3-zoom": "^3.0.0",
|
||||
"zustand": "^4.3.3"
|
||||
"zustand": "^4.4.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=17",
|
||||
|
||||
@@ -58,7 +58,8 @@ function MiniMap({
|
||||
zoomable = false,
|
||||
ariaLabel = 'React Flow mini map',
|
||||
inversePan,
|
||||
zoomStep,
|
||||
zoomStep = 10,
|
||||
offsetScale = 5,
|
||||
}: MiniMapProps) {
|
||||
const store = useStoreApi();
|
||||
const svg = useRef<SVGSVGElement>(null);
|
||||
@@ -70,7 +71,7 @@ function MiniMap({
|
||||
const viewScale = Math.max(scaledWidth, scaledHeight);
|
||||
const viewWidth = viewScale * elementWidth;
|
||||
const viewHeight = viewScale * elementHeight;
|
||||
const offset = 5 * viewScale;
|
||||
const offset = offsetScale * viewScale;
|
||||
const x = boundingRect.x - (viewWidth - boundingRect.width) / 2 - offset;
|
||||
const y = boundingRect.y - (viewHeight - boundingRect.height) / 2 - offset;
|
||||
const width = viewWidth + offset * 2;
|
||||
|
||||
@@ -16,6 +16,7 @@ function MiniMapNode({
|
||||
className,
|
||||
borderRadius,
|
||||
shapeRendering,
|
||||
selected,
|
||||
onClick,
|
||||
}: MiniMapNodeProps) {
|
||||
const { background, backgroundColor } = style || {};
|
||||
@@ -23,7 +24,7 @@ function MiniMapNode({
|
||||
|
||||
return (
|
||||
<rect
|
||||
className={cc(['react-flow__minimap-node', className])}
|
||||
className={cc(['react-flow__minimap-node', { selected }, className])}
|
||||
x={x}
|
||||
y={y}
|
||||
rx={borderRadius}
|
||||
|
||||
@@ -47,6 +47,7 @@ function MiniMapNodes({
|
||||
width={node.width!}
|
||||
height={node.height!}
|
||||
style={node.style}
|
||||
selected={!!node.selected}
|
||||
className={nodeClassNameFunc(node)}
|
||||
color={nodeColorFunc(node)}
|
||||
borderRadius={nodeBorderRadius}
|
||||
|
||||
@@ -24,6 +24,7 @@ export type MiniMapProps<NodeData = any> = Omit<HTMLAttributes<SVGSVGElement>, '
|
||||
ariaLabel?: string | null;
|
||||
inversePan?: boolean;
|
||||
zoomStep?: number;
|
||||
offsetScale?: number;
|
||||
};
|
||||
|
||||
export type MiniMapNodes = Pick<
|
||||
@@ -46,5 +47,6 @@ export type MiniMapNodeProps = {
|
||||
strokeColor: string;
|
||||
strokeWidth: number;
|
||||
style?: CSSProperties;
|
||||
selected: boolean;
|
||||
onClick?: (event: MouseEvent, id: string) => void;
|
||||
};
|
||||
|
||||
@@ -202,7 +202,7 @@ export default (EdgeComponent: ComponentType<EdgeProps>) => {
|
||||
onMouseLeave={onEdgeMouseLeave}
|
||||
onKeyDown={isFocusable ? onKeyDown : undefined}
|
||||
tabIndex={isFocusable ? 0 : undefined}
|
||||
role={isFocusable ? 'button' : undefined}
|
||||
role={isFocusable ? 'button' : 'img'}
|
||||
data-testid={`rf__edge-${id}`}
|
||||
aria-label={ariaLabel === null ? undefined : ariaLabel ? ariaLabel : `Edge from ${source} to ${target}`}
|
||||
aria-describedby={isFocusable ? `${ARIA_EDGE_DESC_KEY}-${rfId}` : undefined}
|
||||
|
||||
@@ -2,6 +2,7 @@ import type { MouseEvent, RefObject } from 'react';
|
||||
import type { StoreApi } from 'zustand';
|
||||
|
||||
import type { Node, ReactFlowState } from '../../types';
|
||||
import { errorMessages } from '@xyflow/system';
|
||||
|
||||
export function getMouseHandler(
|
||||
id: string,
|
||||
@@ -34,9 +35,14 @@ export function handleNodeClick({
|
||||
unselect?: boolean;
|
||||
nodeRef?: RefObject<HTMLDivElement>;
|
||||
}) {
|
||||
const { addSelectedNodes, unselectNodesAndEdges, multiSelectionActive, nodes } = store.getState();
|
||||
const { addSelectedNodes, unselectNodesAndEdges, multiSelectionActive, nodes, onError } = store.getState();
|
||||
const node = nodes.find((n) => n.id === id)!;
|
||||
|
||||
if (!node) {
|
||||
onError?.('012', errorMessages['error012'](id));
|
||||
return;
|
||||
}
|
||||
|
||||
store.setState({ nodesSelectionActive: false });
|
||||
|
||||
if (!node.selected) {
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import { useRef, type FC, type PropsWithChildren } from 'react';
|
||||
import { type StoreApi } from 'zustand';
|
||||
import { UseBoundStoreWithEqualityFn } from 'zustand/traditional';
|
||||
|
||||
import { Provider } from '../../contexts/RFStoreContext';
|
||||
import { createRFStore } from '../../store';
|
||||
import type { ReactFlowState } from '../../types';
|
||||
|
||||
const ReactFlowProvider: FC<PropsWithChildren<unknown>> = ({ children }) => {
|
||||
const storeRef = useRef<StoreApi<ReactFlowState> | null>(null);
|
||||
const storeRef = useRef<UseBoundStoreWithEqualityFn<StoreApi<ReactFlowState>> | null>(null);
|
||||
|
||||
if (!storeRef.current) {
|
||||
storeRef.current = createRFStore();
|
||||
|
||||
@@ -7,11 +7,10 @@ import { useStore } from '../../hooks/useStore';
|
||||
import useVisibleEdges from '../../hooks/useVisibleEdges';
|
||||
import MarkerDefinitions from './MarkerDefinitions';
|
||||
import { GraphViewProps } from '../GraphView';
|
||||
import type { ReactFlowState } from '../../types';
|
||||
import type { EdgeTypesWrapped, ReactFlowState } from '../../types';
|
||||
|
||||
type EdgeRendererProps = Pick<
|
||||
GraphViewProps,
|
||||
| 'edgeTypes'
|
||||
| 'onEdgeClick'
|
||||
| 'onEdgeDoubleClick'
|
||||
| 'defaultMarkerColor'
|
||||
@@ -29,6 +28,7 @@ type EdgeRendererProps = Pick<
|
||||
| 'rfId'
|
||||
| 'disableKeyboardA11y'
|
||||
> & {
|
||||
edgeTypes: EdgeTypesWrapped;
|
||||
elevateEdgesOnSelect: boolean;
|
||||
children: ReactNode;
|
||||
};
|
||||
|
||||
@@ -6,7 +6,10 @@ import EdgeRenderer from '../EdgeRenderer';
|
||||
import ViewportWrapper from '../Viewport';
|
||||
import useOnInitHandler from '../../hooks/useOnInitHandler';
|
||||
import ConnectionLine from '../../components/ConnectionLine';
|
||||
import type { EdgeTypesWrapped, NodeTypesWrapped, ReactFlowProps } from '../../types';
|
||||
import type { NodeTypesWrapped, ReactFlowProps } from '../../types';
|
||||
import { createNodeTypes } from '../NodeRenderer/utils';
|
||||
import { createEdgeTypes } from '../EdgeRenderer/utils';
|
||||
import { useNodeOrEdgeTypes } from './utils';
|
||||
|
||||
export type GraphViewProps = Omit<
|
||||
ReactFlowProps,
|
||||
@@ -15,6 +18,8 @@ export type GraphViewProps = Omit<
|
||||
Required<
|
||||
Pick<
|
||||
ReactFlowProps,
|
||||
| 'nodeTypes'
|
||||
| 'edgeTypes'
|
||||
| 'selectionKeyCode'
|
||||
| 'deleteKeyCode'
|
||||
| 'multiSelectionKeyCode'
|
||||
@@ -33,8 +38,6 @@ export type GraphViewProps = Omit<
|
||||
| 'nodeOrigin'
|
||||
>
|
||||
> & {
|
||||
nodeTypes: NodeTypesWrapped;
|
||||
edgeTypes: EdgeTypesWrapped;
|
||||
rfId: string;
|
||||
};
|
||||
|
||||
@@ -102,6 +105,9 @@ const GraphView = ({
|
||||
nodeExtent,
|
||||
rfId,
|
||||
}: GraphViewProps) => {
|
||||
const nodeTypesWrapped = useNodeOrEdgeTypes(nodeTypes, createNodeTypes);
|
||||
const edgeTypesWrapped = useNodeOrEdgeTypes(edgeTypes, createEdgeTypes);
|
||||
|
||||
useOnInitHandler(onInit);
|
||||
|
||||
return (
|
||||
@@ -142,7 +148,7 @@ const GraphView = ({
|
||||
>
|
||||
<ViewportWrapper>
|
||||
<EdgeRenderer
|
||||
edgeTypes={edgeTypes}
|
||||
edgeTypes={edgeTypesWrapped}
|
||||
onEdgeClick={onEdgeClick}
|
||||
onEdgeDoubleClick={onEdgeDoubleClick}
|
||||
onEdgeUpdate={onEdgeUpdate}
|
||||
@@ -170,7 +176,7 @@ const GraphView = ({
|
||||
<div className="react-flow__edgelabel-renderer" />
|
||||
|
||||
<NodeRenderer
|
||||
nodeTypes={nodeTypes}
|
||||
nodeTypes={nodeTypesWrapped}
|
||||
onNodeClick={onNodeClick}
|
||||
onNodeDoubleClick={onNodeDoubleClick}
|
||||
onNodeMouseEnter={onNodeMouseEnter}
|
||||
|
||||
+4
-2
@@ -1,22 +1,24 @@
|
||||
import { useMemo, useRef } from 'react';
|
||||
import { shallow } from 'zustand/shallow';
|
||||
import { errorMessages, devWarn } from '@xyflow/system';
|
||||
import { errorMessages } from '@xyflow/system';
|
||||
|
||||
import { CreateEdgeTypes } from '../EdgeRenderer/utils';
|
||||
import { CreateNodeTypes } from '../NodeRenderer/utils';
|
||||
import type { EdgeTypes, EdgeTypesWrapped, NodeTypes, NodeTypesWrapped } from '../../types';
|
||||
import { useStoreApi } from '../../hooks/useStore';
|
||||
|
||||
export function useNodeOrEdgeTypes(nodeOrEdgeTypes: NodeTypes, createTypes: CreateNodeTypes): NodeTypesWrapped;
|
||||
export function useNodeOrEdgeTypes(nodeOrEdgeTypes: EdgeTypes, createTypes: CreateEdgeTypes): EdgeTypesWrapped;
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
export function useNodeOrEdgeTypes(nodeOrEdgeTypes: any, createTypes: any): any {
|
||||
const typesKeysRef = useRef<string[] | null>(null);
|
||||
const store = useStoreApi();
|
||||
|
||||
const typesParsed = useMemo(() => {
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
const typeKeys = Object.keys(nodeOrEdgeTypes);
|
||||
if (shallow(typesKeysRef.current, typeKeys)) {
|
||||
devWarn('002', errorMessages['error002']());
|
||||
store.getState().onError?.('002', errorMessages['error002']());
|
||||
}
|
||||
|
||||
typesKeysRef.current = typeKeys;
|
||||
@@ -6,11 +6,10 @@ import useVisibleNodes from '../../hooks/useVisibleNodes';
|
||||
import { useStore } from '../../hooks/useStore';
|
||||
import { containerStyle } from '../../styles';
|
||||
import { GraphViewProps } from '../GraphView';
|
||||
import type { ReactFlowState, WrapNodeProps } from '../../types';
|
||||
import type { NodeTypesWrapped, ReactFlowState, WrapNodeProps } from '../../types';
|
||||
|
||||
type NodeRendererProps = Pick<
|
||||
GraphViewProps,
|
||||
| 'nodeTypes'
|
||||
| 'onNodeClick'
|
||||
| 'onNodeDoubleClick'
|
||||
| 'onNodeMouseEnter'
|
||||
@@ -24,7 +23,9 @@ type NodeRendererProps = Pick<
|
||||
| 'disableKeyboardA11y'
|
||||
| 'nodeOrigin'
|
||||
| 'nodeExtent'
|
||||
>;
|
||||
> & {
|
||||
nodeTypes: NodeTypesWrapped;
|
||||
};
|
||||
|
||||
const selector = (s: ReactFlowState) => ({
|
||||
nodesDraggable: s.nodesDraggable,
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
infiniteExtent,
|
||||
type NodeOrigin,
|
||||
type Viewport,
|
||||
isMacOs,
|
||||
} from '@xyflow/system';
|
||||
|
||||
import Attribution from '../../components/Attribution';
|
||||
@@ -19,19 +20,9 @@ import GroupNode from '../../components/Nodes/GroupNode';
|
||||
import SelectionListener from '../../components/SelectionListener';
|
||||
import StoreUpdater from '../../components/StoreUpdater';
|
||||
import A11yDescriptions from '../../components/A11yDescriptions';
|
||||
import { createEdgeTypes } from '../EdgeRenderer/utils';
|
||||
import { createNodeTypes } from '../NodeRenderer/utils';
|
||||
import GraphView from '../GraphView';
|
||||
import Wrapper from './Wrapper';
|
||||
import { useNodeOrEdgeTypes } from './utils';
|
||||
import type {
|
||||
EdgeTypes,
|
||||
EdgeTypesWrapped,
|
||||
NodeTypes,
|
||||
NodeTypesWrapped,
|
||||
ReactFlowProps,
|
||||
ReactFlowRefType,
|
||||
} from '../../types';
|
||||
import type { EdgeTypes, NodeTypes, ReactFlowProps, ReactFlowRefType } from '../../types';
|
||||
|
||||
const defaultNodeTypes: NodeTypes = {
|
||||
input: InputNode,
|
||||
@@ -108,8 +99,8 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
|
||||
selectionOnDrag = false,
|
||||
selectionMode = SelectionMode.Full,
|
||||
panActivationKeyCode = 'Space',
|
||||
multiSelectionKeyCode = 'Meta',
|
||||
zoomActivationKeyCode = 'Meta',
|
||||
multiSelectionKeyCode = isMacOs() ? 'Meta' : 'Control',
|
||||
zoomActivationKeyCode = isMacOs() ? 'Meta' : 'Control',
|
||||
snapToGrid = false,
|
||||
snapGrid = initSnapGrid,
|
||||
onlyRenderVisibleElements = false,
|
||||
@@ -176,8 +167,6 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
|
||||
},
|
||||
ref
|
||||
) => {
|
||||
const nodeTypesWrapped = useNodeOrEdgeTypes(nodeTypes, createNodeTypes) as NodeTypesWrapped;
|
||||
const edgeTypesWrapped = useNodeOrEdgeTypes(edgeTypes, createEdgeTypes) as EdgeTypesWrapped;
|
||||
const rfId = id || '1';
|
||||
|
||||
return (
|
||||
@@ -199,8 +188,8 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
|
||||
onNodeMouseLeave={onNodeMouseLeave}
|
||||
onNodeContextMenu={onNodeContextMenu}
|
||||
onNodeDoubleClick={onNodeDoubleClick}
|
||||
nodeTypes={nodeTypesWrapped}
|
||||
edgeTypes={edgeTypesWrapped}
|
||||
nodeTypes={nodeTypes}
|
||||
edgeTypes={edgeTypes}
|
||||
connectionLineType={connectionLineType}
|
||||
connectionLineStyle={connectionLineStyle}
|
||||
connectionLineComponent={connectionLineComponent}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { useContext, useMemo } from 'react';
|
||||
import { useStore as useZustandStore, type StoreApi } from 'zustand';
|
||||
import { useStoreWithEqualityFn as useZustandStore } from 'zustand/traditional';
|
||||
import type { StoreApi } from 'zustand';
|
||||
import { errorMessages } from '@xyflow/system';
|
||||
|
||||
import StoreContext from '../contexts/RFStoreContext';
|
||||
|
||||
+248
-245
@@ -1,4 +1,4 @@
|
||||
import { createStore } from 'zustand';
|
||||
import { createWithEqualityFn } from 'zustand/traditional';
|
||||
import {
|
||||
clampPosition,
|
||||
fitView as fitViewSystem,
|
||||
@@ -25,261 +25,264 @@ import type {
|
||||
} from '../types';
|
||||
|
||||
const createRFStore = () =>
|
||||
createStore<ReactFlowState>((set, get) => ({
|
||||
...initialState,
|
||||
setNodes: (nodes: Node[]) => {
|
||||
const { nodes: storeNodes, nodeOrigin, elevateNodesOnSelect } = get();
|
||||
const nextNodes = updateNodes(nodes, storeNodes, { nodeOrigin, elevateNodesOnSelect });
|
||||
createWithEqualityFn<ReactFlowState>(
|
||||
(set, get) => ({
|
||||
...initialState,
|
||||
setNodes: (nodes: Node[]) => {
|
||||
const { nodes: storeNodes, nodeOrigin, elevateNodesOnSelect } = get();
|
||||
const nextNodes = updateNodes(nodes, storeNodes, { nodeOrigin, elevateNodesOnSelect });
|
||||
|
||||
set({ nodes: nextNodes });
|
||||
},
|
||||
getNodes: () => {
|
||||
return get().nodes;
|
||||
},
|
||||
setEdges: (edges: Edge[]) => {
|
||||
const { defaultEdgeOptions = {} } = get();
|
||||
set({ edges: edges.map((e) => ({ ...defaultEdgeOptions, ...e })) });
|
||||
},
|
||||
setDefaultNodesAndEdges: (nodes?: Node[], edges?: Edge[]) => {
|
||||
const hasDefaultNodes = typeof nodes !== 'undefined';
|
||||
const hasDefaultEdges = typeof edges !== 'undefined';
|
||||
set({ nodes: nextNodes });
|
||||
},
|
||||
getNodes: () => {
|
||||
return get().nodes;
|
||||
},
|
||||
setEdges: (edges: Edge[]) => {
|
||||
const { defaultEdgeOptions = {} } = get();
|
||||
set({ edges: edges.map((e) => ({ ...defaultEdgeOptions, ...e })) });
|
||||
},
|
||||
setDefaultNodesAndEdges: (nodes?: Node[], edges?: Edge[]) => {
|
||||
const hasDefaultNodes = typeof nodes !== 'undefined';
|
||||
const hasDefaultEdges = typeof edges !== 'undefined';
|
||||
|
||||
const nextNodes = hasDefaultNodes
|
||||
? updateNodes(nodes, [], {
|
||||
nodeOrigin: get().nodeOrigin,
|
||||
elevateNodesOnSelect: get().elevateNodesOnSelect,
|
||||
})
|
||||
: [];
|
||||
const nextEdges = hasDefaultEdges ? edges : [];
|
||||
const nextNodes = hasDefaultNodes
|
||||
? updateNodes(nodes, [], {
|
||||
nodeOrigin: get().nodeOrigin,
|
||||
elevateNodesOnSelect: get().elevateNodesOnSelect,
|
||||
})
|
||||
: [];
|
||||
const nextEdges = hasDefaultEdges ? edges : [];
|
||||
|
||||
set({ nodes: nextNodes, edges: nextEdges, hasDefaultNodes, hasDefaultEdges });
|
||||
},
|
||||
updateNodeDimensions: (updates) => {
|
||||
const { onNodesChange, fitView, nodes, fitViewOnInit, fitViewDone, fitViewOnInitOptions, domNode, nodeOrigin } =
|
||||
get();
|
||||
const changes: NodeDimensionChange[] = [];
|
||||
set({ nodes: nextNodes, edges: nextEdges, hasDefaultNodes, hasDefaultEdges });
|
||||
},
|
||||
updateNodeDimensions: (updates) => {
|
||||
const { onNodesChange, fitView, nodes, fitViewOnInit, fitViewDone, fitViewOnInitOptions, domNode, nodeOrigin } =
|
||||
get();
|
||||
const changes: NodeDimensionChange[] = [];
|
||||
|
||||
const updatedNodes = updateNodeDimensionsSystem(
|
||||
updates,
|
||||
nodes,
|
||||
domNode,
|
||||
nodeOrigin,
|
||||
(id: string, dimensions: Dimensions) => {
|
||||
changes.push({
|
||||
id: id,
|
||||
type: 'dimensions',
|
||||
dimensions,
|
||||
});
|
||||
const updatedNodes = updateNodeDimensionsSystem(
|
||||
updates,
|
||||
nodes,
|
||||
domNode,
|
||||
nodeOrigin,
|
||||
(id: string, dimensions: Dimensions) => {
|
||||
changes.push({
|
||||
id: id,
|
||||
type: 'dimensions',
|
||||
dimensions,
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
if (!updatedNodes) {
|
||||
return;
|
||||
}
|
||||
);
|
||||
|
||||
if (!updatedNodes) {
|
||||
return;
|
||||
}
|
||||
const nextNodes = updateAbsolutePositions(updatedNodes, nodeOrigin);
|
||||
|
||||
const nextNodes = updateAbsolutePositions(updatedNodes, nodeOrigin);
|
||||
const nextFitViewDone =
|
||||
fitViewDone ||
|
||||
(fitViewOnInit &&
|
||||
fitView({
|
||||
...fitViewOnInitOptions,
|
||||
nodes: nextNodes,
|
||||
}));
|
||||
|
||||
const nextFitViewDone =
|
||||
fitViewDone ||
|
||||
(fitViewOnInit &&
|
||||
fitView({
|
||||
...fitViewOnInitOptions,
|
||||
nodes: nextNodes,
|
||||
}));
|
||||
set({ nodes: nextNodes, fitViewDone: nextFitViewDone });
|
||||
|
||||
set({ nodes: nextNodes, fitViewDone: nextFitViewDone });
|
||||
if (changes?.length > 0) {
|
||||
onNodesChange?.(changes);
|
||||
}
|
||||
},
|
||||
updateNodePositions: (nodeDragItems, positionChanged = true, dragging = false) => {
|
||||
const changes = nodeDragItems.map((node) => {
|
||||
const change: NodePositionChange = {
|
||||
id: node.id,
|
||||
type: 'position',
|
||||
dragging,
|
||||
};
|
||||
|
||||
if (changes?.length > 0) {
|
||||
onNodesChange?.(changes);
|
||||
}
|
||||
},
|
||||
updateNodePositions: (nodeDragItems, positionChanged = true, dragging = false) => {
|
||||
const changes = nodeDragItems.map((node) => {
|
||||
const change: NodePositionChange = {
|
||||
id: node.id,
|
||||
type: 'position',
|
||||
dragging,
|
||||
if (positionChanged) {
|
||||
change.positionAbsolute = node.positionAbsolute;
|
||||
change.position = node.position;
|
||||
}
|
||||
|
||||
return change;
|
||||
});
|
||||
|
||||
get().triggerNodeChanges(changes);
|
||||
},
|
||||
|
||||
triggerNodeChanges: (changes) => {
|
||||
const { onNodesChange, nodes, hasDefaultNodes, nodeOrigin, elevateNodesOnSelect } = get();
|
||||
|
||||
if (changes?.length) {
|
||||
if (hasDefaultNodes) {
|
||||
const updatedNodes = applyNodeChanges(changes, nodes);
|
||||
const nextNodes = updateNodes(updatedNodes, nodes, {
|
||||
nodeOrigin,
|
||||
elevateNodesOnSelect,
|
||||
});
|
||||
set({ nodes: nextNodes });
|
||||
}
|
||||
|
||||
onNodesChange?.(changes);
|
||||
}
|
||||
},
|
||||
|
||||
addSelectedNodes: (selectedNodeIds) => {
|
||||
const { multiSelectionActive, edges, nodes } = get();
|
||||
let changedNodes: NodeSelectionChange[];
|
||||
let changedEdges: EdgeSelectionChange[] | null = null;
|
||||
|
||||
if (multiSelectionActive) {
|
||||
changedNodes = selectedNodeIds.map((nodeId) => createSelectionChange(nodeId, true)) as NodeSelectionChange[];
|
||||
} else {
|
||||
changedNodes = getSelectionChanges(nodes, selectedNodeIds);
|
||||
changedEdges = getSelectionChanges(edges, []);
|
||||
}
|
||||
|
||||
updateNodesAndEdgesSelections({
|
||||
changedNodes,
|
||||
changedEdges,
|
||||
get,
|
||||
set,
|
||||
});
|
||||
},
|
||||
addSelectedEdges: (selectedEdgeIds) => {
|
||||
const { multiSelectionActive, edges, nodes } = get();
|
||||
let changedEdges: EdgeSelectionChange[];
|
||||
let changedNodes: NodeSelectionChange[] | null = null;
|
||||
|
||||
if (multiSelectionActive) {
|
||||
changedEdges = selectedEdgeIds.map((edgeId) => createSelectionChange(edgeId, true)) as EdgeSelectionChange[];
|
||||
} else {
|
||||
changedEdges = getSelectionChanges(edges, selectedEdgeIds);
|
||||
changedNodes = getSelectionChanges(nodes, []);
|
||||
}
|
||||
|
||||
updateNodesAndEdgesSelections({
|
||||
changedNodes,
|
||||
changedEdges,
|
||||
get,
|
||||
set,
|
||||
});
|
||||
},
|
||||
unselectNodesAndEdges: ({ nodes, edges }: UnselectNodesAndEdgesParams = {}) => {
|
||||
const { edges: storeEdges, nodes: storeNodes } = get();
|
||||
const nodesToUnselect = nodes ? nodes : storeNodes;
|
||||
const edgesToUnselect = edges ? edges : storeEdges;
|
||||
|
||||
const changedNodes = nodesToUnselect.map((n) => {
|
||||
n.selected = false;
|
||||
return createSelectionChange(n.id, false);
|
||||
}) as NodeSelectionChange[];
|
||||
const changedEdges = edgesToUnselect.map((edge) =>
|
||||
createSelectionChange(edge.id, false)
|
||||
) as EdgeSelectionChange[];
|
||||
|
||||
updateNodesAndEdgesSelections({
|
||||
changedNodes,
|
||||
changedEdges,
|
||||
get,
|
||||
set,
|
||||
});
|
||||
},
|
||||
setMinZoom: (minZoom) => {
|
||||
const { panZoom, maxZoom } = get();
|
||||
panZoom?.setScaleExtent([minZoom, maxZoom]);
|
||||
|
||||
set({ minZoom });
|
||||
},
|
||||
setMaxZoom: (maxZoom) => {
|
||||
const { panZoom, minZoom } = get();
|
||||
panZoom?.setScaleExtent([minZoom, maxZoom]);
|
||||
|
||||
set({ maxZoom });
|
||||
},
|
||||
setTranslateExtent: (translateExtent) => {
|
||||
get().panZoom?.setTranslateExtent(translateExtent);
|
||||
|
||||
set({ translateExtent });
|
||||
},
|
||||
resetSelectedElements: () => {
|
||||
const { edges, nodes } = get();
|
||||
|
||||
const nodesToUnselect = nodes
|
||||
.filter((e) => e.selected)
|
||||
.map((n) => createSelectionChange(n.id, false)) as NodeSelectionChange[];
|
||||
const edgesToUnselect = edges
|
||||
.filter((e) => e.selected)
|
||||
.map((e) => createSelectionChange(e.id, false)) as EdgeSelectionChange[];
|
||||
|
||||
updateNodesAndEdgesSelections({
|
||||
changedNodes: nodesToUnselect,
|
||||
changedEdges: edgesToUnselect,
|
||||
get,
|
||||
set,
|
||||
});
|
||||
},
|
||||
setNodeExtent: (nodeExtent) => {
|
||||
const { nodes } = get();
|
||||
|
||||
set({
|
||||
nodeExtent,
|
||||
nodes: nodes.map((node) => {
|
||||
const positionAbsolute = clampPosition(node.position, nodeExtent);
|
||||
|
||||
return {
|
||||
...node,
|
||||
positionAbsolute,
|
||||
};
|
||||
}),
|
||||
});
|
||||
},
|
||||
panBy: (delta): boolean => {
|
||||
const { transform, width, height, panZoom, translateExtent } = get();
|
||||
return panBySystem({ delta, panZoom, transform, translateExtent, width, height });
|
||||
},
|
||||
fitView: (options?: FitViewOptions): boolean => {
|
||||
const { panZoom, nodes, width, height, minZoom, maxZoom, nodeOrigin } = get();
|
||||
const fitViewNodes = options?.nodes || nodes;
|
||||
|
||||
if (!panZoom) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return fitViewSystem(
|
||||
{
|
||||
nodes: fitViewNodes as Node[],
|
||||
width,
|
||||
height,
|
||||
panZoom,
|
||||
minZoom,
|
||||
maxZoom,
|
||||
nodeOrigin,
|
||||
},
|
||||
options
|
||||
);
|
||||
},
|
||||
cancelConnection: () =>
|
||||
set({
|
||||
connectionStatus: initialState.connectionStatus,
|
||||
connectionStartHandle: initialState.connectionStartHandle,
|
||||
connectionEndHandle: initialState.connectionEndHandle,
|
||||
}),
|
||||
updateConnection: (params) => {
|
||||
const { connectionStatus, connectionStartHandle, connectionEndHandle, connectionPosition } = get();
|
||||
|
||||
const currentConnection = {
|
||||
connectionPosition: params.connectionPosition ?? connectionPosition,
|
||||
connectionStatus: params.connectionStatus ?? connectionStatus,
|
||||
connectionStartHandle: params.connectionStartHandle ?? connectionStartHandle,
|
||||
connectionEndHandle: params.connectionEndHandle ?? connectionEndHandle,
|
||||
};
|
||||
|
||||
if (positionChanged) {
|
||||
change.positionAbsolute = node.positionAbsolute;
|
||||
change.position = node.position;
|
||||
}
|
||||
|
||||
return change;
|
||||
});
|
||||
|
||||
get().triggerNodeChanges(changes);
|
||||
},
|
||||
|
||||
triggerNodeChanges: (changes) => {
|
||||
const { onNodesChange, nodes, hasDefaultNodes, nodeOrigin, elevateNodesOnSelect } = get();
|
||||
|
||||
if (changes?.length) {
|
||||
if (hasDefaultNodes) {
|
||||
const updatedNodes = applyNodeChanges(changes, nodes);
|
||||
const nextNodes = updateNodes(updatedNodes, nodes, {
|
||||
nodeOrigin,
|
||||
elevateNodesOnSelect,
|
||||
});
|
||||
set({ nodes: nextNodes });
|
||||
}
|
||||
|
||||
onNodesChange?.(changes);
|
||||
}
|
||||
},
|
||||
|
||||
addSelectedNodes: (selectedNodeIds) => {
|
||||
const { multiSelectionActive, edges, nodes } = get();
|
||||
let changedNodes: NodeSelectionChange[];
|
||||
let changedEdges: EdgeSelectionChange[] | null = null;
|
||||
|
||||
if (multiSelectionActive) {
|
||||
changedNodes = selectedNodeIds.map((nodeId) => createSelectionChange(nodeId, true)) as NodeSelectionChange[];
|
||||
} else {
|
||||
changedNodes = getSelectionChanges(nodes, selectedNodeIds);
|
||||
changedEdges = getSelectionChanges(edges, []);
|
||||
}
|
||||
|
||||
updateNodesAndEdgesSelections({
|
||||
changedNodes,
|
||||
changedEdges,
|
||||
get,
|
||||
set,
|
||||
});
|
||||
},
|
||||
addSelectedEdges: (selectedEdgeIds) => {
|
||||
const { multiSelectionActive, edges, nodes } = get();
|
||||
let changedEdges: EdgeSelectionChange[];
|
||||
let changedNodes: NodeSelectionChange[] | null = null;
|
||||
|
||||
if (multiSelectionActive) {
|
||||
changedEdges = selectedEdgeIds.map((edgeId) => createSelectionChange(edgeId, true)) as EdgeSelectionChange[];
|
||||
} else {
|
||||
changedEdges = getSelectionChanges(edges, selectedEdgeIds);
|
||||
changedNodes = getSelectionChanges(nodes, []);
|
||||
}
|
||||
|
||||
updateNodesAndEdgesSelections({
|
||||
changedNodes,
|
||||
changedEdges,
|
||||
get,
|
||||
set,
|
||||
});
|
||||
},
|
||||
unselectNodesAndEdges: ({ nodes, edges }: UnselectNodesAndEdgesParams = {}) => {
|
||||
const { edges: storeEdges, nodes: storeNodes } = get();
|
||||
const nodesToUnselect = nodes ? nodes : storeNodes;
|
||||
const edgesToUnselect = edges ? edges : storeEdges;
|
||||
|
||||
const changedNodes = nodesToUnselect.map((n) => {
|
||||
n.selected = false;
|
||||
return createSelectionChange(n.id, false);
|
||||
}) as NodeSelectionChange[];
|
||||
const changedEdges = edgesToUnselect.map((edge) =>
|
||||
createSelectionChange(edge.id, false)
|
||||
) as EdgeSelectionChange[];
|
||||
|
||||
updateNodesAndEdgesSelections({
|
||||
changedNodes,
|
||||
changedEdges,
|
||||
get,
|
||||
set,
|
||||
});
|
||||
},
|
||||
setMinZoom: (minZoom) => {
|
||||
const { panZoom, maxZoom } = get();
|
||||
panZoom?.setScaleExtent([minZoom, maxZoom]);
|
||||
|
||||
set({ minZoom });
|
||||
},
|
||||
setMaxZoom: (maxZoom) => {
|
||||
const { panZoom, minZoom } = get();
|
||||
panZoom?.setScaleExtent([minZoom, maxZoom]);
|
||||
|
||||
set({ maxZoom });
|
||||
},
|
||||
setTranslateExtent: (translateExtent) => {
|
||||
get().panZoom?.setTranslateExtent(translateExtent);
|
||||
|
||||
set({ translateExtent });
|
||||
},
|
||||
resetSelectedElements: () => {
|
||||
const { edges, nodes } = get();
|
||||
|
||||
const nodesToUnselect = nodes
|
||||
.filter((e) => e.selected)
|
||||
.map((n) => createSelectionChange(n.id, false)) as NodeSelectionChange[];
|
||||
const edgesToUnselect = edges
|
||||
.filter((e) => e.selected)
|
||||
.map((e) => createSelectionChange(e.id, false)) as EdgeSelectionChange[];
|
||||
|
||||
updateNodesAndEdgesSelections({
|
||||
changedNodes: nodesToUnselect,
|
||||
changedEdges: edgesToUnselect,
|
||||
get,
|
||||
set,
|
||||
});
|
||||
},
|
||||
setNodeExtent: (nodeExtent) => {
|
||||
const { nodes } = get();
|
||||
|
||||
set({
|
||||
nodeExtent,
|
||||
nodes: nodes.map((node) => {
|
||||
const positionAbsolute = clampPosition(node.position, nodeExtent);
|
||||
|
||||
return {
|
||||
...node,
|
||||
positionAbsolute,
|
||||
};
|
||||
}),
|
||||
});
|
||||
},
|
||||
panBy: (delta): boolean => {
|
||||
const { transform, width, height, panZoom, translateExtent } = get();
|
||||
return panBySystem({ delta, panZoom, transform, translateExtent, width, height });
|
||||
},
|
||||
fitView: (options?: FitViewOptions): boolean => {
|
||||
const { panZoom, nodes, width, height, minZoom, maxZoom, nodeOrigin } = get();
|
||||
const fitViewNodes = options?.nodes || nodes;
|
||||
|
||||
if (!panZoom) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return fitViewSystem(
|
||||
{
|
||||
nodes: fitViewNodes as Node[],
|
||||
width,
|
||||
height,
|
||||
panZoom,
|
||||
minZoom,
|
||||
maxZoom,
|
||||
nodeOrigin,
|
||||
},
|
||||
options
|
||||
);
|
||||
},
|
||||
cancelConnection: () =>
|
||||
set({
|
||||
connectionStatus: initialState.connectionStatus,
|
||||
connectionStartHandle: initialState.connectionStartHandle,
|
||||
connectionEndHandle: initialState.connectionEndHandle,
|
||||
}),
|
||||
updateConnection: (params) => {
|
||||
const { connectionStatus, connectionStartHandle, connectionEndHandle, connectionPosition } = get();
|
||||
|
||||
const currentConnection = {
|
||||
connectionPosition: params.connectionPosition ?? connectionPosition,
|
||||
connectionStatus: params.connectionStatus ?? connectionStatus,
|
||||
connectionStartHandle: params.connectionStartHandle ?? connectionStartHandle,
|
||||
connectionEndHandle: params.connectionEndHandle ?? connectionEndHandle,
|
||||
};
|
||||
|
||||
set(currentConnection);
|
||||
},
|
||||
reset: () => set({ ...initialState }),
|
||||
}));
|
||||
set(currentConnection);
|
||||
},
|
||||
reset: () => set({ ...initialState }),
|
||||
}),
|
||||
Object.is
|
||||
);
|
||||
|
||||
export { createRFStore };
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sveltejs/adapter-auto": "^2.1.0",
|
||||
"@sveltejs/kit": "^1.20.5",
|
||||
"@sveltejs/package": "^2.1.0",
|
||||
"@sveltejs/kit": "^1.22.6",
|
||||
"@sveltejs/package": "^2.2.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.60.0",
|
||||
"@typescript-eslint/parser": "^5.60.0",
|
||||
"eslint": "^8.43.0",
|
||||
@@ -48,9 +48,9 @@
|
||||
"eslint-plugin-svelte": "^2.31.1",
|
||||
"prettier": "^2.8.8",
|
||||
"prettier-plugin-svelte": "^2.10.1",
|
||||
"svelte": "^4.0.0",
|
||||
"svelte-check": "^3.4.4",
|
||||
"svelte-eslint-parser": "^0.31.0",
|
||||
"svelte": "^4.2.0",
|
||||
"svelte-check": "^3.5.0",
|
||||
"svelte-eslint-parser": "^0.32.2",
|
||||
"tslib": "^2.5.3",
|
||||
"typescript": "5.1.3",
|
||||
"vite": "^4.3.9"
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
export let targetY: $$Props['targetY'];
|
||||
export let sourcePosition: $$Props['sourcePosition'];
|
||||
export let targetPosition: $$Props['targetPosition'];
|
||||
export let ariaLabel: $$Props['ariaLabel'] = undefined;
|
||||
// @ todo: support edge updates
|
||||
|
||||
const { edges, edgeTypes, flowId, addSelectedEdges } = useStore();
|
||||
@@ -51,7 +52,19 @@
|
||||
</script>
|
||||
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
<g class="svelte-flow__edge" class:animated class:selected data-id={id} on:click={onClick}>
|
||||
<g
|
||||
class="svelte-flow__edge"
|
||||
class:animated
|
||||
class:selected
|
||||
data-id={id}
|
||||
on:click={onClick}
|
||||
aria-label={ariaLabel === null
|
||||
? undefined
|
||||
: ariaLabel
|
||||
? ariaLabel
|
||||
: `Edge from ${source} to ${target}`}
|
||||
role="img"
|
||||
>
|
||||
<svelte:component
|
||||
this={edgeComponent}
|
||||
{id}
|
||||
|
||||
@@ -67,6 +67,7 @@ export type EdgeLayouted = Pick<
|
||||
| 'markerEnd'
|
||||
| 'sourceHandle'
|
||||
| 'targetHandle'
|
||||
| 'ariaLabel'
|
||||
> &
|
||||
EdgePosition & {
|
||||
sourceHandleId?: string | null;
|
||||
|
||||
@@ -16,8 +16,15 @@
|
||||
],
|
||||
"source": "src/index.ts",
|
||||
"main": "dist/umd/index.js",
|
||||
"module": "dist/esm/index.js",
|
||||
"module": "dist/esm/index.mjs",
|
||||
"types": "dist/esm/index.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./dist/esm/index.d.ts",
|
||||
"import": "./dist/esm/index.mjs",
|
||||
"require": "./dist/umd/index.js"
|
||||
}
|
||||
},
|
||||
"sideEffects": false,
|
||||
"license": "MIT",
|
||||
"publishConfig": {
|
||||
|
||||
@@ -21,6 +21,8 @@ export const errorMessages = {
|
||||
}", edge id: ${id}.`,
|
||||
error010: () => 'Handle: No node id found. Make sure to only use a Handle inside a custom Node.',
|
||||
error011: (edgeType: string) => `Edge type "${edgeType}" not found. Using fallback type "default".`,
|
||||
error012: (id: string) =>
|
||||
`Node with id "${id}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,
|
||||
};
|
||||
|
||||
export const internalsSymbol = Symbol.for('internals');
|
||||
|
||||
@@ -69,6 +69,9 @@ function getPoints({
|
||||
|
||||
let points: XYPosition[] = [];
|
||||
let centerX, centerY;
|
||||
const sourceGapOffset = { x: 0, y: 0 };
|
||||
const targetGapOffset = { x: 0, y: 0 };
|
||||
|
||||
const [defaultCenterX, defaultCenterY, defaultOffsetX, defaultOffsetY] = getEdgeCenter({
|
||||
sourceX: source.x,
|
||||
sourceY: source.y,
|
||||
@@ -111,6 +114,20 @@ function getPoints({
|
||||
points = sourceDir.y === currDir ? sourceTarget : targetSource;
|
||||
}
|
||||
|
||||
if (sourcePosition === targetPosition) {
|
||||
const diff = Math.abs(source[dirAccessor] - target[dirAccessor]);
|
||||
|
||||
// if an edge goes from right to right for example (sourcePosition === targetPosition) and the distance between source.x and target.x is less than the offset, the added point and the gapped source/target will overlap. This leads to a weird edge path. To avoid this we add a gapOffset to the source/target
|
||||
if (diff <= offset) {
|
||||
const gapOffset = Math.min(offset - 1, offset - diff);
|
||||
if (sourceDir[dirAccessor] === currDir) {
|
||||
sourceGapOffset[dirAccessor] = gapOffset;
|
||||
} else {
|
||||
targetGapOffset[dirAccessor] = gapOffset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// these are conditions for handling mixed handle positions like Right -> Bottom for example
|
||||
if (sourcePosition !== targetPosition) {
|
||||
const dirAccessorOpposite = dirAccessor === 'x' ? 'y' : 'x';
|
||||
@@ -126,11 +143,28 @@ function getPoints({
|
||||
}
|
||||
}
|
||||
|
||||
centerX = points[0].x;
|
||||
centerY = points[0].y;
|
||||
const sourceGapPoint = { x: sourceGapped.x - sourceGapOffset.x, y: sourceGapped.y - sourceGapOffset.y };
|
||||
const targetGapPoint = { x: targetGapped.x - targetGapOffset.x, y: targetGapped.y - targetGapOffset.y };
|
||||
const maxXDistance = Math.max(Math.abs(sourceGapPoint.x - points[0].x), Math.abs(targetGapPoint.x - points[0].x));
|
||||
const maxYDistance = Math.max(Math.abs(sourceGapPoint.y - points[0].y), Math.abs(targetGapPoint.y - points[0].y));
|
||||
|
||||
// we want to place the label on the longest segment of the edge
|
||||
if (maxXDistance >= maxYDistance) {
|
||||
centerX = (sourceGapPoint.x + targetGapPoint.x) / 2;
|
||||
centerY = points[0].y;
|
||||
} else {
|
||||
centerX = points[0].x;
|
||||
centerY = (sourceGapPoint.y + targetGapPoint.y) / 2;
|
||||
}
|
||||
}
|
||||
|
||||
const pathPoints = [source, sourceGapped, ...points, targetGapped, target];
|
||||
const pathPoints = [
|
||||
source,
|
||||
{ x: sourceGapped.x - sourceGapOffset.x, y: sourceGapped.y - sourceGapOffset.y },
|
||||
...points,
|
||||
{ x: targetGapped.x - targetGapOffset.x, y: targetGapped.y - targetGapOffset.y },
|
||||
target,
|
||||
];
|
||||
|
||||
return [pathPoints, centerX, centerY, defaultOffsetX, defaultOffsetY];
|
||||
}
|
||||
|
||||
@@ -173,3 +173,5 @@ export const getTransformForBounds = (
|
||||
|
||||
return [x, y, clampedZoom];
|
||||
};
|
||||
|
||||
export const isMacOs = () => typeof navigator !== 'undefined' && navigator?.userAgent?.indexOf('Mac') >= 0;
|
||||
|
||||
@@ -254,9 +254,10 @@ export function calcNextPosition<NodeType extends NodeBase>(
|
||||
];
|
||||
}
|
||||
|
||||
const positionAbsolute = currentExtent
|
||||
? clampPosition(nextPosition, currentExtent as CoordinateExtent)
|
||||
: nextPosition;
|
||||
const positionAbsolute =
|
||||
currentExtent && currentExtent !== 'parent'
|
||||
? clampPosition(nextPosition, currentExtent as CoordinateExtent)
|
||||
: nextPosition;
|
||||
|
||||
return {
|
||||
position: {
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
import { drag } from 'd3-drag';
|
||||
import { select } from 'd3-selection';
|
||||
|
||||
import { calcAutoPan, getEventPosition, getPointerPosition, calcNextPosition, snapPosition } from '../utils';
|
||||
import {
|
||||
calcAutoPan,
|
||||
getEventPosition,
|
||||
getPointerPosition,
|
||||
calcNextPosition,
|
||||
snapPosition,
|
||||
getRectOfNodes,
|
||||
rectToBox,
|
||||
} from '../utils';
|
||||
import { getDragItems, getEventHandlerParams, hasSelector, wrapSelectionDragFunc } from './utils';
|
||||
import type {
|
||||
NodeBase,
|
||||
@@ -18,6 +26,7 @@ import type {
|
||||
OnNodeDrag,
|
||||
OnSelectionDrag,
|
||||
UpdateNodePositions,
|
||||
Box,
|
||||
} from '../types';
|
||||
|
||||
export type OnDrag = (event: MouseEvent, dragItems: NodeDragItem[], node: NodeBase, nodes: NodeBase[]) => void;
|
||||
@@ -105,6 +114,12 @@ export function XYDrag({
|
||||
lastPos = { x, y };
|
||||
|
||||
let hasChange = false;
|
||||
let nodesBox: Box = { x: 0, y: 0, x2: 0, y2: 0 };
|
||||
|
||||
if (dragItems.length > 1 && nodeExtent) {
|
||||
const rect = getRectOfNodes(dragItems as unknown as NodeBase[], nodeOrigin);
|
||||
nodesBox = rectToBox(rect);
|
||||
}
|
||||
|
||||
dragItems = dragItems.map((n) => {
|
||||
let nextPosition = { x: x - n.distance.x, y: y - n.distance.y };
|
||||
@@ -113,9 +128,24 @@ export function XYDrag({
|
||||
nextPosition = snapPosition(nextPosition, snapGrid);
|
||||
}
|
||||
|
||||
const updatedPos = calcNextPosition(n, nextPosition, nodes, nodeExtent, nodeOrigin, onError);
|
||||
// if there is selection with multiple nodes and a node extent is set, we need to adjust the node extent for each node
|
||||
// based on its position so that the node stays at it's position relative to the selection.
|
||||
const adjustedNodeExtent: CoordinateExtent = [
|
||||
[nodeExtent[0][0], nodeExtent[0][1]],
|
||||
[nodeExtent[1][0], nodeExtent[1][1]],
|
||||
];
|
||||
|
||||
// we want to make sure that we only fire a change event when there is a changes
|
||||
if (dragItems.length > 1 && nodeExtent && !n.extent) {
|
||||
adjustedNodeExtent[0][0] = n.positionAbsolute.x - nodesBox.x + nodeExtent[0][0];
|
||||
adjustedNodeExtent[1][0] = n.positionAbsolute.x + (n.width ?? 0) - nodesBox.x2 + nodeExtent[1][0];
|
||||
|
||||
adjustedNodeExtent[0][1] = n.positionAbsolute.y - nodesBox.y + nodeExtent[0][1];
|
||||
adjustedNodeExtent[1][1] = n.positionAbsolute.y + (n.height ?? 0) - nodesBox.y2 + nodeExtent[1][1];
|
||||
}
|
||||
|
||||
const updatedPos = calcNextPosition(n, nextPosition, nodes, adjustedNodeExtent, nodeOrigin, onError);
|
||||
|
||||
// we want to make sure that we only fire a change event when there is a change
|
||||
hasChange = hasChange || n.position.x !== updatedPos.position.x || n.position.y !== updatedPos.position.y;
|
||||
|
||||
n.position = updatedPos.position;
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
PanZoomInstance,
|
||||
} from '../types';
|
||||
import { clamp } from '../utils';
|
||||
import { getD3Transition, viewportToTransform } from './utils';
|
||||
import { getD3Transition, viewportToTransform, wheelDelta } from './utils';
|
||||
import {
|
||||
createPanOnScrollHandler,
|
||||
createPanZoomEndHandler,
|
||||
@@ -26,6 +26,8 @@ export type ZoomPanValues = {
|
||||
prevViewport: Viewport;
|
||||
mouseButton: number;
|
||||
timerId: ReturnType<typeof setTimeout> | undefined;
|
||||
panScrollTimeout: ReturnType<typeof setTimeout> | undefined;
|
||||
isPanScrolling: boolean;
|
||||
};
|
||||
|
||||
export function XYPanZoom({
|
||||
@@ -46,6 +48,8 @@ export function XYPanZoom({
|
||||
prevViewport: { x: 0, y: 0, zoom: 0 },
|
||||
mouseButton: 0,
|
||||
timerId: undefined,
|
||||
panScrollTimeout: undefined,
|
||||
isPanScrolling: false,
|
||||
};
|
||||
const bbox = domNode.getBoundingClientRect();
|
||||
const d3ZoomInstance = zoom().scaleExtent([minZoom, maxZoom]).translateExtent(translateExtent);
|
||||
@@ -65,6 +69,7 @@ export function XYPanZoom({
|
||||
);
|
||||
|
||||
const d3ZoomHandler = d3Selection.on('wheel.zoom')!;
|
||||
d3ZoomInstance.wheelDelta(wheelDelta);
|
||||
|
||||
function setTransform(transform: ZoomTransform, options?: PanZoomTransformOptions) {
|
||||
if (d3Selection) {
|
||||
@@ -97,12 +102,16 @@ export function XYPanZoom({
|
||||
|
||||
const wheelHandler = isPanOnScroll
|
||||
? createPanOnScrollHandler({
|
||||
zoomPanValues,
|
||||
noWheelClassName,
|
||||
d3Selection,
|
||||
d3Zoom: d3ZoomInstance,
|
||||
panOnScrollMode,
|
||||
panOnScrollSpeed,
|
||||
zoomOnPinch,
|
||||
onPanZoomStart,
|
||||
onPanZoom,
|
||||
onPanZoomEnd,
|
||||
})
|
||||
: createZoomOnScrollHandler({
|
||||
noWheelClassName,
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
||||
import type { D3ZoomEvent } from 'd3-zoom';
|
||||
import { pointer } from 'd3-selection';
|
||||
|
||||
@@ -7,27 +9,24 @@ import {
|
||||
type D3ZoomHandler,
|
||||
type D3ZoomInstance,
|
||||
type OnPanZoom,
|
||||
type Viewport,
|
||||
type OnDraggingChange,
|
||||
type OnTransformChange,
|
||||
} from '../types';
|
||||
import { isRightClickPan, isWrappedWithClass, transformToViewport, viewChanged } from './utils';
|
||||
|
||||
export type ZoomPanValues = {
|
||||
isZoomingOrPanning: boolean;
|
||||
usedRightMouseButton: boolean;
|
||||
prevViewport: Viewport;
|
||||
mouseButton: number;
|
||||
timerId: ReturnType<typeof setTimeout> | undefined;
|
||||
};
|
||||
import { isRightClickPan, isWrappedWithClass, transformToViewport, viewChanged, wheelDelta } from './utils';
|
||||
import { isMacOs } from '../utils';
|
||||
import { ZoomPanValues } from './XYPanZoom';
|
||||
|
||||
export type PanOnScrollParams = {
|
||||
zoomPanValues: ZoomPanValues;
|
||||
noWheelClassName: string;
|
||||
d3Selection: D3SelectionInstance;
|
||||
d3Zoom: D3ZoomInstance;
|
||||
panOnScrollMode: PanOnScrollMode;
|
||||
panOnScrollSpeed: number;
|
||||
zoomOnPinch: boolean;
|
||||
onPanZoomStart?: OnPanZoom;
|
||||
onPanZoom?: OnPanZoom;
|
||||
onPanZoomEnd?: OnPanZoom;
|
||||
};
|
||||
|
||||
export type ZoomOnScrollParams = {
|
||||
@@ -60,12 +59,16 @@ export type PanZoomEndParams = {
|
||||
};
|
||||
|
||||
export function createPanOnScrollHandler({
|
||||
zoomPanValues,
|
||||
noWheelClassName,
|
||||
d3Selection,
|
||||
d3Zoom,
|
||||
panOnScrollMode,
|
||||
panOnScrollSpeed,
|
||||
zoomOnPinch,
|
||||
onPanZoomStart,
|
||||
onPanZoom,
|
||||
onPanZoomEnd,
|
||||
}: PanOnScrollParams) {
|
||||
return (event: any) => {
|
||||
if (isWrappedWithClass(event, noWheelClassName)) {
|
||||
@@ -75,13 +78,15 @@ export function createPanOnScrollHandler({
|
||||
event.stopImmediatePropagation();
|
||||
|
||||
const currentZoom = d3Selection.property('__zoom').k || 1;
|
||||
const _isMacOs = isMacOs();
|
||||
|
||||
if (event.ctrlKey && zoomOnPinch) {
|
||||
// macos sets ctrlKey=true for pinch gesture on a trackpad
|
||||
if (event.ctrlKey && zoomOnPinch && _isMacOs) {
|
||||
const point = pointer(event);
|
||||
// taken from https://github.com/d3/d3-zoom/blob/master/src/zoom.js
|
||||
const pinchDelta = -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * 10;
|
||||
const pinchDelta = wheelDelta(event);
|
||||
const zoom = currentZoom * Math.pow(2, pinchDelta);
|
||||
d3Zoom.scaleTo(d3Selection, zoom, point);
|
||||
// @ts-ignore
|
||||
d3Zoom.scaleTo(d3Selection, zoom, point, event);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -89,14 +94,45 @@ export function createPanOnScrollHandler({
|
||||
// increase scroll speed in firefox
|
||||
// firefox: deltaMode === 1; chrome: deltaMode === 0
|
||||
const deltaNormalize = event.deltaMode === 1 ? 20 : 1;
|
||||
const deltaX = panOnScrollMode === PanOnScrollMode.Vertical ? 0 : event.deltaX * deltaNormalize;
|
||||
const deltaY = panOnScrollMode === PanOnScrollMode.Horizontal ? 0 : event.deltaY * deltaNormalize;
|
||||
let deltaX = panOnScrollMode === PanOnScrollMode.Vertical ? 0 : event.deltaX * deltaNormalize;
|
||||
let deltaY = panOnScrollMode === PanOnScrollMode.Horizontal ? 0 : event.deltaY * deltaNormalize;
|
||||
|
||||
// this enables vertical scrolling with shift + scroll on windows
|
||||
if (!_isMacOs && event.shiftKey && panOnScrollMode !== PanOnScrollMode.Vertical) {
|
||||
deltaX = event.deltaY * deltaNormalize;
|
||||
deltaY = 0;
|
||||
}
|
||||
|
||||
d3Zoom.translateBy(
|
||||
d3Selection,
|
||||
-(deltaX / currentZoom) * panOnScrollSpeed,
|
||||
-(deltaY / currentZoom) * panOnScrollSpeed
|
||||
-(deltaY / currentZoom) * panOnScrollSpeed,
|
||||
// @ts-ignore
|
||||
{ internal: true }
|
||||
);
|
||||
|
||||
const nextViewport = transformToViewport(d3Selection.property('__zoom'));
|
||||
|
||||
clearTimeout(zoomPanValues.panScrollTimeout);
|
||||
|
||||
// for pan on scroll we need to handle the event calls on our own
|
||||
// we can't use the start, zoom and end events from d3-zoom
|
||||
// because start and move gets called on every scroll event and not once at the beginning
|
||||
if (!zoomPanValues.isPanScrolling) {
|
||||
zoomPanValues.isPanScrolling = true;
|
||||
|
||||
onPanZoomStart?.(event, nextViewport);
|
||||
}
|
||||
|
||||
if (zoomPanValues.isPanScrolling) {
|
||||
onPanZoom?.(event, nextViewport);
|
||||
|
||||
zoomPanValues.panScrollTimeout = setTimeout(() => {
|
||||
onPanZoomEnd?.(event, nextViewport);
|
||||
|
||||
zoomPanValues.isPanScrolling = false;
|
||||
}, 150);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -114,19 +150,22 @@ export function createZoomOnScrollHandler({ noWheelClassName, preventScrolling,
|
||||
|
||||
export function createPanZoomStartHandler({ zoomPanValues, onDraggingChange, onPanZoomStart }: PanZoomStartParams) {
|
||||
return (event: D3ZoomEvent<HTMLDivElement, any>) => {
|
||||
if (event.sourceEvent?.internal) {
|
||||
return;
|
||||
}
|
||||
|
||||
const viewport = transformToViewport(event.transform);
|
||||
|
||||
// we need to remember it here, because it's always 0 in the "zoom" event
|
||||
zoomPanValues.mouseButton = event.sourceEvent?.button || 0;
|
||||
|
||||
zoomPanValues.isZoomingOrPanning = true;
|
||||
zoomPanValues.prevViewport = viewport;
|
||||
|
||||
if (event.sourceEvent?.type === 'mousedown') {
|
||||
onDraggingChange(true);
|
||||
}
|
||||
|
||||
if (onPanZoomStart) {
|
||||
const viewport = transformToViewport(event.transform);
|
||||
zoomPanValues.prevViewport = viewport;
|
||||
|
||||
onPanZoomStart?.(event.sourceEvent as MouseEvent | TouchEvent, viewport);
|
||||
}
|
||||
};
|
||||
@@ -146,7 +185,7 @@ export function createPanZoomHandler({
|
||||
|
||||
onTransformChange([event.transform.x, event.transform.y, event.transform.k]);
|
||||
|
||||
if (onPanZoom) {
|
||||
if (onPanZoom && !event.sourceEvent?.internal) {
|
||||
onPanZoom?.(event.sourceEvent as MouseEvent | TouchEvent, transformToViewport(event.transform));
|
||||
}
|
||||
};
|
||||
@@ -161,6 +200,9 @@ export function createPanZoomEndHandler({
|
||||
onPaneContextMenu,
|
||||
}: PanZoomEndParams) {
|
||||
return (event: D3ZoomEvent<HTMLDivElement, any>) => {
|
||||
if (event.sourceEvent?.internal) {
|
||||
return;
|
||||
}
|
||||
zoomPanValues.isZoomingOrPanning = false;
|
||||
|
||||
if (
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { type ZoomTransform, zoomIdentity } from 'd3-zoom';
|
||||
|
||||
import { type D3SelectionInstance, type Viewport } from '../types';
|
||||
import { isMacOs } from '../utils';
|
||||
|
||||
export const viewChanged = (prevViewport: Viewport, eventViewport: any): boolean =>
|
||||
prevViewport.x !== eventViewport.x || prevViewport.y !== eventViewport.y || prevViewport.zoom !== eventViewport.k;
|
||||
@@ -21,3 +22,9 @@ export const isRightClickPan = (panOnDrag: boolean | number[], usedButton: numbe
|
||||
|
||||
export const getD3Transition = (selection: D3SelectionInstance, duration = 0) =>
|
||||
typeof duration === 'number' && duration > 0 ? selection.transition().duration(duration) : selection;
|
||||
|
||||
export const wheelDelta = (event: any) => {
|
||||
const factor = event.ctrlKey && isMacOs() ? 10 : 1;
|
||||
|
||||
return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * factor;
|
||||
};
|
||||
|
||||
Generated
+183
-258
@@ -169,8 +169,8 @@ importers:
|
||||
specifier: '>=17'
|
||||
version: registry.npmjs.org/react-dom@18.2.0(react@18.2.0)
|
||||
zustand:
|
||||
specifier: ^4.3.3
|
||||
version: registry.npmjs.org/zustand@4.3.8(react@18.2.0)
|
||||
specifier: ^4.4.0
|
||||
version: registry.npmjs.org/zustand@4.4.0(@types/react@18.2.12)(react@18.2.0)
|
||||
devDependencies:
|
||||
'@types/node':
|
||||
specifier: ^18.7.16
|
||||
@@ -211,13 +211,13 @@ importers:
|
||||
devDependencies:
|
||||
'@sveltejs/adapter-auto':
|
||||
specifier: ^2.1.0
|
||||
version: registry.npmjs.org/@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.20.5)
|
||||
version: registry.npmjs.org/@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.22.6)
|
||||
'@sveltejs/kit':
|
||||
specifier: ^1.20.5
|
||||
version: registry.npmjs.org/@sveltejs/kit@1.20.5(svelte@4.0.0)(vite@4.3.9)
|
||||
specifier: ^1.22.6
|
||||
version: registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.0)(vite@4.3.9)
|
||||
'@sveltejs/package':
|
||||
specifier: ^2.1.0
|
||||
version: registry.npmjs.org/@sveltejs/package@2.1.0(svelte@4.0.0)(typescript@5.1.3)
|
||||
specifier: ^2.2.1
|
||||
version: registry.npmjs.org/@sveltejs/package@2.2.1(svelte@4.2.0)(typescript@5.1.3)
|
||||
'@typescript-eslint/eslint-plugin':
|
||||
specifier: ^5.60.0
|
||||
version: registry.npmjs.org/@typescript-eslint/eslint-plugin@5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3)
|
||||
@@ -232,22 +232,22 @@ importers:
|
||||
version: registry.npmjs.org/eslint-config-prettier@8.8.0(eslint@8.43.0)
|
||||
eslint-plugin-svelte:
|
||||
specifier: ^2.31.1
|
||||
version: registry.npmjs.org/eslint-plugin-svelte@2.31.1(eslint@8.43.0)(svelte@4.0.0)
|
||||
version: registry.npmjs.org/eslint-plugin-svelte@2.31.1(eslint@8.43.0)(svelte@4.2.0)
|
||||
prettier:
|
||||
specifier: ^2.8.8
|
||||
version: registry.npmjs.org/prettier@2.8.8
|
||||
prettier-plugin-svelte:
|
||||
specifier: ^2.10.1
|
||||
version: registry.npmjs.org/prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@4.0.0)
|
||||
version: registry.npmjs.org/prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@4.2.0)
|
||||
svelte:
|
||||
specifier: ^4.0.0
|
||||
version: registry.npmjs.org/svelte@4.0.0
|
||||
specifier: ^4.2.0
|
||||
version: registry.npmjs.org/svelte@4.2.0
|
||||
svelte-check:
|
||||
specifier: ^3.4.4
|
||||
version: registry.npmjs.org/svelte-check@3.4.4(postcss@8.4.24)(svelte@4.0.0)
|
||||
specifier: ^3.5.0
|
||||
version: registry.npmjs.org/svelte-check@3.5.0(postcss@8.4.27)(svelte@4.2.0)
|
||||
svelte-eslint-parser:
|
||||
specifier: ^0.31.0
|
||||
version: registry.npmjs.org/svelte-eslint-parser@0.31.0(svelte@4.0.0)
|
||||
specifier: ^0.32.2
|
||||
version: registry.npmjs.org/svelte-eslint-parser@0.32.2(svelte@4.2.0)
|
||||
tslib:
|
||||
specifier: ^2.5.3
|
||||
version: registry.npmjs.org/tslib@2.5.3
|
||||
@@ -413,7 +413,7 @@ packages:
|
||||
dependencies:
|
||||
'@babel/types': registry.npmjs.org/@babel/types@7.22.10
|
||||
'@jridgewell/gen-mapping': registry.npmjs.org/@jridgewell/gen-mapping@0.3.3
|
||||
'@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.19
|
||||
'@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.18
|
||||
jsesc: registry.npmjs.org/jsesc@2.5.2
|
||||
dev: true
|
||||
|
||||
@@ -900,10 +900,10 @@ packages:
|
||||
dev: true
|
||||
optional: true
|
||||
|
||||
registry.npmjs.org/@cypress/request@2.88.12:
|
||||
resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz}
|
||||
registry.npmjs.org/@cypress/request@2.88.11:
|
||||
resolution: {integrity: sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz}
|
||||
name: '@cypress/request'
|
||||
version: 2.88.12
|
||||
version: 2.88.11
|
||||
engines: {node: '>= 6'}
|
||||
dependencies:
|
||||
aws-sign2: registry.npmjs.org/aws-sign2@0.7.0
|
||||
@@ -921,7 +921,7 @@ packages:
|
||||
performance-now: registry.npmjs.org/performance-now@2.1.0
|
||||
qs: registry.npmjs.org/qs@6.10.4
|
||||
safe-buffer: registry.npmjs.org/safe-buffer@5.2.1
|
||||
tough-cookie: registry.npmjs.org/tough-cookie@4.1.3
|
||||
tough-cookie: registry.npmjs.org/tough-cookie@2.5.0
|
||||
tunnel-agent: registry.npmjs.org/tunnel-agent@0.6.0
|
||||
uuid: registry.npmjs.org/uuid@8.3.2
|
||||
dev: true
|
||||
@@ -1438,7 +1438,7 @@ packages:
|
||||
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
|
||||
dependencies:
|
||||
eslint: registry.npmjs.org/eslint@8.42.0
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.1
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.43.0):
|
||||
@@ -1451,7 +1451,7 @@ packages:
|
||||
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
|
||||
dependencies:
|
||||
eslint: registry.npmjs.org/eslint@8.43.0
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.1
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@eslint-community/regexpp@4.5.1:
|
||||
@@ -1559,13 +1559,6 @@ packages:
|
||||
engines: {node: '>=6.0.0'}
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@jridgewell/resolve-uri@3.1.1:
|
||||
resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz}
|
||||
name: '@jridgewell/resolve-uri'
|
||||
version: 3.1.1
|
||||
engines: {node: '>=6.0.0'}
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@jridgewell/set-array@1.1.2:
|
||||
resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz}
|
||||
name: '@jridgewell/set-array'
|
||||
@@ -1603,15 +1596,6 @@ packages:
|
||||
'@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.14
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@jridgewell/trace-mapping@0.3.19:
|
||||
resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz}
|
||||
name: '@jridgewell/trace-mapping'
|
||||
version: 0.3.19
|
||||
dependencies:
|
||||
'@jridgewell/resolve-uri': registry.npmjs.org/@jridgewell/resolve-uri@3.1.1
|
||||
'@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.15
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@manypkg/find-root@1.1.0:
|
||||
resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz}
|
||||
name: '@manypkg/find-root'
|
||||
@@ -1819,7 +1803,7 @@ packages:
|
||||
version: 2.0.0
|
||||
dev: false
|
||||
|
||||
registry.npmjs.org/@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.20.5):
|
||||
registry.npmjs.org/@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.22.6):
|
||||
resolution: {integrity: sha512-o2pZCfATFtA/Gw/BB0Xm7k4EYaekXxaPGER3xGSY3FvzFJGTlJlZjBseaXwYSM94lZ0HniOjTokN3cWaLX6fow==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.1.0.tgz}
|
||||
id: registry.npmjs.org/@sveltejs/adapter-auto/2.1.0
|
||||
name: '@sveltejs/adapter-auto'
|
||||
@@ -1827,15 +1811,15 @@ packages:
|
||||
peerDependencies:
|
||||
'@sveltejs/kit': ^1.0.0
|
||||
dependencies:
|
||||
'@sveltejs/kit': registry.npmjs.org/@sveltejs/kit@1.20.5(svelte@4.0.0)(vite@4.3.9)
|
||||
'@sveltejs/kit': registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.0)(vite@4.3.9)
|
||||
import-meta-resolve: registry.npmjs.org/import-meta-resolve@3.0.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@sveltejs/kit@1.20.5(svelte@4.0.0)(vite@4.3.9):
|
||||
resolution: {integrity: sha512-8rJYZ2boRlO75lwpbpB+DlSzIwmTuamXTpVlDtw4dBk86o3UaDe/+Ro4xCsV/4FtTw2U8xPHyV83edAWbQHG0w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/kit/-/kit-1.20.5.tgz}
|
||||
id: registry.npmjs.org/@sveltejs/kit/1.20.5
|
||||
registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.0)(vite@4.3.9):
|
||||
resolution: {integrity: sha512-SDKxI/QpsReCwIn5czjT53fKlPBybbmMk67d317gUqfeORroBAFN1Z6s/x0E1JYi+04i7kKllS+Sz9wVfmUkAQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/kit/-/kit-1.22.6.tgz}
|
||||
id: registry.npmjs.org/@sveltejs/kit/1.22.6
|
||||
name: '@sveltejs/kit'
|
||||
version: 1.20.5
|
||||
version: 1.22.6
|
||||
engines: {node: ^16.14 || >=18}
|
||||
hasBin: true
|
||||
requiresBuild: true
|
||||
@@ -1843,7 +1827,7 @@ packages:
|
||||
svelte: ^3.54.0 || ^4.0.0-next.0
|
||||
vite: ^4.0.0
|
||||
dependencies:
|
||||
'@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.1(svelte@4.0.0)(vite@4.3.9)
|
||||
'@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.1(svelte@4.2.0)(vite@4.3.9)
|
||||
'@types/cookie': registry.npmjs.org/@types/cookie@0.5.1
|
||||
cookie: registry.npmjs.org/cookie@0.5.0
|
||||
devalue: registry.npmjs.org/devalue@4.3.2
|
||||
@@ -1854,18 +1838,18 @@ packages:
|
||||
sade: registry.npmjs.org/sade@1.8.1
|
||||
set-cookie-parser: registry.npmjs.org/set-cookie-parser@2.6.0
|
||||
sirv: registry.npmjs.org/sirv@2.0.3
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
undici: registry.npmjs.org/undici@5.22.1
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
undici: registry.npmjs.org/undici@5.23.0
|
||||
vite: registry.npmjs.org/vite@4.3.9
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@sveltejs/package@2.1.0(svelte@4.0.0)(typescript@5.1.3):
|
||||
resolution: {integrity: sha512-c6PLH9G2YLQ48kqrS2XX422BrLNABBstSiapamchVJaQnOTXyJmUR8KmoCCySnzVy3PiYL6jg12UnoPmjW3SwA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/package/-/package-2.1.0.tgz}
|
||||
id: registry.npmjs.org/@sveltejs/package/2.1.0
|
||||
registry.npmjs.org/@sveltejs/package@2.2.1(svelte@4.2.0)(typescript@5.1.3):
|
||||
resolution: {integrity: sha512-7Yv4SdoOZFPYWK1/A8LtZ7+WLlZny/4q5sWbU7dnkEqbIt5j4V3TzrquT9nAE6sUy6Dghxf35dXoPIdvRH7w7g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/package/-/package-2.2.1.tgz}
|
||||
id: registry.npmjs.org/@sveltejs/package/2.2.1
|
||||
name: '@sveltejs/package'
|
||||
version: 2.1.0
|
||||
version: 2.2.1
|
||||
engines: {node: ^16.14 || >=18}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
@@ -1874,13 +1858,14 @@ packages:
|
||||
chokidar: registry.npmjs.org/chokidar@3.5.3
|
||||
kleur: registry.npmjs.org/kleur@4.1.5
|
||||
sade: registry.npmjs.org/sade@1.8.1
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte2tsx: registry.npmjs.org/svelte2tsx@0.6.15(svelte@4.0.0)(typescript@5.1.3)
|
||||
semver: registry.npmjs.org/semver@7.5.3
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
svelte2tsx: registry.npmjs.org/svelte2tsx@0.6.20(svelte@4.2.0)(typescript@5.1.3)
|
||||
transitivePeerDependencies:
|
||||
- typescript
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.0.0)(vite@4.3.9):
|
||||
registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.2.0)(vite@4.3.9):
|
||||
resolution: {integrity: sha512-Cy1dUMcYCnDVV/hPLXa43YZJ2jGKVW5rA0xuNL9dlmYhT0yoS1g7+FOFSRlgk0BXKk/Oc7grs+8BVA5Iz2fr8A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.2.tgz}
|
||||
id: registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/1.0.2
|
||||
name: '@sveltejs/vite-plugin-svelte-inspector'
|
||||
@@ -1891,15 +1876,15 @@ packages:
|
||||
svelte: ^3.54.0 || ^4.0.0-next.0
|
||||
vite: ^4.0.0
|
||||
dependencies:
|
||||
'@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.1(svelte@4.0.0)(vite@4.3.9)
|
||||
'@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.1(svelte@4.2.0)(vite@4.3.9)
|
||||
debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1)
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
vite: registry.npmjs.org/vite@4.3.9
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.1(svelte@4.0.0)(vite@4.3.9):
|
||||
registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.1(svelte@4.2.0)(vite@4.3.9):
|
||||
resolution: {integrity: sha512-bNNKvoRY89ptY7udeBSCmTdCVwkjmMcZ0j/z9J5MuedT8jPjq0zrknAo/jF1sToAza4NVaAgR9AkZoD9oJJmnA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.1.tgz}
|
||||
id: registry.npmjs.org/@sveltejs/vite-plugin-svelte/2.4.1
|
||||
name: '@sveltejs/vite-plugin-svelte'
|
||||
@@ -1909,13 +1894,13 @@ packages:
|
||||
svelte: ^3.54.0 || ^4.0.0-next.0
|
||||
vite: ^4.0.0
|
||||
dependencies:
|
||||
'@sveltejs/vite-plugin-svelte-inspector': registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.0.0)(vite@4.3.9)
|
||||
'@sveltejs/vite-plugin-svelte-inspector': registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.2.0)(vite@4.3.9)
|
||||
debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1)
|
||||
deepmerge: registry.npmjs.org/deepmerge@4.3.1
|
||||
kleur: registry.npmjs.org/kleur@4.1.5
|
||||
magic-string: registry.npmjs.org/magic-string@0.30.0
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte-hmr: registry.npmjs.org/svelte-hmr@0.15.2(svelte@4.0.0)
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
svelte-hmr: registry.npmjs.org/svelte-hmr@0.15.2(svelte@4.2.0)
|
||||
vite: registry.npmjs.org/vite@4.3.9
|
||||
vitefu: registry.npmjs.org/vitefu@0.2.4(vite@4.3.9)
|
||||
transitivePeerDependencies:
|
||||
@@ -2434,7 +2419,7 @@ packages:
|
||||
version: 2.10.0
|
||||
requiresBuild: true
|
||||
dependencies:
|
||||
'@types/node': registry.npmjs.org/@types/node@16.18.40
|
||||
'@types/node': registry.npmjs.org/@types/node@18.16.18
|
||||
dev: true
|
||||
optional: true
|
||||
|
||||
@@ -2646,7 +2631,7 @@ packages:
|
||||
debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1)
|
||||
globby: registry.npmjs.org/globby@11.1.0
|
||||
is-glob: registry.npmjs.org/is-glob@4.0.3
|
||||
semver: registry.npmjs.org/semver@7.5.3
|
||||
semver: registry.npmjs.org/semver@7.5.4
|
||||
tsutils: registry.npmjs.org/tsutils@3.21.0(typescript@5.1.3)
|
||||
typescript: registry.npmjs.org/typescript@5.1.3
|
||||
transitivePeerDependencies:
|
||||
@@ -2694,7 +2679,7 @@ packages:
|
||||
'@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@5.60.0(typescript@5.1.3)
|
||||
eslint: registry.npmjs.org/eslint@8.43.0
|
||||
eslint-scope: registry.npmjs.org/eslint-scope@5.1.1
|
||||
semver: registry.npmjs.org/semver@7.5.3
|
||||
semver: registry.npmjs.org/semver@7.5.4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
- typescript
|
||||
@@ -2729,7 +2714,7 @@ packages:
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
dependencies:
|
||||
'@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.60.0
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.1
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/@typescript-eslint/visitor-keys@6.3.0:
|
||||
@@ -2785,6 +2770,14 @@ packages:
|
||||
acorn: registry.npmjs.org/acorn@8.8.2
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/acorn@8.10.0:
|
||||
resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz}
|
||||
name: acorn
|
||||
version: 8.10.0
|
||||
engines: {node: '>=0.4.0'}
|
||||
hasBin: true
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/acorn@8.8.2:
|
||||
resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz}
|
||||
name: acorn
|
||||
@@ -2936,7 +2929,7 @@ packages:
|
||||
dependencies:
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
define-properties: registry.npmjs.org/define-properties@1.2.0
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.21.2
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.22.1
|
||||
es-shim-unscopables: registry.npmjs.org/es-shim-unscopables@1.0.0
|
||||
dev: true
|
||||
|
||||
@@ -3173,8 +3166,8 @@ packages:
|
||||
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
caniuse-lite: registry.npmjs.org/caniuse-lite@1.0.30001520
|
||||
electron-to-chromium: registry.npmjs.org/electron-to-chromium@1.4.491
|
||||
caniuse-lite: registry.npmjs.org/caniuse-lite@1.0.30001521
|
||||
electron-to-chromium: registry.npmjs.org/electron-to-chromium@1.4.492
|
||||
node-releases: registry.npmjs.org/node-releases@2.0.13
|
||||
update-browserslist-db: registry.npmjs.org/update-browserslist-db@1.0.11(browserslist@4.21.10)
|
||||
dev: true
|
||||
@@ -3229,10 +3222,10 @@ packages:
|
||||
streamsearch: registry.npmjs.org/streamsearch@1.1.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/cachedir@2.4.0:
|
||||
resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz}
|
||||
registry.npmjs.org/cachedir@2.3.0:
|
||||
resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz}
|
||||
name: cachedir
|
||||
version: 2.4.0
|
||||
version: 2.3.0
|
||||
engines: {node: '>=6'}
|
||||
dev: true
|
||||
|
||||
@@ -3276,10 +3269,10 @@ packages:
|
||||
version: 1.0.30001502
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/caniuse-lite@1.0.30001520:
|
||||
resolution: {integrity: sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz}
|
||||
registry.npmjs.org/caniuse-lite@1.0.30001521:
|
||||
resolution: {integrity: sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz}
|
||||
name: caniuse-lite
|
||||
version: 1.0.30001520
|
||||
version: 1.0.30001521
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/caseless@0.12.0:
|
||||
@@ -3424,7 +3417,7 @@ packages:
|
||||
dependencies:
|
||||
'@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.15
|
||||
'@types/estree': registry.npmjs.org/@types/estree@1.0.1
|
||||
acorn: registry.npmjs.org/acorn@8.8.2
|
||||
acorn: registry.npmjs.org/acorn@8.10.0
|
||||
estree-walker: registry.npmjs.org/estree-walker@3.0.3
|
||||
periscopic: registry.npmjs.org/periscopic@3.1.0
|
||||
dev: true
|
||||
@@ -3625,7 +3618,7 @@ packages:
|
||||
cypress: ^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x
|
||||
dependencies:
|
||||
cypress: registry.npmjs.org/cypress@12.17.3
|
||||
prettier: registry.npmjs.org/prettier@3.0.1
|
||||
prettier: registry.npmjs.org/prettier@3.0.2
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/cypress@12.17.3:
|
||||
@@ -3636,7 +3629,7 @@ packages:
|
||||
hasBin: true
|
||||
requiresBuild: true
|
||||
dependencies:
|
||||
'@cypress/request': registry.npmjs.org/@cypress/request@2.88.12
|
||||
'@cypress/request': registry.npmjs.org/@cypress/request@2.88.11
|
||||
'@cypress/xvfb': registry.npmjs.org/@cypress/xvfb@1.2.4(supports-color@8.1.1)
|
||||
'@types/node': registry.npmjs.org/@types/node@16.18.40
|
||||
'@types/sinonjs__fake-timers': registry.npmjs.org/@types/sinonjs__fake-timers@8.1.1
|
||||
@@ -3645,16 +3638,16 @@ packages:
|
||||
blob-util: registry.npmjs.org/blob-util@2.0.2
|
||||
bluebird: registry.npmjs.org/bluebird@3.7.2
|
||||
buffer: registry.npmjs.org/buffer@5.7.1
|
||||
cachedir: registry.npmjs.org/cachedir@2.4.0
|
||||
cachedir: registry.npmjs.org/cachedir@2.3.0
|
||||
chalk: registry.npmjs.org/chalk@4.1.2
|
||||
check-more-types: registry.npmjs.org/check-more-types@2.24.0
|
||||
cli-cursor: registry.npmjs.org/cli-cursor@3.1.0
|
||||
cli-table3: registry.npmjs.org/cli-table3@0.6.3
|
||||
commander: registry.npmjs.org/commander@6.2.1
|
||||
common-tags: registry.npmjs.org/common-tags@1.8.2
|
||||
dayjs: registry.npmjs.org/dayjs@1.11.9
|
||||
dayjs: registry.npmjs.org/dayjs@1.11.8
|
||||
debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1)
|
||||
enquirer: registry.npmjs.org/enquirer@2.4.1
|
||||
enquirer: registry.npmjs.org/enquirer@2.3.6
|
||||
eventemitter2: registry.npmjs.org/eventemitter2@6.4.7
|
||||
execa: registry.npmjs.org/execa@4.1.0
|
||||
executable: registry.npmjs.org/executable@4.1.1
|
||||
@@ -3665,7 +3658,7 @@ packages:
|
||||
is-ci: registry.npmjs.org/is-ci@3.0.1
|
||||
is-installed-globally: registry.npmjs.org/is-installed-globally@0.4.0
|
||||
lazy-ass: registry.npmjs.org/lazy-ass@1.6.0
|
||||
listr2: registry.npmjs.org/listr2@3.14.0(enquirer@2.4.1)
|
||||
listr2: registry.npmjs.org/listr2@3.14.0(enquirer@2.3.6)
|
||||
lodash: registry.npmjs.org/lodash@4.17.21
|
||||
log-symbols: registry.npmjs.org/log-symbols@4.1.0
|
||||
minimist: registry.npmjs.org/minimist@1.2.8
|
||||
@@ -3797,10 +3790,10 @@ packages:
|
||||
'@babel/runtime': registry.npmjs.org/@babel/runtime@7.22.5
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/dayjs@1.11.9:
|
||||
resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz}
|
||||
registry.npmjs.org/dayjs@1.11.8:
|
||||
resolution: {integrity: sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz}
|
||||
name: dayjs
|
||||
version: 1.11.9
|
||||
version: 1.11.8
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/debug@3.2.7(supports-color@8.1.1):
|
||||
@@ -3984,10 +3977,10 @@ packages:
|
||||
version: 1.4.428
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/electron-to-chromium@1.4.491:
|
||||
resolution: {integrity: sha512-ZzPqGKghdVzlQJ+qpfE+r6EB321zed7e5JsvHIlMM4zPFF8okXUkF5Of7h7F3l3cltPL0rG7YVmlp5Qro7RQLA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.491.tgz}
|
||||
registry.npmjs.org/electron-to-chromium@1.4.492:
|
||||
resolution: {integrity: sha512-36K9b/6skMVwAIEsC7GiQ8I8N3soCALVSHqWHzNDtGemAcI9Xu8hP02cywWM0A794rTHm0b0zHPeLJHtgFVamQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.492.tgz}
|
||||
name: electron-to-chromium
|
||||
version: 1.4.491
|
||||
version: 1.4.492
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/emoji-regex@8.0.0:
|
||||
@@ -4013,16 +4006,6 @@ packages:
|
||||
ansi-colors: registry.npmjs.org/ansi-colors@4.1.3
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/enquirer@2.4.1:
|
||||
resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz}
|
||||
name: enquirer
|
||||
version: 2.4.1
|
||||
engines: {node: '>=8.6'}
|
||||
dependencies:
|
||||
ansi-colors: registry.npmjs.org/ansi-colors@4.1.3
|
||||
strip-ansi: registry.npmjs.org/strip-ansi@6.0.1
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/error-ex@1.3.2:
|
||||
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz}
|
||||
name: error-ex
|
||||
@@ -4031,48 +4014,6 @@ packages:
|
||||
is-arrayish: registry.npmjs.org/is-arrayish@0.2.1
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/es-abstract@1.21.2:
|
||||
resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz}
|
||||
name: es-abstract
|
||||
version: 1.21.2
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
array-buffer-byte-length: registry.npmjs.org/array-buffer-byte-length@1.0.0
|
||||
available-typed-arrays: registry.npmjs.org/available-typed-arrays@1.0.5
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
es-set-tostringtag: registry.npmjs.org/es-set-tostringtag@2.0.1
|
||||
es-to-primitive: registry.npmjs.org/es-to-primitive@1.2.1
|
||||
function.prototype.name: registry.npmjs.org/function.prototype.name@1.1.5
|
||||
get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.1
|
||||
get-symbol-description: registry.npmjs.org/get-symbol-description@1.0.0
|
||||
globalthis: registry.npmjs.org/globalthis@1.0.3
|
||||
gopd: registry.npmjs.org/gopd@1.0.1
|
||||
has: registry.npmjs.org/has@1.0.3
|
||||
has-property-descriptors: registry.npmjs.org/has-property-descriptors@1.0.0
|
||||
has-proto: registry.npmjs.org/has-proto@1.0.1
|
||||
has-symbols: registry.npmjs.org/has-symbols@1.0.3
|
||||
internal-slot: registry.npmjs.org/internal-slot@1.0.5
|
||||
is-array-buffer: registry.npmjs.org/is-array-buffer@3.0.2
|
||||
is-callable: registry.npmjs.org/is-callable@1.2.7
|
||||
is-negative-zero: registry.npmjs.org/is-negative-zero@2.0.2
|
||||
is-regex: registry.npmjs.org/is-regex@1.1.4
|
||||
is-shared-array-buffer: registry.npmjs.org/is-shared-array-buffer@1.0.2
|
||||
is-string: registry.npmjs.org/is-string@1.0.7
|
||||
is-typed-array: registry.npmjs.org/is-typed-array@1.1.10
|
||||
is-weakref: registry.npmjs.org/is-weakref@1.0.2
|
||||
object-inspect: registry.npmjs.org/object-inspect@1.12.3
|
||||
object-keys: registry.npmjs.org/object-keys@1.1.1
|
||||
object.assign: registry.npmjs.org/object.assign@4.1.4
|
||||
regexp.prototype.flags: registry.npmjs.org/regexp.prototype.flags@1.5.0
|
||||
safe-regex-test: registry.npmjs.org/safe-regex-test@1.0.0
|
||||
string.prototype.trim: registry.npmjs.org/string.prototype.trim@1.2.7
|
||||
string.prototype.trimend: registry.npmjs.org/string.prototype.trimend@1.0.6
|
||||
string.prototype.trimstart: registry.npmjs.org/string.prototype.trimstart@1.0.6
|
||||
typed-array-length: registry.npmjs.org/typed-array-length@1.0.4
|
||||
unbox-primitive: registry.npmjs.org/unbox-primitive@1.0.2
|
||||
which-typed-array: registry.npmjs.org/which-typed-array@1.1.9
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/es-abstract@1.22.1:
|
||||
resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz}
|
||||
name: es-abstract
|
||||
@@ -4324,7 +4265,7 @@ packages:
|
||||
string.prototype.matchall: registry.npmjs.org/string.prototype.matchall@4.0.8
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/eslint-plugin-svelte@2.31.1(eslint@8.43.0)(svelte@4.0.0):
|
||||
registry.npmjs.org/eslint-plugin-svelte@2.31.1(eslint@8.43.0)(svelte@4.2.0):
|
||||
resolution: {integrity: sha512-08v+DqzHiwIVEbi+266D7+BDhayp9OSqCwa/lHaZlZOlFY0vZLYs/h7SkkUPzA5fTVt8OUJBtvCxFiWEYOvvGg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.31.1.tgz}
|
||||
id: registry.npmjs.org/eslint-plugin-svelte/2.31.1
|
||||
name: eslint-plugin-svelte
|
||||
@@ -4348,8 +4289,8 @@ packages:
|
||||
postcss-safe-parser: registry.npmjs.org/postcss-safe-parser@6.0.0(postcss@8.4.24)
|
||||
postcss-selector-parser: registry.npmjs.org/postcss-selector-parser@6.0.13
|
||||
semver: registry.npmjs.org/semver@7.5.3
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte-eslint-parser: registry.npmjs.org/svelte-eslint-parser@0.31.0(svelte@4.0.0)
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
svelte-eslint-parser: registry.npmjs.org/svelte-eslint-parser@0.31.0(svelte@4.2.0)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
- ts-node
|
||||
@@ -4515,7 +4456,7 @@ packages:
|
||||
dependencies:
|
||||
acorn: registry.npmjs.org/acorn@8.8.2
|
||||
acorn-jsx: registry.npmjs.org/acorn-jsx@5.3.2(acorn@8.8.2)
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.1
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/esprima@4.0.1:
|
||||
@@ -4714,6 +4655,19 @@ packages:
|
||||
micromatch: registry.npmjs.org/micromatch@4.0.5
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/fast-glob@3.3.1:
|
||||
resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz}
|
||||
name: fast-glob
|
||||
version: 3.3.1
|
||||
engines: {node: '>=8.6.0'}
|
||||
dependencies:
|
||||
'@nodelib/fs.stat': registry.npmjs.org/@nodelib/fs.stat@2.0.5
|
||||
'@nodelib/fs.walk': registry.npmjs.org/@nodelib/fs.walk@1.2.8
|
||||
glob-parent: registry.npmjs.org/glob-parent@5.1.2
|
||||
merge2: registry.npmjs.org/merge2@1.4.1
|
||||
micromatch: registry.npmjs.org/micromatch@4.0.5
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/fast-json-stable-stringify@2.1.0:
|
||||
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz}
|
||||
name: fast-json-stable-stringify
|
||||
@@ -4952,7 +4906,7 @@ packages:
|
||||
dependencies:
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
define-properties: registry.npmjs.org/define-properties@1.2.0
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.21.2
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.22.1
|
||||
functions-have-names: registry.npmjs.org/functions-have-names@1.2.3
|
||||
dev: true
|
||||
|
||||
@@ -5122,7 +5076,7 @@ packages:
|
||||
dependencies:
|
||||
array-union: registry.npmjs.org/array-union@2.1.0
|
||||
dir-glob: registry.npmjs.org/dir-glob@3.0.1
|
||||
fast-glob: registry.npmjs.org/fast-glob@3.2.12
|
||||
fast-glob: registry.npmjs.org/fast-glob@3.3.1
|
||||
ignore: registry.npmjs.org/ignore@5.2.4
|
||||
merge2: registry.npmjs.org/merge2@1.4.1
|
||||
slash: registry.npmjs.org/slash@3.0.0
|
||||
@@ -5135,7 +5089,7 @@ packages:
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
dependencies:
|
||||
dir-glob: registry.npmjs.org/dir-glob@3.0.1
|
||||
fast-glob: registry.npmjs.org/fast-glob@3.2.12
|
||||
fast-glob: registry.npmjs.org/fast-glob@3.3.1
|
||||
ignore: registry.npmjs.org/ignore@5.2.4
|
||||
merge2: registry.npmjs.org/merge2@1.4.1
|
||||
slash: registry.npmjs.org/slash@4.0.0
|
||||
@@ -5377,7 +5331,7 @@ packages:
|
||||
dependencies:
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.1
|
||||
is-typed-array: registry.npmjs.org/is-typed-array@1.1.10
|
||||
is-typed-array: registry.npmjs.org/is-typed-array@1.1.12
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/is-arrayish@0.2.1:
|
||||
@@ -5438,14 +5392,6 @@ packages:
|
||||
ci-info: registry.npmjs.org/ci-info@3.8.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/is-core-module@2.12.1:
|
||||
resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz}
|
||||
name: is-core-module
|
||||
version: 2.12.1
|
||||
dependencies:
|
||||
has: registry.npmjs.org/has@1.0.3
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/is-core-module@2.13.0:
|
||||
resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz}
|
||||
name: is-core-module
|
||||
@@ -5607,19 +5553,6 @@ packages:
|
||||
has-symbols: registry.npmjs.org/has-symbols@1.0.3
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/is-typed-array@1.1.10:
|
||||
resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz}
|
||||
name: is-typed-array
|
||||
version: 1.1.10
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
available-typed-arrays: registry.npmjs.org/available-typed-arrays@1.0.5
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
for-each: registry.npmjs.org/for-each@0.3.3
|
||||
gopd: registry.npmjs.org/gopd@1.0.1
|
||||
has-tostringtag: registry.npmjs.org/has-tostringtag@1.0.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/is-typed-array@1.1.12:
|
||||
resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz}
|
||||
name: is-typed-array
|
||||
@@ -5863,7 +5796,7 @@ packages:
|
||||
version: 1.2.4
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/listr2@3.14.0(enquirer@2.4.1):
|
||||
registry.npmjs.org/listr2@3.14.0(enquirer@2.3.6):
|
||||
resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz}
|
||||
id: registry.npmjs.org/listr2/3.14.0
|
||||
name: listr2
|
||||
@@ -5877,7 +5810,7 @@ packages:
|
||||
dependencies:
|
||||
cli-truncate: registry.npmjs.org/cli-truncate@2.1.0
|
||||
colorette: registry.npmjs.org/colorette@2.0.20
|
||||
enquirer: registry.npmjs.org/enquirer@2.4.1
|
||||
enquirer: registry.npmjs.org/enquirer@2.3.6
|
||||
log-update: registry.npmjs.org/log-update@4.0.0
|
||||
p-map: registry.npmjs.org/p-map@4.0.0
|
||||
rfdc: registry.npmjs.org/rfdc@1.3.0
|
||||
@@ -6774,6 +6707,18 @@ packages:
|
||||
postcss: registry.npmjs.org/postcss@8.4.24
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/postcss-scss@4.0.6(postcss@8.4.27):
|
||||
resolution: {integrity: sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz}
|
||||
id: registry.npmjs.org/postcss-scss/4.0.6
|
||||
name: postcss-scss
|
||||
version: 4.0.6
|
||||
engines: {node: '>=12.0'}
|
||||
peerDependencies:
|
||||
postcss: ^8.4.19
|
||||
dependencies:
|
||||
postcss: registry.npmjs.org/postcss@8.4.27
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/postcss-selector-parser@6.0.13:
|
||||
resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz}
|
||||
name: postcss-selector-parser
|
||||
@@ -6840,7 +6785,7 @@ packages:
|
||||
fast-diff: registry.npmjs.org/fast-diff@1.3.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@4.0.0):
|
||||
registry.npmjs.org/prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@4.2.0):
|
||||
resolution: {integrity: sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.10.1.tgz}
|
||||
id: registry.npmjs.org/prettier-plugin-svelte/2.10.1
|
||||
name: prettier-plugin-svelte
|
||||
@@ -6850,7 +6795,7 @@ packages:
|
||||
svelte: ^3.2.0 || ^4.0.0-next.0
|
||||
dependencies:
|
||||
prettier: registry.npmjs.org/prettier@2.8.8
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/prettier@2.8.8:
|
||||
@@ -6861,10 +6806,10 @@ packages:
|
||||
hasBin: true
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/prettier@3.0.1:
|
||||
resolution: {integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz}
|
||||
registry.npmjs.org/prettier@3.0.2:
|
||||
resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz}
|
||||
name: prettier
|
||||
version: 3.0.1
|
||||
version: 3.0.2
|
||||
engines: {node: '>=14'}
|
||||
hasBin: true
|
||||
dev: true
|
||||
@@ -6946,12 +6891,6 @@ packages:
|
||||
side-channel: registry.npmjs.org/side-channel@1.0.4
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/querystringify@2.2.0:
|
||||
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz}
|
||||
name: querystringify
|
||||
version: 2.2.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/queue-microtask@1.2.3:
|
||||
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz}
|
||||
name: queue-microtask
|
||||
@@ -7135,12 +7074,6 @@ packages:
|
||||
version: 2.0.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/requires-port@1.0.0:
|
||||
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz}
|
||||
name: requires-port
|
||||
version: 1.0.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/resolve-from@4.0.0:
|
||||
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz}
|
||||
name: resolve-from
|
||||
@@ -7161,7 +7094,7 @@ packages:
|
||||
version: 1.22.2
|
||||
hasBin: true
|
||||
dependencies:
|
||||
is-core-module: registry.npmjs.org/is-core-module@2.12.1
|
||||
is-core-module: registry.npmjs.org/is-core-module@2.13.0
|
||||
path-parse: registry.npmjs.org/path-parse@1.0.7
|
||||
supports-preserve-symlinks-flag: registry.npmjs.org/supports-preserve-symlinks-flag@1.0.0
|
||||
dev: true
|
||||
@@ -7707,7 +7640,7 @@ packages:
|
||||
dependencies:
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
define-properties: registry.npmjs.org/define-properties@1.2.0
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.21.2
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.22.1
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/string.prototype.trimend@1.0.6:
|
||||
@@ -7717,7 +7650,7 @@ packages:
|
||||
dependencies:
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
define-properties: registry.npmjs.org/define-properties@1.2.0
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.21.2
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.22.1
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/string.prototype.trimstart@1.0.6:
|
||||
@@ -7727,7 +7660,7 @@ packages:
|
||||
dependencies:
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
define-properties: registry.npmjs.org/define-properties@1.2.0
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.21.2
|
||||
es-abstract: registry.npmjs.org/es-abstract@1.22.1
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/strip-ansi@6.0.1:
|
||||
@@ -7803,11 +7736,11 @@ packages:
|
||||
engines: {node: '>= 0.4'}
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/svelte-check@3.4.4(postcss@8.4.24)(svelte@4.0.0):
|
||||
resolution: {integrity: sha512-Uys9+R65cj8TmP8f5UpS7B2xKpNLYNxEWJsA5ZoKcWq/uwvABFF7xS6iPQGLoa7hxz0DS6xU60YFpmq06E4JxA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-check/-/svelte-check-3.4.4.tgz}
|
||||
id: registry.npmjs.org/svelte-check/3.4.4
|
||||
registry.npmjs.org/svelte-check@3.5.0(postcss@8.4.27)(svelte@4.2.0):
|
||||
resolution: {integrity: sha512-KHujbn4k17xKYLmtCwv0sKKM7uiHTYcQvXnvrCcNU6a7hcszh99zFTIoiu/Sp/ewAw5aJmillJ1Cs8gKLmcX4A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-check/-/svelte-check-3.5.0.tgz}
|
||||
id: registry.npmjs.org/svelte-check/3.5.0
|
||||
name: svelte-check
|
||||
version: 3.4.4
|
||||
version: 3.5.0
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0
|
||||
@@ -7818,8 +7751,8 @@ packages:
|
||||
import-fresh: registry.npmjs.org/import-fresh@3.3.0
|
||||
picocolors: registry.npmjs.org/picocolors@1.0.0
|
||||
sade: registry.npmjs.org/sade@1.8.1
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte-preprocess: registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.24)(svelte@4.0.0)(typescript@5.1.3)
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
svelte-preprocess: registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.27)(svelte@4.2.0)(typescript@5.1.3)
|
||||
typescript: registry.npmjs.org/typescript@5.1.3
|
||||
transitivePeerDependencies:
|
||||
- '@babel/core'
|
||||
@@ -7833,7 +7766,7 @@ packages:
|
||||
- sugarss
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/svelte-eslint-parser@0.31.0(svelte@4.0.0):
|
||||
registry.npmjs.org/svelte-eslint-parser@0.31.0(svelte@4.2.0):
|
||||
resolution: {integrity: sha512-/31RpBf/e3YjoFphjsyo3JRyN1r4UalGAGafXrZ6EJK4h4COOO0rbfBoen5byGsXnIJKsrlC1lkEd2Vzpq2IDg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.31.0.tgz}
|
||||
id: registry.npmjs.org/svelte-eslint-parser/0.31.0
|
||||
name: svelte-eslint-parser
|
||||
@@ -7846,14 +7779,34 @@ packages:
|
||||
optional: true
|
||||
dependencies:
|
||||
eslint-scope: registry.npmjs.org/eslint-scope@7.2.0
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.1
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3
|
||||
espree: registry.npmjs.org/espree@9.5.2
|
||||
postcss: registry.npmjs.org/postcss@8.4.24
|
||||
postcss-scss: registry.npmjs.org/postcss-scss@4.0.6(postcss@8.4.24)
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/svelte-hmr@0.15.2(svelte@4.0.0):
|
||||
registry.npmjs.org/svelte-eslint-parser@0.32.2(svelte@4.2.0):
|
||||
resolution: {integrity: sha512-Ok9D3A4b23iLQsONrjqtXtYDu5ZZ/826Blaw2LeFZVTg1pwofKDG4mz3/GYTax8fQ0plRGHI6j+d9VQYy5Lo/A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.32.2.tgz}
|
||||
id: registry.npmjs.org/svelte-eslint-parser/0.32.2
|
||||
name: svelte-eslint-parser
|
||||
version: 0.32.2
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
peerDependencies:
|
||||
svelte: ^3.37.0 || ^4.0.0
|
||||
peerDependenciesMeta:
|
||||
svelte:
|
||||
optional: true
|
||||
dependencies:
|
||||
eslint-scope: registry.npmjs.org/eslint-scope@7.2.0
|
||||
eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.1
|
||||
espree: registry.npmjs.org/espree@9.5.2
|
||||
postcss: registry.npmjs.org/postcss@8.4.27
|
||||
postcss-scss: registry.npmjs.org/postcss-scss@4.0.6(postcss@8.4.27)
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/svelte-hmr@0.15.2(svelte@4.2.0):
|
||||
resolution: {integrity: sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.2.tgz}
|
||||
id: registry.npmjs.org/svelte-hmr/0.15.2
|
||||
name: svelte-hmr
|
||||
@@ -7862,10 +7815,10 @@ packages:
|
||||
peerDependencies:
|
||||
svelte: ^3.19.0 || ^4.0.0-next.0
|
||||
dependencies:
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.24)(svelte@4.0.0)(typescript@5.1.3):
|
||||
registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.27)(svelte@4.2.0)(typescript@5.1.3):
|
||||
resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz}
|
||||
id: registry.npmjs.org/svelte-preprocess/5.0.4
|
||||
name: svelte-preprocess
|
||||
@@ -7909,38 +7862,38 @@ packages:
|
||||
'@types/pug': registry.npmjs.org/@types/pug@2.0.6
|
||||
detect-indent: registry.npmjs.org/detect-indent@6.1.0
|
||||
magic-string: registry.npmjs.org/magic-string@0.27.0
|
||||
postcss: registry.npmjs.org/postcss@8.4.24
|
||||
postcss: registry.npmjs.org/postcss@8.4.27
|
||||
sorcery: registry.npmjs.org/sorcery@0.11.0
|
||||
strip-indent: registry.npmjs.org/strip-indent@3.0.0
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
typescript: registry.npmjs.org/typescript@5.1.3
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/svelte2tsx@0.6.15(svelte@4.0.0)(typescript@5.1.3):
|
||||
resolution: {integrity: sha512-+j6RmA3g5pPs1DHa/rdzJjjhZuCfWx0IbNPaR99A2bvOSPPY6BlVkBGU0urI+DGcWHhYEG28Flo942KqlAkpEQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.6.15.tgz}
|
||||
id: registry.npmjs.org/svelte2tsx/0.6.15
|
||||
registry.npmjs.org/svelte2tsx@0.6.20(svelte@4.2.0)(typescript@5.1.3):
|
||||
resolution: {integrity: sha512-zaSnHSERYceKxugFbjiZ3YiNcC2fNbVjpQ9qaE5hrYI4tIOX9ZqHS+I30Hp2HF+MVXLOVWVErgn/6pAlQNnheA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.6.20.tgz}
|
||||
id: registry.npmjs.org/svelte2tsx/0.6.20
|
||||
name: svelte2tsx
|
||||
version: 0.6.15
|
||||
version: 0.6.20
|
||||
peerDependencies:
|
||||
svelte: ^3.55 || ^4.0
|
||||
svelte: ^3.55 || ^4.0.0-next.0 || ^4.0
|
||||
typescript: ^4.9.4 || ^5.0.0
|
||||
dependencies:
|
||||
dedent-js: registry.npmjs.org/dedent-js@1.0.1
|
||||
pascal-case: registry.npmjs.org/pascal-case@3.1.2
|
||||
svelte: registry.npmjs.org/svelte@4.0.0
|
||||
svelte: registry.npmjs.org/svelte@4.2.0
|
||||
typescript: registry.npmjs.org/typescript@5.1.3
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/svelte@4.0.0:
|
||||
resolution: {integrity: sha512-+yCYu3AEUu9n91dnQNGIbnVp8EmNQtuF/YImW4+FTXRHard7NMo+yTsWzggPAbj3fUEJ1FBJLkql/jkp6YB5pg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte/-/svelte-4.0.0.tgz}
|
||||
registry.npmjs.org/svelte@4.2.0:
|
||||
resolution: {integrity: sha512-kVsdPjDbLrv74SmLSUzAsBGquMs4MPgWGkGLpH+PjOYnFOziAvENVzgJmyOCV2gntxE32aNm8/sqNKD6LbIpeQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte/-/svelte-4.2.0.tgz}
|
||||
name: svelte
|
||||
version: 4.0.0
|
||||
version: 4.2.0
|
||||
engines: {node: '>=16'}
|
||||
dependencies:
|
||||
'@ampproject/remapping': registry.npmjs.org/@ampproject/remapping@2.2.1
|
||||
'@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.15
|
||||
'@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.18
|
||||
acorn: registry.npmjs.org/acorn@8.8.2
|
||||
acorn: registry.npmjs.org/acorn@8.10.0
|
||||
aria-query: registry.npmjs.org/aria-query@5.3.0
|
||||
axobject-query: registry.npmjs.org/axobject-query@3.2.1
|
||||
code-red: registry.npmjs.org/code-red@1.0.3
|
||||
@@ -8037,16 +7990,14 @@ packages:
|
||||
engines: {node: '>=6'}
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/tough-cookie@4.1.3:
|
||||
resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz}
|
||||
registry.npmjs.org/tough-cookie@2.5.0:
|
||||
resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz}
|
||||
name: tough-cookie
|
||||
version: 4.1.3
|
||||
engines: {node: '>=6'}
|
||||
version: 2.5.0
|
||||
engines: {node: '>=0.8'}
|
||||
dependencies:
|
||||
psl: registry.npmjs.org/psl@1.9.0
|
||||
punycode: registry.npmjs.org/punycode@2.3.0
|
||||
universalify: registry.npmjs.org/universalify@0.2.0
|
||||
url-parse: registry.npmjs.org/url-parse@1.5.10
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/tr46@0.0.3:
|
||||
@@ -8298,7 +8249,7 @@ packages:
|
||||
dependencies:
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
for-each: registry.npmjs.org/for-each@0.3.3
|
||||
is-typed-array: registry.npmjs.org/is-typed-array@1.1.10
|
||||
is-typed-array: registry.npmjs.org/is-typed-array@1.1.12
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/typescript@4.9.5:
|
||||
@@ -8328,10 +8279,10 @@ packages:
|
||||
which-boxed-primitive: registry.npmjs.org/which-boxed-primitive@1.0.2
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/undici@5.22.1:
|
||||
resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/undici/-/undici-5.22.1.tgz}
|
||||
registry.npmjs.org/undici@5.23.0:
|
||||
resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/undici/-/undici-5.23.0.tgz}
|
||||
name: undici
|
||||
version: 5.22.1
|
||||
version: 5.23.0
|
||||
engines: {node: '>=14.0'}
|
||||
dependencies:
|
||||
busboy: registry.npmjs.org/busboy@1.6.0
|
||||
@@ -8344,13 +8295,6 @@ packages:
|
||||
engines: {node: '>= 4.0.0'}
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/universalify@0.2.0:
|
||||
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz}
|
||||
name: universalify
|
||||
version: 0.2.0
|
||||
engines: {node: '>= 4.0.0'}
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/universalify@2.0.0:
|
||||
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz}
|
||||
name: universalify
|
||||
@@ -8401,15 +8345,6 @@ packages:
|
||||
punycode: registry.npmjs.org/punycode@2.3.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/url-parse@1.5.10:
|
||||
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz}
|
||||
name: url-parse
|
||||
version: 1.5.10
|
||||
dependencies:
|
||||
querystringify: registry.npmjs.org/querystringify@2.2.0
|
||||
requires-port: registry.npmjs.org/requires-port@1.0.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/use-sync-external-store@1.2.0(react@18.2.0):
|
||||
resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz}
|
||||
id: registry.npmjs.org/use-sync-external-store/1.2.0
|
||||
@@ -8620,20 +8555,6 @@ packages:
|
||||
has-tostringtag: registry.npmjs.org/has-tostringtag@1.0.0
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/which-typed-array@1.1.9:
|
||||
resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz}
|
||||
name: which-typed-array
|
||||
version: 1.1.9
|
||||
engines: {node: '>= 0.4'}
|
||||
dependencies:
|
||||
available-typed-arrays: registry.npmjs.org/available-typed-arrays@1.0.5
|
||||
call-bind: registry.npmjs.org/call-bind@1.0.2
|
||||
for-each: registry.npmjs.org/for-each@0.3.3
|
||||
gopd: registry.npmjs.org/gopd@1.0.1
|
||||
has-tostringtag: registry.npmjs.org/has-tostringtag@1.0.0
|
||||
is-typed-array: registry.npmjs.org/is-typed-array@1.1.10
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/which@1.3.1:
|
||||
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/which/-/which-1.3.1.tgz}
|
||||
name: which
|
||||
@@ -8800,21 +8721,25 @@ packages:
|
||||
engines: {node: '>=10'}
|
||||
dev: true
|
||||
|
||||
registry.npmjs.org/zustand@4.3.8(react@18.2.0):
|
||||
resolution: {integrity: sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/zustand/-/zustand-4.3.8.tgz}
|
||||
id: registry.npmjs.org/zustand/4.3.8
|
||||
registry.npmjs.org/zustand@4.4.0(@types/react@18.2.12)(react@18.2.0):
|
||||
resolution: {integrity: sha512-2dq6wq4dSxbiPTamGar0NlIG/av0wpyWZJGeQYtUOLegIUvhM2Bf86ekPlmgpUtS5uR7HyetSiktYrGsdsyZgQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/zustand/-/zustand-4.4.0.tgz}
|
||||
id: registry.npmjs.org/zustand/4.4.0
|
||||
name: zustand
|
||||
version: 4.3.8
|
||||
version: 4.4.0
|
||||
engines: {node: '>=12.7.0'}
|
||||
peerDependencies:
|
||||
'@types/react': '>=16.8'
|
||||
immer: '>=9.0'
|
||||
react: '>=16.8'
|
||||
peerDependenciesMeta:
|
||||
'@types/react':
|
||||
optional: true
|
||||
immer:
|
||||
optional: true
|
||||
react:
|
||||
optional: true
|
||||
dependencies:
|
||||
'@types/react': registry.npmjs.org/@types/react@18.2.12
|
||||
react: registry.npmjs.org/react@18.2.0
|
||||
use-sync-external-store: registry.npmjs.org/use-sync-external-store@1.2.0(react@18.2.0)
|
||||
dev: false
|
||||
|
||||
Reference in New Issue
Block a user