From 07e8fa7aabad1b3455cc9db63cad9a2e5e4bf070 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Fri, 21 Mar 2025 18:06:51 +0000 Subject: [PATCH 01/38] chore(graph): extracted VerticalLine.tsx from GraphColumn.tsx --- .../GraphColumn/GraphColumn.module.scss | 6 -- .../components/GraphColumn/GraphColumn.tsx | 10 ++- .../VerticalLine/VerticalLine.module.scss | 9 ++ .../components/VerticalLine/VerticalLine.tsx | 86 +++++++++++++++++++ .../Graph/components/VerticalLine/index.ts | 2 + .../Graph/components/VerticalLine/types.ts | 10 +++ 6 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.module.scss create mode 100644 packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx create mode 100644 packages/library/src/modules/Graph/components/VerticalLine/index.ts create mode 100644 packages/library/src/modules/Graph/components/VerticalLine/types.ts diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss index 00566966..cf0237fe 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss @@ -20,12 +20,6 @@ height: 2px; } -.vertical { - left: calc(50% - 3px); - width: 2px; - z-index: 10; -} - .singularLine { position: absolute; left: calc(50% - 3px); diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx index 229acb4a..5fd544ed 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx @@ -10,6 +10,7 @@ import { ColumnBackground } from 'modules/Graph/components/ColumnBackground' import { LeftDownCurve } from 'modules/Graph/components/LeftDownCurve' import { LeftUpCurve } from 'modules/Graph/components/LeftUpCurve' import { HorizontalLine } from 'modules/Graph/components/HorizontalLine' +import { VerticalLine } from 'modules/Graph/components/VerticalLine' // TODO: Extract a bunch of stuff out of this file export const GraphColumn = ({ @@ -175,9 +176,12 @@ export const GraphColumn = ({ {/* This column contains a vertical branching line but its from the HEAD commit to the index node */} {state.isVerticalIndexLine && ( -
)} diff --git a/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.module.scss b/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.module.scss new file mode 100644 index 00000000..736b1407 --- /dev/null +++ b/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.module.scss @@ -0,0 +1,9 @@ +.line { + position: absolute; +} + +.vertical { + left: calc(50% - 3px); + width: 2px; + z-index: 10; +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx b/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx new file mode 100644 index 00000000..4e58d843 --- /dev/null +++ b/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx @@ -0,0 +1,86 @@ +import classNames from 'classnames' +import styles from './VerticalLine.module.scss' +import { CSSProperties, useCallback } from 'react' +import { VerticalLineProps } from './types' +import { useGitContext } from 'context/GitContext' + +export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCommitNodeBorder }: VerticalLineProps) => { + const { headCommit } = useGitContext() + + const verticalNodeLineStyles = useCallback<(isIndex: boolean) => CSSProperties>(isIndex => { + const isRowCommitIndexNode = commit.hash === 'index' + const rowsCommitIsHead = commit.hash === headCommit.hash && state.isNode + + // If the current column is the index pseudo-node + // then draw a dotted line underneath it that will + // eventually meet with the HEAD commit of the current branch. + if (isRowCommitIndexNode) { + return { + top: '50%', + height: '50%', + zIndex: columnIndex + 1, + borderRight: `2px dotted ${indexCommitNodeBorder}` + } + } + + // If this column has the HEAD commit node in it, + // just draw a dotted line on top of it which will + // ultimately hit the index pseudo-node above. + if (rowsCommitIsHead) { + return { + height: '50%', + top: 0, + borderRight: `2px dotted ${indexCommitNodeBorder}` + } + } + + // If this column has a commit node in it, and it + // has no parents, then it must be the first commit + // in the graph, so just draw a solid line above it. + const isFirstCommit = state.isNode && commit.parents.length === 0 + if (isFirstCommit || state.isColumnBelowEmpty) { + return { + top: 0, + height: '50%', + zIndex: columnIndex + 1, + borderRight: `2px solid ${columnColour}` + } + } + + // Border is dotted for the index pseudo-node + // and the skeleton placeholder elements. + const borderStyle = isIndex || state.isPlaceholderSkeleton ? 'dotted' : 'solid' + + // If this column contains a commit node, and + // it is the tip of its branch, then just draw + // a line underneath the node. Same goes for a + // column that an empty one in the row above. + const isBranchTip = commit.isBranchTip && state.isNode + if (isBranchTip || state.isColumnAboveEmpty) { + return { + top: '50%', + height: '50%', + zIndex: columnIndex + 1, + borderRight: `2px ${borderStyle} ${columnColour}` + } + } + + // If none of the above conditions are met then + // we must be in a column with no commit node, and + // so we draw a line the full height of the column. + return { + top: 0, + height: '100%', + zIndex: columnIndex + 1, + borderRight: `2px ${borderStyle} ${isIndex ? indexCommitNodeBorder : columnColour}` + } + }, [commit.hash, commit.parents.length, commit.isBranchTip, headCommit.hash, state.isNode, state.isColumnBelowEmpty, state.isPlaceholderSkeleton, state.isColumnAboveEmpty, columnIndex, indexCommitNodeBorder, columnColour]) + + + return ( +
+ ) +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/VerticalLine/index.ts b/packages/library/src/modules/Graph/components/VerticalLine/index.ts new file mode 100644 index 00000000..1861229d --- /dev/null +++ b/packages/library/src/modules/Graph/components/VerticalLine/index.ts @@ -0,0 +1,2 @@ +export * from './types' +export * from './VerticalLine' \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/VerticalLine/types.ts b/packages/library/src/modules/Graph/components/VerticalLine/types.ts new file mode 100644 index 00000000..3135f57f --- /dev/null +++ b/packages/library/src/modules/Graph/components/VerticalLine/types.ts @@ -0,0 +1,10 @@ +import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { Commit } from 'types' + +export interface VerticalLineProps { + state: GraphColumnState + columnIndex: number + columnColour: string + commit: Commit + indexCommitNodeBorder: string +} \ No newline at end of file From 7c7e0fc36d9334f1e41c1f3f1c3ecca617c8c17f Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Fri, 21 Mar 2025 18:10:17 +0000 Subject: [PATCH 02/38] chore(config): added keywords to library package.json --- packages/library/package.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/library/package.json b/packages/library/package.json index 0adbc313..de644ec3 100644 --- a/packages/library/package.json +++ b/packages/library/package.json @@ -68,5 +68,21 @@ "defaults", "not dead", "maintained node versions" + ], + "keywords": [ + "react", + "git", + "git-log", + "visualization", + "react-component", + "git-history", + "commit-graph", + "react-git", + "react-visualization", + "branching", + "git-graph", + "react-git-graph", + "version-control", + "git-ui" ] } From 41c23659fc155240e43fa80c78ef962d65e2f308 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Fri, 21 Mar 2025 18:10:43 +0000 Subject: [PATCH 03/38] chore(docs): removed npm version badge from library readme --- packages/library/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/library/README.md b/packages/library/README.md index 580ca9e2..7a8fc19e 100644 --- a/packages/library/README.md +++ b/packages/library/README.md @@ -1,4 +1,3 @@ -![NPM Version](https://img.shields.io/npm/v/%40tomplum%2Freact-git-log?style=for-the-badge&logo=npm&color=red&logoColor=red) ![GitHub Release](https://img.shields.io/github/v/release/TomPlum/react-git-log?style=for-the-badge&logo=github&color=green) ![NPM Type Definitions](https://img.shields.io/npm/types/%40tomplum%2Freact-git-log?style=for-the-badge&logo=typescript) ![npm package minimized gzipped size](https://img.shields.io/bundlejs/size/%40tomplum%2Freact-git-log?style=for-the-badge&logo=vite&color=gold&logoColor=gold) From 7839837178fe289922458f93fafcbbbac6ef0cc5 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Fri, 21 Mar 2025 18:20:51 +0000 Subject: [PATCH 04/38] chore(graph): extracted HeadCommitVerticalLine from GraphColumn --- .../Graph/components/GraphColumn/GraphColumn.tsx | 13 +++++-------- .../HeadCommitVerticalLine.module.scss | 9 +++++++++ .../HeadCommitVerticalLine.tsx | 16 ++++++++++++++++ .../components/HeadCommitVerticalLine/index.ts | 2 ++ .../components/HeadCommitVerticalLine/types.ts | 3 +++ .../components/VerticalLine/VerticalLine.tsx | 10 +++++----- .../Graph/components/VerticalLine/types.ts | 1 + 7 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.module.scss create mode 100644 packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx create mode 100644 packages/library/src/modules/Graph/components/HeadCommitVerticalLine/index.ts create mode 100644 packages/library/src/modules/Graph/components/HeadCommitVerticalLine/types.ts diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx index 5fd544ed..c282e1c8 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx @@ -11,6 +11,7 @@ import { LeftDownCurve } from 'modules/Graph/components/LeftDownCurve' import { LeftUpCurve } from 'modules/Graph/components/LeftUpCurve' import { HorizontalLine } from 'modules/Graph/components/HorizontalLine' import { VerticalLine } from 'modules/Graph/components/VerticalLine' +import { HeadCommitVerticalLine } from 'src/modules/Graph/components/HeadCommitVerticalLine' // TODO: Extract a bunch of stuff out of this file export const GraphColumn = ({ @@ -162,21 +163,17 @@ export const GraphColumn = ({ /> )} - {/* This column contains a vertical branching line but is the HEAD commit (So only draw below the node) */} + {/* This column contains the HEAD commit, so only draw below a vertical line below the node */} {state.isVerticalLine && rowsCommitIsHead && ( -
)} {/* This column contains a vertical branching line but its from the HEAD commit to the index node */} {state.isVerticalIndexLine && ( { + return ( +
+ ) +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/index.ts b/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/index.ts new file mode 100644 index 00000000..f8da8931 --- /dev/null +++ b/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/index.ts @@ -0,0 +1,2 @@ +export * from './types' +export * from './HeadCommitVerticalLine' \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/types.ts b/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/types.ts new file mode 100644 index 00000000..d5b4fea0 --- /dev/null +++ b/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/types.ts @@ -0,0 +1,3 @@ +export interface HeadCommitVerticalLineProps { + columnColour: string +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx b/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx index 4e58d843..e34dfb35 100644 --- a/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx +++ b/packages/library/src/modules/Graph/components/VerticalLine/VerticalLine.tsx @@ -1,13 +1,13 @@ import classNames from 'classnames' import styles from './VerticalLine.module.scss' -import { CSSProperties, useCallback } from 'react' +import { CSSProperties, useMemo } from 'react' import { VerticalLineProps } from './types' import { useGitContext } from 'context/GitContext' -export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCommitNodeBorder }: VerticalLineProps) => { +export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCommitNodeBorder, isIndex }: VerticalLineProps) => { const { headCommit } = useGitContext() - const verticalNodeLineStyles = useCallback<(isIndex: boolean) => CSSProperties>(isIndex => { + const verticalNodeLineStyles = useMemo(() => { const isRowCommitIndexNode = commit.hash === 'index' const rowsCommitIsHead = commit.hash === headCommit.hash && state.isNode @@ -74,12 +74,12 @@ export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCo zIndex: columnIndex + 1, borderRight: `2px ${borderStyle} ${isIndex ? indexCommitNodeBorder : columnColour}` } - }, [commit.hash, commit.parents.length, commit.isBranchTip, headCommit.hash, state.isNode, state.isColumnBelowEmpty, state.isPlaceholderSkeleton, state.isColumnAboveEmpty, columnIndex, indexCommitNodeBorder, columnColour]) + }, [commit.hash, commit.parents.length, commit.isBranchTip, headCommit.hash, state.isNode, state.isColumnBelowEmpty, state.isPlaceholderSkeleton, state.isColumnAboveEmpty, isIndex, columnIndex, indexCommitNodeBorder, columnColour]) return (
) diff --git a/packages/library/src/modules/Graph/components/VerticalLine/types.ts b/packages/library/src/modules/Graph/components/VerticalLine/types.ts index 3135f57f..2ed06da4 100644 --- a/packages/library/src/modules/Graph/components/VerticalLine/types.ts +++ b/packages/library/src/modules/Graph/components/VerticalLine/types.ts @@ -2,6 +2,7 @@ import { GraphColumnState } from 'modules/Graph/components/GraphColumn' import { Commit } from 'types' export interface VerticalLineProps { + isIndex: boolean state: GraphColumnState columnIndex: number columnColour: string From 114c179e1b468fc5cc6c32dcc82bf094481f9944 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Fri, 21 Mar 2025 18:24:27 +0000 Subject: [PATCH 05/38] chore(graph): consolidated vertical line rendering points in GraphColumn by re-using VerticalLine --- .../components/GraphColumn/GraphColumn.tsx | 87 ++----------------- .../hooks/useColumnData/useColumnData.ts | 1 + 2 files changed, 7 insertions(+), 81 deletions(-) diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx index c282e1c8..ec1fb0f0 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx @@ -2,7 +2,7 @@ import { GraphColumnProps } from './types' import { CommitNode } from 'modules/Graph/components/CommitNode' import styles from './GraphColumn.module.scss' import { useTheme } from 'hooks/useTheme' -import { CSSProperties, useCallback, useMemo } from 'react' +import { useMemo } from 'react' import classNames from 'classnames' import { useGitContext } from 'context/GitContext' import { useSelectCommit } from 'hooks/useSelectCommit' @@ -18,7 +18,6 @@ export const GraphColumn = ({ index, state, commit, - rowIndex, commitNodeIndex }: GraphColumnProps) => { const { selectCommitHandler } = useSelectCommit() @@ -34,73 +33,7 @@ export const GraphColumn = ({ const rowsCommitMatchesPreviewed = previewedCommit?.hash === commit.hash const rowsCommitMatchesSelected = selectedCommit?.hash === commit.hash const rowsCommitIsHead = commit.hash === headCommit.hash && state.isNode - - const verticalNodeLineStyles = useCallback<(isIndex: boolean) => CSSProperties>(isIndex => { - // If the current column is the index pseudo-node - // then draw a dotted line underneath it that will - // eventually meet with the HEAD commit of the current branch. - if (isRowCommitIndexNode) { - return { - top: '50%', - height: '50%', - zIndex: index + 1, - borderRight: `2px dotted ${indexCommitNodeBorder}` - } - } - - // If this column has the HEAD commit node in it, - // just draw a dotted line on top of it which will - // ultimately hit the index pseudo-node above. - if (rowsCommitIsHead) { - return { - height: '50%', - top: 0, - borderRight: `2px dotted ${indexCommitNodeBorder}` - } - } - - // If this column has a commit node in it, and it - // has no parents, then it must be the first commit - // in the graph, so just draw a solid line above it. - const isFirstCommit = state.isNode && commit.parents.length === 0 - if (isFirstCommit || state.isColumnBelowEmpty) { - return { - top: 0, - height: '50%', - zIndex: index + 1, - borderRight: `2px solid ${columnColour}` - } - } - - // Border is dotted for the index pseudo-node - // and the skeleton placeholder elements. - const borderStyle = isIndex || state.isPlaceholderSkeleton ? 'dotted' : 'solid' - - // If this column contains a commit node, and - // it is the tip of its branch, then just draw - // a line underneath the node. Same goes for a - // column that an empty one in the row above. - const isBranchTip = commit.isBranchTip && state.isNode - if (isBranchTip || state.isColumnAboveEmpty) { - return { - top: '50%', - height: '50%', - zIndex: index + 1, - borderRight: `2px ${borderStyle} ${columnColour}` - } - } - - // If none of the above conditions are met then - // we must be in a column with no commit node, and - // so we draw a line the full height of the column. - return { - top: 0, - height: '100%', - zIndex: index + 1, - borderRight: `2px ${borderStyle} ${isIndex ? indexCommitNodeBorder : columnColour}` - } - }, [columnColour, commit.isBranchTip, commit.parents.length, index, indexCommitNodeBorder, isRowCommitIndexNode, rowsCommitIsHead, state.isColumnAboveEmpty, state.isColumnBelowEmpty, state.isNode, state.isPlaceholderSkeleton]) - + const showPreviewBackground = useMemo(() => { const selectedCommitIsNotPreviewed = selectedCommit?.hash != previewedCommit?.hash const shouldPreview = rowsCommitMatchesPreviewed && selectedCommitIsNotPreviewed @@ -154,15 +87,6 @@ export const GraphColumn = ({ /> )} - {/* This column contains a vertical branching line (full column height) */} - {state.isVerticalLine && ( -
- )} - {/* This column contains the HEAD commit, so only draw below a vertical line below the node */} {state.isVerticalLine && rowsCommitIsHead && ( )} - {/* This column contains a vertical branching line but its from the HEAD commit to the index node */} - {state.isVerticalIndexLine && ( + {/* This column contains a vertical branching line (full column height) */} + {/* OR - This column contains a vertical branching line but its from the HEAD commit to the index node */} + {state.isVerticalLine && ( )} diff --git a/packages/library/src/modules/Graph/hooks/useColumnData/useColumnData.ts b/packages/library/src/modules/Graph/hooks/useColumnData/useColumnData.ts index 184cfc58..3ae21340 100644 --- a/packages/library/src/modules/Graph/hooks/useColumnData/useColumnData.ts +++ b/packages/library/src/modules/Graph/hooks/useColumnData/useColumnData.ts @@ -171,6 +171,7 @@ export const useColumnData = (): GraphColumnData => { columnState[0] = { ...columnState[0], + isVerticalLine: true, isVerticalIndexLine: true } } From c93469cd1c53e3c99227257ef6322d4dde246974 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Fri, 21 Mar 2025 18:33:10 +0000 Subject: [PATCH 06/38] chore(graph): extracted IndexPseudoCommitNode from GraphColumn and cleared TODO --- .../GraphColumn/GraphColumn.module.scss | 38 ------------------- .../components/GraphColumn/GraphColumn.tsx | 20 ++++------ .../HeadCommitVerticalLine.tsx | 2 +- .../IndexPseudoCommitNode.module.scss | 19 ++++++++++ .../IndexPseudoCommitNode.tsx | 21 ++++++++++ .../components/IndexPseudoCommitNode/index.ts | 2 + .../components/IndexPseudoCommitNode/types.ts | 4 ++ 7 files changed, 55 insertions(+), 51 deletions(-) create mode 100644 packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.module.scss create mode 100644 packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx create mode 100644 packages/library/src/modules/Graph/components/IndexPseudoCommitNode/index.ts create mode 100644 packages/library/src/modules/Graph/components/IndexPseudoCommitNode/types.ts diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss index cf0237fe..9342ecc4 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.module.scss @@ -8,42 +8,4 @@ &:hover { cursor: pointer; } -} - -.line { - position: absolute; -} - -.horizontal { - top: 50%; - right: 0; - height: 2px; -} - -.singularLine { - position: absolute; - left: calc(50% - 3px); - top: 0; - width: 2px; - height: 100%; -} - -.indexNode { - width: 20px; - height: 20px; - border-radius: 50%; - z-index: 20; -} - -@keyframes spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -.spin { - animation: spin 10s linear infinite; } \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx index ec1fb0f0..d4746207 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx @@ -3,7 +3,6 @@ import { CommitNode } from 'modules/Graph/components/CommitNode' import styles from './GraphColumn.module.scss' import { useTheme } from 'hooks/useTheme' import { useMemo } from 'react' -import classNames from 'classnames' import { useGitContext } from 'context/GitContext' import { useSelectCommit } from 'hooks/useSelectCommit' import { ColumnBackground } from 'modules/Graph/components/ColumnBackground' @@ -12,8 +11,8 @@ import { LeftUpCurve } from 'modules/Graph/components/LeftUpCurve' import { HorizontalLine } from 'modules/Graph/components/HorizontalLine' import { VerticalLine } from 'modules/Graph/components/VerticalLine' import { HeadCommitVerticalLine } from 'src/modules/Graph/components/HeadCommitVerticalLine' +import { IndexPseudoCommitNode } from 'modules/Graph/components/IndexPseudoCommitNode' -// TODO: Extract a bunch of stuff out of this file export const GraphColumn = ({ index, state, @@ -75,15 +74,9 @@ export const GraphColumn = ({ {/* This column contains a node (and it's the git index pseudo-node) */} {state.isNode && isRowCommitIndexNode && ( -
)} @@ -122,7 +115,10 @@ export const GraphColumn = ({ )} diff --git a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx b/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx index f6d92afb..2eb0886a 100644 --- a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx +++ b/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames' -import styles from 'modules/Graph/components/GraphColumn/GraphColumn.module.scss' +import styles from './HeadCommitVerticalLine.module.scss' import { HeadCommitVerticalLineProps } from './types' export const HeadCommitVerticalLine = ({ columnColour }: HeadCommitVerticalLineProps) => { diff --git a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.module.scss b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.module.scss new file mode 100644 index 00000000..e67409d8 --- /dev/null +++ b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.module.scss @@ -0,0 +1,19 @@ +.indexNode { + width: 20px; + height: 20px; + border-radius: 50%; + z-index: 20; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +.spin { + animation: spin 10s linear infinite; +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx new file mode 100644 index 00000000..495564a7 --- /dev/null +++ b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx @@ -0,0 +1,21 @@ +import classNames from 'classnames' +import styles from './IndexPseudoCommitNode.module.scss' +import { useTheme } from 'hooks/useTheme' +import { IndexPseudoCommitNodeProps } from 'modules/Graph/components/IndexPseudoCommitNode/types' + +export const IndexPseudoCommitNode = ({ animate, columnColour }: IndexPseudoCommitNodeProps) => { + const { shiftAlphaChannel } = useTheme() + + return ( +
+ ) +} \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/index.ts b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/index.ts new file mode 100644 index 00000000..22a2452a --- /dev/null +++ b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/index.ts @@ -0,0 +1,2 @@ +export * from './types' +export * from './IndexPseudoCommitNode' \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/types.ts b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/types.ts new file mode 100644 index 00000000..d64c41ed --- /dev/null +++ b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/types.ts @@ -0,0 +1,4 @@ +export interface IndexPseudoCommitNodeProps { + columnColour: string + animate: boolean +} \ No newline at end of file From 9b81a4e46fcd8837e503965e4083eee9a82fec32 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Fri, 21 Mar 2025 18:52:08 +0000 Subject: [PATCH 07/38] test(graph): added testing deps, commit stub and first graph column test for event handling --- package-lock.json | 65 ++++++++++++++----- packages/library/package.json | 21 ++++-- packages/library/src/_test/stubs.ts | 17 +++++ .../GraphColumn/GraphColumn.spec.tsx | 47 ++++++++++++++ .../components/GraphColumn/GraphColumn.tsx | 4 +- packages/library/tsconfig.json | 3 +- packages/library/vite.config.ts | 3 +- 7 files changed, 134 insertions(+), 26 deletions(-) create mode 100644 packages/library/src/_test/stubs.ts create mode 100644 packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx diff --git a/package-lock.json b/package-lock.json index ad0a1be7..aafac1d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3813,6 +3813,34 @@ "dev": true, "license": "MIT" }, + "node_modules/@testing-library/react": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.2.0.tgz", + "integrity": "sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@testing-library/user-event": { "version": "14.5.2", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", @@ -11419,7 +11447,7 @@ }, "packages/library": { "name": "@tomplum/react-git-log", - "version": "1.0.0", + "version": "1.0.1", "dependencies": { "@uidotdev/usehooks": "^2.4.1", "classnames": "^2.5.1", @@ -11427,13 +11455,16 @@ "fastpriorityqueue": "^0.7.5", "framer-motion": "^12.4.10", "node-interval-tree": "^2.1.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": ">=18.0.0", + "react-dom": ">=18.0.0", "react-tiny-popover": "^8.1.6" }, "devDependencies": { + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.2.0", + "@testing-library/user-event": "^14.6.1", "@types/node": "^22.13.10", - "@types/react": "^19.0.10", + "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react-swc": "^3.8.0", "@vitest/browser": "^3.0.7", @@ -11466,6 +11497,20 @@ } } }, + "packages/library/node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, "packages/library/node_modules/@vitest/browser": { "version": "3.0.7", "dev": true, @@ -11501,18 +11546,6 @@ } } }, - "packages/library/node_modules/@vitest/browser/node_modules/@testing-library/user-event": { - "version": "14.6.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, "packages/library/node_modules/@vitest/expect": { "version": "3.0.7", "dev": true, diff --git a/packages/library/package.json b/packages/library/package.json index de644ec3..ecf8f445 100644 --- a/packages/library/package.json +++ b/packages/library/package.json @@ -24,27 +24,34 @@ "build-storybook": "storybook build" }, "dependencies": { + "@uidotdev/usehooks": "^2.4.1", "classnames": "^2.5.1", "dayjs": "^1.11.13", "fastpriorityqueue": "^0.7.5", "framer-motion": "^12.4.10", "node-interval-tree": "^2.1.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-tiny-popover": "^8.1.6", - "@uidotdev/usehooks": "^2.4.1" + "react": ">=18.0.0", + "react-dom": ">=18.0.0", + "react-tiny-popover": "^8.1.6" }, "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" }, "peerDependenciesMeta": { - "react": { "optional": true }, - "react-dom": { "optional": true } + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } }, "devDependencies": { + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.2.0", + "@testing-library/user-event": "^14.6.1", "@types/node": "^22.13.10", - "@types/react": "^19.0.10", + "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react-swc": "^3.8.0", "@vitest/browser": "^3.0.7", diff --git a/packages/library/src/_test/stubs.ts b/packages/library/src/_test/stubs.ts new file mode 100644 index 00000000..41ac979b --- /dev/null +++ b/packages/library/src/_test/stubs.ts @@ -0,0 +1,17 @@ +import { Commit } from 'types' + +export const commit = (commit?: Partial) => ({ + hash: 'aa2c148', + committerDate: '2025-02-24T22:06:22+00:00', + authorDate: '2025-02-22 22:06:22 +0000', + message: 'feat(graph): example commit message', + parents: [ + 'afdb263' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '30ee0ba' + ], + isBranchTip: false, + ...commit +}) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx new file mode 100644 index 00000000..b28fba11 --- /dev/null +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx @@ -0,0 +1,47 @@ +import { fireEvent, render, screen } from '@testing-library/react' +import { GraphColumn } from './GraphColumn' +import { commit } from 'test/stubs' +import * as selectCommitHandler from 'hooks/useSelectCommit' + +describe('GraphColumn', () => { + it('should invoke the correct select commit handler events when interacting with the column container', () => { + const onMouseOutHandler = vi.fn() + const onMouseOverHandler = vi.fn() + const onClickHandler = vi.fn() + + vi.spyOn(selectCommitHandler, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: onMouseOutHandler, + onMouseOver: onMouseOverHandler, + onClick: onClickHandler + } + }) + + render( + + ) + + const columnElement = screen.getByTestId('graph-column-row-0-col-0') + + fireEvent.mouseOver(columnElement) + expect(onMouseOverHandler).toHaveBeenCalledOnce() + expect(onMouseOutHandler).not.toHaveBeenCalled() + expect(onClickHandler).not.toHaveBeenCalled() + + fireEvent.mouseOut(columnElement) + expect(onMouseOverHandler).toHaveBeenCalledOnce() + expect(onMouseOutHandler).toHaveBeenCalledOnce() + expect(onClickHandler).not.toHaveBeenCalled() + + fireEvent.click(columnElement) + expect(onMouseOverHandler).toHaveBeenCalledOnce() + expect(onMouseOutHandler).toHaveBeenCalledOnce() + expect(onClickHandler).toHaveBeenCalledOnce() + }) +}) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx index d4746207..f6fa4b65 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx @@ -15,6 +15,7 @@ import { IndexPseudoCommitNode } from 'modules/Graph/components/IndexPseudoCommi export const GraphColumn = ({ index, + rowIndex, state, commit, commitNodeIndex @@ -59,9 +60,10 @@ export const GraphColumn = ({ return (
selectCommitHandler.onMouseOut()} onClick={() => selectCommitHandler.onClick(commit)} + data-testid={`graph-column-row-${rowIndex}-col-${index}`} onMouseOver={() => selectCommitHandler.onMouseOver(commit)} > {/* This column contains a node (and it's not the git index pseudo-node) */} diff --git a/packages/library/tsconfig.json b/packages/library/tsconfig.json index 91fdb673..7f9bb09f 100644 --- a/packages/library/tsconfig.json +++ b/packages/library/tsconfig.json @@ -14,7 +14,8 @@ "hooks/*": ["src/hooks/*"], "constants/*": ["src/constants/*"], "data": ["src/data/index.ts"], - "types": ["src/types.ts"] + "types": ["src/types.ts"], + "test/*": ["src/_test/*"], }, "types": ["vitest/globals", "vite/client"], diff --git a/packages/library/vite.config.ts b/packages/library/vite.config.ts index d7e1b951..b56a11b5 100644 --- a/packages/library/vite.config.ts +++ b/packages/library/vite.config.ts @@ -22,7 +22,8 @@ export default defineConfig({ context: resolve(__dirname, '/src/context'), hooks: resolve(__dirname, '/src/hooks'), constants: resolve(__dirname, '/src/constants'), - data: resolve(__dirname, 'src/data') + data: resolve(__dirname, 'src/data'), + test: resolve(__dirname, 'src/_test'), } }, build: { From f705273d1098dc773b7ef4d52204fcc949f1cb86 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Fri, 21 Mar 2025 19:02:13 +0000 Subject: [PATCH 08/38] test(graph): added test cases for graph column commit node rendering --- packages/library/src/_test/vitest.setup.ts | 1 + .../components/CommitNode/CommitNode.tsx | 2 + .../GraphColumn/GraphColumn.spec.tsx | 62 ++++++++++++++++++- packages/library/tsconfig.json | 1 + packages/library/vite.config.ts | 1 + 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 packages/library/src/_test/vitest.setup.ts diff --git a/packages/library/src/_test/vitest.setup.ts b/packages/library/src/_test/vitest.setup.ts new file mode 100644 index 00000000..010b0b5d --- /dev/null +++ b/packages/library/src/_test/vitest.setup.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom' \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx index d9d2203c..8278f107 100644 --- a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx +++ b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx @@ -61,6 +61,8 @@ export const CommitNode = ({ commit, colour }: CommitNodeProps) => { onMouseOut={handleMouseOut} onMouseOver={handleMouseOver} className={styles.commitNode} + id={`commit-node-${commit.hash}`} + data-testid={`commit-node-${commit.hash}`} onClick={() => selectCommitHandler.onClick(commit)} > {isMergeCommit && ( diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx index b28fba11..1ec4c438 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx @@ -17,12 +17,14 @@ describe('GraphColumn', () => { } }) + const columnsRowCommit = commit() + render( ) @@ -42,6 +44,62 @@ describe('GraphColumn', () => { fireEvent.click(columnElement) expect(onMouseOverHandler).toHaveBeenCalledOnce() expect(onMouseOutHandler).toHaveBeenCalledOnce() - expect(onClickHandler).toHaveBeenCalledOnce() + expect(onClickHandler).toHaveBeenCalledExactlyOnceWith(columnsRowCommit) + }) + + it('should render a node commit if the column state has a node, but is not the index node', () => { + render( + + ) + + expect(screen.getByTestId('commit-node-not-index')).toBeInTheDocument() + }) + + it('should not render a node commit if the column state has a node, is the index node', () => { + render( + + ) + + expect(screen.queryByTestId('commit-node-index')).not.toBeInTheDocument() + }) + + it('should not render a node commit if the column state is the index node but does not contain a commit node', () => { + render( + + ) + + expect(screen.queryByTestId('commit-node-index')).not.toBeInTheDocument() + }) + + it('should not render a node commit if the column state has no commit or index node', () => { + render( + + ) + + expect(screen.queryByTestId('commit-node-not-index')).not.toBeInTheDocument() }) }) \ No newline at end of file diff --git a/packages/library/tsconfig.json b/packages/library/tsconfig.json index 7f9bb09f..635930d7 100644 --- a/packages/library/tsconfig.json +++ b/packages/library/tsconfig.json @@ -43,6 +43,7 @@ "include": [ "src/**/*.ts", "src/**/*.tsx", + "src/_test/vitest.setup.ts" ], "exclude": [ "node_modules", diff --git a/packages/library/vite.config.ts b/packages/library/vite.config.ts index b56a11b5..82c8c87f 100644 --- a/packages/library/vite.config.ts +++ b/packages/library/vite.config.ts @@ -60,6 +60,7 @@ export default defineConfig({ classNameStrategy: 'non-scoped' } }, + setupFiles: ['./src/_test/vitest.setup.ts'], coverage: { provider: 'v8', reporter: ['text', 'html'], From ad0e2af7932570cbd5fd5dcc16430754b753991e Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 11:13:10 +0000 Subject: [PATCH 09/38] test(graph): adding graph column POM and refactoring test suite --- package-lock.json | 388 ++++++------------ packages/library/package.json | 10 +- .../library/src/_test/elements/GraphColumn.ts | 25 ++ .../GraphColumn/GraphColumn.spec.tsx | 243 +++++++---- .../IndexPseudoCommitNode.tsx | 2 + .../components/VerticalLine/VerticalLine.tsx | 59 ++- packages/library/vite.config.ts | 7 +- 7 files changed, 361 insertions(+), 373 deletions(-) create mode 100644 packages/library/src/_test/elements/GraphColumn.ts diff --git a/package-lock.json b/package-lock.json index aafac1d6..1848bf52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4242,6 +4242,85 @@ "vite": "^4 || ^5 || ^6" } }, + "node_modules/@vitest/browser": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.0.9.tgz", + "integrity": "sha512-P9dcCeMkA3/oYGfUzRFZJLZxiOpApztxhPsQDUiZzAzLoZonWhse2+vPB0xEBP8Q0lX1WCEEmtY7HzBRi4oYBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@testing-library/dom": "^10.4.0", + "@testing-library/user-event": "^14.6.1", + "@vitest/mocker": "3.0.9", + "@vitest/utils": "3.0.9", + "magic-string": "^0.30.17", + "msw": "^2.7.3", + "sirv": "^3.0.1", + "tinyrainbow": "^2.0.0", + "ws": "^8.18.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "3.0.9", + "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/@vitest/browser/node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@vitest/browser/node_modules/@vitest/pretty-format": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", + "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/browser/node_modules/@vitest/utils": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", + "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.9", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/coverage-v8": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.9.tgz", @@ -4496,6 +4575,56 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/ui": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.0.9.tgz", + "integrity": "sha512-FpZD4aIv/qNpwkV3XbLV6xldWFHMgoNWAJEgg5GmpObmAOLAErpYjew9dDwXdYdKOS3iZRKdwI+P3JOJcYeUBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.0.9", + "fflate": "^0.8.2", + "flatted": "^3.3.3", + "pathe": "^2.0.3", + "sirv": "^3.0.1", + "tinyglobby": "^0.2.12", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "3.0.9" + } + }, + "node_modules/@vitest/ui/node_modules/@vitest/pretty-format": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", + "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui/node_modules/@vitest/utils": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", + "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.9", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/utils": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", @@ -11467,9 +11596,9 @@ "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react-swc": "^3.8.0", - "@vitest/browser": "^3.0.7", - "@vitest/coverage-v8": "^3.0.7", - "@vitest/ui": "^3.0.7", + "@vitest/browser": "^3.0.9", + "@vitest/coverage-v8": "^3.0.9", + "@vitest/ui": "^3.0.9", "globals": "^16.0.0", "jsdom": "^26.0.0", "sass": "^1.85.1", @@ -11479,7 +11608,7 @@ "vite-plugin-lib-inject-css": "^2.2.1", "vite-plugin-svgr": "^4.3.0", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.0.7" + "vitest": "^3.0.9" }, "engines": { "node": ">=18.0.0" @@ -11511,168 +11640,6 @@ "@testing-library/dom": ">=7.21.4" } }, - "packages/library/node_modules/@vitest/browser": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@testing-library/dom": "^10.4.0", - "@testing-library/user-event": "^14.6.1", - "@vitest/mocker": "3.0.7", - "@vitest/utils": "3.0.7", - "magic-string": "^0.30.17", - "msw": "^2.7.3", - "sirv": "^3.0.1", - "tinyrainbow": "^2.0.0", - "ws": "^8.18.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "3.0.7", - "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "packages/library/node_modules/@vitest/expect": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.0.7", - "@vitest/utils": "3.0.7", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/library/node_modules/@vitest/mocker": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.0.7", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "packages/library/node_modules/@vitest/pretty-format": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/library/node_modules/@vitest/runner": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.0.7", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/library/node_modules/@vitest/snapshot": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.0.7", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/library/node_modules/@vitest/spy": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/library/node_modules/@vitest/ui": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.0.7", - "fflate": "^0.8.2", - "flatted": "^3.3.3", - "pathe": "^2.0.3", - "sirv": "^3.0.1", - "tinyglobby": "^0.2.12", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "3.0.7" - } - }, - "packages/library/node_modules/@vitest/utils": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.0.7", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/library/node_modules/estree-walker": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "packages/library/node_modules/fastpriorityqueue": { "version": "0.7.5", "license": "Apache-2.0" @@ -11738,95 +11705,6 @@ "engines": { "node": ">=14.17" } - }, - "packages/library/node_modules/vite-node": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/library/node_modules/vitest": { - "version": "3.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.0.7", - "@vitest/mocker": "3.0.7", - "@vitest/pretty-format": "^3.0.7", - "@vitest/runner": "3.0.7", - "@vitest/snapshot": "3.0.7", - "@vitest/spy": "3.0.7", - "@vitest/utils": "3.0.7", - "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.1.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "std-env": "^3.8.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.7", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.7", - "@vitest/ui": "3.0.7", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } } } } diff --git a/packages/library/package.json b/packages/library/package.json index ecf8f445..3c3c7f1f 100644 --- a/packages/library/package.json +++ b/packages/library/package.json @@ -19,7 +19,7 @@ "preview": "vite preview", "test": "vitest --watch", "test:ci": "vitest --run --reporter=verbose", - "test:ui": "vitest --ui", + "test:ui": "vitest --watch --ui --coverage", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" }, @@ -54,9 +54,9 @@ "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react-swc": "^3.8.0", - "@vitest/browser": "^3.0.7", - "@vitest/coverage-v8": "^3.0.7", - "@vitest/ui": "^3.0.7", + "@vitest/browser": "^3.0.9", + "@vitest/coverage-v8": "^3.0.9", + "@vitest/ui": "^3.0.9", "globals": "^16.0.0", "jsdom": "^26.0.0", "sass": "^1.85.1", @@ -66,7 +66,7 @@ "vite-plugin-lib-inject-css": "^2.2.1", "vite-plugin-svgr": "^4.3.0", "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.0.7" + "vitest": "^3.0.9" }, "engines": { "node": ">=18.0.0" diff --git a/packages/library/src/_test/elements/GraphColumn.ts b/packages/library/src/_test/elements/GraphColumn.ts new file mode 100644 index 00000000..20aa1e7f --- /dev/null +++ b/packages/library/src/_test/elements/GraphColumn.ts @@ -0,0 +1,25 @@ +import { screen } from '@testing-library/react' + +class GraphColumnElement { + private getElement(testId: string, shouldExist: T = true as T): T extends true ? HTMLElement : HTMLElement | null { + return (shouldExist ? screen.getByTestId(testId) : screen.queryByTestId(testId)) as any + } + + public at({ row, column, shouldExist }: { row: number; column: number; shouldExist?: T } = {} as { row: number; column: number; shouldExist?: T }) { + return this.getElement(`graph-column-row-${row}-col-${column}`, shouldExist) + } + + public withCommitNode({ hash, shouldExist }: { hash: string; shouldExist?: T } = {} as { hash: string; shouldExist?: T }) { + return this.getElement(`commit-node-${hash}`, shouldExist) + } + + public withIndexPseudoCommitNode({ shouldExist }: { shouldExist?: T } = {} as { shouldExist?: T }) { + return this.getElement('index-pseudo-commit-node', shouldExist) + } + + public withFullHeightVerticalLine({ shouldExist }: { shouldExist?: T } = {} as { shouldExist?: T }) { + return this.getElement('vertical-line-full-height', shouldExist) + } +} + +export const graphColumn = new GraphColumnElement() \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx index 1ec4c438..2d60c6a4 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx @@ -1,105 +1,166 @@ -import { fireEvent, render, screen } from '@testing-library/react' +import { fireEvent, render } from '@testing-library/react' import { GraphColumn } from './GraphColumn' import { commit } from 'test/stubs' import * as selectCommitHandler from 'hooks/useSelectCommit' +import { graphColumn } from 'test/elements/GraphColumn' describe('GraphColumn', () => { - it('should invoke the correct select commit handler events when interacting with the column container', () => { - const onMouseOutHandler = vi.fn() - const onMouseOverHandler = vi.fn() - const onClickHandler = vi.fn() - - vi.spyOn(selectCommitHandler, 'useSelectCommit').mockReturnValue({ - selectCommitHandler: { - onMouseOut: onMouseOutHandler, - onMouseOver: onMouseOverHandler, - onClick: onClickHandler - } + describe('Event Handling', () => { + it('should invoke the correct select commit handler events when interacting with the column container', () => { + const onMouseOutHandler = vi.fn() + const onMouseOverHandler = vi.fn() + const onClickHandler = vi.fn() + + vi.spyOn(selectCommitHandler, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: onMouseOutHandler, + onMouseOver: onMouseOverHandler, + onClick: onClickHandler + } + }) + + const columnsRowCommit = commit() + + render( + + ) + + const columnElement = graphColumn.at({ row: 0, column: 0 }) + + fireEvent.mouseOver(columnElement) + expect(onMouseOverHandler).toHaveBeenCalledOnce() + expect(onMouseOutHandler).not.toHaveBeenCalled() + expect(onClickHandler).not.toHaveBeenCalled() + + fireEvent.mouseOut(columnElement) + expect(onMouseOverHandler).toHaveBeenCalledOnce() + expect(onMouseOutHandler).toHaveBeenCalledOnce() + expect(onClickHandler).not.toHaveBeenCalled() + + fireEvent.click(columnElement) + expect(onMouseOverHandler).toHaveBeenCalledOnce() + expect(onMouseOutHandler).toHaveBeenCalledOnce() + expect(onClickHandler).toHaveBeenCalledExactlyOnceWith(columnsRowCommit) }) - - const columnsRowCommit = commit() - - render( - - ) - - const columnElement = screen.getByTestId('graph-column-row-0-col-0') - - fireEvent.mouseOver(columnElement) - expect(onMouseOverHandler).toHaveBeenCalledOnce() - expect(onMouseOutHandler).not.toHaveBeenCalled() - expect(onClickHandler).not.toHaveBeenCalled() - - fireEvent.mouseOut(columnElement) - expect(onMouseOverHandler).toHaveBeenCalledOnce() - expect(onMouseOutHandler).toHaveBeenCalledOnce() - expect(onClickHandler).not.toHaveBeenCalled() - - fireEvent.click(columnElement) - expect(onMouseOverHandler).toHaveBeenCalledOnce() - expect(onMouseOutHandler).toHaveBeenCalledOnce() - expect(onClickHandler).toHaveBeenCalledExactlyOnceWith(columnsRowCommit) }) - it('should render a node commit if the column state has a node, but is not the index node', () => { - render( - - ) - - expect(screen.getByTestId('commit-node-not-index')).toBeInTheDocument() - }) + describe('Commit Nodes', () => { + it('should render a commit node if the column state has a node, but is not the index node', () => { + render( + + ) + + expect(graphColumn.withCommitNode({ hash: 'not-index' })).toBeInTheDocument() + + // Other column elements should not be rendered + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + }) - it('should not render a node commit if the column state has a node, is the index node', () => { - render( - - ) - - expect(screen.queryByTestId('commit-node-index')).not.toBeInTheDocument() - }) + it('should render a pseudo commit node if the column state has a node and is the index node', () => { + render( + + ) + + expect(graphColumn.withIndexPseudoCommitNode()).toBeInTheDocument() + + // Other column elements should not be rendered + expect(graphColumn.withCommitNode({ hash: 'index', shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + }) - it('should not render a node commit if the column state is the index node but does not contain a commit node', () => { - render( - - ) - - expect(screen.queryByTestId('commit-node-index')).not.toBeInTheDocument() + it('should not render a commit node if the column state is the index node but does not contain a commit node', () => { + render( + + ) + + expect(graphColumn.withCommitNode({ hash: 'index', shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + }) + + it('should not render a commit node if the column state has no commit or index node', () => { + render( + + ) + + expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + }) }) - it('should not render a node commit if the column state has no commit or index node', () => { - render( - - ) - - expect(screen.queryByTestId('commit-node-not-index')).not.toBeInTheDocument() + describe('Vertical Lines', () => { + it('should render a full height solid vertical line if the state isVerticalLine but not isVerticalIndexLine', () => { + render( + + ) + + expect(graphColumn.withFullHeightVerticalLine()).toBeInTheDocument() + expect(getComputedStyle(graphColumn.withFullHeightVerticalLine()).borderRightStyle).toBe('solid') + + expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render a full height vertical line if the state has isVerticalLine', () => { + render( + + ) + + expect(graphColumn.withFullHeightVerticalLine()).toBeInTheDocument() + expect(getComputedStyle(graphColumn.withFullHeightVerticalLine()).borderRightStyle).toBe('dotted') + + expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + }) }) }) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx index 495564a7..6c89199e 100644 --- a/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx +++ b/packages/library/src/modules/Graph/components/IndexPseudoCommitNode/IndexPseudoCommitNode.tsx @@ -8,6 +8,8 @@ export const IndexPseudoCommitNode = ({ animate, columnColour }: IndexPseudoComm return (
{ const { headCommit } = useGitContext() - const verticalNodeLineStyles = useMemo(() => { + const { style, variant } = useMemo<{ style: CSSProperties, variant: string }>(() => { const isRowCommitIndexNode = commit.hash === 'index' const rowsCommitIsHead = commit.hash === headCommit.hash && state.isNode @@ -16,10 +16,13 @@ export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCo // eventually meet with the HEAD commit of the current branch. if (isRowCommitIndexNode) { return { - top: '50%', - height: '50%', - zIndex: columnIndex + 1, - borderRight: `2px dotted ${indexCommitNodeBorder}` + variant: 'bottom-half-dotted', + style: { + top: '50%', + height: '50%', + zIndex: columnIndex + 1, + borderRight: `2px dotted ${indexCommitNodeBorder}` + } } } @@ -28,9 +31,12 @@ export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCo // ultimately hit the index pseudo-node above. if (rowsCommitIsHead) { return { - height: '50%', - top: 0, - borderRight: `2px dotted ${indexCommitNodeBorder}` + variant: 'top-half-dotted', + style: { + height: '50%', + top: 0, + borderRight: `2px dotted ${indexCommitNodeBorder}` + } } } @@ -40,10 +46,13 @@ export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCo const isFirstCommit = state.isNode && commit.parents.length === 0 if (isFirstCommit || state.isColumnBelowEmpty) { return { - top: 0, - height: '50%', - zIndex: columnIndex + 1, - borderRight: `2px solid ${columnColour}` + variant: 'top-half', + style: { + top: 0, + height: '50%', + zIndex: columnIndex + 1, + borderRight: `2px solid ${columnColour}` + } } } @@ -58,10 +67,13 @@ export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCo const isBranchTip = commit.isBranchTip && state.isNode if (isBranchTip || state.isColumnAboveEmpty) { return { - top: '50%', - height: '50%', - zIndex: columnIndex + 1, - borderRight: `2px ${borderStyle} ${columnColour}` + variant: 'bottom-half', + style: { + top: '50%', + height: '50%', + zIndex: columnIndex + 1, + borderRight: `2px ${borderStyle} ${columnColour}` + } } } @@ -69,17 +81,22 @@ export const VerticalLine = ({ state, columnIndex, columnColour, commit, indexCo // we must be in a column with no commit node, and // so we draw a line the full height of the column. return { - top: 0, - height: '100%', - zIndex: columnIndex + 1, - borderRight: `2px ${borderStyle} ${isIndex ? indexCommitNodeBorder : columnColour}` + variant: 'full-height', + style: { + top: 0, + height: '100%', + zIndex: columnIndex + 1, + borderRight: `2px ${borderStyle} ${isIndex ? indexCommitNodeBorder : columnColour}` + } } }, [commit.hash, commit.parents.length, commit.isBranchTip, headCommit.hash, state.isNode, state.isColumnBelowEmpty, state.isPlaceholderSkeleton, state.isColumnAboveEmpty, isIndex, columnIndex, indexCommitNodeBorder, columnColour]) return (
) diff --git a/packages/library/vite.config.ts b/packages/library/vite.config.ts index 82c8c87f..5bf64e7f 100644 --- a/packages/library/vite.config.ts +++ b/packages/library/vite.config.ts @@ -64,8 +64,13 @@ export default defineConfig({ coverage: { provider: 'v8', reporter: ['text', 'html'], + include: [ + 'src' + ], exclude: [ - 'node_modules/' + 'node_modules/', + 'dist', + 'src/_test' ] } } From 9a6e3ecaf4f11fff575df07ede058c97bd11567b Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 11:33:30 +0000 Subject: [PATCH 10/38] test(graph): added test cases for horizontal line rendering in graph column --- .../library/src/_test/elements/GraphColumn.ts | 29 ++++- .../GraphColumn/GraphColumn.spec.tsx | 105 +++++++++++++++++- .../HorizontalLine/HorizontalLine.tsx | 25 +++-- 3 files changed, 141 insertions(+), 18 deletions(-) diff --git a/packages/library/src/_test/elements/GraphColumn.ts b/packages/library/src/_test/elements/GraphColumn.ts index 20aa1e7f..5385827d 100644 --- a/packages/library/src/_test/elements/GraphColumn.ts +++ b/packages/library/src/_test/elements/GraphColumn.ts @@ -1,25 +1,46 @@ import { screen } from '@testing-library/react' +interface At extends ShouldExist { + row: number + column: number +} + +interface Node extends ShouldExist { + hash: string +} + +interface ShouldExist { + shouldExist?: T +} + class GraphColumnElement { private getElement(testId: string, shouldExist: T = true as T): T extends true ? HTMLElement : HTMLElement | null { return (shouldExist ? screen.getByTestId(testId) : screen.queryByTestId(testId)) as any } - public at({ row, column, shouldExist }: { row: number; column: number; shouldExist?: T } = {} as { row: number; column: number; shouldExist?: T }) { + public at({ row, column, shouldExist }: At = {} as At) { return this.getElement(`graph-column-row-${row}-col-${column}`, shouldExist) } - public withCommitNode({ hash, shouldExist }: { hash: string; shouldExist?: T } = {} as { hash: string; shouldExist?: T }) { + public withCommitNode({ hash, shouldExist }: Node = {} as Node) { return this.getElement(`commit-node-${hash}`, shouldExist) } - public withIndexPseudoCommitNode({ shouldExist }: { shouldExist?: T } = {} as { shouldExist?: T }) { + public withIndexPseudoCommitNode({ shouldExist }: ShouldExist = {} as ShouldExist) { return this.getElement('index-pseudo-commit-node', shouldExist) } - public withFullHeightVerticalLine({ shouldExist }: { shouldExist?: T } = {} as { shouldExist?: T }) { + public withFullHeightVerticalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { return this.getElement('vertical-line-full-height', shouldExist) } + + public withFullWidthHorizontalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('horizontal-line-full-width', shouldExist) + } + + public withHalfWidthRightHorizontalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('horizontal-line-right-half', shouldExist) + } } export const graphColumn = new GraphColumnElement() \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx index 2d60c6a4..878935af 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx @@ -67,6 +67,7 @@ describe('GraphColumn', () => { // Other column elements should not be rendered expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() }) it('should render a pseudo commit node if the column state has a node and is the index node', () => { @@ -85,6 +86,7 @@ describe('GraphColumn', () => { // Other column elements should not be rendered expect(graphColumn.withCommitNode({ hash: 'index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state is the index node but does not contain a commit node', () => { @@ -101,6 +103,7 @@ describe('GraphColumn', () => { expect(graphColumn.withCommitNode({ hash: 'index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state has no commit or index node', () => { @@ -117,11 +120,12 @@ describe('GraphColumn', () => { expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() }) }) describe('Vertical Lines', () => { - it('should render a full height solid vertical line if the state isVerticalLine but not isVerticalIndexLine', () => { + it('should render a full height solid vertical line if the state has a vertical line but not an index line', () => { render( { /> ) - expect(graphColumn.withFullHeightVerticalLine()).toBeInTheDocument() - expect(getComputedStyle(graphColumn.withFullHeightVerticalLine()).borderRightStyle).toBe('solid') + const verticalLine = graphColumn.withFullHeightVerticalLine() + expect(verticalLine).toBeInTheDocument() + expect(getComputedStyle(verticalLine).borderRightStyle).toBe('solid') expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() }) - it('should render a full height vertical line if the state has isVerticalLine', () => { + it('should render a full height dotted vertical line if the state has a vertical line and index line', () => { render( { /> ) - expect(graphColumn.withFullHeightVerticalLine()).toBeInTheDocument() - expect(getComputedStyle(graphColumn.withFullHeightVerticalLine()).borderRightStyle).toBe('dotted') + const verticalLine = graphColumn.withFullHeightVerticalLine() + expect(verticalLine).toBeInTheDocument() + expect(getComputedStyle(verticalLine).borderRightStyle).toBe('dotted') expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + }) + }) + + describe('Horizontal Lines', () => { + it('should render a full width solid horizontal line if the state has a horizontal line', () => { + render( + + ) + + const horizontalLine = graphColumn.withFullWidthHorizontalLine() + expect(horizontalLine).toBeInTheDocument() + expect(getComputedStyle(horizontalLine).borderTopStyle).toBe('solid') + + expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHalfWidthRightHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render a right half solid horizontal line if the column has a commit and is the target of a merge', () => { + render( + + ) + + + // Should render the half-width line on the right side + const horizontalLine = graphColumn.withHalfWidthRightHorizontalLine() + expect(horizontalLine).toBeInTheDocument() + expect(getComputedStyle(horizontalLine).borderTopStyle).toBe('solid') + + // Plus the commit node + expect(graphColumn.withCommitNode({ hash: 'merge-target-node' })).toBeInTheDocument() + + // Other elements should not be rendered + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render a right half dotted horizontal line if the column has a commit, is the target of a merge and is a placeholder', () => { + render( + + ) + + + // Should render the half-width line on the right side + const horizontalLine = graphColumn.withHalfWidthRightHorizontalLine() + expect(horizontalLine).toBeInTheDocument() + expect(getComputedStyle(horizontalLine).borderTopStyle).toBe('dotted') + + // Plus the commit node + expect(graphColumn.withCommitNode({ hash: 'merge-target-node-2' })).toBeInTheDocument() + + // Other elements should not be rendered + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() }) }) }) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx b/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx index 530a10ab..513fbe74 100644 --- a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx +++ b/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx @@ -7,7 +7,7 @@ import { useTheme } from 'hooks/useTheme' export const HorizontalLine = ({ state, columnIndex, commitNodeIndex, columnColour }: HorizontalLineProps) => { const { getGraphColumnColour } = useTheme() - const style = useMemo(() => { + const { style, variant } = useMemo<{ style: CSSProperties, variant: string }>(() => { // Furthest-right active branch takes precedence const furtherRightMergeNodeColumnIndex = state?.mergeSourceColumns ? Math.max(...state?.mergeSourceColumns ?? []) @@ -25,19 +25,26 @@ export const HorizontalLine = ({ state, columnIndex, commitNodeIndex, columnColo // to the right side horizontal line. if (state.isNode && state.mergeSourceColumns) { return { - borderTop: `2px ${borderStyle} ${borderColour}`, - width: '50%', - right: 0, - zIndex: columnIndex + 1 + variant: 'right-half', + style: { + borderTop: `2px ${borderStyle} ${borderColour}`, + width: '50%', + right: 0, + zIndex: columnIndex + 1 + } } } // If no other conditions are met then we can draw a // full-width horizontal line. return { - borderTop: `2px ${borderStyle} ${borderColour}`, - width: columnIndex === 0 ? '50%' : '100%', - zIndex: columnIndex + 1 + variant: 'full-width', + style: { + borderTop: `2px ${borderStyle} ${borderColour}`, + width: '50%', + right: 0, + zIndex: columnIndex + 1 + } } }, [columnColour, commitNodeIndex, getGraphColumnColour, columnIndex, state.isNode, state.isPlaceholderSkeleton, state.mergeSourceColumns]) @@ -45,6 +52,8 @@ export const HorizontalLine = ({ state, columnIndex, commitNodeIndex, columnColo return (
) From d40a145d3a6a5356b6ca901030f02038ed4240e1 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 11:52:57 +0000 Subject: [PATCH 11/38] test(graph): added test cases for graph column selected background rendering --- .../library/src/_test/elements/GraphColumn.ts | 12 +++- packages/library/src/_test/stubs.ts | 32 +++++++++++ .../ColumnBackground/ColumnBackground.tsx | 2 + .../GraphColumn/GraphColumn.spec.tsx | 56 ++++++++++++++++++- .../components/GraphColumn/GraphColumn.tsx | 10 +++- 5 files changed, 107 insertions(+), 5 deletions(-) diff --git a/packages/library/src/_test/elements/GraphColumn.ts b/packages/library/src/_test/elements/GraphColumn.ts index 5385827d..118edc84 100644 --- a/packages/library/src/_test/elements/GraphColumn.ts +++ b/packages/library/src/_test/elements/GraphColumn.ts @@ -1,5 +1,9 @@ import { screen } from '@testing-library/react' +interface ShouldExist { + shouldExist?: T +} + interface At extends ShouldExist { row: number column: number @@ -9,8 +13,8 @@ interface Node extends ShouldExist { hash: string } -interface ShouldExist { - shouldExist?: T +interface Background extends ShouldExist { + column: number } class GraphColumnElement { @@ -41,6 +45,10 @@ class GraphColumnElement { public withHalfWidthRightHorizontalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { return this.getElement('horizontal-line-right-half', shouldExist) } + + public withBackground({ column, shouldExist }: Background = {} as Background) { + return this.getElement(`column-background-${column}`, shouldExist) + } } export const graphColumn = new GraphColumnElement() \ No newline at end of file diff --git a/packages/library/src/_test/stubs.ts b/packages/library/src/_test/stubs.ts index 41ac979b..453e291d 100644 --- a/packages/library/src/_test/stubs.ts +++ b/packages/library/src/_test/stubs.ts @@ -1,4 +1,6 @@ import { Commit } from 'types' +import { GitContextBag } from 'context/GitContext' +import DataIntervalTree from 'node-interval-tree' export const commit = (commit?: Partial) => ({ hash: 'aa2c148', @@ -14,4 +16,34 @@ export const commit = (commit?: Partial) => ({ ], isBranchTip: false, ...commit +}) + +export const gitContextBag = (bag?: Partial): GitContextBag => ({ + currentBranch: 'main', + defaultGraphContainerWidth: 0, + graphContainerWidth: 0, + indexCommit: commit({ hash: 'index' }), + paging: { endIndex: 0, isIndexVisible: false, startIndex: 0 }, + rowSpacing: 0, + setGraphContainerWidth: vi.fn(), + setPreviewedCommit: vi.fn(), + setSelectedCommit: vi.fn(), + showBranchesTags: false, + showCommitNodeHashes: false, + theme: 'dark', + timestampFormat: '', + showTable: true, + selectedCommit: commit({ hash: 'selected' }), + colours: ['white'], + headCommit: commit({ hash: 'HEAD' }), + graphData: { + positions: new Map(), + graphWidth: 5, + commits: [], + hashToCommit: new Map(), + parents: new Map(), + edges: new DataIntervalTree(), + children: new Map() + }, + ...bag }) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx b/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx index 6836bbf9..07b2d660 100644 --- a/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx +++ b/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx @@ -35,6 +35,8 @@ export const ColumnBackground = ({ index, colour, commitNodeIndex }: ColumnBackg return ( { @@ -68,6 +69,7 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should render a pseudo commit node if the column state has a node and is the index node', () => { @@ -87,6 +89,7 @@ describe('GraphColumn', () => { expect(graphColumn.withCommitNode({ hash: 'index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state is the index node but does not contain a commit node', () => { @@ -104,6 +107,7 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state has no commit or index node', () => { @@ -121,6 +125,7 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) }) @@ -146,6 +151,7 @@ describe('GraphColumn', () => { expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should render a full height dotted vertical line if the state has a vertical line and index line', () => { @@ -169,6 +175,7 @@ describe('GraphColumn', () => { expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) }) @@ -192,6 +199,7 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withHalfWidthRightHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should render a right half solid horizontal line if the column has a commit and is the target of a merge', () => { @@ -223,6 +231,7 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should render a right half dotted horizontal line if the column has a commit, is the target of a merge and is a placeholder', () => { @@ -254,6 +263,51 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + }) + }) + + describe('Column Background (Selected Commit)', () => { + it('should render a column background if the selected commits hash matches that of the columns rows, and the table is shown', () => { + const selectedCommit = commit({ hash: 'selected-commit' }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + selectedCommit + })) + + render( + + ) + + expect(graphColumn.withBackground({ column: 5 })).toBeInTheDocument() + }) + + it('should not render a column background if the the table is shown but the selected commits hash does not match', () => { + const selectedCommit = commit({ hash: 'selected-commit' }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + selectedCommit + })) + + render( + + ) + + expect(graphColumn.withBackground({ column: 2, shouldExist: false })).not.toBeInTheDocument() }) }) }) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx index f6fa4b65..e8992e34 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx @@ -38,21 +38,27 @@ export const GraphColumn = ({ const selectedCommitIsNotPreviewed = selectedCommit?.hash != previewedCommit?.hash const shouldPreview = rowsCommitMatchesPreviewed && selectedCommitIsNotPreviewed + // If we're rendering the table on the right, then we + // want all columns in this row to render a background + // so that it lines up with the table row. if (showTable) { return shouldPreview } - // If the log is not rendered on the right, only + // If the table is not rendered on the right, only // show the preview background for the node column return shouldPreview && commitNodeIndex === index }, [commitNodeIndex, index, previewedCommit?.hash, rowsCommitMatchesPreviewed, selectedCommit?.hash, showTable]) const showSelectedBackground = useMemo(() => { + // If we're rendering the table on the right, then we + // want all columns in this row to render a background + // so that it lines up with the table row. if (showTable) { return rowsCommitMatchesSelected } - // If the log is not rendered on the right, only + // If the table is not rendered on the right, only // show the selected background for the node column return rowsCommitMatchesSelected && commitNodeIndex === index }, [commitNodeIndex, index, rowsCommitMatchesSelected, showTable]) From 134d6a603082b14267b4c5fc8a2a594fb1d2f57e Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 11:57:28 +0000 Subject: [PATCH 12/38] test(graph): added more test cases for graph column selected background rendering --- .../GraphColumn/GraphColumn.spec.tsx | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx index 85173afb..169c2a13 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx @@ -272,7 +272,8 @@ describe('GraphColumn', () => { const selectedCommit = commit({ hash: 'selected-commit' }) vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ - selectedCommit + selectedCommit, + showTable: true // <-- the table is shown })) render( @@ -292,7 +293,8 @@ describe('GraphColumn', () => { const selectedCommit = commit({ hash: 'selected-commit' }) vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ - selectedCommit + selectedCommit, + showTable: true // <-- the table is shown })) render( @@ -309,5 +311,47 @@ describe('GraphColumn', () => { expect(graphColumn.withBackground({ column: 2, shouldExist: false })).not.toBeInTheDocument() }) + + it('should render a column background when the table is not shown if the commit on this row is in this column', () => { + const selectedCommit = commit({ hash: 'selected-commit' }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + selectedCommit, + showTable: false // <-- the table is not shown + })) + + render( + + ) + + expect(graphColumn.withBackground({ column: 7 })).toBeInTheDocument() + }) + + it('should not render a column background if the the table is not shown and the commit on this row is in a different column', () => { + const selectedCommit = commit({ hash: 'selected-commit' }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + selectedCommit, + showTable: false // <-- the table is not shown + })) + + render( + + ) + + expect(graphColumn.withBackground({ column: 7, shouldExist: false })).not.toBeInTheDocument() + }) }) }) \ No newline at end of file From 9801ffefc0c7ad6d4ce955e9a70d5fb86c11588b Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 12:06:56 +0000 Subject: [PATCH 13/38] test(graph): added test cases for graph column previewed background rendering --- .../library/src/_test/elements/GraphColumn.ts | 8 +- .../ColumnBackground/ColumnBackground.tsx | 6 +- .../components/ColumnBackground/types.ts | 1 + .../GraphColumn/GraphColumn.spec.tsx | 156 ++++++++++++++++-- .../components/GraphColumn/GraphColumn.tsx | 2 + 5 files changed, 155 insertions(+), 18 deletions(-) diff --git a/packages/library/src/_test/elements/GraphColumn.ts b/packages/library/src/_test/elements/GraphColumn.ts index 118edc84..eff20150 100644 --- a/packages/library/src/_test/elements/GraphColumn.ts +++ b/packages/library/src/_test/elements/GraphColumn.ts @@ -46,8 +46,12 @@ class GraphColumnElement { return this.getElement('horizontal-line-right-half', shouldExist) } - public withBackground({ column, shouldExist }: Background = {} as Background) { - return this.getElement(`column-background-${column}`, shouldExist) + public withSelectedBackground({ column, shouldExist }: Background = {} as Background) { + return this.getElement(`column-background-${column}-selected`, shouldExist) + } + + public withPreviewedBackground({ column, shouldExist }: Background = {} as Background) { + return this.getElement(`column-background-${column}-previewed`, shouldExist) } } diff --git a/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx b/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx index 07b2d660..9371ba28 100644 --- a/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx +++ b/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx @@ -6,7 +6,7 @@ import { CSSProperties, useMemo } from 'react' import { NODE_BORDER_WIDTH, NODE_WIDTH, ROW_HEIGHT } from 'constants/constants' import { useGitContext } from 'context/GitContext' -export const ColumnBackground = ({ index, colour, commitNodeIndex }: ColumnBackgroundProps) => { +export const ColumnBackground = ({ id, index, colour, commitNodeIndex }: ColumnBackgroundProps) => { const { showTable } = useGitContext() const previewedBackgroundStyles = useMemo(() => { @@ -35,8 +35,8 @@ export const ColumnBackground = ({ index, colour, commitNodeIndex }: ColumnBackg return ( { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should render a pseudo commit node if the column state has a node and is the index node', () => { @@ -89,7 +90,8 @@ describe('GraphColumn', () => { expect(graphColumn.withCommitNode({ hash: 'index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state is the index node but does not contain a commit node', () => { @@ -107,7 +109,8 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state has no commit or index node', () => { @@ -125,7 +128,8 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) }) @@ -151,7 +155,7 @@ describe('GraphColumn', () => { expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should render a full height dotted vertical line if the state has a vertical line and index line', () => { @@ -175,7 +179,8 @@ describe('GraphColumn', () => { expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) }) @@ -199,7 +204,8 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withHalfWidthRightHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should render a right half solid horizontal line if the column has a commit and is the target of a merge', () => { @@ -231,7 +237,8 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) it('should render a right half dotted horizontal line if the column has a commit, is the target of a merge and is a placeholder', () => { @@ -263,7 +270,8 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() }) }) @@ -286,7 +294,8 @@ describe('GraphColumn', () => { /> ) - expect(graphColumn.withBackground({ column: 5 })).toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 5 })).toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 5, shouldExist: false })).not.toBeInTheDocument() }) it('should not render a column background if the the table is shown but the selected commits hash does not match', () => { @@ -309,7 +318,8 @@ describe('GraphColumn', () => { /> ) - expect(graphColumn.withBackground({ column: 2, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 2, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 2, shouldExist: false })).not.toBeInTheDocument() }) it('should render a column background when the table is not shown if the commit on this row is in this column', () => { @@ -330,7 +340,8 @@ describe('GraphColumn', () => { /> ) - expect(graphColumn.withBackground({ column: 7 })).toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 7 })).toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 7, shouldExist: false })).not.toBeInTheDocument() }) it('should not render a column background if the the table is not shown and the commit on this row is in a different column', () => { @@ -351,7 +362,126 @@ describe('GraphColumn', () => { /> ) - expect(graphColumn.withBackground({ column: 7, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 7, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 7, shouldExist: false })).not.toBeInTheDocument() + }) + }) + + describe('Column Background (Previewed Commit)', () => { + it('should render a column background if the previewed commits hash matches that of the columns rows, and the table is shown', () => { + const previewedCommit = commit({ hash: 'previewed-commit' }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + previewedCommit, + showTable: true // <-- the table is shown + })) + + render( + + ) + + expect(graphColumn.withPreviewedBackground({ column: 5 })).toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 5, shouldExist: false })).not.toBeInTheDocument() + }) + + it('should not render a previewed column background if the previewed commits hash matches that of the columns rows, the table is shown, but the row is already selected', () => { + // This row is already selected, but the user is hovering too, so it's marked as previewed + const commitHash = 'the-commit-of-this-row' + const previewedCommit = commit({ hash: commitHash }) + const selectedCommit = commit({ hash: commitHash }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + previewedCommit, + selectedCommit, + showTable: true // <-- the table is shown + })) + + render( + + ) + + expect(graphColumn.withSelectedBackground({ column: 5 })).toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 5, shouldExist: false })).not.toBeInTheDocument() + }) + + it('should not render a column background if the the table is shown but the previewed commits hash does not match', () => { + const previewedCommit = commit({ hash: 'previewed-commit' }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + previewedCommit, + showTable: true // <-- the table is shown + })) + + render( + + ) + + expect(graphColumn.withPreviewedBackground({ column: 2, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 2, shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render a column background when the table is not shown if the commit on this row is in this column', () => { + const previewedCommit = commit({ hash: 'previewed-commit' }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + previewedCommit, + showTable: false // <-- the table is not shown + })) + + render( + + ) + + expect(graphColumn.withPreviewedBackground({ column: 7 })).toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 7, shouldExist: false })).not.toBeInTheDocument() + }) + + it('should not render a column background if the the table is not shown and the commit on this row is in a different column', () => { + const previewedCommit = commit({ hash: 'previewed-commit' }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + previewedCommit, + showTable: false // <-- the table is not shown + })) + + render( + + ) + + expect(graphColumn.withPreviewedBackground({ column: 7, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 7, shouldExist: false })).not.toBeInTheDocument() }) }) }) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx index e8992e34..1ac41297 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.tsx @@ -121,6 +121,7 @@ export const GraphColumn = ({ {/* This column is part of a row that has been selected */} {showSelectedBackground && ( Date: Sat, 22 Mar 2025 12:12:34 +0000 Subject: [PATCH 14/38] fix(graph): fixed small horizontal line rendering issue after test-id refactor --- .../modules/Graph/components/HorizontalLine/HorizontalLine.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx b/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx index 513fbe74..e7eb93db 100644 --- a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx +++ b/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx @@ -41,8 +41,7 @@ export const HorizontalLine = ({ state, columnIndex, commitNodeIndex, columnColo variant: 'full-width', style: { borderTop: `2px ${borderStyle} ${borderColour}`, - width: '50%', - right: 0, + width: columnIndex === 0 ? '50%' : '100%', zIndex: columnIndex + 1 } } From 5ed475144b066c2830533aa176ade77f380c50c6 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 12:13:14 +0000 Subject: [PATCH 15/38] chore(config): added coverage directory to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 85502ecd..ee649884 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ dist-ssr *storybook.log packages/demo/storybook-static + +packages/library/coverage \ No newline at end of file From a620c7a1967c53ba3ba99d5b271d6586b7eb9ac3 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 12:30:18 +0000 Subject: [PATCH 16/38] chore(graph): added wrapping container around curve components to simulate fragments and attach attributes --- .../components/LeftDownCurve/LeftDownCurve.module.scss | 6 +++++- .../Graph/components/LeftDownCurve/LeftDownCurve.tsx | 8 ++++---- .../components/LeftUpCurve/LeftUpCurve.module.scss | 6 +++++- .../Graph/components/LeftUpCurve/LeftUpCurve.tsx | 10 ++++++---- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.module.scss b/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.module.scss index c6ef27e6..c67674e0 100644 --- a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.module.scss +++ b/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.module.scss @@ -1,3 +1,7 @@ -.curve { +.container { + display: contents; +} + +.curve, .line { position: absolute; } \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx b/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx index daf1c042..1d2e9c24 100644 --- a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx +++ b/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx @@ -10,9 +10,9 @@ export const LeftDownCurve = ({ color, isPlaceholder }: LeftDownCurveProps) => { const borderStyle = isPlaceholder ? 'dotted' : 'solid' return ( - <> +
{ />
{ width: `calc(50% - ${NODE_WIDTH / 2}px)` }} /> - +
) } \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.module.scss b/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.module.scss index c6ef27e6..c67674e0 100644 --- a/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.module.scss +++ b/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.module.scss @@ -1,3 +1,7 @@ -.curve { +.container { + display: contents; +} + +.curve, .line { position: absolute; } \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.tsx b/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.tsx index 36192a14..dde294ed 100644 --- a/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.tsx +++ b/packages/library/src/modules/Graph/components/LeftUpCurve/LeftUpCurve.tsx @@ -10,9 +10,9 @@ export const LeftUpCurve = ({ color, isPlaceholder }: LeftUpCurveProps) => { const borderStyle = isPlaceholder ? 'dotted' : 'solid' return ( - <> +
{ height: (ROW_HEIGHT + rowSpacing - NODE_WIDTH) / 2 }} /> + +
{ width: `calc(50% - ${NODE_WIDTH / 2}px)` }} /> - +
) } \ No newline at end of file From 541d58dbb19b715fe18cee68624fe73823f1aaa6 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 15:33:54 +0000 Subject: [PATCH 17/38] test(graph): added test cases for left-down curve rendering in graph column --- .../library/src/_test/elements/GraphColumn.ts | 32 ++++ .../components/CurvedEdge/CurvedEdge.tsx | 12 +- .../Graph/components/CurvedEdge/types.ts | 1 + .../GraphColumn/GraphColumn.spec.tsx | 139 ++++++++++++++++++ .../LeftDownCurve/LeftDownCurve.tsx | 14 +- .../components/LeftUpCurve/LeftUpCurve.tsx | 5 + 6 files changed, 200 insertions(+), 3 deletions(-) diff --git a/packages/library/src/_test/elements/GraphColumn.ts b/packages/library/src/_test/elements/GraphColumn.ts index eff20150..f135ac1a 100644 --- a/packages/library/src/_test/elements/GraphColumn.ts +++ b/packages/library/src/_test/elements/GraphColumn.ts @@ -53,6 +53,38 @@ class GraphColumnElement { public withPreviewedBackground({ column, shouldExist }: Background = {} as Background) { return this.getElement(`column-background-${column}-previewed`, shouldExist) } + + public withLeftDownCurve({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('left-down-curve', shouldExist) + } + + public withLeftDownCurveCurvedLine({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('left-down-curve-curved-line', shouldExist) + } + + public withLeftDownCurveLeftLine({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('left-down-curve-left-line', shouldExist) + } + + public withLeftDownCurveBottomLine({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('left-down-curve-bottom-line', shouldExist) + } + + public withLeftUpCurve({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('left-up-curve', shouldExist) + } + + public withLeftUpCurveCurvedLine({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('left-up-curve-curved-line', shouldExist) + } + + public withLeftUpCurveLeftLine({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('left-up-curve-left-line', shouldExist) + } + + public withLeftUpCurveTopLine({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('left-up-curve-top-line', shouldExist) + } } export const graphColumn = new GraphColumnElement() \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/CurvedEdge/CurvedEdge.tsx b/packages/library/src/modules/Graph/components/CurvedEdge/CurvedEdge.tsx index 3d406258..c535abac 100644 --- a/packages/library/src/modules/Graph/components/CurvedEdge/CurvedEdge.tsx +++ b/packages/library/src/modules/Graph/components/CurvedEdge/CurvedEdge.tsx @@ -2,9 +2,17 @@ import { NODE_WIDTH } from 'constants/constants' import styles from './CurvedEdge.module.scss' import { CurvedEdgeProps } from './types' -export const CurvedEdge = ({ colour, path, dashed }: CurvedEdgeProps) => { +export const CurvedEdge = ({ id, colour, path, dashed }: CurvedEdgeProps) => { return ( - + { @@ -71,6 +72,8 @@ describe('GraphColumn', () => { expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) it('should render a pseudo commit node if the column state has a node and is the index node', () => { @@ -92,6 +95,8 @@ describe('GraphColumn', () => { expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state is the index node but does not contain a commit node', () => { @@ -111,6 +116,8 @@ describe('GraphColumn', () => { expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state has no commit or index node', () => { @@ -130,6 +137,8 @@ describe('GraphColumn', () => { expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) }) @@ -156,6 +165,8 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) it('should render a full height dotted vertical line if the state has a vertical line and index line', () => { @@ -181,6 +192,8 @@ describe('GraphColumn', () => { expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) }) @@ -206,6 +219,8 @@ describe('GraphColumn', () => { expect(graphColumn.withHalfWidthRightHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) it('should render a right half solid horizontal line if the column has a commit and is the target of a merge', () => { @@ -239,6 +254,8 @@ describe('GraphColumn', () => { expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) it('should render a right half dotted horizontal line if the column has a commit, is the target of a merge and is a placeholder', () => { @@ -272,6 +289,8 @@ describe('GraphColumn', () => { expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) }) @@ -484,4 +503,124 @@ describe('GraphColumn', () => { expect(graphColumn.withSelectedBackground({ column: 7, shouldExist: false })).not.toBeInTheDocument() }) }) + + describe('Left Down Curve', () => { + it('should render a left-down curve if the column has a left down curve element', () => { + const getGraphColumnColour = vi.fn() + vi.spyOn(themeHook, 'useTheme').mockReturnValue({ + getGraphColumnColour, + shiftAlphaChannel: vi.fn(), + hoverColour: 'hoverColour', + theme: 'dark', + textColour: 'textColour', + reduceOpacity: vi.fn(), + getCommitColour: vi.fn(), + getTooltipBackground: vi.fn(), + hoverTransitionDuration: 500 + }) + + const graphColumnColour = 'rgb(124, 6, 168)' + getGraphColumnColour.mockReturnValue(graphColumnColour) + + render( + + ) + + expect(getGraphColumnColour).toHaveBeenCalledWith(1) + + // Should render the correct curve element + expect(graphColumn.withLeftDownCurve()).toBeInTheDocument() + + // Since it's not a placeholder, the lines should be solid + const leftLine = graphColumn.withLeftDownCurveLeftLine() + const leftLineStyles = getComputedStyle(leftLine) + expect(leftLineStyles.borderBottomStyle).toBe('solid') + expect(leftLineStyles.borderBottomColor).toBe(graphColumnColour) + + const bottomLine = graphColumn.withLeftDownCurveBottomLine() + const bottomLineStyles = getComputedStyle(bottomLine) + expect(bottomLineStyles.borderRightStyle).toBe('solid') + expect(bottomLineStyles.borderRightColor).toBe(graphColumnColour) + + const curvedLine = graphColumn.withLeftDownCurveCurvedLine() + const curvedLinePath = curvedLine?.querySelector('path') + expect(curvedLinePath?.getAttribute('stroke-dasharray')).toBeNull() + expect(curvedLinePath?.getAttribute('stroke')).toBe(graphColumnColour) + + + // Other elements should not be rendered + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render a dotted left-down curve if the column has a left down curve element and is a placeholder', () => { + const shiftAlphaChannel = vi.fn() + vi.spyOn(themeHook, 'useTheme').mockReturnValue({ + getGraphColumnColour: vi.fn(), + shiftAlphaChannel, + hoverColour: 'hoverColour', + theme: 'dark', + textColour: 'textColour', + reduceOpacity: vi.fn(), + getCommitColour: vi.fn(), + getTooltipBackground: vi.fn(), + hoverTransitionDuration: 500 + }) + + const placeholderColour = 'rgb(255, 255, 255)' + shiftAlphaChannel.mockReturnValue(placeholderColour) + + render( + + ) + + expect(shiftAlphaChannel).toHaveBeenCalledWith('textColour', 0.8) + + // Since it's a placeholder, the lines should be dotted + const leftLine = graphColumn.withLeftDownCurveLeftLine() + const leftLineStyles = getComputedStyle(leftLine) + expect(leftLineStyles.borderBottomStyle).toBe('dotted') + expect(leftLineStyles.borderBottomColor).toBe(placeholderColour) + + const bottomLine = graphColumn.withLeftDownCurveBottomLine() + const bottomLineStyles = getComputedStyle(bottomLine) + expect(bottomLineStyles.borderRightStyle).toBe('dotted') + expect(bottomLineStyles.borderRightColor).toBe(placeholderColour) + + const curvedLine = graphColumn.withLeftDownCurveCurvedLine() + const curvedLinePath = curvedLine?.querySelector('path') + expect(curvedLinePath?.getAttribute('stroke-dasharray')).toBe('2 2') + expect(curvedLinePath?.getAttribute('stroke')).toBe(placeholderColour) + + // Other elements should not be rendered + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + }) + }) }) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx b/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx index 1d2e9c24..efb36661 100644 --- a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx +++ b/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx @@ -8,10 +8,19 @@ export const LeftDownCurve = ({ color, isPlaceholder }: LeftDownCurveProps) => { const { rowSpacing } = useGitContext() const borderStyle = isPlaceholder ? 'dotted' : 'solid' - + + console.log({ + bottom: 0, + left: 'calc(50% - 1px)', + borderRight: `2px ${borderStyle} ${color}`, + height: (ROW_HEIGHT + rowSpacing - NODE_WIDTH) / 2 + }) + return (
{
{ return (
{
Date: Sat, 22 Mar 2025 15:37:44 +0000 Subject: [PATCH 18/38] test(graph): added test cases for left-up curve rendering in graph column --- .../GraphColumn/GraphColumn.spec.tsx | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx index 11c15fd9..e49204d2 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx @@ -623,4 +623,124 @@ describe('GraphColumn', () => { expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() }) }) + + describe('Left Up Curve', () => { + it('should render a left-up curve if the column has a left up curve element', () => { + const getGraphColumnColour = vi.fn() + vi.spyOn(themeHook, 'useTheme').mockReturnValue({ + getGraphColumnColour, + shiftAlphaChannel: vi.fn(), + hoverColour: 'hoverColour', + theme: 'dark', + textColour: 'textColour', + reduceOpacity: vi.fn(), + getCommitColour: vi.fn(), + getTooltipBackground: vi.fn(), + hoverTransitionDuration: 500 + }) + + const graphColumnColour = 'rgb(124, 6, 168)' + getGraphColumnColour.mockReturnValue(graphColumnColour) + + render( + + ) + + expect(getGraphColumnColour).toHaveBeenCalledWith(1) + + // Should render the correct curve element + expect(graphColumn.withLeftUpCurve()).toBeInTheDocument() + + // Since it's not a placeholder, the lines should be solid + const leftLine = graphColumn.withLeftUpCurveLeftLine() + const leftLineStyles = getComputedStyle(leftLine) + expect(leftLineStyles.borderBottomStyle).toBe('solid') + expect(leftLineStyles.borderBottomColor).toBe(graphColumnColour) + + const topLine = graphColumn.withLeftUpCurveTopLine() + const topLineStyles = getComputedStyle(topLine) + expect(topLineStyles.borderRightStyle).toBe('solid') + expect(topLineStyles.borderRightColor).toBe(graphColumnColour) + + const curvedLine = graphColumn.withLeftUpCurveCurvedLine() + const curvedLinePath = curvedLine?.querySelector('path') + expect(curvedLinePath?.getAttribute('stroke-dasharray')).toBeNull() + expect(curvedLinePath?.getAttribute('stroke')).toBe(graphColumnColour) + + + // Other elements should not be rendered + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render a dotted left-up curve if the column has a left up curve element and is a placeholder', () => { + const shiftAlphaChannel = vi.fn() + vi.spyOn(themeHook, 'useTheme').mockReturnValue({ + getGraphColumnColour: vi.fn(), + shiftAlphaChannel, + hoverColour: 'hoverColour', + theme: 'dark', + textColour: 'textColour', + reduceOpacity: vi.fn(), + getCommitColour: vi.fn(), + getTooltipBackground: vi.fn(), + hoverTransitionDuration: 500 + }) + + const placeholderColour = 'rgb(255, 255, 255)' + shiftAlphaChannel.mockReturnValue(placeholderColour) + + render( + + ) + + expect(shiftAlphaChannel).toHaveBeenCalledWith('textColour', 0.8) + + // Since it's a placeholder, the lines should be dotted + const leftLine = graphColumn.withLeftUpCurveLeftLine() + const leftLineStyles = getComputedStyle(leftLine) + expect(leftLineStyles.borderBottomStyle).toBe('dotted') + expect(leftLineStyles.borderBottomColor).toBe(placeholderColour) + + const topLine = graphColumn.withLeftUpCurveTopLine() + const topLineStyles = getComputedStyle(topLine) + expect(topLineStyles.borderRightStyle).toBe('dotted') + expect(topLineStyles.borderRightColor).toBe(placeholderColour) + + const curvedLine = graphColumn.withLeftUpCurveCurvedLine() + const curvedLinePath = curvedLine?.querySelector('path') + expect(curvedLinePath?.getAttribute('stroke-dasharray')).toBe('2 2') + expect(curvedLinePath?.getAttribute('stroke')).toBe(placeholderColour) + + // Other elements should not be rendered + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + }) + }) }) \ No newline at end of file From 9a00a716d8660d4875540dfa0fca91638821f0fa Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 15:44:52 +0000 Subject: [PATCH 19/38] test(graph): added test cases for head commit vertical line rendering in graph column --- .../library/src/_test/elements/GraphColumn.ts | 4 ++ .../GraphColumn/GraphColumn.spec.tsx | 43 ++++++++++++++++++- .../HeadCommitVerticalLine.tsx | 2 + 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/packages/library/src/_test/elements/GraphColumn.ts b/packages/library/src/_test/elements/GraphColumn.ts index f135ac1a..1c4b9668 100644 --- a/packages/library/src/_test/elements/GraphColumn.ts +++ b/packages/library/src/_test/elements/GraphColumn.ts @@ -38,6 +38,10 @@ class GraphColumnElement { return this.getElement('vertical-line-full-height', shouldExist) } + public withHeadCommitVerticalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('head-commit-vertical-line', shouldExist) + } + public withFullWidthHorizontalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { return this.getElement('horizontal-line-full-width', shouldExist) } diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx index e49204d2..c0508698 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx @@ -74,6 +74,7 @@ describe('GraphColumn', () => { expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() }) it('should render a pseudo commit node if the column state has a node and is the index node', () => { @@ -97,6 +98,7 @@ describe('GraphColumn', () => { expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state is the index node but does not contain a commit node', () => { @@ -118,6 +120,7 @@ describe('GraphColumn', () => { expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() }) it('should not render a commit node if the column state has no commit or index node', () => { @@ -139,6 +142,7 @@ describe('GraphColumn', () => { expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() }) }) @@ -152,7 +156,6 @@ describe('GraphColumn', () => { commitNodeIndex={0} state={{ isVerticalLine: true, // <-- is a vertical line - isVerticalIndexLine: false // <-- but is not drawn from the index node }} /> ) @@ -167,6 +170,7 @@ describe('GraphColumn', () => { expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() }) it('should render a full height dotted vertical line if the state has a vertical line and index line', () => { @@ -187,6 +191,36 @@ describe('GraphColumn', () => { expect(verticalLine).toBeInTheDocument() expect(getComputedStyle(verticalLine).borderRightStyle).toBe('dotted') + expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render a solid half-height vertical line if the rows commit is the head and this column has its node', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + headCommit: commit({ hash: 'HEAD' }), + })) + + render( + + ) + + expect(graphColumn.withHeadCommitVerticalLine()).toBeInTheDocument() + expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() @@ -221,6 +255,7 @@ describe('GraphColumn', () => { expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() }) it('should render a right half solid horizontal line if the column has a commit and is the target of a merge', () => { @@ -256,6 +291,7 @@ describe('GraphColumn', () => { expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() }) it('should render a right half dotted horizontal line if the column has a commit, is the target of a merge and is a placeholder', () => { @@ -291,6 +327,7 @@ describe('GraphColumn', () => { expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() }) }) @@ -561,6 +598,7 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() @@ -618,6 +656,7 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftUpCurve({ shouldExist: false })).not.toBeInTheDocument() @@ -681,6 +720,7 @@ describe('GraphColumn', () => { expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() @@ -737,6 +777,7 @@ describe('GraphColumn', () => { // Other elements should not be rendered expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withHeadCommitVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() diff --git a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx b/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx index 2eb0886a..29b9ca46 100644 --- a/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx +++ b/packages/library/src/modules/Graph/components/HeadCommitVerticalLine/HeadCommitVerticalLine.tsx @@ -5,6 +5,8 @@ import { HeadCommitVerticalLineProps } from './types' export const HeadCommitVerticalLine = ({ columnColour }: HeadCommitVerticalLineProps) => { return (
Date: Sat, 22 Mar 2025 17:25:41 +0000 Subject: [PATCH 20/38] test(graph): added extra styling assertions to column background tests --- .../ColumnBackground/ColumnBackground.tsx | 4 +- .../GraphColumn/GraphColumn.spec.tsx | 97 ++++++++++++++++++- 2 files changed, 98 insertions(+), 3 deletions(-) diff --git a/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx b/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx index 9371ba28..f5d59181 100644 --- a/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx +++ b/packages/library/src/modules/Graph/components/ColumnBackground/ColumnBackground.tsx @@ -9,7 +9,7 @@ import { useGitContext } from 'context/GitContext' export const ColumnBackground = ({ id, index, colour, commitNodeIndex }: ColumnBackgroundProps) => { const { showTable } = useGitContext() - const previewedBackgroundStyles = useMemo(() => { + const style = useMemo(() => { // 8 pixels either side of the node const offset = 8 * 2 const widthOffset = offset / (NODE_BORDER_WIDTH * 2) @@ -37,7 +37,7 @@ export const ColumnBackground = ({ id, index, colour, commitNodeIndex }: ColumnB ) => { + return vi.spyOn(themeHook, 'useTheme').mockReturnValue({ + getGraphColumnColour: vi.fn(), + shiftAlphaChannel: vi.fn(), + hoverColour: 'hoverColour', + theme: 'dark', + textColour: 'textColour', + reduceOpacity: vi.fn(), + getCommitColour: vi.fn(), + getTooltipBackground: vi.fn(), + hoverTransitionDuration: 500, + ...stubs + }) +} describe('GraphColumn', () => { describe('Event Handling', () => { @@ -340,17 +356,60 @@ describe('GraphColumn', () => { showTable: true // <-- the table is shown })) + const commitNodeIndex = 3 + const expectedColour = 'rgb(123, 123, 123)' + const graphColumnColour = 'graph-column-colour' + const getGraphColumnColour = vi.fn().mockReturnValue(graphColumnColour) + const reduceOpacity = vi.fn().mockReturnValue(expectedColour) + + spyTheme({ getGraphColumnColour, reduceOpacity }) + render( + ) + + expect(getGraphColumnColour).toHaveBeenCalledWith(commitNodeIndex) + expect(reduceOpacity).toHaveBeenCalledWith(graphColumnColour, 0.15) + + const background = graphColumn.withSelectedBackground({ column: 5 }) + expect(background).toBeInTheDocument() + expect(getComputedStyle(background).background).toBe(expectedColour) + + expect(graphColumn.withPreviewedBackground({ column: 5, shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render a different coloured background for the selected rows column if its a placeholder', () => { + const selectedCommit = commit({ hash: 'selected-commit' }) + + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + selectedCommit + })) + + const expectedColour = 'rgb(8, 5, 1)' + spyTheme({ + hoverColour: expectedColour + }) + + render( + ) - expect(graphColumn.withSelectedBackground({ column: 5 })).toBeInTheDocument() + const background = graphColumn.withSelectedBackground({ column: 5 }) + expect(background).toBeInTheDocument() + expect(getComputedStyle(background).background).toBe(expectedColour) + expect(graphColumn.withPreviewedBackground({ column: 5, shouldExist: false })).not.toBeInTheDocument() }) @@ -446,6 +505,42 @@ describe('GraphColumn', () => { expect(graphColumn.withSelectedBackground({ column: 5, shouldExist: false })).not.toBeInTheDocument() }) + it('should render a curved column background if the column has a commit node in it', () => { + const previewedCommit = commit({ hash: 'previewed-commit' }) + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + previewedCommit + })) + + const expectedBackgroundColour = 'rgb(1, 2, 3)' + spyTheme({ + hoverColour: expectedBackgroundColour + }) + + render( + + ) + + // Should render the background + const background = graphColumn.withPreviewedBackground({ column: 3 }) + expect(background).toBeInTheDocument() + + // Since this is the nodes column, the background should be rounded + const backgroundStyle = getComputedStyle(background) + expect(background).toHaveClass('backgroundBehindNode') + expect(backgroundStyle.width).toBe('calc(50% + 24px - 4px)') + expect(backgroundStyle.background).toBe(expectedBackgroundColour) + expect(backgroundStyle.height).toBe('40px') + expect(backgroundStyle.left).toBe('calc(50% - 24px + 4px)') + + expect(graphColumn.withSelectedBackground({ column: 3, shouldExist: false })).not.toBeInTheDocument() + }) + it('should not render a previewed column background if the previewed commits hash matches that of the columns rows, the table is shown, but the row is already selected', () => { // This row is already selected, but the user is hovering too, so it's marked as previewed const commitHash = 'the-commit-of-this-row' From e51be4db7b7aa12c511a956b4e58da3669c03004 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 17:44:33 +0000 Subject: [PATCH 21/38] test(graph): added horizontal line component unit tests --- .../GraphColumn/GraphColumn.spec.tsx | 6 +- .../HorizontalLine/HorizontalLine.spec.tsx | 91 +++++++++++++++++++ .../HorizontalLine/HorizontalLine.tsx | 14 +-- 3 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.spec.tsx diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx index bf7292f9..2dd51202 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx @@ -248,7 +248,7 @@ describe('GraphColumn', () => { }) describe('Horizontal Lines', () => { - it('should render a full width solid horizontal line if the state has a horizontal line', () => { + it('should render a right-side half width solid horizontal line if the state has a horizontal line index column index 0', () => { render( { /> ) - const horizontalLine = graphColumn.withFullWidthHorizontalLine() + const horizontalLine = graphColumn.withHalfWidthRightHorizontalLine() expect(horizontalLine).toBeInTheDocument() expect(getComputedStyle(horizontalLine).borderTopStyle).toBe('solid') expect(graphColumn.withCommitNode({ hash: 'not-index', shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withIndexPseudoCommitNode({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withFullHeightVerticalLine({ shouldExist: false })).not.toBeInTheDocument() - expect(graphColumn.withHalfWidthRightHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() + expect(graphColumn.withFullWidthHorizontalLine({ shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withSelectedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withPreviewedBackground({ column: 0, shouldExist: false })).not.toBeInTheDocument() expect(graphColumn.withLeftDownCurve({ shouldExist: false })).not.toBeInTheDocument() diff --git a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.spec.tsx b/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.spec.tsx new file mode 100644 index 00000000..a3fd90d2 --- /dev/null +++ b/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.spec.tsx @@ -0,0 +1,91 @@ +import { describe } from 'vitest' +import { render } from '@testing-library/react' +import { HorizontalLine } from 'modules/Graph/components/HorizontalLine/HorizontalLine' +import { graphColumn } from 'test/elements/GraphColumn' +import * as themeHook from 'hooks/useTheme' +import { ThemeFunctions } from 'hooks/useTheme' + +const spyTheme = (stubs: Partial) => { + return vi.spyOn(themeHook, 'useTheme').mockReturnValue({ + getGraphColumnColour: vi.fn(), + shiftAlphaChannel: vi.fn(), + hoverColour: 'hoverColour', + theme: 'dark', + textColour: 'textColour', + reduceOpacity: vi.fn(), + getCommitColour: vi.fn(), + getTooltipBackground: vi.fn(), + hoverTransitionDuration: 500, + ...stubs + }) +} + +describe('HorizontalLine', () => { + it('should render a half-width line if the column is index 0', () => { + const graphColumnColour = 'rgb(0, 5, 10)' + const getGraphColumnColour = vi.fn().mockReturnValue(graphColumnColour) + spyTheme({ getGraphColumnColour }) + + const commitNodeIndex = 0 + + render( + + ) + + expect(getGraphColumnColour).toHaveBeenCalledWith(commitNodeIndex) + + const line = graphColumn.withHalfWidthRightHorizontalLine() + expect(line).toHaveAttribute('id', 'horizontal-line-right-half') + + const lineStyle = getComputedStyle(line) + expect(lineStyle.width).toBe('50%') + expect(lineStyle.borderTopWidth).toBe('2px') + expect(lineStyle.borderTopStyle).toBe('solid') + expect(lineStyle.borderTopColor).toBe(graphColumnColour) + expect(lineStyle.zIndex).toBe('1') + }) + + it('should render a full-width line if the column is index is greater-than 0', () => { + render( + + ) + + const line = graphColumn.withFullWidthHorizontalLine() + expect(line).toHaveAttribute('id', 'horizontal-line-full-width') + + const lineStyle = getComputedStyle(line) + expect(lineStyle.width).toBe('100%') + }) + + it('should render the line with the column colour of the max merge node index if there is one', () => { + const graphColumnColour = 'rgb(2, 1, 76)' + const getGraphColumnColour = vi.fn().mockReturnValue(graphColumnColour) + spyTheme({ getGraphColumnColour }) + + render( + + ) + + // Even though we're in column 0, get the colour for + // column 6 since it's the farther right in the merge source columns. + expect(getGraphColumnColour).toHaveBeenCalledWith(6) + + const lineStyle = getComputedStyle(graphColumn.withHalfWidthRightHorizontalLine()) + expect(lineStyle.borderTopColor).toBe(graphColumnColour) + }) +}) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx b/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx index e7eb93db..7bdb02e9 100644 --- a/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx +++ b/packages/library/src/modules/Graph/components/HorizontalLine/HorizontalLine.tsx @@ -8,14 +8,14 @@ export const HorizontalLine = ({ state, columnIndex, commitNodeIndex, columnColo const { getGraphColumnColour } = useTheme() const { style, variant } = useMemo<{ style: CSSProperties, variant: string }>(() => { - // Furthest-right active branch takes precedence - const furtherRightMergeNodeColumnIndex = state?.mergeSourceColumns - ? Math.max(...state?.mergeSourceColumns ?? []) + // Farthest-right active branch takes precedence + const farthestRightMergeNodeColumnIndex = state?.mergeSourceColumns + ? Math.max(...state.mergeSourceColumns) : undefined const borderColour = state.isPlaceholderSkeleton ? columnColour - : getGraphColumnColour(furtherRightMergeNodeColumnIndex ?? commitNodeIndex) + : getGraphColumnColour(farthestRightMergeNodeColumnIndex ?? commitNodeIndex) // Border is dotted for the skeleton placeholder elements. const borderStyle = state.isPlaceholderSkeleton ? 'dotted' : 'solid' @@ -37,11 +37,13 @@ export const HorizontalLine = ({ state, columnIndex, commitNodeIndex, columnColo // If no other conditions are met then we can draw a // full-width horizontal line. + const isInFirstColumn = columnIndex === 0 + return { - variant: 'full-width', + variant: isInFirstColumn ? 'right-half' : 'full-width', style: { borderTop: `2px ${borderStyle} ${borderColour}`, - width: columnIndex === 0 ? '50%' : '100%', + width: isInFirstColumn ? '50%' : '100%', zIndex: columnIndex + 1 } } From 78867a02ca74a4162af4590c363015d4d33da694 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 18:08:51 +0000 Subject: [PATCH 22/38] test(graph): added fading div unit tests --- packages/library/src/_test/stubs.ts | 14 +++++++++ .../components/FadingDiv/FadingDiv.spec.tsx | 31 +++++++++++++++++++ .../src/components/FadingDiv/FadingDiv.tsx | 8 +++-- .../library/src/components/FadingDiv/index.ts | 1 + .../library/src/components/FadingDiv/types.ts | 4 +++ .../GraphColumn/GraphColumn.spec.tsx | 31 ++++++------------- 6 files changed, 64 insertions(+), 25 deletions(-) create mode 100644 packages/library/src/components/FadingDiv/FadingDiv.spec.tsx create mode 100644 packages/library/src/components/FadingDiv/types.ts diff --git a/packages/library/src/_test/stubs.ts b/packages/library/src/_test/stubs.ts index 453e291d..6fe596cc 100644 --- a/packages/library/src/_test/stubs.ts +++ b/packages/library/src/_test/stubs.ts @@ -1,6 +1,7 @@ import { Commit } from 'types' import { GitContextBag } from 'context/GitContext' import DataIntervalTree from 'node-interval-tree' +import { ThemeFunctions } from 'hooks/useTheme' export const commit = (commit?: Partial) => ({ hash: 'aa2c148', @@ -46,4 +47,17 @@ export const gitContextBag = (bag?: Partial): GitContextBag => ({ children: new Map() }, ...bag +}) + +export const themeFunctions = (response?: Partial): ThemeFunctions => ({ + getGraphColumnColour: vi.fn(), + shiftAlphaChannel: vi.fn(), + hoverColour: 'hoverColour', + theme: 'dark', + textColour: 'textColour', + reduceOpacity: vi.fn(), + getCommitColour: vi.fn(), + getTooltipBackground: vi.fn(), + hoverTransitionDuration: 500, + ...response }) \ No newline at end of file diff --git a/packages/library/src/components/FadingDiv/FadingDiv.spec.tsx b/packages/library/src/components/FadingDiv/FadingDiv.spec.tsx new file mode 100644 index 00000000..3361f393 --- /dev/null +++ b/packages/library/src/components/FadingDiv/FadingDiv.spec.tsx @@ -0,0 +1,31 @@ +import { gitContextBag, themeFunctions } from 'test/stubs' +import { render, screen } from '@testing-library/react' +import { FadingDiv } from 'components/FadingDiv/FadingDiv' +import * as themeHook from 'hooks/useTheme' +import * as gitContext from 'context/GitContext/useGitContext' + +describe('FadingDiv', () => { + it('should render a motion.div from framer motion if enableExperimentalMotion is on', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + enableExperimentalAnimation: true + })) + + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + hoverTransitionDuration: 1000 + })) + + render() + + expect(screen.getByTestId('fading-div')).toBeInTheDocument() + }) + + it('should render a regular div if enableExperimentalMotion is off', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + enableExperimentalAnimation: false + })) + + render() + + expect(screen.queryByTestId('fading-div')).not.toBeInTheDocument() + }) +}) \ No newline at end of file diff --git a/packages/library/src/components/FadingDiv/FadingDiv.tsx b/packages/library/src/components/FadingDiv/FadingDiv.tsx index e4cbfec0..5528cf8f 100644 --- a/packages/library/src/components/FadingDiv/FadingDiv.tsx +++ b/packages/library/src/components/FadingDiv/FadingDiv.tsx @@ -1,15 +1,17 @@ -import { motion, MotionProps } from 'framer-motion' -import { HTMLAttributes, PropsWithChildren } from 'react' +import { motion } from 'framer-motion' +import { PropsWithChildren } from 'react' import { useGitContext } from 'context/GitContext' import { useTheme } from 'hooks/useTheme' +import { FadingDivProps } from './types' -export const FadingDiv = ({ children, ...props }: PropsWithChildren & MotionProps>) => { +export const FadingDiv = ({ children, ...props }: PropsWithChildren) => { const { hoverTransitionDuration } = useTheme() const { enableExperimentalAnimation } = useGitContext() if (enableExperimentalAnimation) { return ( & MotionProps \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx index 2dd51202..5b5d0de4 100644 --- a/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx +++ b/packages/library/src/modules/Graph/components/GraphColumn/GraphColumn.spec.tsx @@ -1,26 +1,10 @@ import { fireEvent, render } from '@testing-library/react' import { GraphColumn } from './GraphColumn' -import { commit, gitContextBag } from 'test/stubs' +import { commit, gitContextBag, themeFunctions } from 'test/stubs' import * as selectCommitHandler from 'hooks/useSelectCommit' import * as gitContext from 'context/GitContext/useGitContext' import * as themeHook from 'hooks/useTheme' import { graphColumn } from 'test/elements/GraphColumn' -import { ThemeFunctions } from 'hooks/useTheme' - -const spyTheme = (stubs: Partial) => { - return vi.spyOn(themeHook, 'useTheme').mockReturnValue({ - getGraphColumnColour: vi.fn(), - shiftAlphaChannel: vi.fn(), - hoverColour: 'hoverColour', - theme: 'dark', - textColour: 'textColour', - reduceOpacity: vi.fn(), - getCommitColour: vi.fn(), - getTooltipBackground: vi.fn(), - hoverTransitionDuration: 500, - ...stubs - }) -} describe('GraphColumn', () => { describe('Event Handling', () => { @@ -362,7 +346,10 @@ describe('GraphColumn', () => { const getGraphColumnColour = vi.fn().mockReturnValue(graphColumnColour) const reduceOpacity = vi.fn().mockReturnValue(expectedColour) - spyTheme({ getGraphColumnColour, reduceOpacity }) + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + getGraphColumnColour, + reduceOpacity + })) render( { })) const expectedColour = 'rgb(8, 5, 1)' - spyTheme({ + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ hoverColour: expectedColour - }) + })) render( { })) const expectedBackgroundColour = 'rgb(1, 2, 3)' - spyTheme({ + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ hoverColour: expectedBackgroundColour - }) + })) render( Date: Sat, 22 Mar 2025 18:20:27 +0000 Subject: [PATCH 23/38] test(hooks): added shiftAlphaChannel tests for useTheme hook --- .../src/hooks/useTheme/useTheme.spec.ts | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 packages/library/src/hooks/useTheme/useTheme.spec.ts diff --git a/packages/library/src/hooks/useTheme/useTheme.spec.ts b/packages/library/src/hooks/useTheme/useTheme.spec.ts new file mode 100644 index 00000000..1150faa4 --- /dev/null +++ b/packages/library/src/hooks/useTheme/useTheme.spec.ts @@ -0,0 +1,57 @@ +import { describe, it, expect } from 'vitest' +import { renderHook } from '@testing-library/react' +import { useTheme } from './useTheme' +import * as gitContext from 'context/GitContext/useGitContext' +import { gitContextBag } from 'test/stubs' + +describe('useTheme', () => { + describe('shiftAlphaChannel', () => { + it('returns the same RGB when opacity is 1 (fully opaque)', () => { + const { result } = renderHook(useTheme) + const shiftedColour = result.current.shiftAlphaChannel('rgb(100, 150, 200)', 1) + expect(shiftedColour).toBe('rgb(100, 150, 200)') + }) + + it('returns theme background color when opacity is 0 in dark mode', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + theme: 'dark' + })) + + const { result } = renderHook(useTheme) + const shiftedColour = result.current.shiftAlphaChannel('rgb(100, 150, 200)', 0) + expect(shiftedColour).toBe('rgb(0, 0, 0)' ) + }) + + it('correctly blends colors based on opacity in dark mode', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + theme: 'dark' + })) + + const { result } = renderHook(useTheme) + const shiftedColour = result.current.shiftAlphaChannel('rgb(100, 150, 200)', 0.5) + expect(shiftedColour).toBe('rgb(50, 75, 100)') + }) + + it('correctly blends colors based on opacity in light mode', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + theme: 'light' + })) + + const { result } = renderHook(useTheme) + const shiftedColour = result.current.shiftAlphaChannel('rgb(100, 150, 200)', 0.5) + expect(shiftedColour).toBe('rgb(178, 203, 228)') + }) + + it('returns original value if input is not a valid RGB string', () => { + const { result } = renderHook(useTheme) + expect(result.current.shiftAlphaChannel('invalid', 0.5)).toBe('invalid') + expect(result.current.shiftAlphaChannel('', 0.5)).toBe('') + }) + + it('returns original value if RGB input is null or undefined', () => { + const { result } = renderHook(useTheme) + expect(result.current.shiftAlphaChannel(null as unknown as string, 0.5)).toBeNull() + expect(result.current.shiftAlphaChannel(undefined as unknown as string, 0.5)).toBeUndefined() + }) + }) +}) \ No newline at end of file From ce2d33ffd4deb7aeccb290122d24f1d8501762cb Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 18:26:50 +0000 Subject: [PATCH 24/38] test(hooks): added tests for remaining useTheme functions --- packages/library/src/_test/stubs.ts | 22 +-- .../src/hooks/useTheme/useTheme.spec.ts | 134 +++++++++++++++++- 2 files changed, 145 insertions(+), 11 deletions(-) diff --git a/packages/library/src/_test/stubs.ts b/packages/library/src/_test/stubs.ts index 6fe596cc..7f1ec9e7 100644 --- a/packages/library/src/_test/stubs.ts +++ b/packages/library/src/_test/stubs.ts @@ -2,6 +2,7 @@ import { Commit } from 'types' import { GitContextBag } from 'context/GitContext' import DataIntervalTree from 'node-interval-tree' import { ThemeFunctions } from 'hooks/useTheme' +import { GraphData } from 'data' export const commit = (commit?: Partial) => ({ hash: 'aa2c148', @@ -37,15 +38,7 @@ export const gitContextBag = (bag?: Partial): GitContextBag => ({ selectedCommit: commit({ hash: 'selected' }), colours: ['white'], headCommit: commit({ hash: 'HEAD' }), - graphData: { - positions: new Map(), - graphWidth: 5, - commits: [], - hashToCommit: new Map(), - parents: new Map(), - edges: new DataIntervalTree(), - children: new Map() - }, + graphData: graphData(), ...bag }) @@ -60,4 +53,15 @@ export const themeFunctions = (response?: Partial): ThemeFunctio getTooltipBackground: vi.fn(), hoverTransitionDuration: 500, ...response +}) + +export const graphData = (data?: Partial): GraphData => ({ + positions: new Map(), + graphWidth: 5, + commits: [], + hashToCommit: new Map(), + parents: new Map(), + edges: new DataIntervalTree(), + children: new Map(), + ...data }) \ No newline at end of file diff --git a/packages/library/src/hooks/useTheme/useTheme.spec.ts b/packages/library/src/hooks/useTheme/useTheme.spec.ts index 1150faa4..9ee687a3 100644 --- a/packages/library/src/hooks/useTheme/useTheme.spec.ts +++ b/packages/library/src/hooks/useTheme/useTheme.spec.ts @@ -1,10 +1,19 @@ -import { describe, it, expect } from 'vitest' +import { describe, it, expect, beforeEach, afterEach } from 'vitest' import { renderHook } from '@testing-library/react' import { useTheme } from './useTheme' import * as gitContext from 'context/GitContext/useGitContext' -import { gitContextBag } from 'test/stubs' +import { gitContextBag, graphData } from 'test/stubs' +import { Commit } from 'types' describe('useTheme', () => { + beforeEach(() => { + vi.restoreAllMocks() + }) + + afterEach(() => { + vi.restoreAllMocks() + }) + describe('shiftAlphaChannel', () => { it('returns the same RGB when opacity is 1 (fully opaque)', () => { const { result } = renderHook(useTheme) @@ -54,4 +63,125 @@ describe('useTheme', () => { expect(result.current.shiftAlphaChannel(undefined as unknown as string, 0.5)).toBeUndefined() }) }) + + describe('hoverColour', () => { + it('returns correct hover colour for dark theme', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ theme: 'dark' })) + const { result } = renderHook(useTheme) + expect(result.current.hoverColour).toBe('rgba(70,70,70,0.8)') + }) + + it('returns correct hover colour for light theme', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ theme: 'light' })) + const { result } = renderHook(useTheme) + expect(result.current.hoverColour).toBe('rgba(231, 231, 231, 0.5)') + }) + }) + + describe('textColour', () => { + it('returns correct text colour for dark theme', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ theme: 'dark' })) + const { result } = renderHook(useTheme) + expect(result.current.textColour).toBe('rgb(255, 255, 255)') + }) + + it('returns correct text colour for light theme', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ theme: 'light' })) + const { result } = renderHook(useTheme) + expect(result.current.textColour).toBe('rgb(0, 0, 0)') + }) + }) + + describe('reduceOpacity', () => { + it('returns rgba string with given opacity', () => { + const { result } = renderHook(useTheme) + expect(result.current.reduceOpacity('rgb(100, 150, 200)', 0.5)).toBe('rgba(100, 150, 200, 0.5)') + }) + }) + + describe('getGraphColumnColour', () => { + it('returns the correct colour when the index exists in colours array', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ colours: ['red', 'green', 'blue'] })) + const { result } = renderHook(useTheme) + expect(result.current.getGraphColumnColour(1)).toBe('green') + }) + + it('returns a repeated colour when index is beyond the array length', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ colours: ['red', 'green', 'blue'] })) + const { result } = renderHook(useTheme) + expect(result.current.getGraphColumnColour(5)).toBe('blue') // 5 % 3 === 2, so should return 'blue' + }) + }) + + describe('getCommitColour', () => { + it('returns the first column colour for index commit', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ colours: ['red', 'green', 'blue'] })) + const { result } = renderHook(useTheme) + expect(result.current.getCommitColour({ hash: 'index' } as Commit)).toBe('red') + }) + + it('returns correct column colour based on commit position', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue( + gitContextBag({ + colours: ['red', 'green', 'blue'], + graphData: graphData({ + positions: new Map([['abc123', [0, 1]]]) + }) + }) + ) + + const { result } = renderHook(useTheme) + expect(result.current.getCommitColour({ hash: 'abc123' } as Commit)).toBe('green') + }) + + it('logs a warning and returns default black for unmapped commit', () => { + const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}) + vi.spyOn(gitContext, 'useGitContext').mockReturnValue( + gitContextBag({ + colours: ['red', 'green', 'blue'], + graphData: graphData({ + positions: new Map() + }) + }) + ) + + const { result } = renderHook(useTheme) + expect(result.current.getCommitColour({ hash: 'unknown' } as Commit)).toBe('rgb(0, 0, 0)') + expect(consoleWarnSpy).toHaveBeenCalledWith('Commit unknown did not have a mapped graph position') + + consoleWarnSpy.mockRestore() + }) + }) + + describe('getTooltipBackground', () => { + it('returns correctly adjusted background colour for dark theme', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue( + gitContextBag({ + theme: 'dark', + colours: ['rgb(100, 150, 200)'], + graphData: graphData({ + positions: new Map([['abc123', [0, 0]]]) + }) + }) + ) + + const { result } = renderHook(useTheme) + expect(result.current.getTooltipBackground({ hash: 'abc123' } as Commit)).toBe('rgb(20, 30, 40)') + }) + + it('returns correctly adjusted background colour for light theme', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue( + gitContextBag({ + theme: 'light', + colours: ['rgb(100, 150, 200)'], + graphData: graphData({ + positions: new Map([['abc123', [0, 0]]]) + }) + }) + ) + + const { result } = renderHook(useTheme) + expect(result.current.getTooltipBackground({ hash: 'abc123' } as Commit)).toBe('rgb(240, 245, 250)') + }) + }) }) \ No newline at end of file From 769dedb80763d8ba3c129a63408de8467cea63bd Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 18:35:26 +0000 Subject: [PATCH 25/38] test(hooks): added tests for createRainbowTheme.ts --- .../hooks/useTheme/createRainbowTheme.spec.ts | 37 +++++++++++++++++++ .../src/hooks/useTheme/createRainbowTheme.ts | 17 +++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 packages/library/src/hooks/useTheme/createRainbowTheme.spec.ts diff --git a/packages/library/src/hooks/useTheme/createRainbowTheme.spec.ts b/packages/library/src/hooks/useTheme/createRainbowTheme.spec.ts new file mode 100644 index 00000000..df45ab68 --- /dev/null +++ b/packages/library/src/hooks/useTheme/createRainbowTheme.spec.ts @@ -0,0 +1,37 @@ +import { describe, it, expect } from 'vitest' +import { generateRainbowGradient } from './createRainbowTheme' + +describe('generateRainbowGradient', () => { + it('returns an empty array when n is less than 1', () => { + expect(generateRainbowGradient(0)).toEqual([]) + expect(generateRainbowGradient(-5)).toEqual([]) + }) + + it('returns a single color when n is 1', () => { + const result = generateRainbowGradient(1) + expect(result).toHaveLength(1) + expect(result[0]).toBe('rgb(54,229,234)') + }) + + it('returns an array of n colors when n > 1', () => { + const n = 5 + const result = generateRainbowGradient(n) + expect(result).toHaveLength(n) + result.forEach(color => { + expect(color).toMatch(/^rgb\(\d+, \d+, \d+\)$/) + }) + }) + + it('returns a smooth gradient where first and last colors are distinct', () => { + const n = 10 + const result = generateRainbowGradient(n) + expect(result[0]).not.toBe(result[result.length - 1]) + }) + + it('returns distinct colors for a large n', () => { + const n = 100 + const result = generateRainbowGradient(n) + const uniqueColors = new Set(result) + expect(uniqueColors.size).toBeGreaterThan(90) // Most should be unique + }) +}) \ No newline at end of file diff --git a/packages/library/src/hooks/useTheme/createRainbowTheme.ts b/packages/library/src/hooks/useTheme/createRainbowTheme.ts index 4bc93068..c1c540c5 100644 --- a/packages/library/src/hooks/useTheme/createRainbowTheme.ts +++ b/packages/library/src/hooks/useTheme/createRainbowTheme.ts @@ -10,10 +10,19 @@ export const generateRainbowGradient = (n: number): string[] => { const colors: string[] = [] - for (let i = 0; i < n; i++) { - const hue = (i / (n - 1)) * 360 // Spread across the hue spectrum (0-360) - const rgb = hslToRgb(hue, 100, 50) - colors.push(`rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`) + if (n === 1) { + // Just any colour if the graph width is 1... + colors.push('rgb(54,229,234)') + } else { + for (let i = 0; i < n; i++) { + const hue = (i / (n - 1)) * 360 // Spread across the hue spectrum (0-360) + + // Ensure that hue values do not exactly repeat at the first and last position + const adjustedHue = i === 0 ? 0 : (i === n - 1 ? 360 - 1 : hue) + + const rgb = hslToRgb(adjustedHue, 100, 50) + colors.push(`rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`) + } } return colors From 710a324fa39203281bbbf25585e83a2a2749d246 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 19:13:00 +0000 Subject: [PATCH 26/38] test(hooks): added graph row unit tests --- packages/library/src/_test/stubs.ts | 14 ++++ .../components/GraphRow/GraphRow.spec.tsx | 69 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 packages/library/src/modules/Graph/components/GraphRow/GraphRow.spec.tsx diff --git a/packages/library/src/_test/stubs.ts b/packages/library/src/_test/stubs.ts index 7f1ec9e7..3a35dc89 100644 --- a/packages/library/src/_test/stubs.ts +++ b/packages/library/src/_test/stubs.ts @@ -3,6 +3,7 @@ import { GitContextBag } from 'context/GitContext' import DataIntervalTree from 'node-interval-tree' import { ThemeFunctions } from 'hooks/useTheme' import { GraphData } from 'data' +import { GraphColumnState } from 'modules/Graph/components/GraphColumn' export const commit = (commit?: Partial) => ({ hash: 'aa2c148', @@ -64,4 +65,17 @@ export const graphData = (data?: Partial): GraphData => ({ edges: new DataIntervalTree(), children: new Map(), ...data +}) + +export const graphColumnState = (state?: Partial): GraphColumnState => ({ + isNode: false, + isPlaceholderSkeleton: false, + isLeftUpCurve: false, + isLeftDownCurve: false, + isHorizontalLine: false, + isVerticalLine: false, + isVerticalIndexLine: false, + isColumnBelowEmpty: false, + isColumnAboveEmpty: false, + ...state }) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/GraphRow/GraphRow.spec.tsx b/packages/library/src/modules/Graph/components/GraphRow/GraphRow.spec.tsx new file mode 100644 index 00000000..6d17fcd9 --- /dev/null +++ b/packages/library/src/modules/Graph/components/GraphRow/GraphRow.spec.tsx @@ -0,0 +1,69 @@ +import { render } from '@testing-library/react' +import { GraphRow } from './GraphRow' +import { commit, graphColumnState, themeFunctions } from 'test/stubs' +import { graphColumn } from 'test/elements/GraphColumn' +import * as themeHook from 'hooks/useTheme' + +describe('GraphRow', () => { + it('should render a column for each one in the columns property', () => { + render( + + ) + + expect(graphColumn.at({ row: 0, column: 0 })).toBeInTheDocument() + expect(graphColumn.at({ row: 0, column: 1 })).toBeInTheDocument() + expect(graphColumn.at({ row: 0, column: 2 })).toBeInTheDocument() + }) + + it('should pass the column index that the node for this row is in to the columns', () => { + const graphColumnColour = 'rgb(56, 56, 56)' + const getGraphColumnColour = vi.fn().mockImplementation(index => { + // Commit node is at index 2, so return a unique colour here + if (index === 2) { + return graphColumnColour + } + + return 'rgb(0, 0, 0)' + }) + + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + getGraphColumnColour + })) + + render( + + ) + + // Proving that the correct commit node index is passed + // into the column. It drives a few things, but the horizontal + // line is coloured based on the index of the column with the commit node. + expect(getGraphColumnColour).toHaveBeenCalledWith(1) + const horizontalLine = graphColumn.withFullWidthHorizontalLine() + expect(horizontalLine).toBeInTheDocument() + expect(getComputedStyle(horizontalLine).borderTopColor).toBe(graphColumnColour) + }) +}) \ No newline at end of file From 29bace1d649be0f5be4d07b13f0670c33d1d1f11 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sat, 22 Mar 2025 22:27:15 +0000 Subject: [PATCH 27/38] fix(graph): fixed dynamic position of commit node hashes --- .../Graph/components/CommitNode/CommitNode.module.scss | 2 -- .../src/modules/Graph/components/CommitNode/CommitNode.tsx | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.module.scss b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.module.scss index 7cccfce4..0aee5d1f 100644 --- a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.module.scss +++ b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.module.scss @@ -12,8 +12,6 @@ .commitLabel { position: absolute; - left: 80%; - top: 25%; padding: 2px 5px 2px 2px; border-radius: 5px; font-size: 0.7rem diff --git a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx index 8278f107..d559ceb9 100644 --- a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx +++ b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx @@ -6,12 +6,12 @@ import { useTheme } from 'hooks/useTheme' import { useGitContext } from 'context/GitContext' import { CommitNodeTooltip } from '../CommitNodeTooltip' import { useSelectCommit } from 'hooks/useSelectCommit' -import { NODE_BORDER_WIDTH } from 'constants/constants' +import { NODE_BORDER_WIDTH, NODE_WIDTH } from 'constants/constants' export const CommitNode = ({ commit, colour }: CommitNodeProps) => { const { selectCommitHandler } = useSelectCommit() const { textColour, shiftAlphaChannel, theme } = useTheme() - const { showCommitNodeTooltips, showCommitNodeHashes, nodeTheme } = useGitContext() + const { showCommitNodeTooltips, showCommitNodeHashes, nodeTheme, rowSpacing } = useGitContext() const isMergeCommit = nodeTheme === 'default' && commit.parents.length > 1 @@ -77,6 +77,8 @@ export const CommitNode = ({ commit, colour }: CommitNodeProps) => { className={styles.commitLabel} style={{ color: textColour, + top: `calc(50% - 4px - ${rowSpacing})`, + left: `calc(50% + ${NODE_WIDTH / 2}px + 5px)`, background: theme === 'dark' ? 'rgb(26,26,26)' : 'white', }} > From 66e623d31c4687095c8b91dfd1ed5a1d1344d06c Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sun, 23 Mar 2025 09:17:36 +0000 Subject: [PATCH 28/38] chore(graph): removed console.log and cleared todo --- .../Graph/components/LeftDownCurve/LeftDownCurve.tsx | 7 ------- .../modules/Graph/hooks/useColumnData/useColumnData.ts | 10 ---------- 2 files changed, 17 deletions(-) diff --git a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx b/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx index efb36661..207de678 100644 --- a/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx +++ b/packages/library/src/modules/Graph/components/LeftDownCurve/LeftDownCurve.tsx @@ -9,13 +9,6 @@ export const LeftDownCurve = ({ color, isPlaceholder }: LeftDownCurveProps) => { const borderStyle = isPlaceholder ? 'dotted' : 'solid' - console.log({ - bottom: 0, - left: 'calc(50% - 1px)', - borderRight: `2px ${borderStyle} ${color}`, - height: (ROW_HEIGHT + rowSpacing - NODE_WIDTH) / 2 - }) - return (
{ rowToColumnState.set(targetRow, columnState) } } - - // TODO: Remove the below once all working - /*const fromHash = [...positions.entries()].find((it) => { - return it[1][0] === rowStart - })![0] - - const toHash = [...positions.entries()].find((it) => { - return it[1][0] === rowEnd - })![0] - console.log('Row', rowStart, 'Column', colStart, 'hash', fromHash, '-->', 'Row', rowEnd, 'Column', colEnd, 'hash', toHash, ' --- type', type)*/ }) // Add the commit nodes into their respective rows and columns From ed3bcdc350a74d37ae416136e8e8a559fa5326d8 Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sun, 23 Mar 2025 09:50:20 +0000 Subject: [PATCH 29/38] test(graph): added test suite for commit node component --- .../library/src/_test/elements/CommitNode.ts | 31 ++ .../library/src/_test/elements/GraphColumn.ts | 5 +- packages/library/src/_test/elements/types.ts | 3 + packages/library/src/_test/stubs.ts | 5 + .../components/CommitNode/CommitNode.spec.tsx | 300 ++++++++++++++++++ .../components/CommitNode/CommitNode.tsx | 10 +- .../CommitNodeTooltip/CommitNodeTooltip.tsx | 2 + packages/library/vite.config.ts | 2 + 8 files changed, 352 insertions(+), 6 deletions(-) create mode 100644 packages/library/src/_test/elements/CommitNode.ts create mode 100644 packages/library/src/_test/elements/types.ts create mode 100644 packages/library/src/modules/Graph/components/CommitNode/CommitNode.spec.tsx diff --git a/packages/library/src/_test/elements/CommitNode.ts b/packages/library/src/_test/elements/CommitNode.ts new file mode 100644 index 00000000..c6649050 --- /dev/null +++ b/packages/library/src/_test/elements/CommitNode.ts @@ -0,0 +1,31 @@ +import { ShouldExist } from './types' +import { screen } from '@testing-library/react' + +interface WithHash extends ShouldExist { + hash: string +} + +class CommitNodeElement { + private getElement(testId: string, shouldExist: T = true as T): T extends true ? HTMLElement : HTMLElement | null { + return (shouldExist ? screen.getByTestId(testId) : screen.queryByTestId(testId)) as any + } + + public withHash({ hash, shouldExist }: WithHash = {} as WithHash) { + return this.getElement(`commit-node-${hash}`, shouldExist) + } + + public tooltip({ hash, shouldExist }: WithHash = {} as WithHash) { + return this.getElement(`commit-node-tooltip-${hash}`, shouldExist) + } + + public hashLabel({ hash, shouldExist }: WithHash = {} as WithHash) { + return this.getElement(`commit-node-hash-${hash}`, shouldExist) + } + + public mergeCircle({ hash, shouldExist }: WithHash = {} as WithHash) { + return this.getElement(`commit-node-merge-circle-${hash}`, shouldExist) + } + +} + +export const commitNode = new CommitNodeElement() \ No newline at end of file diff --git a/packages/library/src/_test/elements/GraphColumn.ts b/packages/library/src/_test/elements/GraphColumn.ts index 1c4b9668..de856eb1 100644 --- a/packages/library/src/_test/elements/GraphColumn.ts +++ b/packages/library/src/_test/elements/GraphColumn.ts @@ -1,8 +1,5 @@ import { screen } from '@testing-library/react' - -interface ShouldExist { - shouldExist?: T -} +import { ShouldExist } from './types' interface At extends ShouldExist { row: number diff --git a/packages/library/src/_test/elements/types.ts b/packages/library/src/_test/elements/types.ts new file mode 100644 index 00000000..1f82cfaf --- /dev/null +++ b/packages/library/src/_test/elements/types.ts @@ -0,0 +1,3 @@ +export interface ShouldExist { + shouldExist?: T +} \ No newline at end of file diff --git a/packages/library/src/_test/stubs.ts b/packages/library/src/_test/stubs.ts index 3a35dc89..b1a46cef 100644 --- a/packages/library/src/_test/stubs.ts +++ b/packages/library/src/_test/stubs.ts @@ -40,6 +40,11 @@ export const gitContextBag = (bag?: Partial): GitContextBag => ({ colours: ['white'], headCommit: commit({ hash: 'HEAD' }), graphData: graphData(), + nodeTheme: 'default', + showCommitNodeTooltips: false, + enableExperimentalAnimation: false, + showTableHeaders: true, + enableResize: false, ...bag }) diff --git a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.spec.tsx b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.spec.tsx new file mode 100644 index 00000000..4cd99a2c --- /dev/null +++ b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.spec.tsx @@ -0,0 +1,300 @@ +import * as gitContext from 'context/GitContext' +import * as selectCommit from 'hooks/useSelectCommit' +import * as themeHook from 'hooks/useTheme' +import { commit, gitContextBag, themeFunctions } from 'test/stubs' +import { render, waitFor } from '@testing-library/react' +import { userEvent } from '@testing-library/user-event' +import { CommitNode } from 'modules/Graph/components/CommitNode/CommitNode' +import { commitNode } from 'test/elements/CommitNode' +import { expect } from 'vitest' + +describe('CommitNode', () => { + it('should render a tooltip on hover of the node if the prop is enabled', async () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + showCommitNodeTooltips: true + })) + + vi.spyOn(selectCommit, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: vi.fn(), + onClick: vi.fn(), + onMouseOver: vi.fn() + } + }) + + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions()) + + render( + + ) + + const commitElement = commitNode.withHash({ hash: 'commit-to-hover' }) + + await userEvent.hover(commitElement) + expect(commitElement).toBeInTheDocument() + + const tooltip = commitNode.tooltip({ hash: 'commit-to-hover' }) + expect(tooltip).toBeInTheDocument() + + await userEvent.unhover(commitElement) + await waitFor(() => { + expect(commitNode.tooltip({ hash: 'commit-to-hover', shouldExist: false })).not.toBeInTheDocument() + }) + expect(commitElement).toBeInTheDocument() + }) + + it('should not render a tooltip on hover of the node if the prop is disabled', async () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + showCommitNodeTooltips: false + })) + + vi.spyOn(selectCommit, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: vi.fn(), + onClick: vi.fn(), + onMouseOver: vi.fn() + } + }) + + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions()) + + render( + + ) + + const commitElement = commitNode.withHash({ hash: 'commit-to-hover' }) + + await userEvent.hover(commitElement) + + expect(commitElement).toBeInTheDocument() + expect(commitNode.tooltip({ hash: 'commit-to-hover', shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render the commits hash next to the node if showCommitNodeHashes is true', () => { + const rowSpacing = 12 + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + showCommitNodeHashes: true, + rowSpacing + })) + + vi.spyOn(selectCommit, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: vi.fn(), + onClick: vi.fn(), + onMouseOver: vi.fn() + } + }) + + const expectedTextColour = 'rgb(0, 78, 91)' + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + textColour: expectedTextColour, + theme: 'dark' + })) + + render( + + ) + + expect(commitNode.withHash({ hash: '8a1b7c0e' })).toBeInTheDocument() + + const hashLabelElement = commitNode.hashLabel({ hash: '8a1b7c0e' }) + expect(hashLabelElement).toBeInTheDocument() + expect(hashLabelElement).toHaveTextContent('8a1b7c0e') + + const hashLabelStyle = getComputedStyle(hashLabelElement) + expect(hashLabelStyle.color).toBe(expectedTextColour) + expect(hashLabelStyle.top).toBe('calc(50% - 10px)') + expect(hashLabelStyle.height).toBe('20px') + expect(hashLabelStyle.left).toBe('calc(50% + 12px + 5px)') + expect(hashLabelStyle.background).toBe('rgb(26, 26, 26)') + }) + + it('should render the commits hash with a light background if the theme is light', () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + showCommitNodeHashes: true + })) + + vi.spyOn(selectCommit, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: vi.fn(), + onClick: vi.fn(), + onMouseOver: vi.fn() + } + }) + + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + theme: 'light' + })) + + render( + + ) + + expect(commitNode.withHash({ hash: '12345' })).toBeInTheDocument() + + const hashLabelElement = commitNode.hashLabel({ hash: '12345' }) + expect(hashLabelElement).toBeInTheDocument() + + const hashLabelStyle = getComputedStyle(hashLabelElement) + expect(hashLabelStyle.background).toBe('white') + }) + + it('should invoke the onClick event handler from the select commit handler hook when clicking the node', async () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag()) + + const onClickHandler = vi.fn() + vi.spyOn(selectCommit, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: vi.fn(), + onClick: onClickHandler, + onMouseOver: vi.fn() + } + }) + + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions()) + + const commitObject = commit({ + hash: 'commit-to-click' + }) + + render( + + ) + + const commitNodeElement = commitNode.withHash({ hash: 'commit-to-click' }) + expect(commitNodeElement).toBeInTheDocument() + + await userEvent.click(commitNodeElement) + expect(onClickHandler).toHaveBeenCalledExactlyOnceWith(commitObject) + }) + + it('should render an inner circle element when the commit is a merge commit and the node theme is default', async () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + nodeTheme: 'default' + })) + + vi.spyOn(selectCommit, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: vi.fn(), + onClick: vi.fn(), + onMouseOver: vi.fn() + } + }) + + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions()) + + const commitObject = commit({ + hash: '0e22d17a', + parents: ['1', '2'] + }) + + const commitColour = 'rgb(0, 51, 123)' + + render( + + ) + + expect(commitNode.withHash({ hash: '0e22d17a' })).toBeInTheDocument() + + const mergeCircle = commitNode.mergeCircle({ hash: '0e22d17a' }) + expect(mergeCircle).toBeInTheDocument() + expect(getComputedStyle(mergeCircle).background).toBe(commitColour) + }) + + it('should not render an inner circle element when the commit is a merge commit but the node theme is plain', async () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + nodeTheme: 'plain' + })) + + vi.spyOn(selectCommit, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: vi.fn(), + onClick: vi.fn(), + onMouseOver: vi.fn() + } + }) + + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions()) + + const commitObject = commit({ + hash: '0e22d17a', + parents: ['1', '2'] + }) + + render( + + ) + + expect(commitNode.withHash({ hash: '0e22d17a' })).toBeInTheDocument() + expect(commitNode.mergeCircle({ hash: '0e22d17a', shouldExist: false })).not.toBeInTheDocument() + }) + + it('should render the commit node element with the correct styles', async () => { + vi.spyOn(gitContext, 'useGitContext').mockReturnValue(gitContextBag({ + nodeTheme: 'plain' + })) + + vi.spyOn(selectCommit, 'useSelectCommit').mockReturnValue({ + selectCommitHandler: { + onMouseOut: vi.fn(), + onClick: vi.fn(), + onMouseOver: vi.fn() + } + }) + + const expectedNodeBackgroundColour = 'rgb(254, 200, 67)' + const shiftAlphaChannel = vi.fn().mockReturnValue(expectedNodeBackgroundColour) + vi.spyOn(themeHook, 'useTheme').mockReturnValue(themeFunctions({ + shiftAlphaChannel + })) + + const commitColour = 'rgb(78, 12, 90)' + + render( + + ) + + expect(shiftAlphaChannel).toHaveBeenCalledWith(commitColour, 0.15) + + const commitNodeElement = commitNode.withHash({ hash: 'abc123' }) + expect(commitNodeElement).toBeInTheDocument() + + const commitNodeStyle = getComputedStyle(commitNodeElement) + expect(commitNodeStyle.backgroundColor).toBe(expectedNodeBackgroundColour) + expect(commitNodeStyle.borderWidth).toBe('2px') + expect(commitNodeStyle.borderColor).toBe(commitColour) + expect(commitNodeStyle.borderStyle).toBe('solid') + }) +}) \ No newline at end of file diff --git a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx index d559ceb9..18548a97 100644 --- a/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx +++ b/packages/library/src/modules/Graph/components/CommitNode/CommitNode.tsx @@ -11,8 +11,9 @@ import { NODE_BORDER_WIDTH, NODE_WIDTH } from 'constants/constants' export const CommitNode = ({ commit, colour }: CommitNodeProps) => { const { selectCommitHandler } = useSelectCommit() const { textColour, shiftAlphaChannel, theme } = useTheme() - const { showCommitNodeTooltips, showCommitNodeHashes, nodeTheme, rowSpacing } = useGitContext() + const { showCommitNodeTooltips, showCommitNodeHashes, nodeTheme } = useGitContext() + const commitHashLabelHeight = 20 const isMergeCommit = nodeTheme === 'default' && commit.parents.length > 1 const [showTooltip, setShowTooltip] = useState(false) @@ -69,16 +70,21 @@ export const CommitNode = ({ commit, colour }: CommitNodeProps) => {
)} {showCommitNodeHashes && ( diff --git a/packages/library/src/modules/Graph/components/CommitNodeTooltip/CommitNodeTooltip.tsx b/packages/library/src/modules/Graph/components/CommitNodeTooltip/CommitNodeTooltip.tsx index c1df4d59..62648d1a 100644 --- a/packages/library/src/modules/Graph/components/CommitNodeTooltip/CommitNodeTooltip.tsx +++ b/packages/library/src/modules/Graph/components/CommitNodeTooltip/CommitNodeTooltip.tsx @@ -8,6 +8,8 @@ export const CommitNodeTooltip = ({ commit, color }: CommitNodeTooltipProps) => return (
Date: Sun, 23 Mar 2025 11:08:57 +0000 Subject: [PATCH 30/38] test(graph): started adding util for integration test and added git log styling/class tests --- packages/library/src/GitLog.spec.tsx | 91 ++++ packages/library/src/Layout.tsx | 2 + .../src/_test/data/gitLogParser.spec.ts | 46 ++ .../library/src/_test/data/gitLogParser.ts | 29 ++ packages/library/src/_test/data/sleep.txt | 472 ++++++++++++++++++ packages/library/src/_test/elements/GitLog.ts | 26 + packages/library/src/_test/elements/Table.ts | 42 ++ packages/library/src/_test/stubs.ts | 14 +- packages/library/src/modules/Table/Table.tsx | 33 +- .../Table/components/TableRow/TableRow.tsx | 16 +- .../Table/components/TableRow/types.ts | 1 + packages/library/src/types.ts | 4 +- packages/library/vite.config.ts | 1 + 13 files changed, 761 insertions(+), 16 deletions(-) create mode 100644 packages/library/src/GitLog.spec.tsx create mode 100644 packages/library/src/_test/data/gitLogParser.spec.ts create mode 100644 packages/library/src/_test/data/gitLogParser.ts create mode 100644 packages/library/src/_test/data/sleep.txt create mode 100644 packages/library/src/_test/elements/GitLog.ts create mode 100644 packages/library/src/_test/elements/Table.ts diff --git a/packages/library/src/GitLog.spec.tsx b/packages/library/src/GitLog.spec.tsx new file mode 100644 index 00000000..0cf5b33b --- /dev/null +++ b/packages/library/src/GitLog.spec.tsx @@ -0,0 +1,91 @@ +import { describe } from 'vitest' +import { render } from '@testing-library/react' +import { GitLog } from './GitLog' +import { entry } from 'test/stubs' +import { gitLog } from 'test/elements/GitLog' +import { table } from 'test/elements/Table' + +describe('GitLog', () => { + describe('Classes & Style Objects', () => { + it('should pass the given container class to the git log layout container element', () => { + render( + + ) + + const gitLogContainer = gitLog.container() + expect(gitLogContainer).toBeInTheDocument() + expect(gitLogContainer.className).toContain('styles.customContainerClass') + }) + + it('should pass the given table class to the git log table element', () => { + render( + + ) + + const gitLogTable = gitLog.table() + expect(gitLogTable).toBeInTheDocument() + expect(gitLogTable.className).toContain('styles.customLogTableClass') + }) + + it('should pass the given container style object to the git log layout container element', () => { + render( + + ) + + const gitLogContainer = gitLog.container() + expect(gitLogContainer).toBeInTheDocument() + expect(gitLogContainer?.style.background).toBe('purple') + }) + + it('should pass the given table style objects to the git log table element', () => { + render( + + ) + + const gitLogTable = gitLog.table() + expect(gitLogTable).toBeInTheDocument() + + expect(table.container()?.style.background).toBe('blueviolet') + expect(table.head()?.style.background).toBe('darkolivegreen') + expect(table.row({ row: 0 })?.style.background).toBe('lightgoldenrodyellow') + expect(table.timestampData({ row: 0 })?.style.background).toBe('mediumvioletred') + expect(table.commitMessageData({ row: 0 })?.style.background).toBe('mediumvioletred') + }) + }) +}) \ No newline at end of file diff --git a/packages/library/src/Layout.tsx b/packages/library/src/Layout.tsx index 1d2c9e65..4cb9466e 100644 --- a/packages/library/src/Layout.tsx +++ b/packages/library/src/Layout.tsx @@ -18,6 +18,8 @@ export const Layout = () => { return (
diff --git a/packages/library/src/_test/data/gitLogParser.spec.ts b/packages/library/src/_test/data/gitLogParser.spec.ts new file mode 100644 index 00000000..f70bdac8 --- /dev/null +++ b/packages/library/src/_test/data/gitLogParser.spec.ts @@ -0,0 +1,46 @@ +import { describe, expect, it } from 'vitest' +import { parseGitLogOutput } from './gitLogParser' + +describe('gitLogParser', () => { + it('parses valid git log output', () => { + const input = ` + hash:be2b8a8,parents:1352f4c,branch:refs/remotes/origin/renovate/all-minor-patch,msg:fix(deps): update all non-major dependencies,cdate:2025-03-20 02:44:38 +0000,adate:2025-03-20 02:44:38 +0000 +hash:c88f0b9,parents:786b044,branch:refs/heads/develop,msg:feat(highlights): cleaned up effect function,cdate:2025-03-07 20:42:31 +0000,adate:2025-03-07 20:42:31 +0000 + ` + + const result = parseGitLogOutput(input.trim()) + + expect(result).toEqual([ + { + hash: 'be2b8a8', + parents: ['1352f4c'], + branch: 'refs/remotes/origin/renovate/all-minor-patch', + message: 'fix(deps): update all non-major dependencies', + committerDate: '2025-03-20 02:44:38 +0000', + authorDate: '2025-03-20 02:44:38 +0000', + }, + { + hash: 'c88f0b9', + parents: ['786b044'], + branch: 'refs/heads/develop', + message: 'feat(highlights): cleaned up effect function', + committerDate: '2025-03-07 20:42:31 +0000', + authorDate: '2025-03-07 20:42:31 +0000', + } + ]) + }) + + it('returns an empty array when input is empty', () => { + expect(parseGitLogOutput('')).toEqual([]) + }) + + it('throw an error for invalid log lines', () => { + const input = ` + hash:abc123,parents:def456,branch:main,refs:HEAD,msg:Valid commit,date:2025-03-05 12:34:56 +0000 + invalid log entry + hash:def456,parents:,branch:feature,refs:,msg:Another commit,date:2025-03-04 11:22:33 +0000 + ` + + expect(() => parseGitLogOutput(input.trim())).toThrowError('Invalid commit entry data: hash:abc123,parents:def456,branch:main,refs:HEAD,msg:Valid commit,date:2025-03-05 12:34:56 +0000') + }) +}) \ No newline at end of file diff --git a/packages/library/src/_test/data/gitLogParser.ts b/packages/library/src/_test/data/gitLogParser.ts new file mode 100644 index 00000000..25c3eaca --- /dev/null +++ b/packages/library/src/_test/data/gitLogParser.ts @@ -0,0 +1,29 @@ +import { GitLogEntry } from 'types' + +export const parseGitLogOutput = (output: string): GitLogEntry[] => { + const commits = output.trim().split('\n') + const logRegex = + /^hash:(?\S+),parents:(?.*?),branch:(?\S*),msg:(?.+),cdate:(?[\d\- :+]+),adate:(?[\d\- :+]+)/ + + if (output.length === 0) { + return [] + } + + return commits + .map(commit => { + const match = commit.trim().match(logRegex) + + if (match?.groups) { + return { + hash: match.groups.hash, + parents: match.groups.parents ? match.groups.parents.split(' ') : [], + branch: match.groups.branch.trim(), + message: match.groups.message, + committerDate: match.groups.committerDate.trim(), + authorDate: match.groups.authorDate.trim(), + } + } + + throw Error(`Invalid commit entry data: ${commit}`) + }) +} \ No newline at end of file diff --git a/packages/library/src/_test/data/sleep.txt b/packages/library/src/_test/data/sleep.txt new file mode 100644 index 00000000..7e332e63 --- /dev/null +++ b/packages/library/src/_test/data/sleep.txt @@ -0,0 +1,472 @@ +hash:be2b8a8,parents:1352f4c,branch:refs/remotes/origin/renovate/all-minor-patch,msg:fix(deps): update all non-major dependencies,cdate:2025-03-20 02:44:38 +0000,adate:2025-03-20 02:44:38 +0000 +hash:c88f0b9,parents:786b044,branch:refs/heads/develop,msg:feat(highlights): cleaned up effect function,cdate:2025-03-07 20:42:31 +0000,adate:2025-03-07 20:42:31 +0000 +hash:26130ea,parents:81ce807,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@1352f4c7814aa2ae660d9bd875870608a32734d1 🚀,cdate:2025-03-05 17:30:04 +0000,adate:2025-03-05 17:30:04 +0000 +hash:d5d320b,parents:1352f4c,branch:refs/remotes/origin/renovate/major-react-monorepo,msg:fix(deps): update react monorepo to v19,cdate:2025-03-05 17:29:54 +0000,adate:2025-03-05 17:29:54 +0000 +hash:6c59bca,parents:1352f4c,branch:refs/remotes/origin/renovate/major-react-router-monorepo,msg:fix(deps): update dependency react-router-dom to v7,cdate:2025-03-05 17:29:47 +0000,adate:2025-03-05 17:29:47 +0000 +hash:1352f4c,parents:e059c28 1d594ea,branch:refs/remotes/origin/release,msg:Merge pull request #54 from TomPlum/renovate/all-minor-patch,cdate:2025-03-05 17:29:01 +0000,adate:2025-03-05 17:29:01 +0000 +hash:1d594ea,parents:e059c28,branch:refs/remotes/origin/release,msg:fix(deps): update all non-major dependencies,cdate:2025-03-05 10:55:09 +0000,adate:2025-03-05 10:55:09 +0000 +hash:786b044,parents:0776115,branch:refs/heads/develop,msg:feat(highlights): Extracted ShowcaseProgressDots component,cdate:2025-03-04 19:22:11 +0000,adate:2025-03-04 19:22:11 +0000 +hash:0776115,parents:0a0a44d,branch:refs/heads/develop,msg:feat(highlights): responsive styling improvements to wake up showcase,cdate:2025-03-04 18:54:59 +0000,adate:2025-03-04 18:54:59 +0000 +hash:0a0a44d,parents:769e569,branch:refs/heads/develop,msg:feat(highlights): added active showcase to query params,cdate:2025-03-04 18:36:14 +0000,adate:2025-03-04 18:36:14 +0000 +hash:769e569,parents:02af2b4,branch:refs/heads/develop,msg:feat(highlights): starting adding progress dots to wake up showcase,cdate:2025-03-04 18:18:59 +0000,adate:2025-03-04 18:18:59 +0000 +hash:02af2b4,parents:de2ac76,branch:refs/heads/develop,msg:feat(highlights): positioned text in wakeup showcase,cdate:2025-03-03 19:30:12 +0000,adate:2025-03-03 19:30:12 +0000 +hash:de2ac76,parents:d81f45e,branch:refs/heads/develop,msg:feat(highlights): refactored page so showcases are full viewport size and added lakeside sunrise animation,cdate:2025-03-01 19:00:19 +0000,adate:2025-03-01 19:00:19 +0000 +hash:d81f45e,parents:4a5f077,branch:refs/heads/develop,msg:feat(highlights): started calculating average wakeup times,cdate:2025-03-01 18:24:09 +0000,adate:2025-03-01 18:24:09 +0000 +hash:4a5f077,parents:33d2930,branch:refs/heads/develop,msg:feat(highlights): fixed showcase context,cdate:2025-03-01 17:21:50 +0000,adate:2025-03-01 17:21:50 +0000 +hash:33d2930,parents:6671923,branch:refs/heads/develop,msg:feat(highlights): started implementing custom showcase,cdate:2025-02-28 15:26:55 +0000,adate:2025-02-28 15:26:55 +0000 +hash:6671923,parents:a8bfc71,branch:refs/heads/develop,msg:feat(highlights): extracted LandingPageHeading.tsx component,cdate:2025-02-27 17:53:06 +0000,adate:2025-02-27 17:53:06 +0000 +hash:a8bfc71,parents:69e20aa,branch:refs/heads/develop,msg:feat(styling): added back to charts link in highlights landing page,cdate:2025-02-27 17:49:03 +0000,adate:2025-02-27 17:49:03 +0000 +hash:69e20aa,parents:ec397ea,branch:refs/heads/develop,msg:feat(styling): minor improvements to layout of highlights showcases,cdate:2025-02-26 21:10:47 +0000,adate:2025-02-26 21:10:47 +0000 +hash:ec397ea,parents:2c26dfb,branch:refs/heads/develop,msg:feat(styling): added in remaining exit animations after starting,cdate:2025-02-26 20:56:55 +0000,adate:2025-02-26 20:56:55 +0000 +hash:2c26dfb,parents:3dc9b40,branch:refs/heads/develop,msg:feat(styling): added moon and land exit animations,cdate:2025-02-26 20:45:52 +0000,adate:2025-02-26 20:45:52 +0000 +hash:3dc9b40,parents:8c8952a,branch:refs/heads/develop,msg:feat(styling): added moon loading state,cdate:2025-02-26 20:33:32 +0000,adate:2025-02-26 20:33:32 +0000 +hash:8c8952a,parents:a267aea,branch:refs/heads/develop,msg:feat(styling): added compact sleep data loading component,cdate:2025-02-26 20:25:51 +0000,adate:2025-02-26 20:25:51 +0000 +hash:a267aea,parents:9994eec,branch:refs/heads/develop,msg:feat(styling): extracted night sky scene into component,cdate:2025-02-26 19:42:48 +0000,adate:2025-02-26 19:42:48 +0000 +hash:9994eec,parents:52aa9dd,branch:refs/heads/develop,msg:feat(styling): added extra shooting star,cdate:2025-02-26 19:40:30 +0000,adate:2025-02-26 19:40:30 +0000 +hash:52aa9dd,parents:18088d2,branch:refs/heads/develop,msg:feat(styling): adjustments to moon,cdate:2025-02-26 19:37:02 +0000,adate:2025-02-26 19:37:02 +0000 +hash:18088d2,parents:0c202af,branch:refs/heads/develop,msg:feat(styling): added generated stars to background scene,cdate:2025-02-26 19:32:50 +0000,adate:2025-02-26 19:32:50 +0000 +hash:0c202af,parents:cf56b70,branch:refs/heads/develop,msg:feat(styling): making scene more responsive and full screen,cdate:2025-02-26 17:59:21 +0000,adate:2025-02-26 17:59:21 +0000 +hash:cf56b70,parents:b61aeed,branch:refs/heads/develop,msg:feat(styling): experimenting with highlights landing styling,cdate:2025-02-26 17:27:45 +0000,adate:2025-02-26 17:27:45 +0000 +hash:5a67c90,parents:e059c28,branch:refs/heads/renovate/major-react-monorepo,msg:fix(deps): update react monorepo to v19,cdate:2025-02-25 17:14:01 +0000,adate:2025-02-25 17:14:01 +0000 +hash:b61aeed,parents:2d173ca,branch:refs/heads/develop,msg:fix(styling): fixed dart sass 3.0 deprecation warnings,cdate:2025-02-25 17:11:36 +0000,adate:2025-02-25 17:11:36 +0000 +hash:81ce807,parents:f2d49cf,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@e059c28b8fa1668ec033daca1648f00a78126bc5 🚀,cdate:2025-02-25 17:09:11 +0000,adate:2025-02-25 17:09:11 +0000 +hash:2d173ca,parents:51ba1e7 e059c28,branch:refs/heads/develop,msg:Merge branch 'release' into develop,cdate:2025-02-25 17:08:31 +0000,adate:2025-02-25 17:08:31 +0000 +hash:e059c28,parents:0b78e07 867c511,branch:refs/heads/release,msg:Merge pull request #39 from TomPlum/renovate/vite-6.x,cdate:2025-02-25 17:08:06 +0000,adate:2025-02-25 17:08:06 +0000 +hash:51ba1e7,parents:675127e,branch:refs/heads/develop,msg:feat(page): playing with highlights landing page styling,cdate:2025-02-25 17:07:43 +0000,adate:2025-02-25 17:07:43 +0000 +hash:675127e,parents:017e506,branch:refs/heads/develop,msg:feat(page): moved colours, added sleeping animation,cdate:2025-02-24 19:56:47 +0000,adate:2025-02-24 19:56:47 +0000 +hash:017e506,parents:ff018dd,branch:refs/heads/develop,msg:feat(page): progress on highlights page,cdate:2025-02-24 17:48:20 +0000,adate:2025-02-24 17:48:20 +0000 +hash:ff018dd,parents:f28088d,branch:refs/heads/develop,msg:feat(page): initial pass of best session showcase content,cdate:2025-02-23 19:29:55 +0000,adate:2025-02-23 19:29:55 +0000 +hash:f28088d,parents:f7cd757,branch:refs/heads/develop,msg:feat(page): initial highlights page work for showcases,cdate:2025-02-23 19:09:41 +0000,adate:2025-02-23 19:09:41 +0000 +hash:f7cd757,parents:ea5a998,branch:refs/heads/develop,msg:chore(docs): added tsdoc to NestedProgressCircle props interface,cdate:2025-02-23 18:48:35 +0000,adate:2025-02-23 18:48:35 +0000 +hash:ea5a998,parents:efe3dd6,branch:refs/heads/develop,msg:feat(routing): added highlights page and made query param routing only for sleep page,cdate:2025-02-23 17:44:59 +0000,adate:2025-02-23 17:44:59 +0000 +hash:f2d49cf,parents:30ee0ba,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@0b78e0746d5a183a5be7879a9726815df474e857 🚀,cdate:2025-02-23 16:40:46 +0000,adate:2025-02-23 16:40:46 +0000 +hash:0b78e07,parents:7355361 efe3dd6,branch:refs/tags/v2.4.0,msg:Merge pull request #52 from TomPlum/develop,cdate:2025-02-23 16:39:50 +0000,adate:2025-02-23 16:39:50 +0000 +hash:efe3dd6,parents:d524100,branch:refs/heads/develop,msg:feat(chart): moved session highlights card,cdate:2025-02-23 16:38:25 +0000,adate:2025-02-23 16:38:25 +0000 +hash:d524100,parents:50250a9,branch:refs/heads/develop,msg:feat(chart): Re-added locale toggle as ascii checkbox,cdate:2025-02-23 16:35:33 +0000,adate:2025-02-23 16:35:33 +0000 +hash:50250a9,parents:bb950c2,branch:refs/heads/develop,msg:feat(chart): Added show highlights card toggle to controls + jp translations,cdate:2025-02-23 16:29:15 +0000,adate:2025-02-23 16:29:15 +0000 +hash:bb950c2,parents:432fd9c,branch:refs/heads/develop,msg:feat(chart): Fixed carousel theming in SessionHighlightCard.tsx,cdate:2025-02-23 16:08:30 +0000,adate:2025-02-23 16:08:30 +0000 +hash:432fd9c,parents:6115d5f 7355361,branch:refs/heads/develop,msg:Merge branch 'release' into develop,cdate:2025-02-23 15:46:54 +0000,adate:2025-02-23 15:46:54 +0000 +hash:6115d5f,parents:b45bf05,branch:refs/heads/develop,msg:feat(chart): Extracted HighlightCarouselItem component,cdate:2025-02-23 13:03:09 +0000,adate:2025-02-23 13:03:09 +0000 +hash:b45bf05,parents:6beb2d1,branch:refs/heads/develop,msg:feat(chart): Moved SessionHighlightCard to Highlights module,cdate:2025-02-23 12:56:22 +0000,adate:2025-02-23 12:56:22 +0000 +hash:6beb2d1,parents:2bc6652,branch:refs/heads/develop,msg:feat(chart): Extracted NestedProgressCircles components in new Highlights module,cdate:2025-02-23 12:54:45 +0000,adate:2025-02-23 12:54:45 +0000 +hash:2bc6652,parents:ab51db5,branch:refs/heads/develop,msg:feat(chart): Added formatDuration util and added details to highlight card,cdate:2025-02-22 23:56:31 +0000,adate:2025-02-22 23:56:31 +0000 +hash:ab51db5,parents:165b754,branch:refs/heads/develop,msg:feat(chart): added nested progress circle to session highlight,cdate:2025-02-22 23:33:27 +0000,adate:2025-02-22 23:33:27 +0000 +hash:165b754,parents:eff7491,branch:refs/heads/develop,msg:feat(chart): starting new session highlight component,cdate:2025-02-22 23:24:09 +0000,adate:2025-02-22 23:24:09 +0000 +hash:30ee0ba,parents:aa2c148,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@7355361e6e85ef1159cfe61f676044dc71d5f2fd 🚀,cdate:2025-02-22 22:48:03 +0000,adate:2025-02-22 22:48:03 +0000 +hash:7355361,parents:515eaa9 eff7491,branch:refs/tags/v2.3.1,msg:Merge pull request #51 from TomPlum/develop,cdate:2025-02-22 22:47:07 +0000,adate:2025-02-22 22:47:07 +0000 +hash:eff7491,parents:127dd9c,branch:refs/heads/develop,msg:chore(docs): updated web worker loading image for docs,cdate:2025-02-22 22:45:59 +0000,adate:2025-02-22 22:45:59 +0000 +hash:127dd9c,parents:0964b7d,branch:refs/heads/develop,msg:fix(styling): fixed positioning issue in starry background,cdate:2025-02-22 22:44:34 +0000,adate:2025-02-22 22:44:34 +0000 +hash:0964b7d,parents:f4ef8e9,branch:refs/heads/develop,msg:fix(params): date range params now default to last 2 months if they are not present on page load,cdate:2025-02-22 22:33:55 +0000,adate:2025-02-22 22:33:55 +0000 +hash:f4ef8e9,parents:5510915,branch:refs/heads/develop,msg:feat(loading): added starry background to data loading page,cdate:2025-02-22 22:11:18 +0000,adate:2025-02-22 22:11:18 +0000 +hash:aa2c148,parents:afdb263,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@88a3ca2bc032b0ddf44eff0d272abf71052fbbe5 🚀,cdate:2025-02-22 22:06:22 +0000,adate:2025-02-22 22:06:22 +0000 +hash:515eaa9,parents:88a3ca2 575887a,branch:refs/tags/v2.3.1,msg:Merge pull request #49 from TomPlum/renovate/major-eslint-stylistic-monorepo,cdate:2025-02-22 22:05:44 +0000,adate:2025-02-22 22:05:44 +0000 +hash:88a3ca2,parents:fd93615 932be3a,branch:refs/tags/v2.3.1,msg:Merge pull request #48 from TomPlum/renovate/all-minor-patch,cdate:2025-02-22 22:05:23 +0000,adate:2025-02-22 22:05:23 +0000 +hash:fd93615,parents:3d4d017 f687c53,branch:refs/tags/v2.3.1,msg:Merge pull request #50 from TomPlum/renovate/globals-16.x,cdate:2025-02-22 22:05:07 +0000,adate:2025-02-22 22:05:07 +0000 +hash:5510915,parents:202237c,branch:refs/heads/develop,msg:feat(page): added back link on improvements page,cdate:2025-02-22 21:52:51 +0000,adate:2025-02-22 21:52:51 +0000 +hash:202237c,parents:4be118d,branch:refs/heads/develop,msg:feat(page): rough first draft of improvements page content,cdate:2025-02-22 21:51:17 +0000,adate:2025-02-22 21:51:17 +0000 +hash:f687c53,parents:3d4d017,branch:refs/tags/v2.3.1,msg:chore(deps): update dependency globals to v16,cdate:2025-02-22 07:05:41 +0000,adate:2025-02-22 07:05:41 +0000 +hash:575887a,parents:3d4d017,branch:refs/tags/v2.3.1,msg:chore(deps): update dependency @stylistic/eslint-plugin to v4,cdate:2025-02-22 02:47:35 +0000,adate:2025-02-22 02:47:35 +0000 +hash:932be3a,parents:3d4d017,branch:refs/tags/v2.3.1,msg:fix(deps): update all non-major dependencies,cdate:2025-02-22 02:47:25 +0000,adate:2025-02-22 02:47:25 +0000 +hash:4be118d,parents:a338942,branch:refs/heads/develop,msg:chore(docs): added missing ToC entry in readme,cdate:2025-02-19 21:06:34 +0000,adate:2025-02-19 21:06:34 +0000 +hash:a338942,parents:f17afd7,branch:refs/heads/develop,msg:chore(docs): more docs additions in readme,cdate:2025-02-16 17:26:41 +0000,adate:2025-02-16 17:26:41 +0000 +hash:f17afd7,parents:3d4d017,branch:refs/heads/develop,msg:chore(docs): updated readme images and docs,cdate:2025-02-16 17:20:01 +0000,adate:2025-02-16 17:20:01 +0000 +hash:afdb263,parents:a829a48,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@3d4d017bf91addfc357a9bfcc88ccfc4eceae78c 🚀,cdate:2025-02-16 15:23:06 +0000,adate:2025-02-16 15:23:06 +0000 +hash:3d4d017,parents:5525ed5 f157195,branch:refs/tags/v2.3.0,msg:Merge pull request #47 from TomPlum/renovate/all-minor-patch,cdate:2025-02-16 15:22:11 +0000,adate:2025-02-16 15:22:11 +0000 +hash:867c511,parents:5525ed5,branch:refs/heads/release,msg:chore(deps): update dependency vite to v6,cdate:2025-02-16 15:21:55 +0000,adate:2025-02-16 15:21:55 +0000 +hash:a829a48,parents:8ddccd2,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@5525ed5d3a90dca5f4930426d8f6367f67587575 🚀,cdate:2025-02-16 15:21:20 +0000,adate:2025-02-16 15:21:20 +0000 +hash:f157195,parents:5525ed5,branch:refs/tags/v2.3.0,msg:fix(deps): update all non-major dependencies,cdate:2025-02-16 15:21:05 +0000,adate:2025-02-16 15:21:05 +0000 +hash:5525ed5,parents:5862498 081b2d3,branch:refs/tags/v2.3.0,msg:Merge pull request #38 from TomPlum/develop,cdate:2025-02-16 15:20:20 +0000,adate:2025-02-16 15:20:20 +0000 +hash:081b2d3,parents:a10ab03,branch:refs/tags/v2.3.0,msg:chore(data): added latest pillow data 16/02/2025,cdate:2025-02-16 15:16:44 +0000,adate:2025-02-16 15:16:44 +0000 +hash:a10ab03,parents:55ec23e 5862498,branch:refs/tags/v2.3.0,msg:Merge branch 'release' into develop,cdate:2025-02-16 15:02:17 +0000,adate:2025-02-16 15:02:17 +0000 +hash:8ddccd2,parents:5db47c6,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@58624987661cae7503ac110e7ec054e47e62cd2c 🚀,cdate:2025-02-16 15:01:01 +0000,adate:2025-02-16 15:01:01 +0000 +hash:5862498,parents:27d7e9e eeeb1f2,branch:refs/tags/v2.3.0,msg:Merge pull request #46 from TomPlum/renovate/all-minor-patch,cdate:2025-02-16 15:00:05 +0000,adate:2025-02-16 15:00:05 +0000 +hash:eeeb1f2,parents:27d7e9e,branch:refs/tags/v2.3.0,msg:fix(deps): update all non-major dependencies,cdate:2025-02-14 01:53:30 +0000,adate:2025-02-14 01:53:30 +0000 +hash:55ec23e,parents:75fea53,branch:refs/tags/v2.3.0,msg:fix(deps): npm install to fix lockfile issues,cdate:2025-02-01 15:22:07 +0000,adate:2025-02-01 15:22:07 +0000 +hash:75fea53,parents:e11674d 27d7e9e,branch:refs/tags/v2.3.0,msg:Merge branch 'refs/heads/release' into develop,cdate:2025-02-01 15:21:44 +0000,adate:2025-02-01 15:21:44 +0000 +hash:27d7e9e,parents:338b505 0577e9d,branch:refs/tags/v2.3.0,msg:Merge pull request #45 from TomPlum/renovate/major-eslint-stylistic-monorepo,cdate:2025-02-01 15:21:11 +0000,adate:2025-02-01 15:21:11 +0000 +hash:338b505,parents:988bf8d ca136bf,branch:refs/tags/v2.3.0,msg:Merge pull request #43 from TomPlum/renovate/jsdom-26.x,cdate:2025-02-01 15:20:55 +0000,adate:2025-02-01 15:20:55 +0000 +hash:988bf8d,parents:b35728b 648f6e9,branch:refs/tags/v2.3.0,msg:Merge pull request #44 from TomPlum/renovate/major-vitest-monorepo,cdate:2025-02-01 15:20:45 +0000,adate:2025-02-01 15:20:45 +0000 +hash:e11674d,parents:72a5dbb b35728b,branch:refs/tags/v2.3.0,msg:Merge branch 'release' into develop,cdate:2025-02-01 15:17:11 +0000,adate:2025-02-01 15:17:11 +0000 +hash:5db47c6,parents:d26bcc7,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@b35728b6da106abb0f2c82c143ae0b4a6e31f668 🚀,cdate:2025-02-01 15:16:35 +0000,adate:2025-02-01 15:16:35 +0000 +hash:0577e9d,parents:b35728b,branch:refs/tags/v2.3.0,msg:chore(deps): update dependency @stylistic/eslint-plugin to v3,cdate:2025-02-01 15:16:12 +0000,adate:2025-02-01 15:16:12 +0000 +hash:b35728b,parents:09e615d 0f5ae74,branch:refs/tags/v2.3.0,msg:Merge pull request #42 from TomPlum/renovate/all-minor-patch,cdate:2025-02-01 15:15:42 +0000,adate:2025-02-01 15:15:42 +0000 +hash:0f5ae74,parents:09e615d,branch:refs/tags/v2.3.0,msg:fix(deps): update all non-major dependencies,cdate:2025-01-31 21:51:43 +0000,adate:2025-01-31 21:51:43 +0000 +hash:648f6e9,parents:09e615d,branch:refs/tags/v2.3.0,msg:chore(deps): update vitest monorepo to v3,cdate:2025-01-19 09:39:08 +0000,adate:2025-01-19 09:39:08 +0000 +hash:ca136bf,parents:09e615d,branch:refs/tags/v2.3.0,msg:chore(deps): update dependency jsdom to v26,cdate:2025-01-11 01:17:46 +0000,adate:2025-01-11 01:17:46 +0000 +hash:09e615d,parents:b7ec825 2b85a9e,branch:refs/tags/v2.3.0,msg:Merge pull request #41 from TomPlum/renovate/react-error-boundary-5.x,cdate:2025-01-09 20:17:13 +0000,adate:2025-01-09 20:17:13 +0000 +hash:72a5dbb,parents:5281010,branch:refs/tags/v2.3.0,msg:fix(deps): removed redundant package-lock.json entries,cdate:2025-01-09 20:16:59 +0000,adate:2025-01-09 20:16:59 +0000 +hash:5281010,parents:000b3aa b7ec825,branch:refs/tags/v2.3.0,msg:Merge branch 'release' into develop,cdate:2025-01-09 20:15:57 +0000,adate:2025-01-09 20:15:57 +0000 +hash:d26bcc7,parents:74885fc,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@b7ec8259f761ea82faf75ed4da7502589769e1a7 🚀,cdate:2025-01-09 20:15:47 +0000,adate:2025-01-09 20:15:47 +0000 +hash:b7ec825,parents:810a868 3d680fd,branch:refs/tags/v2.3.0,msg:Merge pull request #35 from TomPlum/renovate/all-minor-patch,cdate:2025-01-09 20:14:48 +0000,adate:2025-01-09 20:14:48 +0000 +hash:3d680fd,parents:810a868,branch:refs/tags/v2.3.0,msg:fix(deps): update all non-major dependencies,cdate:2025-01-08 22:25:06 +0000,adate:2025-01-08 22:25:06 +0000 +hash:2b85a9e,parents:810a868,branch:refs/tags/v2.3.0,msg:fix(deps): update dependency react-error-boundary to v5,cdate:2024-12-21 21:55:38 +0000,adate:2024-12-21 21:55:38 +0000 +hash:000b3aa,parents:45dbbde,branch:refs/tags/v2.3.0,msg:fix(graph): filtered out metric nodes that have a value of 0,cdate:2024-11-28 19:10:41 +0000,adate:2024-11-28 19:10:41 +0000 +hash:45dbbde,parents:2c60633,branch:refs/tags/v2.3.0,msg:feat(graph): minor styling consistency improvements to the ascii inputs,cdate:2024-11-28 19:08:06 +0000,adate:2024-11-28 19:08:06 +0000 +hash:2c60633,parents:7f60983,branch:refs/tags/v2.3.0,msg:feat(graph): moved stats ui to bottom right and updated ascii checkbox checked mark,cdate:2024-11-28 18:50:33 +0000,adate:2024-11-28 18:50:33 +0000 +hash:7f60983,parents:cebb57d,branch:refs/tags/v2.3.0,msg:feat(graph): reduced scene cooldown time to stop node drift and improve performance on first render,cdate:2024-11-28 18:26:08 +0000,adate:2024-11-28 18:26:08 +0000 +hash:cebb57d,parents:33c38c5,branch:refs/tags/v2.3.0,msg:chore(deps): removed react-force-graph and replaced with 3d standalone package and bumped three back to latest,cdate:2024-11-28 17:57:17 +0000,adate:2024-11-28 17:57:17 +0000 +hash:33c38c5,parents:f19e207,branch:refs/tags/v2.3.0,msg:chore(graph): removed redundant import file extensions,cdate:2024-11-28 16:27:32 +0000,adate:2024-11-28 16:27:32 +0000 +hash:f19e207,parents:b9bc1dc,branch:refs/tags/v2.3.0,msg:chore(graph): renamed three scene folder to match module name,cdate:2024-11-28 16:26:50 +0000,adate:2024-11-28 16:26:50 +0000 +hash:b9bc1dc,parents:9c65959,branch:refs/tags/v2.3.0,msg:feat(graph): added root node link directional particles and arrows to indicate the passage of time,cdate:2024-11-28 16:24:07 +0000,adate:2024-11-28 16:24:07 +0000 +hash:9c65959,parents:a172219,branch:refs/tags/v2.3.0,msg:feat(graph): fixed ref typing and reset camera loading state,cdate:2024-11-28 11:57:08 +0000,adate:2024-11-28 11:57:08 +0000 +hash:a172219,parents:a3af060,branch:refs/tags/v2.3.0,msg:feat(graph): renamed and structured three chart component,cdate:2024-11-28 11:37:49 +0000,adate:2024-11-28 11:37:49 +0000 +hash:a3af060,parents:363c60d,branch:refs/tags/v2.3.0,msg:feat(graph): reworked three scene component structure for better use of context + added ascii button,cdate:2024-11-28 11:35:52 +0000,adate:2024-11-28 11:35:52 +0000 +hash:363c60d,parents:cc0598b,branch:refs/tags/v2.3.0,msg:feat(graph): added draggable nodes button and dynamic node sizes based on percentage,cdate:2024-11-27 17:24:13 +0000,adate:2024-11-27 17:24:13 +0000 +hash:cc0598b,parents:6e89c11,branch:refs/tags/v2.3.0,msg:feat(graph): added new three context and toggle for the scene,cdate:2024-11-27 16:50:40 +0000,adate:2024-11-27 16:50:40 +0000 +hash:6e89c11,parents:6904884,branch:refs/tags/v2.3.0,msg:feat(graph): started adding controls menu for 3d graph,cdate:2024-11-27 16:31:13 +0000,adate:2024-11-27 16:31:13 +0000 +hash:6904884,parents:94b945f,branch:refs/tags/v2.3.0,msg:feat(graph): minor styling improvements on ascii checkbox and turned checked 'x' to 'o',cdate:2024-11-27 16:30:28 +0000,adate:2024-11-27 16:30:28 +0000 +hash:94b945f,parents:115846d,branch:refs/tags/v2.3.0,msg:feat(graph): more experimentation with 3d force graph,cdate:2024-11-27 16:17:49 +0000,adate:2024-11-27 16:17:49 +0000 +hash:115846d,parents:71869c4,branch:refs/tags/v2.3.0,msg:feat(graph): added fps and network stats counter to 3d graph,cdate:2024-11-27 10:35:33 +0000,adate:2024-11-27 10:35:33 +0000 +hash:71869c4,parents:a3476a8,branch:refs/tags/v2.3.0,msg:fix(config): vite config css preproccessor options now use modern-compiler to fix dart scss warnings,cdate:2024-11-27 09:10:10 +0000,adate:2024-11-27 09:10:10 +0000 +hash:a3476a8,parents:deba6b5,branch:refs/tags/v2.3.0,msg:fix(graph): fixed is3D default query param value and line chart missing opacity keyframes,cdate:2024-11-27 09:09:45 +0000,adate:2024-11-27 09:09:45 +0000 +hash:deba6b5,parents:d8e279c,branch:refs/tags/v2.3.0,msg:feat(graph): added experimental 3d button and re-instated 3d graph behind it,cdate:2024-11-26 16:53:18 +0000,adate:2024-11-26 16:53:18 +0000 +hash:74885fc,parents:ecb5b57,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@810a868f1f691c458fa0354a5122d8fe166d84ed 🚀,cdate:2024-11-26 14:11:47 +0000,adate:2024-11-26 14:11:47 +0000 +hash:810a868,parents:c31b3a8 3a78717,branch:refs/tags/v2.2.0,msg:Merge pull request #37 from TomPlum/develop,cdate:2024-11-26 14:10:47 +0000,adate:2024-11-26 14:10:47 +0000 +hash:d8e279c,parents:3a78717,branch:refs/tags/v2.3.0,msg:chore(graph): removed locale toggle from graph controls ui,cdate:2024-11-26 13:46:26 +0000,adate:2024-11-26 13:46:26 +0000 +hash:3a78717,parents:d89f085,branch:refs/tags/v2.2.0,msg:fix(graph): active session info colour gradients now support all new chart view types,cdate:2024-11-26 13:44:29 +0000,adate:2024-11-26 13:44:29 +0000 +hash:d89f085,parents:5f7da3f,branch:refs/tags/v2.2.0,msg:chore(graph): renamed stackedMetrics to activeMetrics in chart config context,cdate:2024-11-26 13:43:23 +0000,adate:2024-11-26 13:43:23 +0000 +hash:5f7da3f,parents:7ca3b25,branch:refs/tags/v2.2.0,msg:fix(controls): made chart view selector button small to match the other controls,cdate:2024-11-26 11:00:51 +0000,adate:2024-11-26 11:00:51 +0000 +hash:7ca3b25,parents:fc6a3e8,branch:refs/tags/v2.2.0,msg:fix(graph): rendered key-less line when in single metric view to stop re-mounting,cdate:2024-11-26 10:57:41 +0000,adate:2024-11-26 10:57:41 +0000 +hash:fc6a3e8,parents:c1b3995,branch:refs/tags/v2.2.0,msg:fix(graph): chart view selection now correctly updates stacked metrics param,cdate:2024-11-26 10:35:05 +0000,adate:2024-11-26 10:35:05 +0000 +hash:c1b3995,parents:f61711f,branch:refs/tags/v2.2.0,msg:feat(graph): refactored chart metric selection to support all view types,cdate:2024-11-26 10:31:14 +0000,adate:2024-11-26 10:31:14 +0000 +hash:f61711f,parents:62e3f80,branch:refs/tags/v2.2.0,msg:chore(graph): renamed StackedGraphPlaceholder to ChartMetricSelection,cdate:2024-11-26 10:06:44 +0000,adate:2024-11-26 10:06:44 +0000 +hash:62e3f80,parents:17d9d64,branch:refs/tags/v2.2.0,msg:feat(graph): fixed chart view selector for single metric,cdate:2024-11-26 10:05:35 +0000,adate:2024-11-26 10:05:35 +0000 +hash:17d9d64,parents:b516162,branch:refs/tags/v2.2.0,msg:feat(graph): added graph metric selector in multiple metrics view when none are selected,cdate:2024-11-26 09:57:09 +0000,adate:2024-11-26 09:57:09 +0000 +hash:b516162,parents:33b5d79,branch:refs/tags/v2.2.0,msg:feat(graph): started refactor for adding multiple metric lines on the chart at once,cdate:2024-11-25 21:16:17 +0000,adate:2024-11-25 21:16:17 +0000 +hash:33b5d79,parents:97b060f,branch:refs/tags/v2.2.0,msg:chore(graph): renamed line chart component to be consistent,cdate:2024-11-25 20:48:51 +0000,adate:2024-11-25 20:48:51 +0000 +hash:97b060f,parents:e6318eb,branch:refs/tags/v2.2.0,msg:feat(graph): refactored stacked view toggle into a chart view selector dropdown,cdate:2024-11-25 19:14:05 +0000,adate:2024-11-25 19:14:05 +0000 +hash:ecb5b57,parents:60698cc,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@c31b3a86b361a8a207d838498ce16125a5c93b54 🚀,cdate:2024-11-25 18:35:11 +0000,adate:2024-11-25 18:35:11 +0000 +hash:c31b3a8,parents:0b903cc e6318eb,branch:refs/tags/v2.1.1,msg:Merge pull request #36 from TomPlum/develop,cdate:2024-11-25 18:34:13 +0000,adate:2024-11-25 18:34:13 +0000 +hash:e6318eb,parents:2d1025f,branch:refs/tags/v2.2.0,msg:test(data): fixed bad file path reference which was breaking a test mock,cdate:2024-11-25 18:31:19 +0000,adate:2024-11-25 18:31:19 +0000 +hash:2d1025f,parents:1321e4d,branch:refs/tags/v2.2.0,msg:chore(data): added tsdoc and supporting comments to useSleepStageData,cdate:2024-11-25 16:03:20 +0000,adate:2024-11-25 16:03:20 +0000 +hash:1321e4d,parents:71a1a7e,branch:refs/tags/v2.2.0,msg:fix(data): filtered sleep stage instance data by their unique IDs to remove duplicates that were breaking the chart,cdate:2024-11-25 15:55:53 +0000,adate:2024-11-25 15:55:53 +0000 +hash:71a1a7e,parents:97a941a,branch:refs/tags/v2.2.0,msg:feat(graph): added basic styling to error boundary fallback page,cdate:2024-11-25 15:49:06 +0000,adate:2024-11-25 15:49:06 +0000 +hash:97a941a,parents:0d85838,branch:refs/tags/v2.2.0,msg:feat(graph): reworked metric checkbox styling, no longer uses antd,cdate:2024-11-25 15:48:52 +0000,adate:2024-11-25 15:48:52 +0000 +hash:0d85838,parents:cf8e018,branch:refs/tags/v2.2.0,msg:feat(data): added japanese translations for the web worker statuses,cdate:2024-11-25 15:21:04 +0000,adate:2024-11-25 15:21:04 +0000 +hash:cf8e018,parents:5e7f6f8,branch:refs/tags/v2.2.0,msg:feat(graph): added error boundary around application,cdate:2024-11-25 15:17:48 +0000,adate:2024-11-25 15:17:48 +0000 +hash:5e7f6f8,parents:5a0d8f6,branch:refs/tags/v2.2.0,msg:feat(graph): added sound toggle to session info,cdate:2024-11-24 17:38:11 +0000,adate:2024-11-24 17:38:11 +0000 +hash:5a0d8f6,parents:e42905d,branch:refs/tags/v2.2.0,msg:fix(context): inverted context dependencies to fix date selection bug,cdate:2024-11-24 17:20:40 +0000,adate:2024-11-24 17:20:40 +0000 +hash:e42905d,parents:66a83c0,branch:refs/tags/v2.2.0,msg:feat(graph): added sleep stage pie chart tooltip,cdate:2024-11-24 17:10:58 +0000,adate:2024-11-24 17:10:58 +0000 +hash:66a83c0,parents:9e9389e,branch:refs/tags/v2.2.0,msg:fix(data): added web worker terminate call after done event received,cdate:2024-11-24 16:26:24 +0000,adate:2024-11-24 16:26:24 +0000 +hash:9e9389e,parents:8e241d2,branch:refs/tags/v2.2.0,msg:chore(context): split chart config context from sleep context,cdate:2024-11-24 16:26:03 +0000,adate:2024-11-24 16:26:03 +0000 +hash:8e241d2,parents:b7a1cc8,branch:refs/tags/v2.2.0,msg:chore(housekeeping): moved sleep context files into its own subdirectory,cdate:2024-11-24 10:30:47 +0000,adate:2024-11-24 10:30:47 +0000 +hash:b7a1cc8,parents:0143d04,branch:refs/tags/v2.2.0,msg:chore(housekeeping): renamed some components for consistency,cdate:2024-11-24 10:27:26 +0000,adate:2024-11-24 10:27:26 +0000 +hash:0143d04,parents:25f597f,branch:refs/tags/v2.2.0,msg:fix(housekeeping): fixed bad translations string after folder refactor,cdate:2024-11-23 22:48:51 +0000,adate:2024-11-23 22:48:51 +0000 +hash:25f597f,parents:8e4f92b,branch:refs/tags/v2.2.0,msg:chore(housekeeping): major folder structure and module rework,cdate:2024-11-23 22:41:41 +0000,adate:2024-11-23 22:41:41 +0000 +hash:8e4f92b,parents:47d542c,branch:refs/tags/v2.2.0,msg:feat(graph): removed active dot from sleep stage areas,cdate:2024-11-23 22:26:38 +0000,adate:2024-11-23 22:26:38 +0000 +hash:47d542c,parents:9248e1f,branch:refs/tags/v2.2.0,msg:feat(graph): added stage instance duration to graph tooltip,cdate:2024-11-23 22:24:15 +0000,adate:2024-11-23 22:24:15 +0000 +hash:9248e1f,parents:38190b2,branch:refs/tags/v2.2.0,msg:chore(graph): added custom interface for sleep session graph y-axis meta,cdate:2024-11-23 22:07:08 +0000,adate:2024-11-23 22:07:08 +0000 +hash:38190b2,parents:f8ddbd4,branch:refs/tags/v2.2.0,msg:chore(deps): upgraded i18next to major version 24,cdate:2024-11-23 19:39:33 +0000,adate:2024-11-23 19:39:33 +0000 +hash:60698cc,parents:05bec69,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@0b903cc93b1fd0fed264ae1f4d746f1414235fc9 🚀,cdate:2024-11-23 19:38:24 +0000,adate:2024-11-23 19:38:24 +0000 +hash:f8ddbd4,parents:4ebf726 0b903cc,branch:refs/tags/v2.2.0,msg:Merge branch 'release' into develop,cdate:2024-11-23 19:37:44 +0000,adate:2024-11-23 19:37:44 +0000 +hash:0b903cc,parents:6e3df33 dc8936d,branch:refs/tags/v2.1.1,msg:Merge pull request #32 from TomPlum/renovate/all-minor-patch,cdate:2024-11-23 19:37:29 +0000,adate:2024-11-23 19:37:29 +0000 +hash:4ebf726,parents:9857380,branch:refs/tags/v2.2.0,msg:feat(graph): added close button to selected session display,cdate:2024-11-23 19:35:46 +0000,adate:2024-11-23 19:35:46 +0000 +hash:9857380,parents:acd7649,branch:refs/tags/v2.2.0,msg:chore(graph): improved styling in SleepSessionTooltip.module.scss for labels and values,cdate:2024-11-23 19:30:44 +0000,adate:2024-11-23 19:30:44 +0000 +hash:acd7649,parents:7723e57,branch:refs/tags/v2.2.0,msg:chore(graph): extracted SleepSessionBreakdownInfo.tsx component,cdate:2024-11-23 19:29:30 +0000,adate:2024-11-23 19:29:30 +0000 +hash:7723e57,parents:ff5f173,branch:refs/tags/v2.2.0,msg:feat(graph): sleep stage graph x-ticks are now 30 minute intervals,cdate:2024-11-23 19:24:31 +0000,adate:2024-11-23 19:24:31 +0000 +hash:ff5f173,parents:b754d54,branch:refs/tags/v2.2.0,msg:chore(graph): moved stage transition data to hook and disabled area animations,cdate:2024-11-23 19:21:55 +0000,adate:2024-11-23 19:21:55 +0000 +hash:b754d54,parents:ea79846,branch:refs/tags/v2.2.0,msg:feat(graph): sleep stage graph tooltip now shows current stage and time,cdate:2024-11-23 19:04:33 +0000,adate:2024-11-23 19:04:33 +0000 +hash:ea79846,parents:478a361,branch:refs/tags/v2.2.0,msg:test(graph): added unit test suite for generateTicks,cdate:2024-11-23 15:11:32 +0000,adate:2024-11-23 15:11:32 +0000 +hash:478a361,parents:9d21764,branch:refs/tags/v2.2.0,msg:test(graph): added unit test suite for getSleepStageMetricYValue,cdate:2024-11-23 15:07:03 +0000,adate:2024-11-23 15:07:03 +0000 +hash:9d21764,parents:be596e4,branch:refs/tags/v2.2.0,msg:chore(graph): extracted useSleepStagesAreas hook from breakdown graph,cdate:2024-11-23 15:02:43 +0000,adate:2024-11-23 15:02:43 +0000 +hash:be596e4,parents:6ef3091,branch:refs/tags/v2.2.0,msg:feat(graph): sleep stage areas now generate minute granular points along their edges,cdate:2024-11-23 14:25:55 +0000,adate:2024-11-23 14:25:55 +0000 +hash:dc8936d,parents:6e3df33,branch:refs/tags/v2.1.1,msg:chore(deps): update all non-major dependencies,cdate:2024-11-23 04:50:20 +0000,adate:2024-11-23 04:50:20 +0000 +hash:6ef3091,parents:f60cdc8,branch:refs/tags/v2.2.0,msg:feat(graph): refactored sleep stage graph to use real areas instead of reference ones,cdate:2024-11-22 19:56:50 +0000,adate:2024-11-22 19:56:50 +0000 +hash:f60cdc8,parents:b1c9c9b,branch:refs/tags/v2.2.0,msg:feat(graph): extracted useSleepStageData hook from breakdown graph component,cdate:2024-11-22 16:46:06 +0000,adate:2024-11-22 16:46:06 +0000 +hash:05bec69,parents:0c28eb6,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@6e3df33a8b0bc47270c2cf0e2f45aaa9afe17eaf 🚀,cdate:2024-11-21 19:55:10 +0000,adate:2024-11-21 19:55:10 +0000 +hash:6e3df33,parents:f396ce1 b1c9c9b,branch:refs/tags/v2.1.0,msg:Merge pull request #31 from TomPlum/develop,cdate:2024-11-21 19:54:17 +0000,adate:2024-11-21 19:54:17 +0000 +hash:b1c9c9b,parents:db3687b db3c4f9,branch:refs/tags/v2.2.0,msg:Merge pull request #30 from TomPlum/improve-stage-chart,cdate:2024-11-21 19:51:52 +0000,adate:2024-11-21 19:51:52 +0000 +hash:db3c4f9,parents:b4e9d3b,branch:refs/heads/improve-stage-chart,msg:feat(graph): improved stage graph x-domain,cdate:2024-11-21 19:50:20 +0000,adate:2024-11-21 19:50:20 +0000 +hash:b4e9d3b,parents:5b96a51,branch:refs/heads/improve-stage-chart,msg:feat(graph): fixed stage breakdown graph y-domain and ticks,cdate:2024-11-21 19:41:09 +0000,adate:2024-11-21 19:41:09 +0000 +hash:5b96a51,parents:d89c2c1,branch:refs/heads/improve-stage-chart,msg:feat(graph): added in reparation code to the sleep stage graph data,cdate:2024-11-21 19:03:51 +0000,adate:2024-11-21 19:03:51 +0000 +hash:d89c2c1,parents:ced9837,branch:refs/heads/improve-stage-chart,msg:feat(graph): corrected stage transition line x-ordinates,cdate:2024-11-20 20:58:52 +0000,adate:2024-11-20 20:58:52 +0000 +hash:ced9837,parents:9b4a1b5,branch:refs/heads/improve-stage-chart,msg:feat(graph): switched sleep stage scatter to reference areas,cdate:2024-11-20 18:45:26 +0000,adate:2024-11-20 18:45:26 +0000 +hash:9b4a1b5,parents:1d21e76,branch:refs/heads/improve-stage-chart,msg:feat(graph): fixed breakdown graph stage connecting lines,cdate:2024-11-20 14:59:16 +0000,adate:2024-11-20 14:59:16 +0000 +hash:1d21e76,parents:76eb4f3,branch:refs/heads/improve-stage-chart,msg:feat(graph): fixed sorting of stage data in breakdown graph,cdate:2024-11-20 14:44:03 +0000,adate:2024-11-20 14:44:03 +0000 +hash:76eb4f3,parents:db3687b,branch:refs/heads/improve-stage-chart,msg:feat(graph): starting refactoring breakdown chart,cdate:2024-11-19 20:53:45 +0000,adate:2024-11-19 20:53:45 +0000 +hash:db3687b,parents:a18a5c4,branch:refs/tags/v2.2.0,msg:feat(graph): line chart x-axis tick now changes format for small ranges,cdate:2024-11-19 17:16:54 +0000,adate:2024-11-19 17:16:54 +0000 +hash:a18a5c4,parents:de17621 f396ce1,branch:refs/tags/v2.2.0,msg:Merge branch 'release' into develop,cdate:2024-11-19 17:09:14 +0000,adate:2024-11-19 17:09:14 +0000 +hash:f396ce1,parents:8eda2d7 5752a89,branch:refs/tags/v2.1.0,msg:Merge pull request #26 from TomPlum/renovate/all-minor-patch,cdate:2024-11-19 17:08:58 +0000,adate:2024-11-19 17:08:58 +0000 +hash:de17621,parents:b0f2ce3,branch:refs/tags/v2.2.0,msg:test(data): fixed failing test for useLinearRegression.spec.ts,cdate:2024-11-19 17:08:30 +0000,adate:2024-11-19 17:08:30 +0000 +hash:5752a89,parents:8eda2d7,branch:refs/tags/v2.1.0,msg:chore(deps): update all non-major dependencies,cdate:2024-11-19 14:00:17 +0000,adate:2024-11-19 14:00:17 +0000 +hash:b0f2ce3,parents:dad2e46,branch:refs/tags/v2.2.0,msg:feat(graph): added custom sleep stage tooltip and extracted display name util,cdate:2024-11-18 17:35:25 +0000,adate:2024-11-18 17:35:25 +0000 +hash:dad2e46,parents:3c495cc,branch:refs/tags/v2.2.0,msg:chore(data): updated docs regarding Apples Cocoa Datetime API,cdate:2024-11-18 17:06:00 +0000,adate:2024-11-18 17:06:00 +0000 +hash:3c495cc,parents:7d91ff0,branch:refs/tags/v2.2.0,msg:feat(graph): extracted legend item component and updated styles,cdate:2024-11-17 19:12:19 +0000,adate:2024-11-17 19:12:19 +0000 +hash:7d91ff0,parents:4be777a,branch:refs/tags/v2.2.0,msg:feat(graph): added duration in sleep session info,cdate:2024-11-17 19:05:12 +0000,adate:2024-11-17 19:05:12 +0000 +hash:4be777a,parents:0cf76da,branch:refs/tags/v2.2.0,msg:feat(graph): added endTime to graph data and mapped date range to session info,cdate:2024-11-17 18:22:47 +0000,adate:2024-11-17 18:22:47 +0000 +hash:0cf76da,parents:954670c,branch:refs/tags/v2.2.0,msg:chore(graph): refactored selected session state management (hoisted to context),cdate:2024-11-17 18:06:42 +0000,adate:2024-11-17 18:06:42 +0000 +hash:0c28eb6,parents:1482fb7,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@8eda2d7e39053ecf13ee4bd6ce82c4821f3e7ed4 🚀,cdate:2024-11-17 17:33:57 +0000,adate:2024-11-17 17:33:57 +0000 +hash:8eda2d7,parents:64ae166 954670c,branch:refs/tags/v2.1.0,msg:Merge pull request #29 from TomPlum/develop,cdate:2024-11-17 17:33:07 +0000,adate:2024-11-17 17:33:07 +0000 +hash:954670c,parents:419257d,branch:refs/tags/v2.2.0,msg:fix(ci): made dates in useLinearRegression.spec.ts UTC for CI,cdate:2024-11-17 17:30:54 +0000,adate:2024-11-17 17:30:54 +0000 +hash:419257d,parents:52dfc3f,branch:refs/tags/v2.2.0,msg:debug(ci): added date check in develop workflow to check TZ,cdate:2024-11-17 17:26:00 +0000,adate:2024-11-17 17:26:00 +0000 +hash:52dfc3f,parents:e7a2380,branch:refs/tags/v2.2.0,msg:test(data): used dayjs utc in useLinearRegression to try and fix ci tests,cdate:2024-11-17 17:20:05 +0000,adate:2024-11-17 17:20:05 +0000 +hash:e7a2380,parents:d31697d,branch:refs/tags/v2.2.0,msg:feat(graph): extracted useGraphHeight hook and used in placeholder component too,cdate:2024-11-17 17:19:28 +0000,adate:2024-11-17 17:19:28 +0000 +hash:d31697d,parents:8a68890,branch:refs/tags/v2.2.0,msg:fix(graph): tweaked line chart graph height when in stacked view with a selected session,cdate:2024-11-17 17:11:47 +0000,adate:2024-11-17 17:11:47 +0000 +hash:8a68890,parents:df5f451,branch:refs/tags/v2.2.0,msg:feat(ci): set UTC timezone in develop workflow,cdate:2024-11-17 16:58:58 +0000,adate:2024-11-17 16:58:58 +0000 +hash:df5f451,parents:7308bc3,branch:refs/tags/v2.2.0,msg:feat(ci): added new develop workflow for building/testing on PRs,cdate:2024-11-17 16:57:27 +0000,adate:2024-11-17 16:57:27 +0000 +hash:7308bc3,parents:310412c,branch:refs/tags/v2.2.0,msg:fix(ci): added UTC timezone to release workflow config,cdate:2024-11-17 16:53:28 +0000,adate:2024-11-17 16:53:28 +0000 +hash:64ae166,parents:c6a41eb 310412c,branch:refs/tags/v2.1.0,msg:Merge pull request #28 from TomPlum/develop,cdate:2024-11-17 16:48:29 +0000,adate:2024-11-17 16:48:29 +0000 +hash:310412c,parents:0f637b2,branch:refs/tags/v2.2.0,msg:feat(ci): added unit tests to release workflow,cdate:2024-11-17 16:48:01 +0000,adate:2024-11-17 16:48:01 +0000 +hash:0f637b2,parents:6aa8dab,branch:refs/tags/v2.2.0,msg:test(data): fixed failing tests and added test:ci script,cdate:2024-11-17 16:47:10 +0000,adate:2024-11-17 16:47:10 +0000 +hash:6aa8dab,parents:0237445,branch:refs/tags/v2.2.0,msg:fix(data): moved env util into sub-dir to fix build issue,cdate:2024-11-17 16:44:09 +0000,adate:2024-11-17 16:44:09 +0000 +hash:c6a41eb,parents:d52b826 0237445,branch:refs/tags/v2.0.0,msg:Merge pull request #27 from TomPlum/develop,cdate:2024-11-17 15:25:29 +0000,adate:2024-11-17 15:25:29 +0000 +hash:0237445,parents:33e8dd5,branch:refs/tags/v2.2.0,msg:feat(graph): duration breakdown pie chart now matches other charts animation timings,cdate:2024-11-17 15:06:15 +0000,adate:2024-11-17 15:06:15 +0000 +hash:33e8dd5,parents:072d7d6,branch:refs/tags/v2.2.0,msg:feat(graph): pushed down session selection code to prevent re-renders,cdate:2024-11-17 15:04:26 +0000,adate:2024-11-17 15:04:26 +0000 +hash:072d7d6,parents:947600b,branch:refs/tags/v2.2.0,msg:feat(graph): added legend to sleep stage breakdown graph,cdate:2024-11-17 14:53:23 +0000,adate:2024-11-17 14:53:23 +0000 +hash:947600b,parents:5861283,branch:refs/tags/v2.2.0,msg:feat(graph): sleep stage chart is now size aware and resizes bars appropriately,cdate:2024-11-17 14:38:15 +0000,adate:2024-11-17 14:38:15 +0000 +hash:5861283,parents:e778c0d,branch:refs/tags/v2.2.0,msg:feat(graph): removed pie chart from chart tooltip,cdate:2024-11-17 14:32:24 +0000,adate:2024-11-17 14:32:24 +0000 +hash:e778c0d,parents:6c21df1,branch:refs/tags/v2.2.0,msg:feat(graph): added duration breakdown pie chart to selected session info,cdate:2024-11-17 14:25:18 +0000,adate:2024-11-17 14:25:18 +0000 +hash:6c21df1,parents:5beb80b,branch:refs/tags/v2.2.0,msg:feat(graph): added selected session into query parameters,cdate:2024-11-17 14:22:01 +0000,adate:2024-11-17 14:22:01 +0000 +hash:5beb80b,parents:e82dd75,branch:refs/tags/v2.2.0,msg:chore(lint): added quote-props eslint rule and ran --fix,cdate:2024-11-17 13:53:07 +0000,adate:2024-11-17 13:53:07 +0000 +hash:e82dd75,parents:f6e0c4e,branch:refs/tags/v2.2.0,msg:test(data): added test suite for scanTables utility,cdate:2024-11-17 13:52:28 +0000,adate:2024-11-17 13:52:28 +0000 +hash:f6e0c4e,parents:a09f9ad,branch:refs/tags/v2.2.0,msg:fix(data): added missing benchmark start() call to scanTables,cdate:2024-11-17 13:27:51 +0000,adate:2024-11-17 13:27:51 +0000 +hash:a09f9ad,parents:ac05a9f,branch:refs/tags/v2.2.0,msg:test(data): updated unknown time delta message and added tests for it,cdate:2024-11-17 13:26:16 +0000,adate:2024-11-17 13:26:16 +0000 +hash:ac05a9f,parents:74f829c,branch:refs/tags/v2.2.0,msg:test(data): added parseDataLine utility tests,cdate:2024-11-17 13:18:00 +0000,adate:2024-11-17 13:18:00 +0000 +hash:74f829c,parents:ddd3298,branch:refs/tags/v2.2.0,msg:test(data): added readRawDatabaseExport tests,cdate:2024-11-17 12:57:06 +0000,adate:2024-11-17 12:57:06 +0000 +hash:ddd3298,parents:ca95d1b,branch:refs/tags/v2.2.0,msg:test(data): added readFile unit tests and env utility class,cdate:2024-11-17 12:45:42 +0000,adate:2024-11-17 12:45:42 +0000 +hash:ca95d1b,parents:87c3e4b,branch:refs/tags/v2.2.0,msg:feat(graph): added sound reference lines to stage breakdown graph,cdate:2024-11-16 18:40:13 +0000,adate:2024-11-16 18:40:13 +0000 +hash:87c3e4b,parents:43767e6,branch:refs/tags/v2.2.0,msg:feat(graph): passed sleep sound data into session info component from context,cdate:2024-11-15 19:04:17 +0000,adate:2024-11-15 19:04:17 +0000 +hash:43767e6,parents:eb5e0ad,branch:refs/tags/v2.2.0,msg:feat(data): worker file reader now calculates uncompressed file size,cdate:2024-11-15 17:02:12 +0000,adate:2024-11-15 17:02:12 +0000 +hash:eb5e0ad,parents:dc56de6,branch:refs/tags/v2.2.0,msg:test(data): added unit tests and docs for sendMessage.ts,cdate:2024-11-15 17:01:52 +0000,adate:2024-11-15 17:01:52 +0000 +hash:dc56de6,parents:a9d6cf6,branch:refs/tags/v2.2.0,msg:test(data): added unit tests and docs for formatNumber.ts,cdate:2024-11-15 16:54:15 +0000,adate:2024-11-15 16:54:15 +0000 +hash:a9d6cf6,parents:9cdfa40,branch:refs/tags/v2.2.0,msg:test(data): added unit test for convertTimestamp.ts,cdate:2024-11-15 16:52:09 +0000,adate:2024-11-15 16:52:09 +0000 +hash:9cdfa40,parents:724f9ef,branch:refs/tags/v2.2.0,msg:fix(data): fixed benchmark delta bug and added unit tests,cdate:2024-11-15 16:44:36 +0000,adate:2024-11-15 16:44:36 +0000 +hash:724f9ef,parents:8472bb5,branch:refs/tags/v2.2.0,msg:chore(data): added benchmark util to encapsulate timing and delta formatting,cdate:2024-11-14 21:55:11 +0000,adate:2024-11-14 21:55:11 +0000 +hash:8472bb5,parents:d52b826,branch:refs/tags/v2.2.0,msg:test(data): added unit test suite for convertSleepStage.ts,cdate:2024-11-14 21:45:41 +0000,adate:2024-11-14 21:45:41 +0000 +hash:1482fb7,parents:7271948,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@d52b826c02b6909059675040789181420beafd52 🚀,cdate:2024-11-14 21:39:46 +0000,adate:2024-11-14 21:39:46 +0000 +hash:7271948,parents:70437fd,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@744a38879b90beeeddfffebbe9c3ecaca4a4c155 🚀,cdate:2024-11-14 21:38:53 +0000,adate:2024-11-14 21:38:53 +0000 +hash:d52b826,parents:744a388 328c273,branch:refs/tags/v2.0.0,msg:Merge pull request #24 from TomPlum/renovate/all-minor-patch,cdate:2024-11-14 21:38:52 +0000,adate:2024-11-14 21:38:52 +0000 +hash:744a388,parents:2888162 4c98b03,branch:refs/tags/v2.0.0,msg:Merge pull request #25 from TomPlum/feature/parse-raw-data,cdate:2024-11-14 21:38:02 +0000,adate:2024-11-14 21:38:02 +0000 +hash:4c98b03,parents:9b96063,branch:refs/heads/feature/parse-raw-data,msg:chore(data): moved worker type and shortened imports,cdate:2024-11-14 19:22:19 +0000,adate:2024-11-14 19:22:19 +0000 +hash:9b96063,parents:c675f33,branch:refs/heads/feature/parse-raw-data,msg:chore(data): reduced more redundant code for file reading,cdate:2024-11-14 19:17:58 +0000,adate:2024-11-14 19:17:58 +0000 +hash:c675f33,parents:ebec2f8,branch:refs/heads/feature/parse-raw-data,msg:chore(data): extracted session validation function to reduce redundant code,cdate:2024-11-14 19:11:32 +0000,adate:2024-11-14 19:11:32 +0000 +hash:ebec2f8,parents:b3a7721,branch:refs/heads/feature/parse-raw-data,msg:test(data): installed @vitest/web-worker to fix failing tests,cdate:2024-11-14 19:07:04 +0000,adate:2024-11-14 19:07:04 +0000 +hash:b3a7721,parents:f6a4794,branch:refs/heads/feature/parse-raw-data,msg:chore(config): added --host flag to dev script so the server is available on the LAN,cdate:2024-11-14 16:18:11 +0000,adate:2024-11-14 16:18:11 +0000 +hash:328c273,parents:2888162,branch:refs/tags/v2.0.0,msg:chore(deps): update all non-major dependencies,cdate:2024-11-14 13:09:47 +0000,adate:2024-11-14 13:09:47 +0000 +hash:f6a4794,parents:2c6a2a7,branch:refs/heads/feature/parse-raw-data,msg:chore(data): started extracting data worker into its own module of files,cdate:2024-11-14 12:10:51 +0000,adate:2024-11-14 12:10:51 +0000 +hash:2c6a2a7,parents:0261ff8,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): updated active session file name and moved types from worker to types file,cdate:2024-11-13 20:45:31 +0000,adate:2024-11-13 20:45:31 +0000 +hash:0261ff8,parents:0d66a55,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): changed breakdown chart y value type and added tooltip,cdate:2024-11-13 18:01:15 +0000,adate:2024-11-13 18:01:15 +0000 +hash:0d66a55,parents:1bb1a3f,branch:refs/heads/feature/parse-raw-data,msg:chore(data): renamed statusCode -> code and added extra docs to worker types,cdate:2024-11-13 16:24:04 +0000,adate:2024-11-13 16:24:04 +0000 +hash:1bb1a3f,parents:181a606,branch:refs/heads/feature/parse-raw-data,msg:feat(data): extracted and simplified worker number formatter,cdate:2024-11-13 16:20:58 +0000,adate:2024-11-13 16:20:58 +0000 +hash:181a606,parents:34e6895,branch:refs/heads/feature/parse-raw-data,msg:feat(data): added timeouts to throttle worker messages (callback hell, oops),cdate:2024-11-13 16:14:39 +0000,adate:2024-11-13 16:14:39 +0000 +hash:34e6895,parents:05b851a,branch:refs/heads/feature/parse-raw-data,msg:feat(data): tweaks to web worker messaging,cdate:2024-11-13 16:05:57 +0000,adate:2024-11-13 16:05:57 +0000 +hash:05b851a,parents:053033d,branch:refs/heads/feature/parse-raw-data,msg:feat(data): added extra worker events for preprocessing stages,cdate:2024-11-13 09:04:42 +0000,adate:2024-11-13 09:04:42 +0000 +hash:053033d,parents:94c5cdb,branch:refs/heads/feature/parse-raw-data,msg:fix(data): significantly improved worker performance (35s -> 50ms),cdate:2024-11-12 18:57:10 +0000,adate:2024-11-12 18:57:10 +0000 +hash:94c5cdb,parents:f05bba9,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): selection session info/graph now renders in stacked view,cdate:2024-11-12 18:37:10 +0000,adate:2024-11-12 18:37:10 +0000 +hash:f05bba9,parents:00d2522,branch:refs/heads/feature/parse-raw-data,msg:feat(data): added slight delay to final worker event to show data parsing message,cdate:2024-11-12 18:32:17 +0000,adate:2024-11-12 18:32:17 +0000 +hash:00d2522,parents:be23a35,branch:refs/heads/feature/parse-raw-data,msg:chore(data): cleared 2 x TODOs in web worker,cdate:2024-11-12 18:24:05 +0000,adate:2024-11-12 18:24:05 +0000 +hash:be23a35,parents:e55624f,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): added breathing radial gradient to loading component,cdate:2024-11-12 17:39:10 +0000,adate:2024-11-12 17:39:10 +0000 +hash:e55624f,parents:300166e,branch:refs/heads/feature/parse-raw-data,msg:chore(graph): extracted useDynamicFavicon hook,cdate:2024-11-12 17:29:04 +0000,adate:2024-11-12 17:29:04 +0000 +hash:300166e,parents:ebc5a24,branch:refs/heads/feature/parse-raw-data,msg:chore(graph): extracted SleepStageBar component,cdate:2024-11-12 17:27:23 +0000,adate:2024-11-12 17:27:23 +0000 +hash:ebc5a24,parents:4a265bf,branch:refs/heads/feature/parse-raw-data,msg:chore(data): removed old CSV data hook from context provider,cdate:2024-11-12 17:19:29 +0000,adate:2024-11-12 17:19:29 +0000 +hash:4a265bf,parents:77aec21,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): started adding info box to breakdown graph,cdate:2024-11-12 17:17:11 +0000,adate:2024-11-12 17:17:11 +0000 +hash:77aec21,parents:f3ad7d7,branch:refs/heads/feature/parse-raw-data,msg:fix(graph): fixed yTicks in SleepSessionStageBreakdownGraph,cdate:2024-11-12 17:01:01 +0000,adate:2024-11-12 17:01:01 +0000 +hash:f3ad7d7,parents:52e1dd5,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): fixed raw stage mapping and session -> stages ID mapping,cdate:2024-11-12 16:56:09 +0000,adate:2024-11-12 16:56:09 +0000 +hash:52e1dd5,parents:8ab78a0,branch:refs/heads/feature/parse-raw-data,msg:feat(data): data worker typing improvements + TODOs,cdate:2024-11-12 15:54:03 +0000,adate:2024-11-12 15:54:03 +0000 +hash:8ab78a0,parents:8af99c6,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): moved sleep stage graph to the bottom and fixed heights,cdate:2024-11-12 14:44:30 +0000,adate:2024-11-12 14:44:30 +0000 +hash:8af99c6,parents:9bc2a52,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): added custom line active dot to bind click events to sleep breakdown,cdate:2024-11-12 14:13:45 +0000,adate:2024-11-12 14:13:45 +0000 +hash:9bc2a52,parents:d5271f3,branch:refs/heads/feature/parse-raw-data,msg:feat(data): minor copy and styling improvements to worker events and loading page,cdate:2024-11-12 08:28:13 +0000,adate:2024-11-12 08:28:13 +0000 +hash:d5271f3,parents:eda7bbf,branch:refs/heads/feature/parse-raw-data,msg:feat(data): added timings and payload data for other worker events,cdate:2024-11-11 21:13:25 +0000,adate:2024-11-11 21:13:25 +0000 +hash:eda7bbf,parents:0dfc9ec,branch:refs/heads/feature/parse-raw-data,msg:feat(data): added custom payload to worker messages and sent file size,cdate:2024-11-11 20:58:36 +0000,adate:2024-11-11 20:58:36 +0000 +hash:0dfc9ec,parents:8580cc5,branch:refs/heads/feature/parse-raw-data,msg:feat(data): fixed some of the failing data web worker event messages,cdate:2024-11-11 20:33:18 +0000,adate:2024-11-11 20:33:18 +0000 +hash:8580cc5,parents:73fbcc4,branch:refs/heads/feature/parse-raw-data,msg:feat(data): refactored worker to use Worker constructor to support type imports,cdate:2024-11-11 20:21:46 +0000,adate:2024-11-11 20:21:46 +0000 +hash:73fbcc4,parents:dab5c7b,branch:refs/heads/feature/parse-raw-data,msg:feat(data): added percentage to data worker message events for granular tracking,cdate:2024-11-11 16:32:43 +0000,adate:2024-11-11 16:32:43 +0000 +hash:dab5c7b,parents:bee4e29,branch:refs/heads/feature/parse-raw-data,msg:feat(data): integrated worker status with context and loading component,cdate:2024-11-11 15:56:24 +0000,adate:2024-11-11 15:56:24 +0000 +hash:bee4e29,parents:d05120c,branch:refs/heads/feature/parse-raw-data,msg:feat(data): implemented custom web worker for data loading and dropped external dep,cdate:2024-11-11 15:31:19 +0000,adate:2024-11-11 15:31:19 +0000 +hash:d05120c,parents:70e8695,branch:refs/heads/feature/parse-raw-data,msg:chore(data): added extra comments and docs to the pillow export parser,cdate:2024-11-11 14:48:00 +0000,adate:2024-11-11 14:48:00 +0000 +hash:70e8695,parents:0eeea35,branch:refs/heads/feature/parse-raw-data,msg:feat(data): pillow export parser now supports the truly raw export with no prior modifications made,cdate:2024-11-11 14:43:38 +0000,adate:2024-11-11 14:43:38 +0000 +hash:0eeea35,parents:e0fa20a,branch:refs/heads/feature/parse-raw-data,msg:feat(data): refactored raw data parser function to make only one pass of the file,cdate:2024-11-10 20:40:34 +0000,adate:2024-11-10 20:40:34 +0000 +hash:e0fa20a,parents:6178286,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): sleep stage graph improvements,cdate:2024-11-10 17:57:08 +0000,adate:2024-11-10 17:57:08 +0000 +hash:6178286,parents:3496d41,branch:refs/heads/feature/parse-raw-data,msg:feat(graph): first pass of stacked bar chart / gantt of sleep stage breakdown,cdate:2024-11-10 17:46:07 +0000,adate:2024-11-10 17:46:07 +0000 +hash:3496d41,parents:42f2132,branch:refs/heads/feature/parse-raw-data,msg:feat(data): re-integrated worker into raw sleep data hook and added to context,cdate:2024-11-10 15:54:37 +0000,adate:2024-11-10 15:54:37 +0000 +hash:70437fd,parents:5036be1,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@28881627b2f5288a3a68f9127abc1fdfd966c6d2 🚀,cdate:2024-11-10 15:09:39 +0000,adate:2024-11-10 15:09:39 +0000 +hash:2888162,parents:732b304 7215477,branch:refs/tags/v2.0.0,msg:Merge pull request #20 from TomPlum/renovate/all-minor-patch,cdate:2024-11-10 15:08:53 +0000,adate:2024-11-10 15:08:53 +0000 +hash:42f2132,parents:bf551c0,branch:refs/heads/feature/parse-raw-data,msg:feat(data): removed redundant props from useRawSleepData hook,cdate:2024-11-10 14:47:12 +0000,adate:2024-11-10 14:47:12 +0000 +hash:bf551c0,parents:29a7212,branch:refs/heads/feature/parse-raw-data,msg:feat(data): fixed sound data parsing and added sleep stage data alongside it,cdate:2024-11-10 13:21:35 +0000,adate:2024-11-10 13:21:35 +0000 +hash:29a7212,parents:4c801b6,branch:refs/heads/feature/parse-raw-data,msg:feat(data): consolidated raw data parsing experiment into main impl,cdate:2024-11-10 12:40:13 +0000,adate:2024-11-10 12:40:13 +0000 +hash:4c801b6,parents:ffb0337,branch:refs/heads/feature/parse-raw-data,msg:feat(data): parsed sound points and mapped to sessions,cdate:2024-11-09 21:23:18 +0000,adate:2024-11-09 21:23:18 +0000 +hash:ffb0337,parents:5e7b005,branch:refs/heads/feature/parse-raw-data,msg:feat(data): fixed table searching and date parsing,cdate:2024-11-09 21:02:39 +0000,adate:2024-11-09 21:02:39 +0000 +hash:5e7b005,parents:821fe5a,branch:refs/heads/feature/parse-raw-data,msg:feat(data): attempting to parse raw data file,cdate:2024-11-09 20:01:39 +0000,adate:2024-11-09 20:01:39 +0000 +hash:7215477,parents:732b304,branch:refs/tags/v2.0.0,msg:chore(deps): update all non-major dependencies,cdate:2024-11-09 04:39:56 +0000,adate:2024-11-09 04:39:56 +0000 +hash:821fe5a,parents:732b304,branch:refs/heads/feature/parse-raw-data,msg:chore(docs): README ToC,cdate:2024-11-05 21:18:18 +0000,adate:2024-11-05 21:18:18 +0000 +hash:5036be1,parents:b9196fc,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@732b3044a9b1ea8699908ba4b6c41f593f44d18f 🚀,cdate:2024-11-04 19:47:06 +0000,adate:2024-11-04 19:47:06 +0000 +hash:732b304,parents:fbca587 b2bf478,branch:refs/tags/v2.0.0,msg:Merge pull request #23 from TomPlum/develop,cdate:2024-11-04 19:46:19 +0000,adate:2024-11-04 19:46:19 +0000 +hash:b2bf478,parents:4410cd7,branch:refs/tags/v2.0.0,msg:fix(graph): fixed static asset loading in production mode,cdate:2024-11-04 19:45:58 +0000,adate:2024-11-04 19:45:58 +0000 +hash:b9196fc,parents:0994f81,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@fbca587594c87b5c4d13dbb14387eff3bbd97f0b 🚀,cdate:2024-11-04 19:32:13 +0000,adate:2024-11-04 19:32:13 +0000 +hash:fbca587,parents:ff20995 4410cd7,branch:refs/tags/v1.2.1,msg:Merge pull request #22 from TomPlum/develop,cdate:2024-11-04 19:31:29 +0000,adate:2024-11-04 19:31:29 +0000 +hash:4410cd7,parents:e8c2bfb,branch:refs/tags/v2.0.0,msg:test(data): fixed compilation error in useLinearRegression.spec.ts,cdate:2024-11-04 19:31:08 +0000,adate:2024-11-04 19:31:08 +0000 +hash:ff20995,parents:529c117 e8c2bfb,branch:refs/tags/v1.2.1,msg:Merge pull request #21 from TomPlum/develop,cdate:2024-11-04 19:29:24 +0000,adate:2024-11-04 19:29:24 +0000 +hash:e8c2bfb,parents:4d7a7e9,branch:refs/tags/v2.0.0,msg:feat(graph): updated active session info to use pillow logo instead of text,cdate:2024-11-03 18:35:05 +0000,adate:2024-11-03 18:35:05 +0000 +hash:4d7a7e9,parents:69eaadc,branch:refs/tags/v2.0.0,msg:feat(graph): added day of the week name to the tooltip session date format,cdate:2024-11-03 09:41:53 +0000,adate:2024-11-03 09:41:53 +0000 +hash:69eaadc,parents:c31f162,branch:refs/tags/v2.0.0,msg:chore(data): updated sleep data to most recent csv snapshot,cdate:2024-11-03 09:39:56 +0000,adate:2024-11-03 09:39:56 +0000 +hash:c31f162,parents:98ff75e,branch:refs/tags/v2.0.0,msg:feat(graph): minor styling improvements to active session info and stacked graph placeholder,cdate:2024-10-31 20:02:36 +0000,adate:2024-10-31 20:02:36 +0000 +hash:98ff75e,parents:7e8868b,branch:refs/tags/v2.0.0,msg:feat(graph): added pillows website link to the active session info component,cdate:2024-10-30 20:21:01 +0000,adate:2024-10-30 20:21:01 +0000 +hash:7e8868b,parents:51f121d,branch:refs/tags/v2.0.0,msg:feat(graph): added descriptions of sleep metrics upon hover in stacked view,cdate:2024-10-30 20:15:09 +0000,adate:2024-10-30 20:15:09 +0000 +hash:0994f81,parents:bdaa4e4,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@529c1176ebc495163d44d926469cce22300cb2a9 🚀,cdate:2024-10-30 19:52:18 +0000,adate:2024-10-30 19:52:18 +0000 +hash:51f121d,parents:21678c9 529c117,branch:refs/tags/v2.0.0,msg:Merge branch 'release' into develop,cdate:2024-10-30 19:51:40 +0000,adate:2024-10-30 19:51:40 +0000 +hash:529c117,parents:0d12d74 5765026,branch:refs/tags/v1.2.1,msg:Merge pull request #16 from TomPlum/renovate/all-minor-patch,cdate:2024-10-30 19:51:30 +0000,adate:2024-10-30 19:51:30 +0000 +hash:5765026,parents:0d12d74,branch:refs/tags/v1.2.1,msg:chore(deps): update all non-major dependencies,cdate:2024-10-30 15:18:13 +0000,adate:2024-10-30 15:18:13 +0000 +hash:21678c9,parents:e6ea316,branch:refs/tags/v2.0.0,msg:chore(graph): extracted useDefaultQueryParams hook from sleep context provider,cdate:2024-10-27 19:38:06 +0000,adate:2024-10-27 19:38:06 +0000 +hash:e6ea316,parents:f7116d9,branch:refs/tags/v2.0.0,msg:chore(graph): changed default date range query params to all data instead of recent,cdate:2024-10-27 19:30:38 +0000,adate:2024-10-27 19:30:38 +0000 +hash:f7116d9,parents:87efebe,branch:refs/tags/v2.0.0,msg:chore(graph): increased typical sessions healthy awake time range to 0-10%,cdate:2024-10-27 19:28:45 +0000,adate:2024-10-27 19:28:45 +0000 +hash:87efebe,parents:d638b1e,branch:refs/tags/v2.0.0,msg:fix(graph): duration breakdown pie chart no longer renders labels for 0% values,cdate:2024-10-27 19:25:00 +0000,adate:2024-10-27 19:25:00 +0000 +hash:d638b1e,parents:928a7f4,branch:refs/tags/v2.0.0,msg:feat(graph): added mood emoji to the session tooltip,cdate:2024-10-27 18:55:58 +0000,adate:2024-10-27 18:55:58 +0000 +hash:928a7f4,parents:d401424,branch:refs/tags/v2.0.0,msg:feat(graph): reduced active dot radius for active session counts between 100 and 300,cdate:2024-10-23 13:14:39 +0100,adate:2024-10-23 13:14:39 +0100 +hash:d401424,parents:2f85544,branch:refs/tags/v2.0.0,msg:fix(graph): fixed stacked view toggle not updating query param when checking,cdate:2024-10-23 13:08:07 +0100,adate:2024-10-23 13:08:07 +0100 +hash:bdaa4e4,parents:6c77a6b,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@0d12d74a0d49b59240f4071adc56fb9599990905 🚀,cdate:2024-10-23 11:46:53 +0000,adate:2024-10-23 11:46:53 +0000 +hash:0d12d74,parents:5e1e15c 2f85544,branch:refs/tags/v1.2.0,msg:Merge pull request #19 from TomPlum/develop,cdate:2024-10-23 12:46:10 +0100,adate:2024-10-23 12:46:10 +0100 +hash:2f85544,parents:a6ba004 2c5082d,branch:refs/tags/v2.0.0,msg:Merge pull request #18 from TomPlum/feature/stacked-view,cdate:2024-10-23 12:40:38 +0100,adate:2024-10-23 12:40:38 +0100 +hash:2c5082d,parents:9676781,branch:refs/heads/feature/stacked-view,msg:feat(graph): stacked toggle now clears stacked metrics when turning on,cdate:2024-10-23 12:39:13 +0100,adate:2024-10-23 12:39:13 +0100 +hash:9676781,parents:317a526,branch:refs/heads/feature/stacked-view,msg:fix(config): trying to make vite HMR watch the public dir during local development,cdate:2024-10-23 12:33:26 +0100,adate:2024-10-23 12:33:26 +0100 +hash:317a526,parents:66ac076,branch:refs/heads/feature/stacked-view,msg:feat(graph): fixed stacked graph placeholder messages and ensured metric checkboxes update the query params,cdate:2024-10-23 12:22:32 +0100,adate:2024-10-23 12:22:32 +0100 +hash:66ac076,parents:415c1d1,branch:refs/heads/feature/stacked-view,msg:fix(graph): fixed missing tooltip and improvement label from single graph view,cdate:2024-10-22 20:27:41 +0100,adate:2024-10-22 20:27:41 +0100 +hash:415c1d1,parents:c0dc79f,branch:refs/heads/feature/stacked-view,msg:feat(graph): improvement line label and tooltip no longer render twice in stacked view,cdate:2024-10-22 20:18:29 +0100,adate:2024-10-22 20:18:29 +0100 +hash:c0dc79f,parents:0b9fad5,branch:refs/heads/feature/stacked-view,msg:feat(graph): active sessions info now respects stacked view with no selections,cdate:2024-10-22 20:13:21 +0100,adate:2024-10-22 20:13:21 +0100 +hash:0b9fad5,parents:70164f4,branch:refs/heads/feature/stacked-view,msg:fix(graph): fixed react hooks lifecycle error with stacked graphs,cdate:2024-10-22 20:08:53 +0100,adate:2024-10-22 20:08:53 +0100 +hash:70164f4,parents:bb29e00,branch:refs/heads/feature/stacked-view,msg:chore(graph): split metric checkbox component into two for separation of concerns,cdate:2024-10-22 19:38:40 +0100,adate:2024-10-22 19:38:40 +0100 +hash:bb29e00,parents:6487f34,branch:refs/heads/feature/stacked-view,msg:feat(graph): metric checkbox now has button mode and graph placeholder improved button styling,cdate:2024-10-22 17:33:45 +0100,adate:2024-10-22 17:33:45 +0100 +hash:6487f34,parents:18fdb81,branch:refs/heads/feature/stacked-view,msg:feat(routing): serialised stacked view boolean in query params,cdate:2024-10-22 15:38:58 +0100,adate:2024-10-22 15:38:58 +0100 +hash:18fdb81,parents:e33383e,branch:refs/heads/feature/stacked-view,msg:feat(graph): metric config no longer lets you pick more than 3 metrics in stacked view,cdate:2024-10-22 15:13:33 +0100,adate:2024-10-22 15:13:33 +0100 +hash:e33383e,parents:77adf46,branch:refs/heads/feature/stacked-view,msg:feat(graph): stacked graph placeholder now offer available sleep metrics to pick from,cdate:2024-10-22 15:10:35 +0100,adate:2024-10-22 15:10:35 +0100 +hash:77adf46,parents:1d30e95,branch:refs/heads/feature/stacked-view,msg:chore(graph): extracted stacked graph placeholder component,cdate:2024-10-22 14:59:15 +0100,adate:2024-10-22 14:59:15 +0100 +hash:1d30e95,parents:d453692,branch:refs/heads/feature/stacked-view,msg:feat(graph): second graph in stacked view now transitions its opacity as it renders,cdate:2024-10-22 13:49:05 +0100,adate:2024-10-22 13:49:05 +0100 +hash:d453692,parents:7ef626b,branch:refs/heads/feature/stacked-view,msg:feat(graph): reduced the upper-bound of the dynamic y-axis domain to better frame the data on the chart,cdate:2024-10-22 12:59:58 +0100,adate:2024-10-22 12:59:58 +0100 +hash:7ef626b,parents:b7851b4,branch:refs/heads/feature/stacked-view,msg:feat(graph): added selection placeholder when a second metric is not selected in stacked view,cdate:2024-10-22 12:57:30 +0100,adate:2024-10-22 12:57:30 +0100 +hash:b7851b4,parents:569f1d0,branch:refs/heads/feature/stacked-view,msg:feat(graph): favicon now changes based on active sleep metric,cdate:2024-10-22 09:56:43 +0100,adate:2024-10-22 09:56:43 +0100 +hash:569f1d0,parents:72634f1,branch:refs/heads/feature/stacked-view,msg:feat(graph): added text to stacked view toggle button,cdate:2024-10-22 09:28:15 +0100,adate:2024-10-22 09:28:15 +0100 +hash:72634f1,parents:6b2dfb3,branch:refs/heads/feature/stacked-view,msg:feat(graph): fixed non-stacked view and added dynamic stacked colours to active session info,cdate:2024-10-22 09:20:51 +0100,adate:2024-10-22 09:20:51 +0100 +hash:6b2dfb3,parents:a6ba004,branch:refs/heads/feature/stacked-view,msg:feat(graph): first pass of enabling stacked graphs,cdate:2024-10-21 17:24:29 +0100,adate:2024-10-21 17:24:29 +0100 +hash:a6ba004,parents:9de61dd,branch:refs/tags/v2.0.0,msg:chore(graph): renamed old graph to 3D,cdate:2024-10-21 16:35:40 +0100,adate:2024-10-21 16:35:40 +0100 +hash:9de61dd,parents:e9d14e5 5e1e15c,branch:refs/tags/v2.0.0,msg:Merge branch 'release' into develop,cdate:2024-10-21 16:34:23 +0100,adate:2024-10-21 16:34:23 +0100 +hash:e9d14e5,parents:61b38d9,branch:refs/tags/v2.0.0,msg:chore(docs): added some TODOs to the README,cdate:2024-10-21 16:34:13 +0100,adate:2024-10-21 16:34:13 +0100 +hash:6c77a6b,parents:ed89441,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@5e1e15c2d5eada142fbd66cd5b87d015945fd11b 🚀,cdate:2024-10-21 10:42:07 +0000,adate:2024-10-21 10:42:07 +0000 +hash:5e1e15c,parents:7d545a5 61b38d9,branch:refs/tags/v1.1.0,msg:Merge pull request #17 from TomPlum/develop,cdate:2024-10-21 11:41:21 +0100,adate:2024-10-21 11:41:21 +0100 +hash:61b38d9,parents:a2db943,branch:refs/tags/v2.0.0,msg:feat(graph): session count colour now transitions with same animation duration as graph,cdate:2024-10-21 10:46:02 +0100,adate:2024-10-21 10:46:02 +0100 +hash:a2db943,parents:5a21429,branch:refs/tags/v2.0.0,msg:feat(graph): data source now links to a download of the raw CSV,cdate:2024-10-21 10:44:52 +0100,adate:2024-10-21 10:44:52 +0100 +hash:5a21429,parents:a5425d1,branch:refs/tags/v2.0.0,msg:feat(graph): added data source version to active session info,cdate:2024-10-21 10:35:42 +0100,adate:2024-10-21 10:35:42 +0100 +hash:a5425d1,parents:2282d36,branch:refs/tags/v2.0.0,msg:chore(graph): extracted active session info component from sleep page,cdate:2024-10-21 10:27:09 +0100,adate:2024-10-21 10:27:09 +0100 +hash:2282d36,parents:cba1df6,branch:refs/tags/v2.0.0,msg:chore(graph): increased font weight of improvement label text,cdate:2024-10-21 10:22:42 +0100,adate:2024-10-21 10:22:42 +0100 +hash:cba1df6,parents:da988de,branch:refs/tags/v2.0.0,msg:feat(graph): added subtle cartesian grid back to the line chart,cdate:2024-10-20 11:18:32 +0100,adate:2024-10-20 11:18:32 +0100 +hash:da988de,parents:edafbbf,branch:refs/tags/v2.0.0,msg:fix(graph): a single month can now be selected from the date picker,cdate:2024-10-20 11:06:32 +0100,adate:2024-10-20 11:06:32 +0100 +hash:edafbbf,parents:afd8749 7d545a5,branch:refs/tags/v2.0.0,msg:Merge branch 'release' into develop,cdate:2024-10-20 10:55:50 +0100,adate:2024-10-20 10:55:50 +0100 +hash:afd8749,parents:cee6402,branch:refs/tags/v2.0.0,msg:chore(graph): tweaked active dot radius for the main sleep metric line,cdate:2024-10-20 10:54:55 +0100,adate:2024-10-20 10:54:55 +0100 +hash:cee6402,parents:012ffe9,branch:refs/tags/v2.0.0,msg:chore(graph): hoisted improvement date calculation into sleep context,cdate:2024-10-20 10:49:13 +0100,adate:2024-10-20 10:49:13 +0100 +hash:012ffe9,parents:bff2088,branch:refs/tags/v2.0.0,msg:feat(graph): improved session and nap filtering,cdate:2024-10-20 10:45:23 +0100,adate:2024-10-20 10:45:23 +0100 +hash:bff2088,parents:21fecc1,branch:refs/tags/v2.0.0,msg:feat(routing): added language to query parameters,cdate:2024-10-19 19:18:37 +0100,adate:2024-10-19 19:18:37 +0100 +hash:21fecc1,parents:9136c6b,branch:refs/tags/v2.0.0,msg:feat(graph): show all button now changes to "recent" if all sessions are showing,cdate:2024-10-19 19:10:25 +0100,adate:2024-10-19 19:10:25 +0100 +hash:ed89441,parents:1b5c868,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@7d545a59464b63d3aaace8e99aa55cf6e0866f97 🚀,cdate:2024-10-19 18:02:15 +0000,adate:2024-10-19 18:02:15 +0000 +hash:7d545a5,parents:3d3d5a2 e27d91a,branch:refs/tags/v1.1.0,msg:Merge pull request #14 from TomPlum/renovate/all-minor-patch,cdate:2024-10-19 19:01:32 +0100,adate:2024-10-19 19:01:32 +0100 +hash:9136c6b,parents:7fc3850,branch:refs/tags/v2.0.0,msg:feat(graph): added show all button and extracted date selection hook,cdate:2024-10-19 15:36:18 +0100,adate:2024-10-19 15:36:18 +0100 +hash:7fc3850,parents:7c9d0e2,branch:refs/tags/v2.0.0,msg:chore(graph): extracted graph controls component,cdate:2024-10-19 15:21:51 +0100,adate:2024-10-19 15:21:51 +0100 +hash:7c9d0e2,parents:91ab124,branch:refs/tags/v2.0.0,msg:fix(data): filtered out sessions longer than 15 hours,cdate:2024-10-19 15:17:59 +0100,adate:2024-10-19 15:17:59 +0100 +hash:91ab124,parents:b9e9eaf,branch:refs/tags/v2.0.0,msg:feat(graph): added vertical reference line for the date in which I made improvements,cdate:2024-10-19 15:12:54 +0100,adate:2024-10-19 15:12:54 +0100 +hash:1b5c868,parents:bff718f,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@3d3d5a2ec3361fa74673968451d4fb7bd9d9bf65 🚀,cdate:2024-10-19 11:45:18 +0000,adate:2024-10-19 11:45:18 +0000 +hash:3d3d5a2,parents:c9c48c0 b9e9eaf,branch:refs/tags/v1.1.0,msg:Merge pull request #15 from TomPlum/develop,cdate:2024-10-19 12:44:33 +0100,adate:2024-10-19 12:44:33 +0100 +hash:b9e9eaf,parents:1634ce3,branch:refs/tags/v2.0.0,msg:chore(test): fixed failing unit tests due to bad setup data,cdate:2024-10-19 12:43:46 +0100,adate:2024-10-19 12:43:46 +0100 +hash:1634ce3,parents:fcc0e1c,branch:refs/tags/v2.0.0,msg:feat(graph): moved locale switch to top right controls and extracted component,cdate:2024-10-19 12:40:59 +0100,adate:2024-10-19 12:40:59 +0100 +hash:fcc0e1c,parents:ef2cfc2,branch:refs/tags/v2.0.0,msg:chore(docs): added screenshots to README,cdate:2024-10-19 12:26:20 +0100,adate:2024-10-19 12:26:20 +0100 +hash:ef2cfc2,parents:76a2a2e,branch:refs/tags/v2.0.0,msg:feat(graph): added nap indicator to session tooltip,cdate:2024-10-19 12:21:14 +0100,adate:2024-10-19 12:21:14 +0100 +hash:76a2a2e,parents:3f4402f,branch:refs/tags/v2.0.0,msg:fix(routing): fixed bad query param name for sleep metric,cdate:2024-10-19 12:11:57 +0100,adate:2024-10-19 12:11:57 +0100 +hash:3f4402f,parents:184b081,branch:refs/tags/v2.0.0,msg:feat(graph): added duration as a percentage of 8 hours as a new metric,cdate:2024-10-19 12:04:44 +0100,adate:2024-10-19 12:04:44 +0100 +hash:e27d91a,parents:c9c48c0,branch:refs/tags/v1.1.0,msg:chore(deps): update all non-major dependencies,cdate:2024-10-19 04:30:16 +0000,adate:2024-10-19 04:30:16 +0000 +hash:bff718f,parents:8f95b4a,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@c9c48c01cfc584cfe74ecedbbe63f350b39bbc17 🚀,cdate:2024-10-18 15:30:26 +0000,adate:2024-10-18 15:30:26 +0000 +hash:c9c48c0,parents:5f4518b 184b081,branch:refs/tags/v1.0.0,msg:Merge pull request #13 from TomPlum/develop,cdate:2024-10-18 16:29:29 +0100,adate:2024-10-18 16:29:29 +0100 +hash:184b081,parents:eda1f0d,branch:refs/tags/v2.0.0,msg:chore(test): fixed failing unit tests for useLinearRegression.spec.ts,cdate:2024-10-18 16:28:37 +0100,adate:2024-10-18 16:28:37 +0100 +hash:eda1f0d,parents:b89ac17,branch:refs/tags/v2.0.0,msg:feat(graph): added github button to top left controls container,cdate:2024-10-18 16:24:57 +0100,adate:2024-10-18 16:24:57 +0100 +hash:b89ac17,parents:15c8018,branch:refs/tags/v2.0.0,msg:chore(styling): minor styling and font changes,cdate:2024-10-18 11:32:53 +0100,adate:2024-10-18 11:32:53 +0100 +hash:15c8018,parents:b4a80bb,branch:refs/tags/v2.0.0,msg:chore(graph): extracted regression delta label component from graph,cdate:2024-10-17 20:18:02 +0100,adate:2024-10-17 20:18:02 +0100 +hash:b4a80bb,parents:e748aef,branch:refs/tags/v2.0.0,msg:feat(graph): regression line delta horizontal reference line now animates like its vertical counterpart,cdate:2024-10-17 20:13:11 +0100,adate:2024-10-17 20:13:11 +0100 +hash:e748aef,parents:46cfb4d,branch:refs/tags/v2.0.0,msg:feat(graph): regression line delta vertical reference line now fits the correct y-ordinates and doesn't fill the charts height,cdate:2024-10-17 19:50:26 +0100,adate:2024-10-17 19:50:26 +0100 +hash:46cfb4d,parents:aaa16bf,branch:refs/tags/v2.0.0,msg:chore(graph): encapsulated reference area fill into hook and tweaks reference line stroke dash,cdate:2024-10-17 18:15:51 +0100,adate:2024-10-17 18:15:51 +0100 +hash:aaa16bf,parents:05b7c89,branch:refs/tags/v2.0.0,msg:chore(docs): removed readme template contents,cdate:2024-10-17 18:00:20 +0100,adate:2024-10-17 18:00:20 +0100 +hash:05b7c89,parents:19e0968,branch:refs/tags/v2.0.0,msg:chore(lint): added import eslint plugin, configured and fixed import extensions,cdate:2024-10-17 17:58:06 +0100,adate:2024-10-17 17:58:06 +0100 +hash:19e0968,parents:245c95a,branch:refs/tags/v2.0.0,msg:chore(lint): tweaked quotes rules and fixed all double -> single,cdate:2024-10-17 17:51:00 +0100,adate:2024-10-17 17:51:00 +0100 +hash:245c95a,parents:ddca752,branch:refs/tags/v2.0.0,msg:chore(lint): tweaked object/curly brace rules and fixed all spacing issues,cdate:2024-10-17 17:50:04 +0100,adate:2024-10-17 17:50:04 +0100 +hash:ddca752,parents:f32e3d4,branch:refs/tags/v2.0.0,msg:chore(lint): tweaked semi rules and removed redundant semicolons,cdate:2024-10-17 17:48:04 +0100,adate:2024-10-17 17:48:04 +0100 +hash:f32e3d4,parents:01068d1,branch:refs/tags/v2.0.0,msg:Revert "chore(data): removed redundant guarding in linear regression hook",cdate:2024-10-17 16:42:11 +0100,adate:2024-10-17 16:42:11 +0100 +hash:01068d1,parents:c61415e,branch:refs/tags/v2.0.0,msg:chore(data): removed redundant guarding in linear regression hook,cdate:2024-10-17 16:41:32 +0100,adate:2024-10-17 16:41:32 +0100 +hash:c61415e,parents:66a1d30,branch:refs/tags/v2.0.0,msg:chore(data): filtered out invalid awake time values,cdate:2024-10-17 16:34:33 +0100,adate:2024-10-17 16:34:33 +0100 +hash:66a1d30,parents:76baba0,branch:refs/tags/v2.0.0,msg:feat(graph): migrated xAxisInterval to axes hook and added one more level of granularity,cdate:2024-10-17 16:30:39 +0100,adate:2024-10-17 16:30:39 +0100 +hash:8f95b4a,parents:9f93e5f,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@5f4518bb04c3e9c8fe74c2815da5b0584d1cdbc7 🚀,cdate:2024-10-17 15:22:19 +0000,adate:2024-10-17 15:22:19 +0000 +hash:5f4518b,parents:34aa1bf 76baba0,branch:refs/tags/v1.0.0,msg:Merge pull request #12 from TomPlum/develop,cdate:2024-10-17 16:21:40 +0100,adate:2024-10-17 16:21:40 +0100 +hash:76baba0,parents:ae9b6bc,branch:refs/tags/v2.0.0,msg:feat(locale): default locale and switch position is now en,cdate:2024-10-17 16:21:03 +0100,adate:2024-10-17 16:21:03 +0100 +hash:ae9b6bc,parents:924c8f9,branch:refs/tags/v2.0.0,msg:feat(graph): custom x tick now offsets first/last date strings to fit on screen,cdate:2024-10-17 16:19:51 +0100,adate:2024-10-17 16:19:51 +0100 +hash:924c8f9,parents:8abcdd6,branch:refs/tags/v2.0.0,msg:chore(data): extracted axes 2d hook,cdate:2024-10-17 16:12:38 +0100,adate:2024-10-17 16:12:38 +0100 +hash:8abcdd6,parents:d4d645a,branch:refs/tags/v2.0.0,msg:chore(data): hoisted earliest/latest active session dates into context and integrated with x-axis domain,cdate:2024-10-17 16:04:33 +0100,adate:2024-10-17 16:04:33 +0100 +hash:d4d645a,parents:7a78b8d,branch:refs/tags/v2.0.0,msg:feat(data): reworked linear regression algorithm and x-axis domain to work better with dates and ensure line of best fit is linear,cdate:2024-10-17 15:30:01 +0100,adate:2024-10-17 15:30:01 +0100 +hash:7a78b8d,parents:827a805,branch:refs/tags/v2.0.0,msg:test(data): added linear regression hook unit tests and shortened english translations,cdate:2024-10-17 11:25:24 +0100,adate:2024-10-17 11:25:24 +0100 +hash:9f93e5f,parents:9950706,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@34aa1bf564af10c4d3ebeef73542b82385be5163 🚀,cdate:2024-10-16 09:47:17 +0000,adate:2024-10-16 09:47:17 +0000 +hash:34aa1bf,parents:6a66ec6 827a805,branch:refs/tags/v1.0.0,msg:Merge pull request #11 from TomPlum/develop,cdate:2024-10-16 10:46:32 +0100,adate:2024-10-16 10:46:32 +0100 +hash:827a805,parents:5ef49a3,branch:refs/tags/v2.0.0,msg:feat(routing): re-added sleep route to app navigation and added dynamic baseUrl based on mode,cdate:2024-10-16 10:45:53 +0100,adate:2024-10-16 10:45:53 +0100 +hash:9950706,parents:38ff1c2,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@6a66ec6e43d3e2961e869aa07bfed4bcfa369eed 🚀,cdate:2024-10-16 09:39:12 +0000,adate:2024-10-16 09:39:12 +0000 +hash:6a66ec6,parents:46a65f9 5ef49a3,branch:refs/tags/v1.0.0,msg:Merge pull request #10 from TomPlum/develop,cdate:2024-10-16 10:38:22 +0100,adate:2024-10-16 10:38:22 +0100 +hash:5ef49a3,parents:3270ffd,branch:refs/tags/v2.0.0,msg:feat(graph): added language toggle button,cdate:2024-10-16 10:37:53 +0100,adate:2024-10-16 10:37:53 +0100 +hash:38ff1c2,parents:4bebfe5,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@46a65f9bf3c7bf3060a0fccc8b0e5ce4ccdf5310 🚀,cdate:2024-10-15 17:51:27 +0000,adate:2024-10-15 17:51:27 +0000 +hash:46a65f9,parents:7125412 3270ffd,branch:refs/tags/v1.0.0,msg:Merge pull request #9 from TomPlum/develop,cdate:2024-10-15 18:50:48 +0100,adate:2024-10-15 18:50:48 +0100 +hash:3270ffd,parents:fb7455a,branch:refs/tags/v2.0.0,msg:feat(graph): added duration to the tooltip,cdate:2024-10-15 18:49:22 +0100,adate:2024-10-15 18:49:22 +0100 +hash:fb7455a,parents:1606c57,branch:refs/tags/v2.0.0,msg:feat(graph): added healthy data range for sleep quality metric,cdate:2024-10-15 18:43:22 +0100,adate:2024-10-15 18:43:22 +0100 +hash:1606c57,parents:5408eb4,branch:refs/tags/v2.0.0,msg:chore(graph): session count now renders in the current metric colour,cdate:2024-10-15 18:22:41 +0100,adate:2024-10-15 18:22:41 +0100 +hash:5408eb4,parents:adaf340,branch:refs/tags/v2.0.0,msg:chore(graph): tweaked healthy ranges and added translations for session count,cdate:2024-10-15 16:52:42 +0100,adate:2024-10-15 16:52:42 +0100 +hash:adaf340,parents:95dcf41,branch:refs/tags/v2.0.0,msg:chore(styles): added antd dark theme and added total sessions to top left,cdate:2024-10-15 16:45:46 +0100,adate:2024-10-15 16:45:46 +0100 +hash:95dcf41,parents:28293da,branch:refs/tags/v2.0.0,msg:feat(graph): added label to typical session area and added missing jp translations,cdate:2024-10-15 16:37:33 +0100,adate:2024-10-15 16:37:33 +0100 +hash:28293da,parents:c27bf01,branch:refs/tags/v2.0.0,msg:chore(graph): removed enum index signatures in sleep graph datum interface and removed casting,cdate:2024-10-15 16:26:56 +0100,adate:2024-10-15 16:26:56 +0100 +hash:c27bf01,parents:eb84e73,branch:refs/tags/v2.0.0,msg:feat(graph): added custom domain and ticks so the y domain is wrapped tighter around the value range,cdate:2024-10-15 16:07:11 +0100,adate:2024-10-15 16:07:11 +0100 +hash:eb84e73,parents:1a19a6a,branch:refs/tags/v2.0.0,msg:feat(graph): 2d line graph now renders right up against the left viewport edge,cdate:2024-10-15 15:45:53 +0100,adate:2024-10-15 15:45:53 +0100 +hash:1a19a6a,parents:e28e441,branch:refs/tags/v2.0.0,msg:chore(graph): extracted typical sleep session hook for area data,cdate:2024-10-15 14:40:52 +0100,adate:2024-10-15 14:40:52 +0100 +hash:e28e441,parents:7f58f11,branch:refs/tags/v2.0.0,msg:chore(graph): encapsulated properties into linear regression hook,cdate:2024-10-15 14:33:17 +0100,adate:2024-10-15 14:33:17 +0100 +hash:7f58f11,parents:b854f35,branch:refs/tags/v2.0.0,msg:chore(graph): moved linear regression line delta reference lines into hook,cdate:2024-10-15 14:30:56 +0100,adate:2024-10-15 14:30:56 +0100 +hash:b854f35,parents:ddc31b5,branch:refs/tags/v2.0.0,msg:feat(graph): added typical sleep session reference areas,cdate:2024-10-15 14:24:51 +0100,adate:2024-10-15 14:24:51 +0100 +hash:ddc31b5,parents:7e82560,branch:refs/tags/v2.0.0,msg:feat(graph): added reference lines to show regression delta,cdate:2024-10-15 13:40:21 +0100,adate:2024-10-15 13:40:21 +0100 +hash:7e82560,parents:55c405d,branch:refs/tags/v2.0.0,msg:chore(hooks): moved more graph styling logic into a hook,cdate:2024-10-15 11:06:18 +0100,adate:2024-10-15 11:06:18 +0100 +hash:4bebfe5,parents:7d32883,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@71254127053aea2018fab52895ce039a5bcb607c 🚀,cdate:2024-10-15 09:31:40 +0000,adate:2024-10-15 09:31:40 +0000 +hash:7125412,parents:3cf1df4 55c405d,branch:refs/tags/v1.0.0,msg:Merge pull request #8 from TomPlum/develop,cdate:2024-10-15 10:31:01 +0100,adate:2024-10-15 10:31:01 +0100 +hash:55c405d,parents:758174d,branch:refs/tags/v2.0.0,msg:feat(routing): removed internal use of /sleep in favour of / since gh-pages hosts at /sleep anyway,cdate:2024-10-15 10:29:58 +0100,adate:2024-10-15 10:29:58 +0100 +hash:758174d,parents:b081373,branch:refs/tags/v2.0.0,msg:feat(graph): encapsulated more graph styling into custom hook and added active dot radius value,cdate:2024-10-15 10:25:57 +0100,adate:2024-10-15 10:25:57 +0100 +hash:b081373,parents:e50f872,branch:refs/tags/v2.0.0,msg:chore(state): hoisted graph data to react context and fixed render instability,cdate:2024-10-15 10:04:16 +0100,adate:2024-10-15 10:04:16 +0100 +hash:e50f872,parents:5b5f0a9,branch:refs/tags/v2.0.0,msg:chore(state): hoisted sleep page state management to react context,cdate:2024-10-15 09:42:31 +0100,adate:2024-10-15 09:42:31 +0100 +hash:5b5f0a9,parents:9e6b6d9,branch:refs/tags/v2.0.0,msg:feat(graph): graph config now render translucent and becomes opaque on hover,cdate:2024-10-15 09:23:48 +0100,adate:2024-10-15 09:23:48 +0100 +hash:9e6b6d9,parents:e544bc3,branch:refs/tags/v2.0.0,msg:feat(graph): lines now start on the left viewport edge and y-ticks have a background,cdate:2024-10-14 19:45:07 +0100,adate:2024-10-14 19:45:07 +0100 +hash:e544bc3,parents:d683d57,branch:refs/tags/v2.0.0,msg:feat(routing): added 404 not found page,cdate:2024-10-14 19:03:44 +0100,adate:2024-10-14 19:03:44 +0100 +hash:7d32883,parents:9744f6f,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@3cf1df49c0ef97fd2954882c882f8013d59f6c87 🚀,cdate:2024-10-14 17:38:12 +0000,adate:2024-10-14 17:38:12 +0000 +hash:3cf1df4,parents:67d24a6 d683d57,branch:refs/tags/v1.0.0,msg:Merge pull request #7 from TomPlum/develop,cdate:2024-10-14 18:37:31 +0100,adate:2024-10-14 18:37:31 +0100 +hash:d683d57,parents:3a9d56e,branch:refs/tags/v2.0.0,msg:chore(build): added vite base path for gh-pages deployment,cdate:2024-10-14 18:37:03 +0100,adate:2024-10-14 18:37:03 +0100 +hash:9744f6f,parents:e74f89d,branch:refs/remotes/origin/gh-pages,msg:Deploying to gh-pages from @ TomPlum/sleep@67d24a6224871536699e9ef78e8ac62a61c442f7 🚀,cdate:2024-10-14 13:57:51 +0000,adate:2024-10-14 13:57:51 +0000 +hash:e74f89d,parents:,branch:refs/remotes/origin/gh-pages,msg:Initial gh-pages commit,cdate:2024-10-14 13:57:51 +0000,adate:2024-10-14 13:57:51 +0000 +hash:67d24a6,parents:bffed4c 3a9d56e,branch:refs/tags/v1.0.0,msg:Merge pull request #6 from TomPlum/develop,cdate:2024-10-14 14:57:04 +0100,adate:2024-10-14 14:57:04 +0100 +hash:3a9d56e,parents:17b8e10,branch:refs/tags/v2.0.0,msg:chore(build): fixed build issues for release,cdate:2024-10-14 14:56:00 +0100,adate:2024-10-14 14:56:00 +0100 +hash:bffed4c,parents:fd2f791 17b8e10,branch:refs/tags/v1.0.0,msg:Merge pull request #5 from TomPlum/develop,cdate:2024-10-14 14:47:46 +0100,adate:2024-10-14 14:47:46 +0100 +hash:17b8e10,parents:fd2f791,branch:refs/tags/v2.0.0,msg:chore(ci): renamed main workflow -> release,cdate:2024-10-14 14:47:19 +0100,adate:2024-10-14 14:47:19 +0100 +hash:fd2f791,parents:b166be8 a3aad32,branch:refs/tags/v1.0.0,msg:Merge pull request #4 from TomPlum/renovate/all-minor-patch,cdate:2024-10-14 14:45:08 +0100,adate:2024-10-14 14:45:08 +0100 +hash:a3aad32,parents:b166be8,branch:refs/tags/v1.0.0,msg:chore(deps): update all non-major dependencies,cdate:2024-10-14 13:44:02 +0000,adate:2024-10-14 13:44:02 +0000 +hash:b166be8,parents:d399e92 6376640,branch:refs/tags/v1.0.0,msg:Merge pull request #2 from TomPlum/develop,cdate:2024-10-14 14:41:43 +0100,adate:2024-10-14 14:41:43 +0100 +hash:6376640,parents:30d449b,branch:refs/tags/v1.0.0,msg:chore(config): updated renovate rules, schedule and assignee,cdate:2024-10-14 14:41:24 +0100,adate:2024-10-14 14:41:24 +0100 +hash:30d449b,parents:d399e92 949b36d,branch:refs/tags/v1.0.0,msg:Merge pull request #1 from TomPlum/renovate/configure,cdate:2024-10-14 14:39:59 +0100,adate:2024-10-14 14:39:59 +0100 +hash:949b36d,parents:d399e92,branch:refs/tags/v1.0.0,msg:Add renovate.json,cdate:2024-10-14 13:37:36 +0000,adate:2024-10-14 13:37:36 +0000 +hash:d399e92,parents:96d0ac5,branch:refs/tags/v1.0.0,msg:chore(ci): added gh-pages package and added github actions main workflow,cdate:2024-10-14 10:45:28 +0100,adate:2024-10-14 10:45:28 +0100 +hash:96d0ac5,parents:1e65c1d,branch:refs/tags/v1.0.0,msg:feat(graph): extracted metric checkbox component and changed colours based on metric,cdate:2024-10-14 10:41:44 +0100,adate:2024-10-14 10:41:44 +0100 +hash:1e65c1d,parents:30dcafd,branch:refs/tags/v1.0.0,msg:feat(graph): added pie to to tooltip and extracted graph styles hook,cdate:2024-10-14 10:07:12 +0100,adate:2024-10-14 10:07:12 +0100 +hash:30dcafd,parents:72b1f86,branch:refs/tags/v1.0.0,msg:chore(graph): minor improvements to graph formatting & styling,cdate:2024-10-14 09:28:43 +0100,adate:2024-10-14 09:28:43 +0100 +hash:72b1f86,parents:2115a48,branch:refs/tags/v1.0.0,msg:chore(graph): extracted sleep data 2d hook,cdate:2024-10-14 07:55:23 +0100,adate:2024-10-14 07:55:23 +0100 +hash:2115a48,parents:0bf74b1,branch:refs/tags/v1.0.0,msg:feat(graph): increased axis tick stroke width,cdate:2024-10-14 07:45:57 +0100,adate:2024-10-14 07:45:57 +0100 +hash:0bf74b1,parents:5a6b882,branch:refs/tags/v1.0.0,msg:feat(graph): added custom x-axis tick component,cdate:2024-10-14 07:43:44 +0100,adate:2024-10-14 07:43:44 +0100 +hash:5a6b882,parents:9cfcece,branch:refs/tags/v1.0.0,msg:feat(graph): tweaked colours and now stroke width is dynamic based on dataset size,cdate:2024-10-13 16:27:42 +0100,adate:2024-10-13 16:27:42 +0100 +hash:9cfcece,parents:603fbbc,branch:refs/tags/v1.0.0,msg:feat(routing): sleep route now adds default query params if not present,cdate:2024-10-13 16:19:46 +0100,adate:2024-10-13 16:19:46 +0100 +hash:603fbbc,parents:f892161,branch:refs/tags/v1.0.0,msg:chore(test): fixed failing data test and added eslint stylistic plugin,cdate:2024-10-13 15:24:07 +0100,adate:2024-10-13 15:24:07 +0100 +hash:f892161,parents:9df8d6c,branch:refs/tags/v1.0.0,msg:feat(graph): added custom tooltip and filtered out data with no breakdown,cdate:2024-10-13 12:31:54 +0100,adate:2024-10-13 12:31:54 +0100 +hash:9df8d6c,parents:bb8d532,branch:refs/tags/v1.0.0,msg:chore(refactor): extracted custom y-axis tick component into its own file,cdate:2024-10-13 11:26:08 +0100,adate:2024-10-13 11:26:08 +0100 +hash:bb8d532,parents:7955da7,branch:refs/tags/v1.0.0,msg:chore(state): hoisted sleep data state management into a react context,cdate:2024-10-13 11:19:26 +0100,adate:2024-10-13 11:19:26 +0100 +hash:7955da7,parents:5109e9d,branch:refs/tags/v1.0.0,msg:feat(graph): formatting and styling improvements to 2d graph,cdate:2024-10-12 22:14:12 +0100,adate:2024-10-12 22:14:12 +0100 +hash:5109e9d,parents:d160456,branch:refs/tags/v1.0.0,msg:feat(routing): added custom query params hook and serialised date range in query params,cdate:2024-10-12 22:01:25 +0100,adate:2024-10-12 22:01:25 +0100 +hash:d160456,parents:a09ca48,branch:refs/tags/v1.0.0,msg:feat(routing): added router, new base URL and serialised metric in query param,cdate:2024-10-12 21:41:17 +0100,adate:2024-10-12 21:41:17 +0100 +hash:a09ca48,parents:c2ed208,branch:refs/tags/v1.0.0,msg:feat(graph): first pass at linear regression line,cdate:2024-10-12 19:54:44 +0100,adate:2024-10-12 19:54:44 +0100 +hash:c2ed208,parents:4522569,branch:refs/tags/v1.0.0,msg:feat(graph): added date range picker,cdate:2024-10-12 19:10:12 +0100,adate:2024-10-12 19:10:12 +0100 +hash:4522569,parents:eb371fa,branch:refs/tags/v1.0.0,msg:feat(graph): added colours to each sleep metric line,cdate:2024-10-12 17:05:28 +0100,adate:2024-10-12 17:05:28 +0100 +hash:eb371fa,parents:6530e27,branch:refs/tags/v1.0.0,msg:feat(graph): added metric configuration panel,cdate:2024-10-12 16:52:25 +0100,adate:2024-10-12 16:52:25 +0100 +hash:6530e27,parents:d94993e,branch:refs/tags/v1.0.0,msg:feat(graph): basic first pass at a 2D graph with recharts,cdate:2024-10-12 10:55:38 +0100,adate:2024-10-12 10:55:38 +0100 +hash:d94993e,parents:72de5c9,branch:refs/tags/v1.0.0,msg:feat(graph): added awake time to the 3d graph,cdate:2024-10-07 19:38:04 +0100,adate:2024-10-07 19:38:04 +0100 +hash:72de5c9,parents:7e68687,branch:refs/tags/v1.0.0,msg:feat(graph): first pass of rendering a 2D sleep quality graph in 3D,cdate:2024-10-06 17:11:49 +0100,adate:2024-10-06 17:11:49 +0100 +hash:7e68687,parents:ab657c9,branch:refs/tags/v1.0.0,msg:feat(data): mapped pillow data into custom domain object and parsed raw values,cdate:2024-10-06 16:31:02 +0100,adate:2024-10-06 16:31:02 +0100 +hash:ab657c9,parents:b3e99e8,branch:refs/tags/v1.0.0,msg:feat(data): started parsing pillow CSV data,cdate:2024-10-06 12:47:24 +0100,adate:2024-10-06 12:47:24 +0100 +hash:b3e99e8,parents:1e5c110,branch:refs/tags/v1.0.0,msg:chore(config): added react-force-graph and vitest dependencies + pillow data,cdate:2024-10-06 10:42:01 +0100,adate:2024-10-06 10:42:01 +0100 +hash:1e5c110,parents:05d1859,branch:refs/tags/v1.0.0,msg:chore(config): added placeholder page title and favicon,cdate:2024-10-06 10:34:20 +0100,adate:2024-10-06 10:34:20 +0100 +hash:05d1859,parents:,branch:refs/tags/v1.0.0,msg:chore(setup): ran vite@latest with react-swc-ts template,cdate:2024-10-06 09:36:22 +0100,adate:2024-10-06 09:36:22 +0100 \ No newline at end of file diff --git a/packages/library/src/_test/elements/GitLog.ts b/packages/library/src/_test/elements/GitLog.ts new file mode 100644 index 00000000..ea892bbd --- /dev/null +++ b/packages/library/src/_test/elements/GitLog.ts @@ -0,0 +1,26 @@ +import { screen } from '@testing-library/react' +import { ShouldExist } from './types' + +export class GitLogElement { + private getElement(testId: string, shouldExist: T = true as T): T extends true ? HTMLElement : HTMLElement | null { + return (shouldExist ? screen.getByTestId(testId) : screen.queryByTestId(testId)) as any + } + + public container({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('react-git-log', shouldExist) + } + + public branches({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('react-git-log-branches', shouldExist) + } + + public graph({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('react-git-log-graph', shouldExist) + } + + public table({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('react-git-log-table', shouldExist) + } +} + +export const gitLog = new GitLogElement() \ No newline at end of file diff --git a/packages/library/src/_test/elements/Table.ts b/packages/library/src/_test/elements/Table.ts new file mode 100644 index 00000000..7bae99de --- /dev/null +++ b/packages/library/src/_test/elements/Table.ts @@ -0,0 +1,42 @@ +import { screen } from '@testing-library/react' +import { ShouldExist } from './types' + +interface HasRow extends ShouldExist { + row: number +} + +export class Table { + private getElement(testId: string, shouldExist: T = true as T): T extends true ? HTMLElement : HTMLElement | null { + return (shouldExist ? screen.getByTestId(testId) : screen.queryByTestId(testId)) as any + } + + public container({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('react-git-log-table', shouldExist) + } + + public head({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('react-git-log-table-head', shouldExist) + } + + public commitMessageHeader({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('react-git-log-table-header-commit-message', shouldExist) + } + + public timestampHeader({ shouldExist }: ShouldExist = {} as ShouldExist) { + return this.getElement('react-git-log-table-header-timestamp', shouldExist) + } + + public row({ row, shouldExist }: HasRow = {} as HasRow) { + return this.getElement(`react-git-log-table-row-${row}`, shouldExist) + } + + public commitMessageData({ row, shouldExist }: HasRow = {} as HasRow) { + return this.getElement(`react-git-log-table-data-commit-message-${row}`, shouldExist) + } + + public timestampData({ row, shouldExist }: HasRow = {} as HasRow) { + return this.getElement(`react-git-log-table-data-timestamp-${row}`, shouldExist) + } +} + +export const table = new Table() \ No newline at end of file diff --git a/packages/library/src/_test/stubs.ts b/packages/library/src/_test/stubs.ts index b1a46cef..b9635062 100644 --- a/packages/library/src/_test/stubs.ts +++ b/packages/library/src/_test/stubs.ts @@ -1,11 +1,11 @@ -import { Commit } from 'types' +import { Commit, GitLogEntry } from 'types' import { GitContextBag } from 'context/GitContext' import DataIntervalTree from 'node-interval-tree' import { ThemeFunctions } from 'hooks/useTheme' import { GraphData } from 'data' import { GraphColumnState } from 'modules/Graph/components/GraphColumn' -export const commit = (commit?: Partial) => ({ +export const commit = (commit?: Partial): Commit => ({ hash: 'aa2c148', committerDate: '2025-02-24T22:06:22+00:00', authorDate: '2025-02-22 22:06:22 +0000', @@ -21,6 +21,16 @@ export const commit = (commit?: Partial) => ({ ...commit }) +export const entry = (entry?: Partial): GitLogEntry => ({ + hash: 'aa2c148', + committerDate: '2025-02-24T22:06:22+00:00', + authorDate: '2025-02-22 22:06:22 +0000', + message: 'feat(graph): example commit message', + parents: [], + branch: 'refs/remotes/origin/gh-pages', + ...entry +}) + export const gitContextBag = (bag?: Partial): GitContextBag => ({ currentBranch: 'main', defaultGraphContainerWidth: 0, diff --git a/packages/library/src/modules/Table/Table.tsx b/packages/library/src/modules/Table/Table.tsx index e02a4baf..1c3e60c3 100644 --- a/packages/library/src/modules/Table/Table.tsx +++ b/packages/library/src/modules/Table/Table.tsx @@ -77,21 +77,38 @@ export const Table = () => { return (
{showTableHeaders && ( -
-
+
+
Commit message
-
+
Timestamp
@@ -99,18 +116,20 @@ export const Table = () => { {logData.length == 0 && placeholderData.map(({ commit }, i) => ( ))} {logData.map((commit, i) => ( ))}
diff --git a/packages/library/src/modules/Table/components/TableRow/TableRow.tsx b/packages/library/src/modules/Table/components/TableRow/TableRow.tsx index a8525ae7..dc5efbb9 100644 --- a/packages/library/src/modules/Table/components/TableRow/TableRow.tsx +++ b/packages/library/src/modules/Table/components/TableRow/TableRow.tsx @@ -8,7 +8,7 @@ import { useSelectCommit } from 'hooks/useSelectCommit' import dayjs from 'dayjs' import { ROW_HEIGHT } from 'constants/constants' -export const TableRow = ({ commit, isPlaceholder }: GitLogTableRowProps) => { +export const TableRow = ({ index, commit, isPlaceholder, ...props }: GitLogTableRowProps) => { const { textColour, hoverColour, @@ -79,25 +79,31 @@ export const TableRow = ({ commit, isPlaceholder }: GitLogTableRowProps) => { return (
selectCommitHandler.onClick(commit)} onMouseOver={() => selectCommitHandler.onMouseOver(commit)} >
{commit.message}
+ id={`react-git-log-table-data-timestamp-${index}`} + data-testid={`react-git-log-table-data-timestamp-${index}`} + style={{ ...tableDataStyle, ...backgroundStyles, ...classes?.tableStyles?.td }}> {commit.hash === 'index' || isPlaceholder ? '-' : formatTimestamp(commit.committerDate)}
diff --git a/packages/library/src/modules/Table/components/TableRow/types.ts b/packages/library/src/modules/Table/components/TableRow/types.ts index c336a37a..32fe6739 100644 --- a/packages/library/src/modules/Table/components/TableRow/types.ts +++ b/packages/library/src/modules/Table/components/TableRow/types.ts @@ -1,6 +1,7 @@ import { Commit } from 'types' export interface GitLogTableRowProps { + index: number commit: Commit isPlaceholder?: boolean } \ No newline at end of file diff --git a/packages/library/src/types.ts b/packages/library/src/types.ts index 45e45289..dead63f1 100644 --- a/packages/library/src/types.ts +++ b/packages/library/src/types.ts @@ -174,13 +174,13 @@ export interface GitLogStylingProps { * A class name passed to the table * element for the git log. */ - logTableClass?: string + tableClass?: string /** * A React CSS styling object passed to * the table element for the git log. */ - logTableStyles?: { + tableStyles?: { table?: CSSProperties thead?: CSSProperties tr?: CSSProperties diff --git a/packages/library/vite.config.ts b/packages/library/vite.config.ts index fc38bc8e..82fcb7ed 100644 --- a/packages/library/vite.config.ts +++ b/packages/library/vite.config.ts @@ -65,6 +65,7 @@ export default defineConfig({ provider: 'v8', reporter: ['text', 'html'], cleanOnRerun: true, + clean: true, reportOnFailure: true, include: [ 'src' From 88747b268c47cd14f5c862eecb81697b1ed1ce9e Mon Sep 17 00:00:00 2001 From: Thomas Plumpton Date: Sun, 23 Mar 2025 13:22:08 +0000 Subject: [PATCH 31/38] test(log): started writing integration test against the sleep repository data --- .../library/src/GitLog.integration.spec.tsx | 70 + .../library/src/_test/data/gitLogParser.ts | 13 +- .../library/src/_test/data/sleepCommits.ts | 6720 ++++++++++++ packages/library/src/_test/data/sleepState.ts | 9645 +++++++++++++++++ .../library/src/_test/elements/GraphColumn.ts | 60 +- packages/library/src/modules/Graph/Graph.tsx | 2 +- .../Table/components/TableRow/TableRow.tsx | 1 - 7 files changed, 16490 insertions(+), 21 deletions(-) create mode 100644 packages/library/src/GitLog.integration.spec.tsx create mode 100644 packages/library/src/_test/data/sleepCommits.ts create mode 100644 packages/library/src/_test/data/sleepState.ts diff --git a/packages/library/src/GitLog.integration.spec.tsx b/packages/library/src/GitLog.integration.spec.tsx new file mode 100644 index 00000000..b8133d56 --- /dev/null +++ b/packages/library/src/GitLog.integration.spec.tsx @@ -0,0 +1,70 @@ +import sleepRepositoryData from 'test/data/sleep.txt?raw' +import { parseGitLogOutput } from 'test/data/gitLogParser' +import { sleepRepositoryRowColumnState } from 'test/data/sleepState' +import { GraphColumnState } from 'modules/Graph/components/GraphColumn' +import { graphColumn } from 'test/elements/GraphColumn' +import { describe } from 'vitest' +import { render, within } from '@testing-library/react' +import { GitLog } from './GitLog' +import { sleepCommits } from 'test/data/sleepCommits' + +describe('Integration', () => { + it('should render the correct elements in each column for the sleep repository git log entries', () => { + const gitLogEntries = parseGitLogOutput(sleepRepositoryData) + + render( + + ) + + const debugMetrics: Record = {} + + // The row/column state is from index 1 on-wards, + // since the index pseudo-commit is rendered separately. + Object.entries(sleepRepositoryRowColumnState).forEach(([index, columnStates]: [string, GraphColumnState[]]) => { + const rowIndex = Number(index) + // Check branches / tags TODO + + // Check graph state + columnStates.forEach((columnState, columnIndex) => { + const columnElement = graphColumn.at({ + row: Number(rowIndex), + column: columnIndex + }) + + const missingColMsg = `Column container at row ${rowIndex}, column ${columnIndex} was not found in the graph` + expect(columnElement, missingColMsg).toBeInTheDocument() + + if (columnState.isNode) { + const commit = sleepCommits[rowIndex - 1] + const missingNodeMsg = `Expected commit node element in row ${rowIndex}, column ${columnIndex} with hash ${commit.hash}, but it was not found in the graph` + expect(graphColumn.withCommitNode({ hash: commit.hash }), missingNodeMsg) + debugMetrics['commit-nodes'] = (debugMetrics['commit-nodes'] ?? 0) + 1 + } + + if (columnState.isHorizontalLine) { + const insideCurrentColumn = within(columnElement) + + // Nodes in the first column always have half-width horizontal lines. + // A nodes that are the target of merges also have half-width ones. + if (columnState.isNode && (columnState.mergeSourceColumns || columnIndex === 0)) { + const halfWidthLine = graphColumn.halfWidthRightHorizontalLineId + const message = `Expected half-width, right-side, horizontal line element in row ${rowIndex}, column ${columnIndex}, but it was not found.` + expect(insideCurrentColumn.getByTestId(halfWidthLine), message).toBeInTheDocument() + } else { + const fullWidthLine = graphColumn.fullWidthHorizontalLineId + const message = `Expected full-width horizontal line element in row ${rowIndex}, column ${columnIndex}, but it was not found.` + expect(insideCurrentColumn.getByTestId(fullWidthLine), message).toBeInTheDocument() + } + } + }) + + // Check table TODO + }) + + console.debug('Metrics from GitLog integration test for TomPlum/sleep @ release') + console.debug(JSON.stringify(debugMetrics)) + }, { timeout: 120 * 1000 }) +}) \ No newline at end of file diff --git a/packages/library/src/_test/data/gitLogParser.ts b/packages/library/src/_test/data/gitLogParser.ts index 25c3eaca..89ba0378 100644 --- a/packages/library/src/_test/data/gitLogParser.ts +++ b/packages/library/src/_test/data/gitLogParser.ts @@ -9,7 +9,9 @@ export const parseGitLogOutput = (output: string): GitLogEntry[] => { return [] } - return commits + const invalid: string[] = [] + + const parsed = commits .map(commit => { const match = commit.trim().match(logRegex) @@ -24,6 +26,13 @@ export const parseGitLogOutput = (output: string): GitLogEntry[] => { } } - throw Error(`Invalid commit entry data: ${commit}`) + invalid.push(commit) }) + + if (invalid.length > 0) { + console.warn(`There were ${invalid.length} invalid entries in the git log entry data.`) + invalid.forEach(entry => console.warn(entry)) + } + + return parsed.filter(entry => !!entry) } \ No newline at end of file diff --git a/packages/library/src/_test/data/sleepCommits.ts b/packages/library/src/_test/data/sleepCommits.ts new file mode 100644 index 00000000..90778102 --- /dev/null +++ b/packages/library/src/_test/data/sleepCommits.ts @@ -0,0 +1,6720 @@ +import { Commit } from 'types' + +export const sleepCommits: Commit[] = [ + { + hash: 'be2b8a8', + committerDate: '2025-03-23T02:44:38+00:00', + authorDate: '2025-03-20 02:44:38 +0000', + message: 'fix(deps): update all non-major dependencies', + parents: [ + '1352f4c' + ], + branch: 'refs/remotes/origin/renovate/all-minor-patch', + children: [], + isBranchTip: true + }, + { + hash: 'c88f0b9', + committerDate: '2025-03-10T20:42:31+00:00', + authorDate: '2025-03-07 20:42:31 +0000', + message: 'feat(highlights): cleaned up effect function', + parents: [ + '786b044' + ], + branch: 'refs/heads/develop', + children: [], + isBranchTip: true + }, + { + hash: '26130ea', + committerDate: '2025-03-08T17:30:04+00:00', + authorDate: '2025-03-05 17:30:04 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@1352f4c7814aa2ae660d9bd875870608a32734d1 🚀', + parents: [ + '81ce807' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [], + isBranchTip: true + }, + { + hash: 'd5d320b', + committerDate: '2025-03-08T17:29:54+00:00', + authorDate: '2025-03-05 17:29:54 +0000', + message: 'fix(deps): update react monorepo to v19', + parents: [ + '1352f4c' + ], + branch: 'refs/remotes/origin/renovate/major-react-monorepo', + children: [], + isBranchTip: true + }, + { + hash: '6c59bca', + committerDate: '2025-03-08T17:29:47+00:00', + authorDate: '2025-03-05 17:29:47 +0000', + message: 'fix(deps): update dependency react-router-dom to v7', + parents: [ + '1352f4c' + ], + branch: 'refs/remotes/origin/renovate/major-react-router-monorepo', + children: [], + isBranchTip: true + }, + { + hash: '1352f4c', + committerDate: '2025-03-08T17:29:01+00:00', + authorDate: '2025-03-05 17:29:01 +0000', + message: 'Merge pull request #54 from TomPlum/renovate/all-minor-patch', + parents: [ + 'e059c28', + '1d594ea' + ], + branch: 'refs/remotes/origin/release', + children: [ + 'be2b8a8', + 'd5d320b', + '6c59bca' + ], + isBranchTip: false + }, + { + hash: '1d594ea', + committerDate: '2025-03-08T10:55:09+00:00', + authorDate: '2025-03-05 10:55:09 +0000', + message: 'fix(deps): update all non-major dependencies', + parents: [ + 'e059c28' + ], + branch: 'refs/remotes/origin/release', + children: [ + '1352f4c' + ], + isBranchTip: false + }, + { + hash: '786b044', + committerDate: '2025-03-07T19:22:11+00:00', + authorDate: '2025-03-04 19:22:11 +0000', + message: 'feat(highlights): Extracted ShowcaseProgressDots component', + parents: [ + '0776115' + ], + branch: 'refs/heads/develop', + children: [ + 'c88f0b9' + ], + isBranchTip: false + }, + { + hash: '0776115', + committerDate: '2025-03-07T18:54:59+00:00', + authorDate: '2025-03-04 18:54:59 +0000', + message: 'feat(highlights): responsive styling improvements to wake up showcase', + parents: [ + '0a0a44d' + ], + branch: 'refs/heads/develop', + children: [ + '786b044' + ], + isBranchTip: false + }, + { + hash: '0a0a44d', + committerDate: '2025-03-07T18:36:14+00:00', + authorDate: '2025-03-04 18:36:14 +0000', + message: 'feat(highlights): added active showcase to query params', + parents: [ + '769e569' + ], + branch: 'refs/heads/develop', + children: [ + '0776115' + ], + isBranchTip: false + }, + { + hash: '769e569', + committerDate: '2025-03-07T18:18:59+00:00', + authorDate: '2025-03-04 18:18:59 +0000', + message: 'feat(highlights): starting adding progress dots to wake up showcase', + parents: [ + '02af2b4' + ], + branch: 'refs/heads/develop', + children: [ + '0a0a44d' + ], + isBranchTip: false + }, + { + hash: '02af2b4', + committerDate: '2025-03-06T19:30:12+00:00', + authorDate: '2025-03-03 19:30:12 +0000', + message: 'feat(highlights): positioned text in wakeup showcase', + parents: [ + 'de2ac76' + ], + branch: 'refs/heads/develop', + children: [ + '769e569' + ], + isBranchTip: false + }, + { + hash: 'de2ac76', + committerDate: '2025-03-04T19:00:19+00:00', + authorDate: '2025-03-01 19:00:19 +0000', + message: 'feat(highlights): refactored page so showcases are full viewport size and added lakeside sunrise animation', + parents: [ + 'd81f45e' + ], + branch: 'refs/heads/develop', + children: [ + '02af2b4' + ], + isBranchTip: false + }, + { + hash: 'd81f45e', + committerDate: '2025-03-04T18:24:09+00:00', + authorDate: '2025-03-01 18:24:09 +0000', + message: 'feat(highlights): started calculating average wakeup times', + parents: [ + '4a5f077' + ], + branch: 'refs/heads/develop', + children: [ + 'de2ac76' + ], + isBranchTip: false + }, + { + hash: '4a5f077', + committerDate: '2025-03-04T17:21:50+00:00', + authorDate: '2025-03-01 17:21:50 +0000', + message: 'feat(highlights): fixed showcase context', + parents: [ + '33d2930' + ], + branch: 'refs/heads/develop', + children: [ + 'd81f45e' + ], + isBranchTip: false + }, + { + hash: '33d2930', + committerDate: '2025-03-03T15:26:55+00:00', + authorDate: '2025-02-28 15:26:55 +0000', + message: 'feat(highlights): started implementing custom showcase', + parents: [ + '6671923' + ], + branch: 'refs/heads/develop', + children: [ + '4a5f077' + ], + isBranchTip: false + }, + { + hash: '6671923', + committerDate: '2025-03-02T17:53:06+00:00', + authorDate: '2025-02-27 17:53:06 +0000', + message: 'feat(highlights): extracted LandingPageHeading.tsx component', + parents: [ + 'a8bfc71' + ], + branch: 'refs/heads/develop', + children: [ + '33d2930' + ], + isBranchTip: false + }, + { + hash: 'a8bfc71', + committerDate: '2025-03-02T17:49:03+00:00', + authorDate: '2025-02-27 17:49:03 +0000', + message: 'feat(styling): added back to charts link in highlights landing page', + parents: [ + '69e20aa' + ], + branch: 'refs/heads/develop', + children: [ + '6671923' + ], + isBranchTip: false + }, + { + hash: '69e20aa', + committerDate: '2025-03-01T21:10:47+00:00', + authorDate: '2025-02-26 21:10:47 +0000', + message: 'feat(styling): minor improvements to layout of highlights showcases', + parents: [ + 'ec397ea' + ], + branch: 'refs/heads/develop', + children: [ + 'a8bfc71' + ], + isBranchTip: false + }, + { + hash: 'ec397ea', + committerDate: '2025-03-01T20:56:55+00:00', + authorDate: '2025-02-26 20:56:55 +0000', + message: 'feat(styling): added in remaining exit animations after starting', + parents: [ + '2c26dfb' + ], + branch: 'refs/heads/develop', + children: [ + '69e20aa' + ], + isBranchTip: false + }, + { + hash: '2c26dfb', + committerDate: '2025-03-01T20:45:52+00:00', + authorDate: '2025-02-26 20:45:52 +0000', + message: 'feat(styling): added moon and land exit animations', + parents: [ + '3dc9b40' + ], + branch: 'refs/heads/develop', + children: [ + 'ec397ea' + ], + isBranchTip: false + }, + { + hash: '3dc9b40', + committerDate: '2025-03-01T20:33:32+00:00', + authorDate: '2025-02-26 20:33:32 +0000', + message: 'feat(styling): added moon loading state', + parents: [ + '8c8952a' + ], + branch: 'refs/heads/develop', + children: [ + '2c26dfb' + ], + isBranchTip: false + }, + { + hash: '8c8952a', + committerDate: '2025-03-01T20:25:51+00:00', + authorDate: '2025-02-26 20:25:51 +0000', + message: 'feat(styling): added compact sleep data loading component', + parents: [ + 'a267aea' + ], + branch: 'refs/heads/develop', + children: [ + '3dc9b40' + ], + isBranchTip: false + }, + { + hash: 'a267aea', + committerDate: '2025-03-01T19:42:48+00:00', + authorDate: '2025-02-26 19:42:48 +0000', + message: 'feat(styling): extracted night sky scene into component', + parents: [ + '9994eec' + ], + branch: 'refs/heads/develop', + children: [ + '8c8952a' + ], + isBranchTip: false + }, + { + hash: '9994eec', + committerDate: '2025-03-01T19:40:30+00:00', + authorDate: '2025-02-26 19:40:30 +0000', + message: 'feat(styling): added extra shooting star', + parents: [ + '52aa9dd' + ], + branch: 'refs/heads/develop', + children: [ + 'a267aea' + ], + isBranchTip: false + }, + { + hash: '52aa9dd', + committerDate: '2025-03-01T19:37:02+00:00', + authorDate: '2025-02-26 19:37:02 +0000', + message: 'feat(styling): adjustments to moon', + parents: [ + '18088d2' + ], + branch: 'refs/heads/develop', + children: [ + '9994eec' + ], + isBranchTip: false + }, + { + hash: '18088d2', + committerDate: '2025-03-01T19:32:50+00:00', + authorDate: '2025-02-26 19:32:50 +0000', + message: 'feat(styling): added generated stars to background scene', + parents: [ + '0c202af' + ], + branch: 'refs/heads/develop', + children: [ + '52aa9dd' + ], + isBranchTip: false + }, + { + hash: '0c202af', + committerDate: '2025-03-01T17:59:21+00:00', + authorDate: '2025-02-26 17:59:21 +0000', + message: 'feat(styling): making scene more responsive and full screen', + parents: [ + 'cf56b70' + ], + branch: 'refs/heads/develop', + children: [ + '18088d2' + ], + isBranchTip: false + }, + { + hash: 'cf56b70', + committerDate: '2025-03-01T17:27:45+00:00', + authorDate: '2025-02-26 17:27:45 +0000', + message: 'feat(styling): experimenting with highlights landing styling', + parents: [ + 'b61aeed' + ], + branch: 'refs/heads/develop', + children: [ + '0c202af' + ], + isBranchTip: false + }, + { + hash: '5a67c90', + committerDate: '2025-02-28T17:14:01+00:00', + authorDate: '2025-02-25 17:14:01 +0000', + message: 'fix(deps): update react monorepo to v19', + parents: [ + 'e059c28' + ], + branch: 'refs/heads/renovate/major-react-monorepo', + children: [], + isBranchTip: true + }, + { + hash: 'b61aeed', + committerDate: '2025-02-28T17:11:36+00:00', + authorDate: '2025-02-25 17:11:36 +0000', + message: 'fix(styling): fixed dart sass 3.0 deprecation warnings', + parents: [ + '2d173ca' + ], + branch: 'refs/heads/develop', + children: [ + 'cf56b70' + ], + isBranchTip: false + }, + { + hash: '81ce807', + committerDate: '2025-02-28T17:09:11+00:00', + authorDate: '2025-02-25 17:09:11 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@e059c28b8fa1668ec033daca1648f00a78126bc5 🚀', + parents: [ + 'f2d49cf' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '26130ea' + ], + isBranchTip: false + }, + { + hash: '2d173ca', + committerDate: '2025-02-28T17:08:31+00:00', + authorDate: '2025-02-25 17:08:31 +0000', + message: 'Merge branch \'release\' into develop', + parents: [ + '51ba1e7', + 'e059c28' + ], + branch: 'refs/heads/develop', + children: [ + 'b61aeed' + ], + isBranchTip: false + }, + { + hash: 'e059c28', + committerDate: '2025-02-28T17:08:06+00:00', + authorDate: '2025-02-25 17:08:06 +0000', + message: 'Merge pull request #39 from TomPlum/renovate/vite-6.x', + parents: [ + '0b78e07', + '867c511' + ], + branch: 'refs/heads/release', + children: [ + '1352f4c', + '1d594ea', + '5a67c90', + '2d173ca' + ], + isBranchTip: false + }, + { + hash: '51ba1e7', + committerDate: '2025-02-28T17:07:43+00:00', + authorDate: '2025-02-25 17:07:43 +0000', + message: 'feat(page): playing with highlights landing page styling', + parents: [ + '675127e' + ], + branch: 'refs/heads/develop', + children: [ + '2d173ca' + ], + isBranchTip: false + }, + { + hash: '675127e', + committerDate: '2025-02-27T19:56:47+00:00', + authorDate: '2025-02-24 19:56:47 +0000', + message: 'feat(page): moved colours, added sleeping animation', + parents: [ + '017e506' + ], + branch: 'refs/heads/develop', + children: [ + '51ba1e7' + ], + isBranchTip: false + }, + { + hash: '017e506', + committerDate: '2025-02-27T17:48:20+00:00', + authorDate: '2025-02-24 17:48:20 +0000', + message: 'feat(page): progress on highlights page', + parents: [ + 'ff018dd' + ], + branch: 'refs/heads/develop', + children: [ + '675127e' + ], + isBranchTip: false + }, + { + hash: 'ff018dd', + committerDate: '2025-02-26T19:29:55+00:00', + authorDate: '2025-02-23 19:29:55 +0000', + message: 'feat(page): initial pass of best session showcase content', + parents: [ + 'f28088d' + ], + branch: 'refs/heads/develop', + children: [ + '017e506' + ], + isBranchTip: false + }, + { + hash: 'f28088d', + committerDate: '2025-02-26T19:09:41+00:00', + authorDate: '2025-02-23 19:09:41 +0000', + message: 'feat(page): initial highlights page work for showcases', + parents: [ + 'f7cd757' + ], + branch: 'refs/heads/develop', + children: [ + 'ff018dd' + ], + isBranchTip: false + }, + { + hash: 'f7cd757', + committerDate: '2025-02-26T18:48:35+00:00', + authorDate: '2025-02-23 18:48:35 +0000', + message: 'chore(docs): added tsdoc to NestedProgressCircle props interface', + parents: [ + 'ea5a998' + ], + branch: 'refs/heads/develop', + children: [ + 'f28088d' + ], + isBranchTip: false + }, + { + hash: 'ea5a998', + committerDate: '2025-02-26T17:44:59+00:00', + authorDate: '2025-02-23 17:44:59 +0000', + message: 'feat(routing): added highlights page and made query param routing only for sleep page', + parents: [ + 'efe3dd6' + ], + branch: 'refs/heads/develop', + children: [ + 'f7cd757' + ], + isBranchTip: false + }, + { + hash: 'f2d49cf', + committerDate: '2025-02-26T16:40:46+00:00', + authorDate: '2025-02-23 16:40:46 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@0b78e0746d5a183a5be7879a9726815df474e857 🚀', + parents: [ + '30ee0ba' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '81ce807' + ], + isBranchTip: false + }, + { + hash: '0b78e07', + committerDate: '2025-02-26T16:39:50+00:00', + authorDate: '2025-02-23 16:39:50 +0000', + message: 'Merge pull request #52 from TomPlum/develop', + parents: [ + '7355361', + 'efe3dd6' + ], + branch: 'refs/tags/v2.4.0', + children: [ + 'e059c28' + ], + isBranchTip: false + }, + { + hash: 'efe3dd6', + committerDate: '2025-02-26T16:38:25+00:00', + authorDate: '2025-02-23 16:38:25 +0000', + message: 'feat(chart): moved session highlights card', + parents: [ + 'd524100' + ], + branch: 'refs/heads/develop', + children: [ + 'ea5a998', + '0b78e07' + ], + isBranchTip: false + }, + { + hash: 'd524100', + committerDate: '2025-02-26T16:35:33+00:00', + authorDate: '2025-02-23 16:35:33 +0000', + message: 'feat(chart): Re-added locale toggle as ascii checkbox', + parents: [ + '50250a9' + ], + branch: 'refs/heads/develop', + children: [ + 'efe3dd6' + ], + isBranchTip: false + }, + { + hash: '50250a9', + committerDate: '2025-02-26T16:29:15+00:00', + authorDate: '2025-02-23 16:29:15 +0000', + message: 'feat(chart): Added show highlights card toggle to controls + jp translations', + parents: [ + 'bb950c2' + ], + branch: 'refs/heads/develop', + children: [ + 'd524100' + ], + isBranchTip: false + }, + { + hash: 'bb950c2', + committerDate: '2025-02-26T16:08:30+00:00', + authorDate: '2025-02-23 16:08:30 +0000', + message: 'feat(chart): Fixed carousel theming in SessionHighlightCard.tsx', + parents: [ + '432fd9c' + ], + branch: 'refs/heads/develop', + children: [ + '50250a9' + ], + isBranchTip: false + }, + { + hash: '432fd9c', + committerDate: '2025-02-26T15:46:54+00:00', + authorDate: '2025-02-23 15:46:54 +0000', + message: 'Merge branch \'release\' into develop', + parents: [ + '6115d5f', + '7355361' + ], + branch: 'refs/heads/develop', + children: [ + 'bb950c2' + ], + isBranchTip: false + }, + { + hash: '6115d5f', + committerDate: '2025-02-26T13:03:09+00:00', + authorDate: '2025-02-23 13:03:09 +0000', + message: 'feat(chart): Extracted HighlightCarouselItem component', + parents: [ + 'b45bf05' + ], + branch: 'refs/heads/develop', + children: [ + '432fd9c' + ], + isBranchTip: false + }, + { + hash: 'b45bf05', + committerDate: '2025-02-26T12:56:22+00:00', + authorDate: '2025-02-23 12:56:22 +0000', + message: 'feat(chart): Moved SessionHighlightCard to Highlights module', + parents: [ + '6beb2d1' + ], + branch: 'refs/heads/develop', + children: [ + '6115d5f' + ], + isBranchTip: false + }, + { + hash: '6beb2d1', + committerDate: '2025-02-26T12:54:45+00:00', + authorDate: '2025-02-23 12:54:45 +0000', + message: 'feat(chart): Extracted NestedProgressCircles components in new Highlights module', + parents: [ + '2bc6652' + ], + branch: 'refs/heads/develop', + children: [ + 'b45bf05' + ], + isBranchTip: false + }, + { + hash: '2bc6652', + committerDate: '2025-02-25T23:56:31+00:00', + authorDate: '2025-02-22 23:56:31 +0000', + message: 'feat(chart): Added formatDuration util and added details to highlight card', + parents: [ + 'ab51db5' + ], + branch: 'refs/heads/develop', + children: [ + '6beb2d1' + ], + isBranchTip: false + }, + { + hash: 'ab51db5', + committerDate: '2025-02-25T23:33:27+00:00', + authorDate: '2025-02-22 23:33:27 +0000', + message: 'feat(chart): added nested progress circle to session highlight', + parents: [ + '165b754' + ], + branch: 'refs/heads/develop', + children: [ + '2bc6652' + ], + isBranchTip: false + }, + { + hash: '165b754', + committerDate: '2025-02-25T23:24:09+00:00', + authorDate: '2025-02-22 23:24:09 +0000', + message: 'feat(chart): starting new session highlight component', + parents: [ + 'eff7491' + ], + branch: 'refs/heads/develop', + children: [ + 'ab51db5' + ], + isBranchTip: false + }, + { + hash: '30ee0ba', + committerDate: '2025-02-25T22:48:03+00:00', + authorDate: '2025-02-22 22:48:03 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@7355361e6e85ef1159cfe61f676044dc71d5f2fd 🚀', + parents: [ + 'aa2c148' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'f2d49cf' + ], + isBranchTip: false + }, + { + hash: '7355361', + committerDate: '2025-02-25T22:47:07+00:00', + authorDate: '2025-02-22 22:47:07 +0000', + message: 'Merge pull request #51 from TomPlum/develop', + parents: [ + '515eaa9', + 'eff7491' + ], + branch: 'refs/tags/v2.3.1', + children: [ + '0b78e07', + '432fd9c' + ], + isBranchTip: false + }, + { + hash: 'eff7491', + committerDate: '2025-02-25T22:45:59+00:00', + authorDate: '2025-02-22 22:45:59 +0000', + message: 'chore(docs): updated web worker loading image for docs', + parents: [ + '127dd9c' + ], + branch: 'refs/heads/develop', + children: [ + '165b754', + '7355361' + ], + isBranchTip: false + }, + { + hash: '127dd9c', + committerDate: '2025-02-25T22:44:34+00:00', + authorDate: '2025-02-22 22:44:34 +0000', + message: 'fix(styling): fixed positioning issue in starry background', + parents: [ + '0964b7d' + ], + branch: 'refs/heads/develop', + children: [ + 'eff7491' + ], + isBranchTip: false + }, + { + hash: '0964b7d', + committerDate: '2025-02-25T22:33:55+00:00', + authorDate: '2025-02-22 22:33:55 +0000', + message: 'fix(params): date range params now default to last 2 months if they are not present on page load', + parents: [ + 'f4ef8e9' + ], + branch: 'refs/heads/develop', + children: [ + '127dd9c' + ], + isBranchTip: false + }, + { + hash: 'f4ef8e9', + committerDate: '2025-02-25T22:11:18+00:00', + authorDate: '2025-02-22 22:11:18 +0000', + message: 'feat(loading): added starry background to data loading page', + parents: [ + '5510915' + ], + branch: 'refs/heads/develop', + children: [ + '0964b7d' + ], + isBranchTip: false + }, + { + hash: 'aa2c148', + committerDate: '2025-02-25T22:06:22+00:00', + authorDate: '2025-02-22 22:06:22 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@88a3ca2bc032b0ddf44eff0d272abf71052fbbe5 🚀', + parents: [ + 'afdb263' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '30ee0ba' + ], + isBranchTip: false + }, + { + hash: '515eaa9', + committerDate: '2025-02-25T22:05:44+00:00', + authorDate: '2025-02-22 22:05:44 +0000', + message: 'Merge pull request #49 from TomPlum/renovate/major-eslint-stylistic-monorepo', + parents: [ + '88a3ca2', + '575887a' + ], + branch: 'refs/tags/v2.3.1', + children: [ + '7355361' + ], + isBranchTip: false + }, + { + hash: '88a3ca2', + committerDate: '2025-02-25T22:05:23+00:00', + authorDate: '2025-02-22 22:05:23 +0000', + message: 'Merge pull request #48 from TomPlum/renovate/all-minor-patch', + parents: [ + 'fd93615', + '932be3a' + ], + branch: 'refs/tags/v2.3.1', + children: [ + '515eaa9' + ], + isBranchTip: false + }, + { + hash: 'fd93615', + committerDate: '2025-02-25T22:05:07+00:00', + authorDate: '2025-02-22 22:05:07 +0000', + message: 'Merge pull request #50 from TomPlum/renovate/globals-16.x', + parents: [ + '3d4d017', + 'f687c53' + ], + branch: 'refs/tags/v2.3.1', + children: [ + '88a3ca2' + ], + isBranchTip: false + }, + { + hash: '5510915', + committerDate: '2025-02-25T21:52:51+00:00', + authorDate: '2025-02-22 21:52:51 +0000', + message: 'feat(page): added back link on improvements page', + parents: [ + '202237c' + ], + branch: 'refs/heads/develop', + children: [ + 'f4ef8e9' + ], + isBranchTip: false + }, + { + hash: '202237c', + committerDate: '2025-02-25T21:51:17+00:00', + authorDate: '2025-02-22 21:51:17 +0000', + message: 'feat(page): rough first draft of improvements page content', + parents: [ + '4be118d' + ], + branch: 'refs/heads/develop', + children: [ + '5510915' + ], + isBranchTip: false + }, + { + hash: 'f687c53', + committerDate: '2025-02-25T07:05:41+00:00', + authorDate: '2025-02-22 07:05:41 +0000', + message: 'chore(deps): update dependency globals to v16', + parents: [ + '3d4d017' + ], + branch: 'refs/tags/v2.3.1', + children: [ + 'fd93615' + ], + isBranchTip: false + }, + { + hash: '575887a', + committerDate: '2025-02-25T02:47:35+00:00', + authorDate: '2025-02-22 02:47:35 +0000', + message: 'chore(deps): update dependency @stylistic/eslint-plugin to v4', + parents: [ + '3d4d017' + ], + branch: 'refs/tags/v2.3.1', + children: [ + '515eaa9' + ], + isBranchTip: false + }, + { + hash: '932be3a', + committerDate: '2025-02-25T02:47:25+00:00', + authorDate: '2025-02-22 02:47:25 +0000', + message: 'fix(deps): update all non-major dependencies', + parents: [ + '3d4d017' + ], + branch: 'refs/tags/v2.3.1', + children: [ + '88a3ca2' + ], + isBranchTip: false + }, + { + hash: '4be118d', + committerDate: '2025-02-22T21:06:34+00:00', + authorDate: '2025-02-19 21:06:34 +0000', + message: 'chore(docs): added missing ToC entry in readme', + parents: [ + 'a338942' + ], + branch: 'refs/heads/develop', + children: [ + '202237c' + ], + isBranchTip: false + }, + { + hash: 'a338942', + committerDate: '2025-02-19T17:26:41+00:00', + authorDate: '2025-02-16 17:26:41 +0000', + message: 'chore(docs): more docs additions in readme', + parents: [ + 'f17afd7' + ], + branch: 'refs/heads/develop', + children: [ + '4be118d' + ], + isBranchTip: false + }, + { + hash: 'f17afd7', + committerDate: '2025-02-19T17:20:01+00:00', + authorDate: '2025-02-16 17:20:01 +0000', + message: 'chore(docs): updated readme images and docs', + parents: [ + '3d4d017' + ], + branch: 'refs/heads/develop', + children: [ + 'a338942' + ], + isBranchTip: false + }, + { + hash: 'afdb263', + committerDate: '2025-02-19T15:23:06+00:00', + authorDate: '2025-02-16 15:23:06 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@3d4d017bf91addfc357a9bfcc88ccfc4eceae78c 🚀', + parents: [ + 'a829a48' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'aa2c148' + ], + isBranchTip: false + }, + { + hash: '3d4d017', + committerDate: '2025-02-19T15:22:11+00:00', + authorDate: '2025-02-16 15:22:11 +0000', + message: 'Merge pull request #47 from TomPlum/renovate/all-minor-patch', + parents: [ + '5525ed5', + 'f157195' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'fd93615', + 'f687c53', + '575887a', + '932be3a', + 'f17afd7' + ], + isBranchTip: false + }, + { + hash: '867c511', + committerDate: '2025-02-19T15:21:55+00:00', + authorDate: '2025-02-16 15:21:55 +0000', + message: 'chore(deps): update dependency vite to v6', + parents: [ + '5525ed5' + ], + branch: 'refs/heads/release', + children: [ + 'e059c28' + ], + isBranchTip: false + }, + { + hash: 'a829a48', + committerDate: '2025-02-19T15:21:20+00:00', + authorDate: '2025-02-16 15:21:20 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@5525ed5d3a90dca5f4930426d8f6367f67587575 🚀', + parents: [ + '8ddccd2' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'afdb263' + ], + isBranchTip: false + }, + { + hash: 'f157195', + committerDate: '2025-02-19T15:21:05+00:00', + authorDate: '2025-02-16 15:21:05 +0000', + message: 'fix(deps): update all non-major dependencies', + parents: [ + '5525ed5' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '3d4d017' + ], + isBranchTip: false + }, + { + hash: '5525ed5', + committerDate: '2025-02-19T15:20:20+00:00', + authorDate: '2025-02-16 15:20:20 +0000', + message: 'Merge pull request #38 from TomPlum/develop', + parents: [ + '5862498', + '081b2d3' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '3d4d017', + '867c511', + 'f157195' + ], + isBranchTip: false + }, + { + hash: '081b2d3', + committerDate: '2025-02-19T15:16:44+00:00', + authorDate: '2025-02-16 15:16:44 +0000', + message: 'chore(data): added latest pillow data 16/02/2025', + parents: [ + 'a10ab03' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '5525ed5' + ], + isBranchTip: false + }, + { + hash: 'a10ab03', + committerDate: '2025-02-19T15:02:17+00:00', + authorDate: '2025-02-16 15:02:17 +0000', + message: 'Merge branch \'release\' into develop', + parents: [ + '55ec23e', + '5862498' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '081b2d3' + ], + isBranchTip: false + }, + { + hash: '8ddccd2', + committerDate: '2025-02-19T15:01:01+00:00', + authorDate: '2025-02-16 15:01:01 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@58624987661cae7503ac110e7ec054e47e62cd2c 🚀', + parents: [ + '5db47c6' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'a829a48' + ], + isBranchTip: false + }, + { + hash: '5862498', + committerDate: '2025-02-19T15:00:05+00:00', + authorDate: '2025-02-16 15:00:05 +0000', + message: 'Merge pull request #46 from TomPlum/renovate/all-minor-patch', + parents: [ + '27d7e9e', + 'eeeb1f2' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '5525ed5', + 'a10ab03' + ], + isBranchTip: false + }, + { + hash: 'eeeb1f2', + committerDate: '2025-02-17T01:53:30+00:00', + authorDate: '2025-02-14 01:53:30 +0000', + message: 'fix(deps): update all non-major dependencies', + parents: [ + '27d7e9e' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '5862498' + ], + isBranchTip: false + }, + { + hash: '55ec23e', + committerDate: '2025-02-04T15:22:07+00:00', + authorDate: '2025-02-01 15:22:07 +0000', + message: 'fix(deps): npm install to fix lockfile issues', + parents: [ + '75fea53' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'a10ab03' + ], + isBranchTip: false + }, + { + hash: '75fea53', + committerDate: '2025-02-04T15:21:44+00:00', + authorDate: '2025-02-01 15:21:44 +0000', + message: 'Merge branch \'refs/heads/release\' into develop', + parents: [ + 'e11674d', + '27d7e9e' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '55ec23e' + ], + isBranchTip: false + }, + { + hash: '27d7e9e', + committerDate: '2025-02-04T15:21:11+00:00', + authorDate: '2025-02-01 15:21:11 +0000', + message: 'Merge pull request #45 from TomPlum/renovate/major-eslint-stylistic-monorepo', + parents: [ + '338b505', + '0577e9d' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '5862498', + 'eeeb1f2', + '75fea53' + ], + isBranchTip: false + }, + { + hash: '338b505', + committerDate: '2025-02-04T15:20:55+00:00', + authorDate: '2025-02-01 15:20:55 +0000', + message: 'Merge pull request #43 from TomPlum/renovate/jsdom-26.x', + parents: [ + '988bf8d', + 'ca136bf' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '27d7e9e' + ], + isBranchTip: false + }, + { + hash: '988bf8d', + committerDate: '2025-02-04T15:20:45+00:00', + authorDate: '2025-02-01 15:20:45 +0000', + message: 'Merge pull request #44 from TomPlum/renovate/major-vitest-monorepo', + parents: [ + 'b35728b', + '648f6e9' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '338b505' + ], + isBranchTip: false + }, + { + hash: 'e11674d', + committerDate: '2025-02-04T15:17:11+00:00', + authorDate: '2025-02-01 15:17:11 +0000', + message: 'Merge branch \'release\' into develop', + parents: [ + '72a5dbb', + 'b35728b' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '75fea53' + ], + isBranchTip: false + }, + { + hash: '5db47c6', + committerDate: '2025-02-04T15:16:35+00:00', + authorDate: '2025-02-01 15:16:35 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@b35728b6da106abb0f2c82c143ae0b4a6e31f668 🚀', + parents: [ + 'd26bcc7' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '8ddccd2' + ], + isBranchTip: false + }, + { + hash: '0577e9d', + committerDate: '2025-02-04T15:16:12+00:00', + authorDate: '2025-02-01 15:16:12 +0000', + message: 'chore(deps): update dependency @stylistic/eslint-plugin to v3', + parents: [ + 'b35728b' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '27d7e9e' + ], + isBranchTip: false + }, + { + hash: 'b35728b', + committerDate: '2025-02-04T15:15:42+00:00', + authorDate: '2025-02-01 15:15:42 +0000', + message: 'Merge pull request #42 from TomPlum/renovate/all-minor-patch', + parents: [ + '09e615d', + '0f5ae74' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '988bf8d', + 'e11674d', + '0577e9d' + ], + isBranchTip: false + }, + { + hash: '0f5ae74', + committerDate: '2025-02-03T21:51:43+00:00', + authorDate: '2025-01-31 21:51:43 +0000', + message: 'fix(deps): update all non-major dependencies', + parents: [ + '09e615d' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'b35728b' + ], + isBranchTip: false + }, + { + hash: '648f6e9', + committerDate: '2025-01-22T09:39:08+00:00', + authorDate: '2025-01-19 09:39:08 +0000', + message: 'chore(deps): update vitest monorepo to v3', + parents: [ + '09e615d' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '988bf8d' + ], + isBranchTip: false + }, + { + hash: 'ca136bf', + committerDate: '2025-01-14T01:17:46+00:00', + authorDate: '2025-01-11 01:17:46 +0000', + message: 'chore(deps): update dependency jsdom to v26', + parents: [ + '09e615d' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '338b505' + ], + isBranchTip: false + }, + { + hash: '09e615d', + committerDate: '2025-01-12T20:17:13+00:00', + authorDate: '2025-01-09 20:17:13 +0000', + message: 'Merge pull request #41 from TomPlum/renovate/react-error-boundary-5.x', + parents: [ + 'b7ec825', + '2b85a9e' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'b35728b', + '0f5ae74', + '648f6e9', + 'ca136bf' + ], + isBranchTip: false + }, + { + hash: '72a5dbb', + committerDate: '2025-01-12T20:16:59+00:00', + authorDate: '2025-01-09 20:16:59 +0000', + message: 'fix(deps): removed redundant package-lock.json entries', + parents: [ + '5281010' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'e11674d' + ], + isBranchTip: false + }, + { + hash: '5281010', + committerDate: '2025-01-12T20:15:57+00:00', + authorDate: '2025-01-09 20:15:57 +0000', + message: 'Merge branch \'release\' into develop', + parents: [ + '000b3aa', + 'b7ec825' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '72a5dbb' + ], + isBranchTip: false + }, + { + hash: 'd26bcc7', + committerDate: '2025-01-12T20:15:47+00:00', + authorDate: '2025-01-09 20:15:47 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@b7ec8259f761ea82faf75ed4da7502589769e1a7 🚀', + parents: [ + '74885fc' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '5db47c6' + ], + isBranchTip: false + }, + { + hash: 'b7ec825', + committerDate: '2025-01-12T20:14:48+00:00', + authorDate: '2025-01-09 20:14:48 +0000', + message: 'Merge pull request #35 from TomPlum/renovate/all-minor-patch', + parents: [ + '810a868', + '3d680fd' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '09e615d', + '5281010' + ], + isBranchTip: false + }, + { + hash: '3d680fd', + committerDate: '2025-01-11T22:25:06+00:00', + authorDate: '2025-01-08 22:25:06 +0000', + message: 'fix(deps): update all non-major dependencies', + parents: [ + '810a868' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'b7ec825' + ], + isBranchTip: false + }, + { + hash: '2b85a9e', + committerDate: '2024-12-24T21:55:38+00:00', + authorDate: '2024-12-21 21:55:38 +0000', + message: 'fix(deps): update dependency react-error-boundary to v5', + parents: [ + '810a868' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '09e615d' + ], + isBranchTip: false + }, + { + hash: '000b3aa', + committerDate: '2024-12-01T19:10:41+00:00', + authorDate: '2024-11-28 19:10:41 +0000', + message: 'fix(graph): filtered out metric nodes that have a value of 0', + parents: [ + '45dbbde' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '5281010' + ], + isBranchTip: false + }, + { + hash: '45dbbde', + committerDate: '2024-12-01T19:08:06+00:00', + authorDate: '2024-11-28 19:08:06 +0000', + message: 'feat(graph): minor styling consistency improvements to the ascii inputs', + parents: [ + '2c60633' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '000b3aa' + ], + isBranchTip: false + }, + { + hash: '2c60633', + committerDate: '2024-12-01T18:50:33+00:00', + authorDate: '2024-11-28 18:50:33 +0000', + message: 'feat(graph): moved stats ui to bottom right and updated ascii checkbox checked mark', + parents: [ + '7f60983' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '45dbbde' + ], + isBranchTip: false + }, + { + hash: '7f60983', + committerDate: '2024-12-01T18:26:08+00:00', + authorDate: '2024-11-28 18:26:08 +0000', + message: 'feat(graph): reduced scene cooldown time to stop node drift and improve performance on first render', + parents: [ + 'cebb57d' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '2c60633' + ], + isBranchTip: false + }, + { + hash: 'cebb57d', + committerDate: '2024-12-01T17:57:17+00:00', + authorDate: '2024-11-28 17:57:17 +0000', + message: 'chore(deps): removed react-force-graph and replaced with 3d standalone package and bumped three back to latest', + parents: [ + '33c38c5' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '7f60983' + ], + isBranchTip: false + }, + { + hash: '33c38c5', + committerDate: '2024-12-01T16:27:32+00:00', + authorDate: '2024-11-28 16:27:32 +0000', + message: 'chore(graph): removed redundant import file extensions', + parents: [ + 'f19e207' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'cebb57d' + ], + isBranchTip: false + }, + { + hash: 'f19e207', + committerDate: '2024-12-01T16:26:50+00:00', + authorDate: '2024-11-28 16:26:50 +0000', + message: 'chore(graph): renamed three scene folder to match module name', + parents: [ + 'b9bc1dc' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '33c38c5' + ], + isBranchTip: false + }, + { + hash: 'b9bc1dc', + committerDate: '2024-12-01T16:24:07+00:00', + authorDate: '2024-11-28 16:24:07 +0000', + message: 'feat(graph): added root node link directional particles and arrows to indicate the passage of time', + parents: [ + '9c65959' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'f19e207' + ], + isBranchTip: false + }, + { + hash: '9c65959', + committerDate: '2024-12-01T11:57:08+00:00', + authorDate: '2024-11-28 11:57:08 +0000', + message: 'feat(graph): fixed ref typing and reset camera loading state', + parents: [ + 'a172219' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'b9bc1dc' + ], + isBranchTip: false + }, + { + hash: 'a172219', + committerDate: '2024-12-01T11:37:49+00:00', + authorDate: '2024-11-28 11:37:49 +0000', + message: 'feat(graph): renamed and structured three chart component', + parents: [ + 'a3af060' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '9c65959' + ], + isBranchTip: false + }, + { + hash: 'a3af060', + committerDate: '2024-12-01T11:35:52+00:00', + authorDate: '2024-11-28 11:35:52 +0000', + message: 'feat(graph): reworked three scene component structure for better use of context + added ascii button', + parents: [ + '363c60d' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'a172219' + ], + isBranchTip: false + }, + { + hash: '363c60d', + committerDate: '2024-11-30T17:24:13+00:00', + authorDate: '2024-11-27 17:24:13 +0000', + message: 'feat(graph): added draggable nodes button and dynamic node sizes based on percentage', + parents: [ + 'cc0598b' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'a3af060' + ], + isBranchTip: false + }, + { + hash: 'cc0598b', + committerDate: '2024-11-30T16:50:40+00:00', + authorDate: '2024-11-27 16:50:40 +0000', + message: 'feat(graph): added new three context and toggle for the scene', + parents: [ + '6e89c11' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '363c60d' + ], + isBranchTip: false + }, + { + hash: '6e89c11', + committerDate: '2024-11-30T16:31:13+00:00', + authorDate: '2024-11-27 16:31:13 +0000', + message: 'feat(graph): started adding controls menu for 3d graph', + parents: [ + '6904884' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'cc0598b' + ], + isBranchTip: false + }, + { + hash: '6904884', + committerDate: '2024-11-30T16:30:28+00:00', + authorDate: '2024-11-27 16:30:28 +0000', + message: 'feat(graph): minor styling improvements on ascii checkbox and turned checked \'x\' to \'o\'', + parents: [ + '94b945f' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '6e89c11' + ], + isBranchTip: false + }, + { + hash: '94b945f', + committerDate: '2024-11-30T16:17:49+00:00', + authorDate: '2024-11-27 16:17:49 +0000', + message: 'feat(graph): more experimentation with 3d force graph', + parents: [ + '115846d' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '6904884' + ], + isBranchTip: false + }, + { + hash: '115846d', + committerDate: '2024-11-30T10:35:33+00:00', + authorDate: '2024-11-27 10:35:33 +0000', + message: 'feat(graph): added fps and network stats counter to 3d graph', + parents: [ + '71869c4' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '94b945f' + ], + isBranchTip: false + }, + { + hash: '71869c4', + committerDate: '2024-11-30T09:10:10+00:00', + authorDate: '2024-11-27 09:10:10 +0000', + message: 'fix(config): vite config css preproccessor options now use modern-compiler to fix dart scss warnings', + parents: [ + 'a3476a8' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '115846d' + ], + isBranchTip: false + }, + { + hash: 'a3476a8', + committerDate: '2024-11-30T09:09:45+00:00', + authorDate: '2024-11-27 09:09:45 +0000', + message: 'fix(graph): fixed is3D default query param value and line chart missing opacity keyframes', + parents: [ + 'deba6b5' + ], + branch: 'refs/tags/v2.3.0', + children: [ + '71869c4' + ], + isBranchTip: false + }, + { + hash: 'deba6b5', + committerDate: '2024-11-29T16:53:18+00:00', + authorDate: '2024-11-26 16:53:18 +0000', + message: 'feat(graph): added experimental 3d button and re-instated 3d graph behind it', + parents: [ + 'd8e279c' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'a3476a8' + ], + isBranchTip: false + }, + { + hash: '74885fc', + committerDate: '2024-11-29T14:11:47+00:00', + authorDate: '2024-11-26 14:11:47 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@810a868f1f691c458fa0354a5122d8fe166d84ed 🚀', + parents: [ + 'ecb5b57' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'd26bcc7' + ], + isBranchTip: false + }, + { + hash: '810a868', + committerDate: '2024-11-29T14:10:47+00:00', + authorDate: '2024-11-26 14:10:47 +0000', + message: 'Merge pull request #37 from TomPlum/develop', + parents: [ + 'c31b3a8', + '3a78717' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'b7ec825', + '3d680fd', + '2b85a9e' + ], + isBranchTip: false + }, + { + hash: 'd8e279c', + committerDate: '2024-11-29T13:46:26+00:00', + authorDate: '2024-11-26 13:46:26 +0000', + message: 'chore(graph): removed locale toggle from graph controls ui', + parents: [ + '3a78717' + ], + branch: 'refs/tags/v2.3.0', + children: [ + 'deba6b5' + ], + isBranchTip: false + }, + { + hash: '3a78717', + committerDate: '2024-11-29T13:44:29+00:00', + authorDate: '2024-11-26 13:44:29 +0000', + message: 'fix(graph): active session info colour gradients now support all new chart view types', + parents: [ + 'd89f085' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '810a868', + 'd8e279c' + ], + isBranchTip: false + }, + { + hash: 'd89f085', + committerDate: '2024-11-29T13:43:23+00:00', + authorDate: '2024-11-26 13:43:23 +0000', + message: 'chore(graph): renamed stackedMetrics to activeMetrics in chart config context', + parents: [ + '5f7da3f' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '3a78717' + ], + isBranchTip: false + }, + { + hash: '5f7da3f', + committerDate: '2024-11-29T11:00:51+00:00', + authorDate: '2024-11-26 11:00:51 +0000', + message: 'fix(controls): made chart view selector button small to match the other controls', + parents: [ + '7ca3b25' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'd89f085' + ], + isBranchTip: false + }, + { + hash: '7ca3b25', + committerDate: '2024-11-29T10:57:41+00:00', + authorDate: '2024-11-26 10:57:41 +0000', + message: 'fix(graph): rendered key-less line when in single metric view to stop re-mounting', + parents: [ + 'fc6a3e8' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '5f7da3f' + ], + isBranchTip: false + }, + { + hash: 'fc6a3e8', + committerDate: '2024-11-29T10:35:05+00:00', + authorDate: '2024-11-26 10:35:05 +0000', + message: 'fix(graph): chart view selection now correctly updates stacked metrics param', + parents: [ + 'c1b3995' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '7ca3b25' + ], + isBranchTip: false + }, + { + hash: 'c1b3995', + committerDate: '2024-11-29T10:31:14+00:00', + authorDate: '2024-11-26 10:31:14 +0000', + message: 'feat(graph): refactored chart metric selection to support all view types', + parents: [ + 'f61711f' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'fc6a3e8' + ], + isBranchTip: false + }, + { + hash: 'f61711f', + committerDate: '2024-11-29T10:06:44+00:00', + authorDate: '2024-11-26 10:06:44 +0000', + message: 'chore(graph): renamed StackedGraphPlaceholder to ChartMetricSelection', + parents: [ + '62e3f80' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'c1b3995' + ], + isBranchTip: false + }, + { + hash: '62e3f80', + committerDate: '2024-11-29T10:05:35+00:00', + authorDate: '2024-11-26 10:05:35 +0000', + message: 'feat(graph): fixed chart view selector for single metric', + parents: [ + '17d9d64' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'f61711f' + ], + isBranchTip: false + }, + { + hash: '17d9d64', + committerDate: '2024-11-29T09:57:09+00:00', + authorDate: '2024-11-26 09:57:09 +0000', + message: 'feat(graph): added graph metric selector in multiple metrics view when none are selected', + parents: [ + 'b516162' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '62e3f80' + ], + isBranchTip: false + }, + { + hash: 'b516162', + committerDate: '2024-11-28T21:16:17+00:00', + authorDate: '2024-11-25 21:16:17 +0000', + message: 'feat(graph): started refactor for adding multiple metric lines on the chart at once', + parents: [ + '33b5d79' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '17d9d64' + ], + isBranchTip: false + }, + { + hash: '33b5d79', + committerDate: '2024-11-28T20:48:51+00:00', + authorDate: '2024-11-25 20:48:51 +0000', + message: 'chore(graph): renamed line chart component to be consistent', + parents: [ + '97b060f' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'b516162' + ], + isBranchTip: false + }, + { + hash: '97b060f', + committerDate: '2024-11-28T19:14:05+00:00', + authorDate: '2024-11-25 19:14:05 +0000', + message: 'feat(graph): refactored stacked view toggle into a chart view selector dropdown', + parents: [ + 'e6318eb' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '33b5d79' + ], + isBranchTip: false + }, + { + hash: 'ecb5b57', + committerDate: '2024-11-28T18:35:11+00:00', + authorDate: '2024-11-25 18:35:11 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@c31b3a86b361a8a207d838498ce16125a5c93b54 🚀', + parents: [ + '60698cc' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '74885fc' + ], + isBranchTip: false + }, + { + hash: 'c31b3a8', + committerDate: '2024-11-28T18:34:13+00:00', + authorDate: '2024-11-25 18:34:13 +0000', + message: 'Merge pull request #36 from TomPlum/develop', + parents: [ + '0b903cc', + 'e6318eb' + ], + branch: 'refs/tags/v2.1.1', + children: [ + '810a868' + ], + isBranchTip: false + }, + { + hash: 'e6318eb', + committerDate: '2024-11-28T18:31:19+00:00', + authorDate: '2024-11-25 18:31:19 +0000', + message: 'test(data): fixed bad file path reference which was breaking a test mock', + parents: [ + '2d1025f' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '97b060f', + 'c31b3a8' + ], + isBranchTip: false + }, + { + hash: '2d1025f', + committerDate: '2024-11-28T16:03:20+00:00', + authorDate: '2024-11-25 16:03:20 +0000', + message: 'chore(data): added tsdoc and supporting comments to useSleepStageData', + parents: [ + '1321e4d' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'e6318eb' + ], + isBranchTip: false + }, + { + hash: '1321e4d', + committerDate: '2024-11-28T15:55:53+00:00', + authorDate: '2024-11-25 15:55:53 +0000', + message: 'fix(data): filtered sleep stage instance data by their unique IDs to remove duplicates that were breaking the chart', + parents: [ + '71a1a7e' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '2d1025f' + ], + isBranchTip: false + }, + { + hash: '71a1a7e', + committerDate: '2024-11-28T15:49:06+00:00', + authorDate: '2024-11-25 15:49:06 +0000', + message: 'feat(graph): added basic styling to error boundary fallback page', + parents: [ + '97a941a' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '1321e4d' + ], + isBranchTip: false + }, + { + hash: '97a941a', + committerDate: '2024-11-28T15:48:52+00:00', + authorDate: '2024-11-25 15:48:52 +0000', + message: 'feat(graph): reworked metric checkbox styling, no longer uses antd', + parents: [ + '0d85838' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '71a1a7e' + ], + isBranchTip: false + }, + { + hash: '0d85838', + committerDate: '2024-11-28T15:21:04+00:00', + authorDate: '2024-11-25 15:21:04 +0000', + message: 'feat(data): added japanese translations for the web worker statuses', + parents: [ + 'cf8e018' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '97a941a' + ], + isBranchTip: false + }, + { + hash: 'cf8e018', + committerDate: '2024-11-28T15:17:48+00:00', + authorDate: '2024-11-25 15:17:48 +0000', + message: 'feat(graph): added error boundary around application', + parents: [ + '5e7f6f8' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '0d85838' + ], + isBranchTip: false + }, + { + hash: '5e7f6f8', + committerDate: '2024-11-27T17:38:11+00:00', + authorDate: '2024-11-24 17:38:11 +0000', + message: 'feat(graph): added sound toggle to session info', + parents: [ + '5a0d8f6' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'cf8e018' + ], + isBranchTip: false + }, + { + hash: '5a0d8f6', + committerDate: '2024-11-27T17:20:40+00:00', + authorDate: '2024-11-24 17:20:40 +0000', + message: 'fix(context): inverted context dependencies to fix date selection bug', + parents: [ + 'e42905d' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '5e7f6f8' + ], + isBranchTip: false + }, + { + hash: 'e42905d', + committerDate: '2024-11-27T17:10:58+00:00', + authorDate: '2024-11-24 17:10:58 +0000', + message: 'feat(graph): added sleep stage pie chart tooltip', + parents: [ + '66a83c0' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '5a0d8f6' + ], + isBranchTip: false + }, + { + hash: '66a83c0', + committerDate: '2024-11-27T16:26:24+00:00', + authorDate: '2024-11-24 16:26:24 +0000', + message: 'fix(data): added web worker terminate call after done event received', + parents: [ + '9e9389e' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'e42905d' + ], + isBranchTip: false + }, + { + hash: '9e9389e', + committerDate: '2024-11-27T16:26:03+00:00', + authorDate: '2024-11-24 16:26:03 +0000', + message: 'chore(context): split chart config context from sleep context', + parents: [ + '8e241d2' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '66a83c0' + ], + isBranchTip: false + }, + { + hash: '8e241d2', + committerDate: '2024-11-27T10:30:47+00:00', + authorDate: '2024-11-24 10:30:47 +0000', + message: 'chore(housekeeping): moved sleep context files into its own subdirectory', + parents: [ + 'b7a1cc8' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '9e9389e' + ], + isBranchTip: false + }, + { + hash: 'b7a1cc8', + committerDate: '2024-11-27T10:27:26+00:00', + authorDate: '2024-11-24 10:27:26 +0000', + message: 'chore(housekeeping): renamed some components for consistency', + parents: [ + '0143d04' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '8e241d2' + ], + isBranchTip: false + }, + { + hash: '0143d04', + committerDate: '2024-11-26T22:48:51+00:00', + authorDate: '2024-11-23 22:48:51 +0000', + message: 'fix(housekeeping): fixed bad translations string after folder refactor', + parents: [ + '25f597f' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'b7a1cc8' + ], + isBranchTip: false + }, + { + hash: '25f597f', + committerDate: '2024-11-26T22:41:41+00:00', + authorDate: '2024-11-23 22:41:41 +0000', + message: 'chore(housekeeping): major folder structure and module rework', + parents: [ + '8e4f92b' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '0143d04' + ], + isBranchTip: false + }, + { + hash: '8e4f92b', + committerDate: '2024-11-26T22:26:38+00:00', + authorDate: '2024-11-23 22:26:38 +0000', + message: 'feat(graph): removed active dot from sleep stage areas', + parents: [ + '47d542c' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '25f597f' + ], + isBranchTip: false + }, + { + hash: '47d542c', + committerDate: '2024-11-26T22:24:15+00:00', + authorDate: '2024-11-23 22:24:15 +0000', + message: 'feat(graph): added stage instance duration to graph tooltip', + parents: [ + '9248e1f' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '8e4f92b' + ], + isBranchTip: false + }, + { + hash: '9248e1f', + committerDate: '2024-11-26T22:07:08+00:00', + authorDate: '2024-11-23 22:07:08 +0000', + message: 'chore(graph): added custom interface for sleep session graph y-axis meta', + parents: [ + '38190b2' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '47d542c' + ], + isBranchTip: false + }, + { + hash: '38190b2', + committerDate: '2024-11-26T19:39:33+00:00', + authorDate: '2024-11-23 19:39:33 +0000', + message: 'chore(deps): upgraded i18next to major version 24', + parents: [ + 'f8ddbd4' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '9248e1f' + ], + isBranchTip: false + }, + { + hash: '60698cc', + committerDate: '2024-11-26T19:38:24+00:00', + authorDate: '2024-11-23 19:38:24 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@0b903cc93b1fd0fed264ae1f4d746f1414235fc9 🚀', + parents: [ + '05bec69' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'ecb5b57' + ], + isBranchTip: false + }, + { + hash: 'f8ddbd4', + committerDate: '2024-11-26T19:37:44+00:00', + authorDate: '2024-11-23 19:37:44 +0000', + message: 'Merge branch \'release\' into develop', + parents: [ + '4ebf726', + '0b903cc' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '38190b2' + ], + isBranchTip: false + }, + { + hash: '0b903cc', + committerDate: '2024-11-26T19:37:29+00:00', + authorDate: '2024-11-23 19:37:29 +0000', + message: 'Merge pull request #32 from TomPlum/renovate/all-minor-patch', + parents: [ + '6e3df33', + 'dc8936d' + ], + branch: 'refs/tags/v2.1.1', + children: [ + 'c31b3a8', + 'f8ddbd4' + ], + isBranchTip: false + }, + { + hash: '4ebf726', + committerDate: '2024-11-26T19:35:46+00:00', + authorDate: '2024-11-23 19:35:46 +0000', + message: 'feat(graph): added close button to selected session display', + parents: [ + '9857380' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'f8ddbd4' + ], + isBranchTip: false + }, + { + hash: '9857380', + committerDate: '2024-11-26T19:30:44+00:00', + authorDate: '2024-11-23 19:30:44 +0000', + message: 'chore(graph): improved styling in SleepSessionTooltip.module.scss for labels and values', + parents: [ + 'acd7649' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '4ebf726' + ], + isBranchTip: false + }, + { + hash: 'acd7649', + committerDate: '2024-11-26T19:29:30+00:00', + authorDate: '2024-11-23 19:29:30 +0000', + message: 'chore(graph): extracted SleepSessionBreakdownInfo.tsx component', + parents: [ + '7723e57' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '9857380' + ], + isBranchTip: false + }, + { + hash: '7723e57', + committerDate: '2024-11-26T19:24:31+00:00', + authorDate: '2024-11-23 19:24:31 +0000', + message: 'feat(graph): sleep stage graph x-ticks are now 30 minute intervals', + parents: [ + 'ff5f173' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'acd7649' + ], + isBranchTip: false + }, + { + hash: 'ff5f173', + committerDate: '2024-11-26T19:21:55+00:00', + authorDate: '2024-11-23 19:21:55 +0000', + message: 'chore(graph): moved stage transition data to hook and disabled area animations', + parents: [ + 'b754d54' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '7723e57' + ], + isBranchTip: false + }, + { + hash: 'b754d54', + committerDate: '2024-11-26T19:04:33+00:00', + authorDate: '2024-11-23 19:04:33 +0000', + message: 'feat(graph): sleep stage graph tooltip now shows current stage and time', + parents: [ + 'ea79846' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'ff5f173' + ], + isBranchTip: false + }, + { + hash: 'ea79846', + committerDate: '2024-11-26T15:11:32+00:00', + authorDate: '2024-11-23 15:11:32 +0000', + message: 'test(graph): added unit test suite for generateTicks', + parents: [ + '478a361' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'b754d54' + ], + isBranchTip: false + }, + { + hash: '478a361', + committerDate: '2024-11-26T15:07:03+00:00', + authorDate: '2024-11-23 15:07:03 +0000', + message: 'test(graph): added unit test suite for getSleepStageMetricYValue', + parents: [ + '9d21764' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'ea79846' + ], + isBranchTip: false + }, + { + hash: '9d21764', + committerDate: '2024-11-26T15:02:43+00:00', + authorDate: '2024-11-23 15:02:43 +0000', + message: 'chore(graph): extracted useSleepStagesAreas hook from breakdown graph', + parents: [ + 'be596e4' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '478a361' + ], + isBranchTip: false + }, + { + hash: 'be596e4', + committerDate: '2024-11-26T14:25:55+00:00', + authorDate: '2024-11-23 14:25:55 +0000', + message: 'feat(graph): sleep stage areas now generate minute granular points along their edges', + parents: [ + '6ef3091' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '9d21764' + ], + isBranchTip: false + }, + { + hash: 'dc8936d', + committerDate: '2024-11-26T04:50:20+00:00', + authorDate: '2024-11-23 04:50:20 +0000', + message: 'chore(deps): update all non-major dependencies', + parents: [ + '6e3df33' + ], + branch: 'refs/tags/v2.1.1', + children: [ + '0b903cc' + ], + isBranchTip: false + }, + { + hash: '6ef3091', + committerDate: '2024-11-25T19:56:50+00:00', + authorDate: '2024-11-22 19:56:50 +0000', + message: 'feat(graph): refactored sleep stage graph to use real areas instead of reference ones', + parents: [ + 'f60cdc8' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'be596e4' + ], + isBranchTip: false + }, + { + hash: 'f60cdc8', + committerDate: '2024-11-25T16:46:06+00:00', + authorDate: '2024-11-22 16:46:06 +0000', + message: 'feat(graph): extracted useSleepStageData hook from breakdown graph component', + parents: [ + 'b1c9c9b' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '6ef3091' + ], + isBranchTip: false + }, + { + hash: '05bec69', + committerDate: '2024-11-24T19:55:10+00:00', + authorDate: '2024-11-21 19:55:10 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@6e3df33a8b0bc47270c2cf0e2f45aaa9afe17eaf 🚀', + parents: [ + '0c28eb6' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '60698cc' + ], + isBranchTip: false + }, + { + hash: '6e3df33', + committerDate: '2024-11-24T19:54:17+00:00', + authorDate: '2024-11-21 19:54:17 +0000', + message: 'Merge pull request #31 from TomPlum/develop', + parents: [ + 'f396ce1', + 'b1c9c9b' + ], + branch: 'refs/tags/v2.1.0', + children: [ + '0b903cc', + 'dc8936d' + ], + isBranchTip: false + }, + { + hash: 'b1c9c9b', + committerDate: '2024-11-24T19:51:52+00:00', + authorDate: '2024-11-21 19:51:52 +0000', + message: 'Merge pull request #30 from TomPlum/improve-stage-chart', + parents: [ + 'db3687b', + 'db3c4f9' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'f60cdc8', + '6e3df33' + ], + isBranchTip: false + }, + { + hash: 'db3c4f9', + committerDate: '2024-11-24T19:50:20+00:00', + authorDate: '2024-11-21 19:50:20 +0000', + message: 'feat(graph): improved stage graph x-domain', + parents: [ + 'b4e9d3b' + ], + branch: 'refs/heads/improve-stage-chart', + children: [ + 'b1c9c9b' + ], + isBranchTip: false + }, + { + hash: 'b4e9d3b', + committerDate: '2024-11-24T19:41:09+00:00', + authorDate: '2024-11-21 19:41:09 +0000', + message: 'feat(graph): fixed stage breakdown graph y-domain and ticks', + parents: [ + '5b96a51' + ], + branch: 'refs/heads/improve-stage-chart', + children: [ + 'db3c4f9' + ], + isBranchTip: false + }, + { + hash: '5b96a51', + committerDate: '2024-11-24T19:03:51+00:00', + authorDate: '2024-11-21 19:03:51 +0000', + message: 'feat(graph): added in reparation code to the sleep stage graph data', + parents: [ + 'd89c2c1' + ], + branch: 'refs/heads/improve-stage-chart', + children: [ + 'b4e9d3b' + ], + isBranchTip: false + }, + { + hash: 'd89c2c1', + committerDate: '2024-11-23T20:58:52+00:00', + authorDate: '2024-11-20 20:58:52 +0000', + message: 'feat(graph): corrected stage transition line x-ordinates', + parents: [ + 'ced9837' + ], + branch: 'refs/heads/improve-stage-chart', + children: [ + '5b96a51' + ], + isBranchTip: false + }, + { + hash: 'ced9837', + committerDate: '2024-11-23T18:45:26+00:00', + authorDate: '2024-11-20 18:45:26 +0000', + message: 'feat(graph): switched sleep stage scatter to reference areas', + parents: [ + '9b4a1b5' + ], + branch: 'refs/heads/improve-stage-chart', + children: [ + 'd89c2c1' + ], + isBranchTip: false + }, + { + hash: '9b4a1b5', + committerDate: '2024-11-23T14:59:16+00:00', + authorDate: '2024-11-20 14:59:16 +0000', + message: 'feat(graph): fixed breakdown graph stage connecting lines', + parents: [ + '1d21e76' + ], + branch: 'refs/heads/improve-stage-chart', + children: [ + 'ced9837' + ], + isBranchTip: false + }, + { + hash: '1d21e76', + committerDate: '2024-11-23T14:44:03+00:00', + authorDate: '2024-11-20 14:44:03 +0000', + message: 'feat(graph): fixed sorting of stage data in breakdown graph', + parents: [ + '76eb4f3' + ], + branch: 'refs/heads/improve-stage-chart', + children: [ + '9b4a1b5' + ], + isBranchTip: false + }, + { + hash: '76eb4f3', + committerDate: '2024-11-22T20:53:45+00:00', + authorDate: '2024-11-19 20:53:45 +0000', + message: 'feat(graph): starting refactoring breakdown chart', + parents: [ + 'db3687b' + ], + branch: 'refs/heads/improve-stage-chart', + children: [ + '1d21e76' + ], + isBranchTip: false + }, + { + hash: 'db3687b', + committerDate: '2024-11-22T17:16:54+00:00', + authorDate: '2024-11-19 17:16:54 +0000', + message: 'feat(graph): line chart x-axis tick now changes format for small ranges', + parents: [ + 'a18a5c4' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'b1c9c9b', + '76eb4f3' + ], + isBranchTip: false + }, + { + hash: 'a18a5c4', + committerDate: '2024-11-22T17:09:14+00:00', + authorDate: '2024-11-19 17:09:14 +0000', + message: 'Merge branch \'release\' into develop', + parents: [ + 'de17621', + 'f396ce1' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'db3687b' + ], + isBranchTip: false + }, + { + hash: 'f396ce1', + committerDate: '2024-11-22T17:08:58+00:00', + authorDate: '2024-11-19 17:08:58 +0000', + message: 'Merge pull request #26 from TomPlum/renovate/all-minor-patch', + parents: [ + '8eda2d7', + '5752a89' + ], + branch: 'refs/tags/v2.1.0', + children: [ + '6e3df33', + 'a18a5c4' + ], + isBranchTip: false + }, + { + hash: 'de17621', + committerDate: '2024-11-22T17:08:30+00:00', + authorDate: '2024-11-19 17:08:30 +0000', + message: 'test(data): fixed failing test for useLinearRegression.spec.ts', + parents: [ + 'b0f2ce3' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'a18a5c4' + ], + isBranchTip: false + }, + { + hash: '5752a89', + committerDate: '2024-11-22T14:00:17+00:00', + authorDate: '2024-11-19 14:00:17 +0000', + message: 'chore(deps): update all non-major dependencies', + parents: [ + '8eda2d7' + ], + branch: 'refs/tags/v2.1.0', + children: [ + 'f396ce1' + ], + isBranchTip: false + }, + { + hash: 'b0f2ce3', + committerDate: '2024-11-21T17:35:25+00:00', + authorDate: '2024-11-18 17:35:25 +0000', + message: 'feat(graph): added custom sleep stage tooltip and extracted display name util', + parents: [ + 'dad2e46' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'de17621' + ], + isBranchTip: false + }, + { + hash: 'dad2e46', + committerDate: '2024-11-21T17:06:00+00:00', + authorDate: '2024-11-18 17:06:00 +0000', + message: 'chore(data): updated docs regarding Apples Cocoa Datetime API', + parents: [ + '3c495cc' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'b0f2ce3' + ], + isBranchTip: false + }, + { + hash: '3c495cc', + committerDate: '2024-11-20T19:12:19+00:00', + authorDate: '2024-11-17 19:12:19 +0000', + message: 'feat(graph): extracted legend item component and updated styles', + parents: [ + '7d91ff0' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'dad2e46' + ], + isBranchTip: false + }, + { + hash: '7d91ff0', + committerDate: '2024-11-20T19:05:12+00:00', + authorDate: '2024-11-17 19:05:12 +0000', + message: 'feat(graph): added duration in sleep session info', + parents: [ + '4be777a' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '3c495cc' + ], + isBranchTip: false + }, + { + hash: '4be777a', + committerDate: '2024-11-20T18:22:47+00:00', + authorDate: '2024-11-17 18:22:47 +0000', + message: 'feat(graph): added endTime to graph data and mapped date range to session info', + parents: [ + '0cf76da' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '7d91ff0' + ], + isBranchTip: false + }, + { + hash: '0cf76da', + committerDate: '2024-11-20T18:06:42+00:00', + authorDate: '2024-11-17 18:06:42 +0000', + message: 'chore(graph): refactored selected session state management (hoisted to context)', + parents: [ + '954670c' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '4be777a' + ], + isBranchTip: false + }, + { + hash: '0c28eb6', + committerDate: '2024-11-20T17:33:57+00:00', + authorDate: '2024-11-17 17:33:57 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@8eda2d7e39053ecf13ee4bd6ce82c4821f3e7ed4 🚀', + parents: [ + '1482fb7' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '05bec69' + ], + isBranchTip: false + }, + { + hash: '8eda2d7', + committerDate: '2024-11-20T17:33:07+00:00', + authorDate: '2024-11-17 17:33:07 +0000', + message: 'Merge pull request #29 from TomPlum/develop', + parents: [ + '64ae166', + '954670c' + ], + branch: 'refs/tags/v2.1.0', + children: [ + 'f396ce1', + '5752a89' + ], + isBranchTip: false + }, + { + hash: '954670c', + committerDate: '2024-11-20T17:30:54+00:00', + authorDate: '2024-11-17 17:30:54 +0000', + message: 'fix(ci): made dates in useLinearRegression.spec.ts UTC for CI', + parents: [ + '419257d' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '0cf76da', + '8eda2d7' + ], + isBranchTip: false + }, + { + hash: '419257d', + committerDate: '2024-11-20T17:26:00+00:00', + authorDate: '2024-11-17 17:26:00 +0000', + message: 'debug(ci): added date check in develop workflow to check TZ', + parents: [ + '52dfc3f' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '954670c' + ], + isBranchTip: false + }, + { + hash: '52dfc3f', + committerDate: '2024-11-20T17:20:05+00:00', + authorDate: '2024-11-17 17:20:05 +0000', + message: 'test(data): used dayjs utc in useLinearRegression to try and fix ci tests', + parents: [ + 'e7a2380' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '419257d' + ], + isBranchTip: false + }, + { + hash: 'e7a2380', + committerDate: '2024-11-20T17:19:28+00:00', + authorDate: '2024-11-17 17:19:28 +0000', + message: 'feat(graph): extracted useGraphHeight hook and used in placeholder component too', + parents: [ + 'd31697d' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '52dfc3f' + ], + isBranchTip: false + }, + { + hash: 'd31697d', + committerDate: '2024-11-20T17:11:47+00:00', + authorDate: '2024-11-17 17:11:47 +0000', + message: 'fix(graph): tweaked line chart graph height when in stacked view with a selected session', + parents: [ + '8a68890' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'e7a2380' + ], + isBranchTip: false + }, + { + hash: '8a68890', + committerDate: '2024-11-20T16:58:58+00:00', + authorDate: '2024-11-17 16:58:58 +0000', + message: 'feat(ci): set UTC timezone in develop workflow', + parents: [ + 'df5f451' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'd31697d' + ], + isBranchTip: false + }, + { + hash: 'df5f451', + committerDate: '2024-11-20T16:57:27+00:00', + authorDate: '2024-11-17 16:57:27 +0000', + message: 'feat(ci): added new develop workflow for building/testing on PRs', + parents: [ + '7308bc3' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '8a68890' + ], + isBranchTip: false + }, + { + hash: '7308bc3', + committerDate: '2024-11-20T16:53:28+00:00', + authorDate: '2024-11-17 16:53:28 +0000', + message: 'fix(ci): added UTC timezone to release workflow config', + parents: [ + '310412c' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'df5f451' + ], + isBranchTip: false + }, + { + hash: '64ae166', + committerDate: '2024-11-20T16:48:29+00:00', + authorDate: '2024-11-17 16:48:29 +0000', + message: 'Merge pull request #28 from TomPlum/develop', + parents: [ + 'c6a41eb', + '310412c' + ], + branch: 'refs/tags/v2.1.0', + children: [ + '8eda2d7' + ], + isBranchTip: false + }, + { + hash: '310412c', + committerDate: '2024-11-20T16:48:01+00:00', + authorDate: '2024-11-17 16:48:01 +0000', + message: 'feat(ci): added unit tests to release workflow', + parents: [ + '0f637b2' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '7308bc3', + '64ae166' + ], + isBranchTip: false + }, + { + hash: '0f637b2', + committerDate: '2024-11-20T16:47:10+00:00', + authorDate: '2024-11-17 16:47:10 +0000', + message: 'test(data): fixed failing tests and added test:ci script', + parents: [ + '6aa8dab' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '310412c' + ], + isBranchTip: false + }, + { + hash: '6aa8dab', + committerDate: '2024-11-20T16:44:09+00:00', + authorDate: '2024-11-17 16:44:09 +0000', + message: 'fix(data): moved env util into sub-dir to fix build issue', + parents: [ + '0237445' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '0f637b2' + ], + isBranchTip: false + }, + { + hash: 'c6a41eb', + committerDate: '2024-11-20T15:25:29+00:00', + authorDate: '2024-11-17 15:25:29 +0000', + message: 'Merge pull request #27 from TomPlum/develop', + parents: [ + 'd52b826', + '0237445' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '64ae166' + ], + isBranchTip: false + }, + { + hash: '0237445', + committerDate: '2024-11-20T15:06:15+00:00', + authorDate: '2024-11-17 15:06:15 +0000', + message: 'feat(graph): duration breakdown pie chart now matches other charts animation timings', + parents: [ + '33e8dd5' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '6aa8dab', + 'c6a41eb' + ], + isBranchTip: false + }, + { + hash: '33e8dd5', + committerDate: '2024-11-20T15:04:26+00:00', + authorDate: '2024-11-17 15:04:26 +0000', + message: 'feat(graph): pushed down session selection code to prevent re-renders', + parents: [ + '072d7d6' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '0237445' + ], + isBranchTip: false + }, + { + hash: '072d7d6', + committerDate: '2024-11-20T14:53:23+00:00', + authorDate: '2024-11-17 14:53:23 +0000', + message: 'feat(graph): added legend to sleep stage breakdown graph', + parents: [ + '947600b' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '33e8dd5' + ], + isBranchTip: false + }, + { + hash: '947600b', + committerDate: '2024-11-20T14:38:15+00:00', + authorDate: '2024-11-17 14:38:15 +0000', + message: 'feat(graph): sleep stage chart is now size aware and resizes bars appropriately', + parents: [ + '5861283' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '072d7d6' + ], + isBranchTip: false + }, + { + hash: '5861283', + committerDate: '2024-11-20T14:32:24+00:00', + authorDate: '2024-11-17 14:32:24 +0000', + message: 'feat(graph): removed pie chart from chart tooltip', + parents: [ + 'e778c0d' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '947600b' + ], + isBranchTip: false + }, + { + hash: 'e778c0d', + committerDate: '2024-11-20T14:25:18+00:00', + authorDate: '2024-11-17 14:25:18 +0000', + message: 'feat(graph): added duration breakdown pie chart to selected session info', + parents: [ + '6c21df1' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '5861283' + ], + isBranchTip: false + }, + { + hash: '6c21df1', + committerDate: '2024-11-20T14:22:01+00:00', + authorDate: '2024-11-17 14:22:01 +0000', + message: 'feat(graph): added selected session into query parameters', + parents: [ + '5beb80b' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'e778c0d' + ], + isBranchTip: false + }, + { + hash: '5beb80b', + committerDate: '2024-11-20T13:53:07+00:00', + authorDate: '2024-11-17 13:53:07 +0000', + message: 'chore(lint): added quote-props eslint rule and ran --fix', + parents: [ + 'e82dd75' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '6c21df1' + ], + isBranchTip: false + }, + { + hash: 'e82dd75', + committerDate: '2024-11-20T13:52:28+00:00', + authorDate: '2024-11-17 13:52:28 +0000', + message: 'test(data): added test suite for scanTables utility', + parents: [ + 'f6e0c4e' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '5beb80b' + ], + isBranchTip: false + }, + { + hash: 'f6e0c4e', + committerDate: '2024-11-20T13:27:51+00:00', + authorDate: '2024-11-17 13:27:51 +0000', + message: 'fix(data): added missing benchmark start() call to scanTables', + parents: [ + 'a09f9ad' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'e82dd75' + ], + isBranchTip: false + }, + { + hash: 'a09f9ad', + committerDate: '2024-11-20T13:26:16+00:00', + authorDate: '2024-11-17 13:26:16 +0000', + message: 'test(data): updated unknown time delta message and added tests for it', + parents: [ + 'ac05a9f' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'f6e0c4e' + ], + isBranchTip: false + }, + { + hash: 'ac05a9f', + committerDate: '2024-11-20T13:18:00+00:00', + authorDate: '2024-11-17 13:18:00 +0000', + message: 'test(data): added parseDataLine utility tests', + parents: [ + '74f829c' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'a09f9ad' + ], + isBranchTip: false + }, + { + hash: '74f829c', + committerDate: '2024-11-20T12:57:06+00:00', + authorDate: '2024-11-17 12:57:06 +0000', + message: 'test(data): added readRawDatabaseExport tests', + parents: [ + 'ddd3298' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'ac05a9f' + ], + isBranchTip: false + }, + { + hash: 'ddd3298', + committerDate: '2024-11-20T12:45:42+00:00', + authorDate: '2024-11-17 12:45:42 +0000', + message: 'test(data): added readFile unit tests and env utility class', + parents: [ + 'ca95d1b' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '74f829c' + ], + isBranchTip: false + }, + { + hash: 'ca95d1b', + committerDate: '2024-11-19T18:40:13+00:00', + authorDate: '2024-11-16 18:40:13 +0000', + message: 'feat(graph): added sound reference lines to stage breakdown graph', + parents: [ + '87c3e4b' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'ddd3298' + ], + isBranchTip: false + }, + { + hash: '87c3e4b', + committerDate: '2024-11-18T19:04:17+00:00', + authorDate: '2024-11-15 19:04:17 +0000', + message: 'feat(graph): passed sleep sound data into session info component from context', + parents: [ + '43767e6' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'ca95d1b' + ], + isBranchTip: false + }, + { + hash: '43767e6', + committerDate: '2024-11-18T17:02:12+00:00', + authorDate: '2024-11-15 17:02:12 +0000', + message: 'feat(data): worker file reader now calculates uncompressed file size', + parents: [ + 'eb5e0ad' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '87c3e4b' + ], + isBranchTip: false + }, + { + hash: 'eb5e0ad', + committerDate: '2024-11-18T17:01:52+00:00', + authorDate: '2024-11-15 17:01:52 +0000', + message: 'test(data): added unit tests and docs for sendMessage.ts', + parents: [ + 'dc56de6' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '43767e6' + ], + isBranchTip: false + }, + { + hash: 'dc56de6', + committerDate: '2024-11-18T16:54:15+00:00', + authorDate: '2024-11-15 16:54:15 +0000', + message: 'test(data): added unit tests and docs for formatNumber.ts', + parents: [ + 'a9d6cf6' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'eb5e0ad' + ], + isBranchTip: false + }, + { + hash: 'a9d6cf6', + committerDate: '2024-11-18T16:52:09+00:00', + authorDate: '2024-11-15 16:52:09 +0000', + message: 'test(data): added unit test for convertTimestamp.ts', + parents: [ + '9cdfa40' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'dc56de6' + ], + isBranchTip: false + }, + { + hash: '9cdfa40', + committerDate: '2024-11-18T16:44:36+00:00', + authorDate: '2024-11-15 16:44:36 +0000', + message: 'fix(data): fixed benchmark delta bug and added unit tests', + parents: [ + '724f9ef' + ], + branch: 'refs/tags/v2.2.0', + children: [ + 'a9d6cf6' + ], + isBranchTip: false + }, + { + hash: '724f9ef', + committerDate: '2024-11-17T21:55:11+00:00', + authorDate: '2024-11-14 21:55:11 +0000', + message: 'chore(data): added benchmark util to encapsulate timing and delta formatting', + parents: [ + '8472bb5' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '9cdfa40' + ], + isBranchTip: false + }, + { + hash: '8472bb5', + committerDate: '2024-11-17T21:45:41+00:00', + authorDate: '2024-11-14 21:45:41 +0000', + message: 'test(data): added unit test suite for convertSleepStage.ts', + parents: [ + 'd52b826' + ], + branch: 'refs/tags/v2.2.0', + children: [ + '724f9ef' + ], + isBranchTip: false + }, + { + hash: '1482fb7', + committerDate: '2024-11-17T21:39:46+00:00', + authorDate: '2024-11-14 21:39:46 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@d52b826c02b6909059675040789181420beafd52 🚀', + parents: [ + '7271948' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '0c28eb6' + ], + isBranchTip: false + }, + { + hash: '7271948', + committerDate: '2024-11-17T21:38:53+00:00', + authorDate: '2024-11-14 21:38:53 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@744a38879b90beeeddfffebbe9c3ecaca4a4c155 🚀', + parents: [ + '70437fd' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '1482fb7' + ], + isBranchTip: false + }, + { + hash: 'd52b826', + committerDate: '2024-11-17T21:38:52+00:00', + authorDate: '2024-11-14 21:38:52 +0000', + message: 'Merge pull request #24 from TomPlum/renovate/all-minor-patch', + parents: [ + '744a388', + '328c273' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'c6a41eb', + '8472bb5' + ], + isBranchTip: false + }, + { + hash: '744a388', + committerDate: '2024-11-17T21:38:02+00:00', + authorDate: '2024-11-14 21:38:02 +0000', + message: 'Merge pull request #25 from TomPlum/feature/parse-raw-data', + parents: [ + '2888162', + '4c98b03' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'd52b826' + ], + isBranchTip: false + }, + { + hash: '4c98b03', + committerDate: '2024-11-17T19:22:19+00:00', + authorDate: '2024-11-14 19:22:19 +0000', + message: 'chore(data): moved worker type and shortened imports', + parents: [ + '9b96063' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '744a388' + ], + isBranchTip: false + }, + { + hash: '9b96063', + committerDate: '2024-11-17T19:17:58+00:00', + authorDate: '2024-11-14 19:17:58 +0000', + message: 'chore(data): reduced more redundant code for file reading', + parents: [ + 'c675f33' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '4c98b03' + ], + isBranchTip: false + }, + { + hash: 'c675f33', + committerDate: '2024-11-17T19:11:32+00:00', + authorDate: '2024-11-14 19:11:32 +0000', + message: 'chore(data): extracted session validation function to reduce redundant code', + parents: [ + 'ebec2f8' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '9b96063' + ], + isBranchTip: false + }, + { + hash: 'ebec2f8', + committerDate: '2024-11-17T19:07:04+00:00', + authorDate: '2024-11-14 19:07:04 +0000', + message: 'test(data): installed @vitest/web-worker to fix failing tests', + parents: [ + 'b3a7721' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'c675f33' + ], + isBranchTip: false + }, + { + hash: 'b3a7721', + committerDate: '2024-11-17T16:18:11+00:00', + authorDate: '2024-11-14 16:18:11 +0000', + message: 'chore(config): added --host flag to dev script so the server is available on the LAN', + parents: [ + 'f6a4794' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'ebec2f8' + ], + isBranchTip: false + }, + { + hash: '328c273', + committerDate: '2024-11-17T13:09:47+00:00', + authorDate: '2024-11-14 13:09:47 +0000', + message: 'chore(deps): update all non-major dependencies', + parents: [ + '2888162' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'd52b826' + ], + isBranchTip: false + }, + { + hash: 'f6a4794', + committerDate: '2024-11-17T12:10:51+00:00', + authorDate: '2024-11-14 12:10:51 +0000', + message: 'chore(data): started extracting data worker into its own module of files', + parents: [ + '2c6a2a7' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'b3a7721' + ], + isBranchTip: false + }, + { + hash: '2c6a2a7', + committerDate: '2024-11-16T20:45:31+00:00', + authorDate: '2024-11-13 20:45:31 +0000', + message: 'feat(graph): updated active session file name and moved types from worker to types file', + parents: [ + '0261ff8' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'f6a4794' + ], + isBranchTip: false + }, + { + hash: '0261ff8', + committerDate: '2024-11-16T18:01:15+00:00', + authorDate: '2024-11-13 18:01:15 +0000', + message: 'feat(graph): changed breakdown chart y value type and added tooltip', + parents: [ + '0d66a55' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '2c6a2a7' + ], + isBranchTip: false + }, + { + hash: '0d66a55', + committerDate: '2024-11-16T16:24:04+00:00', + authorDate: '2024-11-13 16:24:04 +0000', + message: 'chore(data): renamed statusCode -> code and added extra docs to worker types', + parents: [ + '1bb1a3f' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '0261ff8' + ], + isBranchTip: false + }, + { + hash: '1bb1a3f', + committerDate: '2024-11-16T16:20:58+00:00', + authorDate: '2024-11-13 16:20:58 +0000', + message: 'feat(data): extracted and simplified worker number formatter', + parents: [ + '181a606' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '0d66a55' + ], + isBranchTip: false + }, + { + hash: '181a606', + committerDate: '2024-11-16T16:14:39+00:00', + authorDate: '2024-11-13 16:14:39 +0000', + message: 'feat(data): added timeouts to throttle worker messages (callback hell, oops)', + parents: [ + '34e6895' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '1bb1a3f' + ], + isBranchTip: false + }, + { + hash: '34e6895', + committerDate: '2024-11-16T16:05:57+00:00', + authorDate: '2024-11-13 16:05:57 +0000', + message: 'feat(data): tweaks to web worker messaging', + parents: [ + '05b851a' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '181a606' + ], + isBranchTip: false + }, + { + hash: '05b851a', + committerDate: '2024-11-16T09:04:42+00:00', + authorDate: '2024-11-13 09:04:42 +0000', + message: 'feat(data): added extra worker events for preprocessing stages', + parents: [ + '053033d' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '34e6895' + ], + isBranchTip: false + }, + { + hash: '053033d', + committerDate: '2024-11-15T18:57:10+00:00', + authorDate: '2024-11-12 18:57:10 +0000', + message: 'fix(data): significantly improved worker performance (35s -> 50ms)', + parents: [ + '94c5cdb' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '05b851a' + ], + isBranchTip: false + }, + { + hash: '94c5cdb', + committerDate: '2024-11-15T18:37:10+00:00', + authorDate: '2024-11-12 18:37:10 +0000', + message: 'feat(graph): selection session info/graph now renders in stacked view', + parents: [ + 'f05bba9' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '053033d' + ], + isBranchTip: false + }, + { + hash: 'f05bba9', + committerDate: '2024-11-15T18:32:17+00:00', + authorDate: '2024-11-12 18:32:17 +0000', + message: 'feat(data): added slight delay to final worker event to show data parsing message', + parents: [ + '00d2522' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '94c5cdb' + ], + isBranchTip: false + }, + { + hash: '00d2522', + committerDate: '2024-11-15T18:24:05+00:00', + authorDate: '2024-11-12 18:24:05 +0000', + message: 'chore(data): cleared 2 x TODOs in web worker', + parents: [ + 'be23a35' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'f05bba9' + ], + isBranchTip: false + }, + { + hash: 'be23a35', + committerDate: '2024-11-15T17:39:10+00:00', + authorDate: '2024-11-12 17:39:10 +0000', + message: 'feat(graph): added breathing radial gradient to loading component', + parents: [ + 'e55624f' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '00d2522' + ], + isBranchTip: false + }, + { + hash: 'e55624f', + committerDate: '2024-11-15T17:29:04+00:00', + authorDate: '2024-11-12 17:29:04 +0000', + message: 'chore(graph): extracted useDynamicFavicon hook', + parents: [ + '300166e' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'be23a35' + ], + isBranchTip: false + }, + { + hash: '300166e', + committerDate: '2024-11-15T17:27:23+00:00', + authorDate: '2024-11-12 17:27:23 +0000', + message: 'chore(graph): extracted SleepStageBar component', + parents: [ + 'ebc5a24' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'e55624f' + ], + isBranchTip: false + }, + { + hash: 'ebc5a24', + committerDate: '2024-11-15T17:19:29+00:00', + authorDate: '2024-11-12 17:19:29 +0000', + message: 'chore(data): removed old CSV data hook from context provider', + parents: [ + '4a265bf' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '300166e' + ], + isBranchTip: false + }, + { + hash: '4a265bf', + committerDate: '2024-11-15T17:17:11+00:00', + authorDate: '2024-11-12 17:17:11 +0000', + message: 'feat(graph): started adding info box to breakdown graph', + parents: [ + '77aec21' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'ebc5a24' + ], + isBranchTip: false + }, + { + hash: '77aec21', + committerDate: '2024-11-15T17:01:01+00:00', + authorDate: '2024-11-12 17:01:01 +0000', + message: 'fix(graph): fixed yTicks in SleepSessionStageBreakdownGraph', + parents: [ + 'f3ad7d7' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '4a265bf' + ], + isBranchTip: false + }, + { + hash: 'f3ad7d7', + committerDate: '2024-11-15T16:56:09+00:00', + authorDate: '2024-11-12 16:56:09 +0000', + message: 'feat(graph): fixed raw stage mapping and session -> stages ID mapping', + parents: [ + '52e1dd5' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '77aec21' + ], + isBranchTip: false + }, + { + hash: '52e1dd5', + committerDate: '2024-11-15T15:54:03+00:00', + authorDate: '2024-11-12 15:54:03 +0000', + message: 'feat(data): data worker typing improvements + TODOs', + parents: [ + '8ab78a0' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'f3ad7d7' + ], + isBranchTip: false + }, + { + hash: '8ab78a0', + committerDate: '2024-11-15T14:44:30+00:00', + authorDate: '2024-11-12 14:44:30 +0000', + message: 'feat(graph): moved sleep stage graph to the bottom and fixed heights', + parents: [ + '8af99c6' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '52e1dd5' + ], + isBranchTip: false + }, + { + hash: '8af99c6', + committerDate: '2024-11-15T14:13:45+00:00', + authorDate: '2024-11-12 14:13:45 +0000', + message: 'feat(graph): added custom line active dot to bind click events to sleep breakdown', + parents: [ + '9bc2a52' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '8ab78a0' + ], + isBranchTip: false + }, + { + hash: '9bc2a52', + committerDate: '2024-11-15T08:28:13+00:00', + authorDate: '2024-11-12 08:28:13 +0000', + message: 'feat(data): minor copy and styling improvements to worker events and loading page', + parents: [ + 'd5271f3' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '8af99c6' + ], + isBranchTip: false + }, + { + hash: 'd5271f3', + committerDate: '2024-11-14T21:13:25+00:00', + authorDate: '2024-11-11 21:13:25 +0000', + message: 'feat(data): added timings and payload data for other worker events', + parents: [ + 'eda7bbf' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '9bc2a52' + ], + isBranchTip: false + }, + { + hash: 'eda7bbf', + committerDate: '2024-11-14T20:58:36+00:00', + authorDate: '2024-11-11 20:58:36 +0000', + message: 'feat(data): added custom payload to worker messages and sent file size', + parents: [ + '0dfc9ec' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'd5271f3' + ], + isBranchTip: false + }, + { + hash: '0dfc9ec', + committerDate: '2024-11-14T20:33:18+00:00', + authorDate: '2024-11-11 20:33:18 +0000', + message: 'feat(data): fixed some of the failing data web worker event messages', + parents: [ + '8580cc5' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'eda7bbf' + ], + isBranchTip: false + }, + { + hash: '8580cc5', + committerDate: '2024-11-14T20:21:46+00:00', + authorDate: '2024-11-11 20:21:46 +0000', + message: 'feat(data): refactored worker to use Worker constructor to support type imports', + parents: [ + '73fbcc4' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '0dfc9ec' + ], + isBranchTip: false + }, + { + hash: '73fbcc4', + committerDate: '2024-11-14T16:32:43+00:00', + authorDate: '2024-11-11 16:32:43 +0000', + message: 'feat(data): added percentage to data worker message events for granular tracking', + parents: [ + 'dab5c7b' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '8580cc5' + ], + isBranchTip: false + }, + { + hash: 'dab5c7b', + committerDate: '2024-11-14T15:56:24+00:00', + authorDate: '2024-11-11 15:56:24 +0000', + message: 'feat(data): integrated worker status with context and loading component', + parents: [ + 'bee4e29' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '73fbcc4' + ], + isBranchTip: false + }, + { + hash: 'bee4e29', + committerDate: '2024-11-14T15:31:19+00:00', + authorDate: '2024-11-11 15:31:19 +0000', + message: 'feat(data): implemented custom web worker for data loading and dropped external dep', + parents: [ + 'd05120c' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'dab5c7b' + ], + isBranchTip: false + }, + { + hash: 'd05120c', + committerDate: '2024-11-14T14:48:00+00:00', + authorDate: '2024-11-11 14:48:00 +0000', + message: 'chore(data): added extra comments and docs to the pillow export parser', + parents: [ + '70e8695' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'bee4e29' + ], + isBranchTip: false + }, + { + hash: '70e8695', + committerDate: '2024-11-14T14:43:38+00:00', + authorDate: '2024-11-11 14:43:38 +0000', + message: 'feat(data): pillow export parser now supports the truly raw export with no prior modifications made', + parents: [ + '0eeea35' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'd05120c' + ], + isBranchTip: false + }, + { + hash: '0eeea35', + committerDate: '2024-11-13T20:40:34+00:00', + authorDate: '2024-11-10 20:40:34 +0000', + message: 'feat(data): refactored raw data parser function to make only one pass of the file', + parents: [ + 'e0fa20a' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '70e8695' + ], + isBranchTip: false + }, + { + hash: 'e0fa20a', + committerDate: '2024-11-13T17:57:08+00:00', + authorDate: '2024-11-10 17:57:08 +0000', + message: 'feat(graph): sleep stage graph improvements', + parents: [ + '6178286' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '0eeea35' + ], + isBranchTip: false + }, + { + hash: '6178286', + committerDate: '2024-11-13T17:46:07+00:00', + authorDate: '2024-11-10 17:46:07 +0000', + message: 'feat(graph): first pass of stacked bar chart / gantt of sleep stage breakdown', + parents: [ + '3496d41' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'e0fa20a' + ], + isBranchTip: false + }, + { + hash: '3496d41', + committerDate: '2024-11-13T15:54:37+00:00', + authorDate: '2024-11-10 15:54:37 +0000', + message: 'feat(data): re-integrated worker into raw sleep data hook and added to context', + parents: [ + '42f2132' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '6178286' + ], + isBranchTip: false + }, + { + hash: '70437fd', + committerDate: '2024-11-13T15:09:39+00:00', + authorDate: '2024-11-10 15:09:39 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@28881627b2f5288a3a68f9127abc1fdfd966c6d2 🚀', + parents: [ + '5036be1' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '7271948' + ], + isBranchTip: false + }, + { + hash: '2888162', + committerDate: '2024-11-13T15:08:53+00:00', + authorDate: '2024-11-10 15:08:53 +0000', + message: 'Merge pull request #20 from TomPlum/renovate/all-minor-patch', + parents: [ + '732b304', + '7215477' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '744a388', + '328c273' + ], + isBranchTip: false + }, + { + hash: '42f2132', + committerDate: '2024-11-13T14:47:12+00:00', + authorDate: '2024-11-10 14:47:12 +0000', + message: 'feat(data): removed redundant props from useRawSleepData hook', + parents: [ + 'bf551c0' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '3496d41' + ], + isBranchTip: false + }, + { + hash: 'bf551c0', + committerDate: '2024-11-13T13:21:35+00:00', + authorDate: '2024-11-10 13:21:35 +0000', + message: 'feat(data): fixed sound data parsing and added sleep stage data alongside it', + parents: [ + '29a7212' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '42f2132' + ], + isBranchTip: false + }, + { + hash: '29a7212', + committerDate: '2024-11-13T12:40:13+00:00', + authorDate: '2024-11-10 12:40:13 +0000', + message: 'feat(data): consolidated raw data parsing experiment into main impl', + parents: [ + '4c801b6' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'bf551c0' + ], + isBranchTip: false + }, + { + hash: '4c801b6', + committerDate: '2024-11-12T21:23:18+00:00', + authorDate: '2024-11-09 21:23:18 +0000', + message: 'feat(data): parsed sound points and mapped to sessions', + parents: [ + 'ffb0337' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '29a7212' + ], + isBranchTip: false + }, + { + hash: 'ffb0337', + committerDate: '2024-11-12T21:02:39+00:00', + authorDate: '2024-11-09 21:02:39 +0000', + message: 'feat(data): fixed table searching and date parsing', + parents: [ + '5e7b005' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '4c801b6' + ], + isBranchTip: false + }, + { + hash: '5e7b005', + committerDate: '2024-11-12T20:01:39+00:00', + authorDate: '2024-11-09 20:01:39 +0000', + message: 'feat(data): attempting to parse raw data file', + parents: [ + '821fe5a' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + 'ffb0337' + ], + isBranchTip: false + }, + { + hash: '7215477', + committerDate: '2024-11-12T04:39:56+00:00', + authorDate: '2024-11-09 04:39:56 +0000', + message: 'chore(deps): update all non-major dependencies', + parents: [ + '732b304' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '2888162' + ], + isBranchTip: false + }, + { + hash: '821fe5a', + committerDate: '2024-11-08T21:18:18+00:00', + authorDate: '2024-11-05 21:18:18 +0000', + message: 'chore(docs): README ToC', + parents: [ + '732b304' + ], + branch: 'refs/heads/feature/parse-raw-data', + children: [ + '5e7b005' + ], + isBranchTip: false + }, + { + hash: '5036be1', + committerDate: '2024-11-07T19:47:06+00:00', + authorDate: '2024-11-04 19:47:06 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@732b3044a9b1ea8699908ba4b6c41f593f44d18f 🚀', + parents: [ + 'b9196fc' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '70437fd' + ], + isBranchTip: false + }, + { + hash: '732b304', + committerDate: '2024-11-07T19:46:19+00:00', + authorDate: '2024-11-04 19:46:19 +0000', + message: 'Merge pull request #23 from TomPlum/develop', + parents: [ + 'fbca587', + 'b2bf478' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '2888162', + '7215477', + '821fe5a' + ], + isBranchTip: false + }, + { + hash: 'b2bf478', + committerDate: '2024-11-07T19:45:58+00:00', + authorDate: '2024-11-04 19:45:58 +0000', + message: 'fix(graph): fixed static asset loading in production mode', + parents: [ + '4410cd7' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '732b304' + ], + isBranchTip: false + }, + { + hash: 'b9196fc', + committerDate: '2024-11-07T19:32:13+00:00', + authorDate: '2024-11-04 19:32:13 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@fbca587594c87b5c4d13dbb14387eff3bbd97f0b 🚀', + parents: [ + '0994f81' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '5036be1' + ], + isBranchTip: false + }, + { + hash: 'fbca587', + committerDate: '2024-11-07T19:31:29+00:00', + authorDate: '2024-11-04 19:31:29 +0000', + message: 'Merge pull request #22 from TomPlum/develop', + parents: [ + 'ff20995', + '4410cd7' + ], + branch: 'refs/tags/v1.2.1', + children: [ + '732b304' + ], + isBranchTip: false + }, + { + hash: '4410cd7', + committerDate: '2024-11-07T19:31:08+00:00', + authorDate: '2024-11-04 19:31:08 +0000', + message: 'test(data): fixed compilation error in useLinearRegression.spec.ts', + parents: [ + 'e8c2bfb' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'b2bf478', + 'fbca587' + ], + isBranchTip: false + }, + { + hash: 'ff20995', + committerDate: '2024-11-07T19:29:24+00:00', + authorDate: '2024-11-04 19:29:24 +0000', + message: 'Merge pull request #21 from TomPlum/develop', + parents: [ + '529c117', + 'e8c2bfb' + ], + branch: 'refs/tags/v1.2.1', + children: [ + 'fbca587' + ], + isBranchTip: false + }, + { + hash: 'e8c2bfb', + committerDate: '2024-11-06T18:35:05+00:00', + authorDate: '2024-11-03 18:35:05 +0000', + message: 'feat(graph): updated active session info to use pillow logo instead of text', + parents: [ + '4d7a7e9' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '4410cd7', + 'ff20995' + ], + isBranchTip: false + }, + { + hash: '4d7a7e9', + committerDate: '2024-11-06T09:41:53+00:00', + authorDate: '2024-11-03 09:41:53 +0000', + message: 'feat(graph): added day of the week name to the tooltip session date format', + parents: [ + '69eaadc' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'e8c2bfb' + ], + isBranchTip: false + }, + { + hash: '69eaadc', + committerDate: '2024-11-06T09:39:56+00:00', + authorDate: '2024-11-03 09:39:56 +0000', + message: 'chore(data): updated sleep data to most recent csv snapshot', + parents: [ + 'c31f162' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '4d7a7e9' + ], + isBranchTip: false + }, + { + hash: 'c31f162', + committerDate: '2024-11-03T20:02:36+00:00', + authorDate: '2024-10-31 20:02:36 +0000', + message: 'feat(graph): minor styling improvements to active session info and stacked graph placeholder', + parents: [ + '98ff75e' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '69eaadc' + ], + isBranchTip: false + }, + { + hash: '98ff75e', + committerDate: '2024-11-02T20:21:01+00:00', + authorDate: '2024-10-30 20:21:01 +0000', + message: 'feat(graph): added pillows website link to the active session info component', + parents: [ + '7e8868b' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'c31f162' + ], + isBranchTip: false + }, + { + hash: '7e8868b', + committerDate: '2024-11-02T20:15:09+00:00', + authorDate: '2024-10-30 20:15:09 +0000', + message: 'feat(graph): added descriptions of sleep metrics upon hover in stacked view', + parents: [ + '51f121d' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '98ff75e' + ], + isBranchTip: false + }, + { + hash: '0994f81', + committerDate: '2024-11-02T19:52:18+00:00', + authorDate: '2024-10-30 19:52:18 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@529c1176ebc495163d44d926469cce22300cb2a9 🚀', + parents: [ + 'bdaa4e4' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'b9196fc' + ], + isBranchTip: false + }, + { + hash: '51f121d', + committerDate: '2024-11-02T19:51:40+00:00', + authorDate: '2024-10-30 19:51:40 +0000', + message: 'Merge branch \'release\' into develop', + parents: [ + '21678c9', + '529c117' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '7e8868b' + ], + isBranchTip: false + }, + { + hash: '529c117', + committerDate: '2024-11-02T19:51:30+00:00', + authorDate: '2024-10-30 19:51:30 +0000', + message: 'Merge pull request #16 from TomPlum/renovate/all-minor-patch', + parents: [ + '0d12d74', + '5765026' + ], + branch: 'refs/tags/v1.2.1', + children: [ + 'ff20995', + '51f121d' + ], + isBranchTip: false + }, + { + hash: '5765026', + committerDate: '2024-11-02T15:18:13+00:00', + authorDate: '2024-10-30 15:18:13 +0000', + message: 'chore(deps): update all non-major dependencies', + parents: [ + '0d12d74' + ], + branch: 'refs/tags/v1.2.1', + children: [ + '529c117' + ], + isBranchTip: false + }, + { + hash: '21678c9', + committerDate: '2024-10-30T19:38:06+00:00', + authorDate: '2024-10-27 19:38:06 +0000', + message: 'chore(graph): extracted useDefaultQueryParams hook from sleep context provider', + parents: [ + 'e6ea316' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '51f121d' + ], + isBranchTip: false + }, + { + hash: 'e6ea316', + committerDate: '2024-10-30T19:30:38+00:00', + authorDate: '2024-10-27 19:30:38 +0000', + message: 'chore(graph): changed default date range query params to all data instead of recent', + parents: [ + 'f7116d9' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '21678c9' + ], + isBranchTip: false + }, + { + hash: 'f7116d9', + committerDate: '2024-10-30T19:28:45+00:00', + authorDate: '2024-10-27 19:28:45 +0000', + message: 'chore(graph): increased typical sessions healthy awake time range to 0-10%', + parents: [ + '87efebe' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'e6ea316' + ], + isBranchTip: false + }, + { + hash: '87efebe', + committerDate: '2024-10-30T19:25:00+00:00', + authorDate: '2024-10-27 19:25:00 +0000', + message: 'fix(graph): duration breakdown pie chart no longer renders labels for 0% values', + parents: [ + 'd638b1e' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'f7116d9' + ], + isBranchTip: false + }, + { + hash: 'd638b1e', + committerDate: '2024-10-30T18:55:58+00:00', + authorDate: '2024-10-27 18:55:58 +0000', + message: 'feat(graph): added mood emoji to the session tooltip', + parents: [ + '928a7f4' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '87efebe' + ], + isBranchTip: false + }, + { + hash: '928a7f4', + committerDate: '2024-10-26T13:14:39+01:00', + authorDate: '2024-10-23 13:14:39 +0100', + message: 'feat(graph): reduced active dot radius for active session counts between 100 and 300', + parents: [ + 'd401424' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'd638b1e' + ], + isBranchTip: false + }, + { + hash: 'd401424', + committerDate: '2024-10-26T13:08:07+01:00', + authorDate: '2024-10-23 13:08:07 +0100', + message: 'fix(graph): fixed stacked view toggle not updating query param when checking', + parents: [ + '2f85544' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '928a7f4' + ], + isBranchTip: false + }, + { + hash: 'bdaa4e4', + committerDate: '2024-10-26T12:46:53+01:00', + authorDate: '2024-10-23 11:46:53 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@0d12d74a0d49b59240f4071adc56fb9599990905 🚀', + parents: [ + '6c77a6b' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '0994f81' + ], + isBranchTip: false + }, + { + hash: '0d12d74', + committerDate: '2024-10-26T12:46:10+01:00', + authorDate: '2024-10-23 12:46:10 +0100', + message: 'Merge pull request #19 from TomPlum/develop', + parents: [ + '5e1e15c', + '2f85544' + ], + branch: 'refs/tags/v1.2.0', + children: [ + '529c117', + '5765026' + ], + isBranchTip: false + }, + { + hash: '2f85544', + committerDate: '2024-10-26T12:40:38+01:00', + authorDate: '2024-10-23 12:40:38 +0100', + message: 'Merge pull request #18 from TomPlum/feature/stacked-view', + parents: [ + 'a6ba004', + '2c5082d' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'd401424', + '0d12d74' + ], + isBranchTip: false + }, + { + hash: '2c5082d', + committerDate: '2024-10-26T12:39:13+01:00', + authorDate: '2024-10-23 12:39:13 +0100', + message: 'feat(graph): stacked toggle now clears stacked metrics when turning on', + parents: [ + '9676781' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '2f85544' + ], + isBranchTip: false + }, + { + hash: '9676781', + committerDate: '2024-10-26T12:33:26+01:00', + authorDate: '2024-10-23 12:33:26 +0100', + message: 'fix(config): trying to make vite HMR watch the public dir during local development', + parents: [ + '317a526' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '2c5082d' + ], + isBranchTip: false + }, + { + hash: '317a526', + committerDate: '2024-10-26T12:22:32+01:00', + authorDate: '2024-10-23 12:22:32 +0100', + message: 'feat(graph): fixed stacked graph placeholder messages and ensured metric checkboxes update the query params', + parents: [ + '66ac076' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '9676781' + ], + isBranchTip: false + }, + { + hash: '66ac076', + committerDate: '2024-10-25T20:27:41+01:00', + authorDate: '2024-10-22 20:27:41 +0100', + message: 'fix(graph): fixed missing tooltip and improvement label from single graph view', + parents: [ + '415c1d1' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '317a526' + ], + isBranchTip: false + }, + { + hash: '415c1d1', + committerDate: '2024-10-25T20:18:29+01:00', + authorDate: '2024-10-22 20:18:29 +0100', + message: 'feat(graph): improvement line label and tooltip no longer render twice in stacked view', + parents: [ + 'c0dc79f' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '66ac076' + ], + isBranchTip: false + }, + { + hash: 'c0dc79f', + committerDate: '2024-10-25T20:13:21+01:00', + authorDate: '2024-10-22 20:13:21 +0100', + message: 'feat(graph): active sessions info now respects stacked view with no selections', + parents: [ + '0b9fad5' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '415c1d1' + ], + isBranchTip: false + }, + { + hash: '0b9fad5', + committerDate: '2024-10-25T20:08:53+01:00', + authorDate: '2024-10-22 20:08:53 +0100', + message: 'fix(graph): fixed react hooks lifecycle error with stacked graphs', + parents: [ + '70164f4' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + 'c0dc79f' + ], + isBranchTip: false + }, + { + hash: '70164f4', + committerDate: '2024-10-25T19:38:40+01:00', + authorDate: '2024-10-22 19:38:40 +0100', + message: 'chore(graph): split metric checkbox component into two for separation of concerns', + parents: [ + 'bb29e00' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '0b9fad5' + ], + isBranchTip: false + }, + { + hash: 'bb29e00', + committerDate: '2024-10-25T17:33:45+01:00', + authorDate: '2024-10-22 17:33:45 +0100', + message: 'feat(graph): metric checkbox now has button mode and graph placeholder improved button styling', + parents: [ + '6487f34' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '70164f4' + ], + isBranchTip: false + }, + { + hash: '6487f34', + committerDate: '2024-10-25T15:38:58+01:00', + authorDate: '2024-10-22 15:38:58 +0100', + message: 'feat(routing): serialised stacked view boolean in query params', + parents: [ + '18fdb81' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + 'bb29e00' + ], + isBranchTip: false + }, + { + hash: '18fdb81', + committerDate: '2024-10-25T15:13:33+01:00', + authorDate: '2024-10-22 15:13:33 +0100', + message: 'feat(graph): metric config no longer lets you pick more than 3 metrics in stacked view', + parents: [ + 'e33383e' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '6487f34' + ], + isBranchTip: false + }, + { + hash: 'e33383e', + committerDate: '2024-10-25T15:10:35+01:00', + authorDate: '2024-10-22 15:10:35 +0100', + message: 'feat(graph): stacked graph placeholder now offer available sleep metrics to pick from', + parents: [ + '77adf46' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '18fdb81' + ], + isBranchTip: false + }, + { + hash: '77adf46', + committerDate: '2024-10-25T14:59:15+01:00', + authorDate: '2024-10-22 14:59:15 +0100', + message: 'chore(graph): extracted stacked graph placeholder component', + parents: [ + '1d30e95' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + 'e33383e' + ], + isBranchTip: false + }, + { + hash: '1d30e95', + committerDate: '2024-10-25T13:49:05+01:00', + authorDate: '2024-10-22 13:49:05 +0100', + message: 'feat(graph): second graph in stacked view now transitions its opacity as it renders', + parents: [ + 'd453692' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '77adf46' + ], + isBranchTip: false + }, + { + hash: 'd453692', + committerDate: '2024-10-25T12:59:58+01:00', + authorDate: '2024-10-22 12:59:58 +0100', + message: 'feat(graph): reduced the upper-bound of the dynamic y-axis domain to better frame the data on the chart', + parents: [ + '7ef626b' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '1d30e95' + ], + isBranchTip: false + }, + { + hash: '7ef626b', + committerDate: '2024-10-25T12:57:30+01:00', + authorDate: '2024-10-22 12:57:30 +0100', + message: 'feat(graph): added selection placeholder when a second metric is not selected in stacked view', + parents: [ + 'b7851b4' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + 'd453692' + ], + isBranchTip: false + }, + { + hash: 'b7851b4', + committerDate: '2024-10-25T09:56:43+01:00', + authorDate: '2024-10-22 09:56:43 +0100', + message: 'feat(graph): favicon now changes based on active sleep metric', + parents: [ + '569f1d0' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '7ef626b' + ], + isBranchTip: false + }, + { + hash: '569f1d0', + committerDate: '2024-10-25T09:28:15+01:00', + authorDate: '2024-10-22 09:28:15 +0100', + message: 'feat(graph): added text to stacked view toggle button', + parents: [ + '72634f1' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + 'b7851b4' + ], + isBranchTip: false + }, + { + hash: '72634f1', + committerDate: '2024-10-25T09:20:51+01:00', + authorDate: '2024-10-22 09:20:51 +0100', + message: 'feat(graph): fixed non-stacked view and added dynamic stacked colours to active session info', + parents: [ + '6b2dfb3' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '569f1d0' + ], + isBranchTip: false + }, + { + hash: '6b2dfb3', + committerDate: '2024-10-24T17:24:29+01:00', + authorDate: '2024-10-21 17:24:29 +0100', + message: 'feat(graph): first pass of enabling stacked graphs', + parents: [ + 'a6ba004' + ], + branch: 'refs/heads/feature/stacked-view', + children: [ + '72634f1' + ], + isBranchTip: false + }, + { + hash: 'a6ba004', + committerDate: '2024-10-24T16:35:40+01:00', + authorDate: '2024-10-21 16:35:40 +0100', + message: 'chore(graph): renamed old graph to 3D', + parents: [ + '9de61dd' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '2f85544', + '6b2dfb3' + ], + isBranchTip: false + }, + { + hash: '9de61dd', + committerDate: '2024-10-24T16:34:23+01:00', + authorDate: '2024-10-21 16:34:23 +0100', + message: 'Merge branch \'release\' into develop', + parents: [ + 'e9d14e5', + '5e1e15c' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'a6ba004' + ], + isBranchTip: false + }, + { + hash: 'e9d14e5', + committerDate: '2024-10-24T16:34:13+01:00', + authorDate: '2024-10-21 16:34:13 +0100', + message: 'chore(docs): added some TODOs to the README', + parents: [ + '61b38d9' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '9de61dd' + ], + isBranchTip: false + }, + { + hash: '6c77a6b', + committerDate: '2024-10-24T11:42:07+01:00', + authorDate: '2024-10-21 10:42:07 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@5e1e15c2d5eada142fbd66cd5b87d015945fd11b 🚀', + parents: [ + 'ed89441' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'bdaa4e4' + ], + isBranchTip: false + }, + { + hash: '5e1e15c', + committerDate: '2024-10-24T11:41:21+01:00', + authorDate: '2024-10-21 11:41:21 +0100', + message: 'Merge pull request #17 from TomPlum/develop', + parents: [ + '7d545a5', + '61b38d9' + ], + branch: 'refs/tags/v1.1.0', + children: [ + '0d12d74', + '9de61dd' + ], + isBranchTip: false + }, + { + hash: '61b38d9', + committerDate: '2024-10-24T10:46:02+01:00', + authorDate: '2024-10-21 10:46:02 +0100', + message: 'feat(graph): session count colour now transitions with same animation duration as graph', + parents: [ + 'a2db943' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'e9d14e5', + '5e1e15c' + ], + isBranchTip: false + }, + { + hash: 'a2db943', + committerDate: '2024-10-24T10:44:52+01:00', + authorDate: '2024-10-21 10:44:52 +0100', + message: 'feat(graph): data source now links to a download of the raw CSV', + parents: [ + '5a21429' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '61b38d9' + ], + isBranchTip: false + }, + { + hash: '5a21429', + committerDate: '2024-10-24T10:35:42+01:00', + authorDate: '2024-10-21 10:35:42 +0100', + message: 'feat(graph): added data source version to active session info', + parents: [ + 'a5425d1' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'a2db943' + ], + isBranchTip: false + }, + { + hash: 'a5425d1', + committerDate: '2024-10-24T10:27:09+01:00', + authorDate: '2024-10-21 10:27:09 +0100', + message: 'chore(graph): extracted active session info component from sleep page', + parents: [ + '2282d36' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '5a21429' + ], + isBranchTip: false + }, + { + hash: '2282d36', + committerDate: '2024-10-24T10:22:42+01:00', + authorDate: '2024-10-21 10:22:42 +0100', + message: 'chore(graph): increased font weight of improvement label text', + parents: [ + 'cba1df6' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'a5425d1' + ], + isBranchTip: false + }, + { + hash: 'cba1df6', + committerDate: '2024-10-23T11:18:32+01:00', + authorDate: '2024-10-20 11:18:32 +0100', + message: 'feat(graph): added subtle cartesian grid back to the line chart', + parents: [ + 'da988de' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '2282d36' + ], + isBranchTip: false + }, + { + hash: 'da988de', + committerDate: '2024-10-23T11:06:32+01:00', + authorDate: '2024-10-20 11:06:32 +0100', + message: 'fix(graph): a single month can now be selected from the date picker', + parents: [ + 'edafbbf' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'cba1df6' + ], + isBranchTip: false + }, + { + hash: 'edafbbf', + committerDate: '2024-10-23T10:55:50+01:00', + authorDate: '2024-10-20 10:55:50 +0100', + message: 'Merge branch \'release\' into develop', + parents: [ + 'afd8749', + '7d545a5' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'da988de' + ], + isBranchTip: false + }, + { + hash: 'afd8749', + committerDate: '2024-10-23T10:54:55+01:00', + authorDate: '2024-10-20 10:54:55 +0100', + message: 'chore(graph): tweaked active dot radius for the main sleep metric line', + parents: [ + 'cee6402' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'edafbbf' + ], + isBranchTip: false + }, + { + hash: 'cee6402', + committerDate: '2024-10-23T10:49:13+01:00', + authorDate: '2024-10-20 10:49:13 +0100', + message: 'chore(graph): hoisted improvement date calculation into sleep context', + parents: [ + '012ffe9' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'afd8749' + ], + isBranchTip: false + }, + { + hash: '012ffe9', + committerDate: '2024-10-23T10:45:23+01:00', + authorDate: '2024-10-20 10:45:23 +0100', + message: 'feat(graph): improved session and nap filtering', + parents: [ + 'bff2088' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'cee6402' + ], + isBranchTip: false + }, + { + hash: 'bff2088', + committerDate: '2024-10-22T19:18:37+01:00', + authorDate: '2024-10-19 19:18:37 +0100', + message: 'feat(routing): added language to query parameters', + parents: [ + '21fecc1' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '012ffe9' + ], + isBranchTip: false + }, + { + hash: '21fecc1', + committerDate: '2024-10-22T19:10:25+01:00', + authorDate: '2024-10-19 19:10:25 +0100', + message: 'feat(graph): show all button now changes to "recent" if all sessions are showing', + parents: [ + '9136c6b' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'bff2088' + ], + isBranchTip: false + }, + { + hash: 'ed89441', + committerDate: '2024-10-22T19:02:15+01:00', + authorDate: '2024-10-19 18:02:15 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@7d545a59464b63d3aaace8e99aa55cf6e0866f97 🚀', + parents: [ + '1b5c868' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '6c77a6b' + ], + isBranchTip: false + }, + { + hash: '7d545a5', + committerDate: '2024-10-22T19:01:32+01:00', + authorDate: '2024-10-19 19:01:32 +0100', + message: 'Merge pull request #14 from TomPlum/renovate/all-minor-patch', + parents: [ + '3d3d5a2', + 'e27d91a' + ], + branch: 'refs/tags/v1.1.0', + children: [ + '5e1e15c', + 'edafbbf' + ], + isBranchTip: false + }, + { + hash: '9136c6b', + committerDate: '2024-10-22T15:36:18+01:00', + authorDate: '2024-10-19 15:36:18 +0100', + message: 'feat(graph): added show all button and extracted date selection hook', + parents: [ + '7fc3850' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '21fecc1' + ], + isBranchTip: false + }, + { + hash: '7fc3850', + committerDate: '2024-10-22T15:21:51+01:00', + authorDate: '2024-10-19 15:21:51 +0100', + message: 'chore(graph): extracted graph controls component', + parents: [ + '7c9d0e2' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '9136c6b' + ], + isBranchTip: false + }, + { + hash: '7c9d0e2', + committerDate: '2024-10-22T15:17:59+01:00', + authorDate: '2024-10-19 15:17:59 +0100', + message: 'fix(data): filtered out sessions longer than 15 hours', + parents: [ + '91ab124' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '7fc3850' + ], + isBranchTip: false + }, + { + hash: '91ab124', + committerDate: '2024-10-22T15:12:54+01:00', + authorDate: '2024-10-19 15:12:54 +0100', + message: 'feat(graph): added vertical reference line for the date in which I made improvements', + parents: [ + 'b9e9eaf' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '7c9d0e2' + ], + isBranchTip: false + }, + { + hash: '1b5c868', + committerDate: '2024-10-22T12:45:18+01:00', + authorDate: '2024-10-19 11:45:18 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@3d3d5a2ec3361fa74673968451d4fb7bd9d9bf65 🚀', + parents: [ + 'bff718f' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'ed89441' + ], + isBranchTip: false + }, + { + hash: '3d3d5a2', + committerDate: '2024-10-22T12:44:33+01:00', + authorDate: '2024-10-19 12:44:33 +0100', + message: 'Merge pull request #15 from TomPlum/develop', + parents: [ + 'c9c48c0', + 'b9e9eaf' + ], + branch: 'refs/tags/v1.1.0', + children: [ + '7d545a5' + ], + isBranchTip: false + }, + { + hash: 'b9e9eaf', + committerDate: '2024-10-22T12:43:46+01:00', + authorDate: '2024-10-19 12:43:46 +0100', + message: 'chore(test): fixed failing unit tests due to bad setup data', + parents: [ + '1634ce3' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '91ab124', + '3d3d5a2' + ], + isBranchTip: false + }, + { + hash: '1634ce3', + committerDate: '2024-10-22T12:40:59+01:00', + authorDate: '2024-10-19 12:40:59 +0100', + message: 'feat(graph): moved locale switch to top right controls and extracted component', + parents: [ + 'fcc0e1c' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'b9e9eaf' + ], + isBranchTip: false + }, + { + hash: 'fcc0e1c', + committerDate: '2024-10-22T12:26:20+01:00', + authorDate: '2024-10-19 12:26:20 +0100', + message: 'chore(docs): added screenshots to README', + parents: [ + 'ef2cfc2' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '1634ce3' + ], + isBranchTip: false + }, + { + hash: 'ef2cfc2', + committerDate: '2024-10-22T12:21:14+01:00', + authorDate: '2024-10-19 12:21:14 +0100', + message: 'feat(graph): added nap indicator to session tooltip', + parents: [ + '76a2a2e' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'fcc0e1c' + ], + isBranchTip: false + }, + { + hash: '76a2a2e', + committerDate: '2024-10-22T12:11:57+01:00', + authorDate: '2024-10-19 12:11:57 +0100', + message: 'fix(routing): fixed bad query param name for sleep metric', + parents: [ + '3f4402f' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'ef2cfc2' + ], + isBranchTip: false + }, + { + hash: '3f4402f', + committerDate: '2024-10-22T12:04:44+01:00', + authorDate: '2024-10-19 12:04:44 +0100', + message: 'feat(graph): added duration as a percentage of 8 hours as a new metric', + parents: [ + '184b081' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '76a2a2e' + ], + isBranchTip: false + }, + { + hash: 'e27d91a', + committerDate: '2024-10-22T05:30:16+01:00', + authorDate: '2024-10-19 04:30:16 +0000', + message: 'chore(deps): update all non-major dependencies', + parents: [ + 'c9c48c0' + ], + branch: 'refs/tags/v1.1.0', + children: [ + '7d545a5' + ], + isBranchTip: false + }, + { + hash: 'bff718f', + committerDate: '2024-10-21T16:30:26+01:00', + authorDate: '2024-10-18 15:30:26 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@c9c48c01cfc584cfe74ecedbbe63f350b39bbc17 🚀', + parents: [ + '8f95b4a' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '1b5c868' + ], + isBranchTip: false + }, + { + hash: 'c9c48c0', + committerDate: '2024-10-21T16:29:29+01:00', + authorDate: '2024-10-18 16:29:29 +0100', + message: 'Merge pull request #13 from TomPlum/develop', + parents: [ + '5f4518b', + '184b081' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '3d3d5a2', + 'e27d91a' + ], + isBranchTip: false + }, + { + hash: '184b081', + committerDate: '2024-10-21T16:28:37+01:00', + authorDate: '2024-10-18 16:28:37 +0100', + message: 'chore(test): fixed failing unit tests for useLinearRegression.spec.ts', + parents: [ + 'eda1f0d' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '3f4402f', + 'c9c48c0' + ], + isBranchTip: false + }, + { + hash: 'eda1f0d', + committerDate: '2024-10-21T16:24:57+01:00', + authorDate: '2024-10-18 16:24:57 +0100', + message: 'feat(graph): added github button to top left controls container', + parents: [ + 'b89ac17' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '184b081' + ], + isBranchTip: false + }, + { + hash: 'b89ac17', + committerDate: '2024-10-21T11:32:53+01:00', + authorDate: '2024-10-18 11:32:53 +0100', + message: 'chore(styling): minor styling and font changes', + parents: [ + '15c8018' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'eda1f0d' + ], + isBranchTip: false + }, + { + hash: '15c8018', + committerDate: '2024-10-20T20:18:02+01:00', + authorDate: '2024-10-17 20:18:02 +0100', + message: 'chore(graph): extracted regression delta label component from graph', + parents: [ + 'b4a80bb' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'b89ac17' + ], + isBranchTip: false + }, + { + hash: 'b4a80bb', + committerDate: '2024-10-20T20:13:11+01:00', + authorDate: '2024-10-17 20:13:11 +0100', + message: 'feat(graph): regression line delta horizontal reference line now animates like its vertical counterpart', + parents: [ + 'e748aef' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '15c8018' + ], + isBranchTip: false + }, + { + hash: 'e748aef', + committerDate: '2024-10-20T19:50:26+01:00', + authorDate: '2024-10-17 19:50:26 +0100', + message: 'feat(graph): regression line delta vertical reference line now fits the correct y-ordinates and doesn\'t fill the charts height', + parents: [ + '46cfb4d' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'b4a80bb' + ], + isBranchTip: false + }, + { + hash: '46cfb4d', + committerDate: '2024-10-20T18:15:51+01:00', + authorDate: '2024-10-17 18:15:51 +0100', + message: 'chore(graph): encapsulated reference area fill into hook and tweaks reference line stroke dash', + parents: [ + 'aaa16bf' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'e748aef' + ], + isBranchTip: false + }, + { + hash: 'aaa16bf', + committerDate: '2024-10-20T18:00:20+01:00', + authorDate: '2024-10-17 18:00:20 +0100', + message: 'chore(docs): removed readme template contents', + parents: [ + '05b7c89' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '46cfb4d' + ], + isBranchTip: false + }, + { + hash: '05b7c89', + committerDate: '2024-10-20T17:58:06+01:00', + authorDate: '2024-10-17 17:58:06 +0100', + message: 'chore(lint): added import eslint plugin, configured and fixed import extensions', + parents: [ + '19e0968' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'aaa16bf' + ], + isBranchTip: false + }, + { + hash: '19e0968', + committerDate: '2024-10-20T17:51:00+01:00', + authorDate: '2024-10-17 17:51:00 +0100', + message: 'chore(lint): tweaked quotes rules and fixed all double -> single', + parents: [ + '245c95a' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '05b7c89' + ], + isBranchTip: false + }, + { + hash: '245c95a', + committerDate: '2024-10-20T17:50:04+01:00', + authorDate: '2024-10-17 17:50:04 +0100', + message: 'chore(lint): tweaked object/curly brace rules and fixed all spacing issues', + parents: [ + 'ddca752' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '19e0968' + ], + isBranchTip: false + }, + { + hash: 'ddca752', + committerDate: '2024-10-20T17:48:04+01:00', + authorDate: '2024-10-17 17:48:04 +0100', + message: 'chore(lint): tweaked semi rules and removed redundant semicolons', + parents: [ + 'f32e3d4' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '245c95a' + ], + isBranchTip: false + }, + { + hash: 'f32e3d4', + committerDate: '2024-10-20T16:42:11+01:00', + authorDate: '2024-10-17 16:42:11 +0100', + message: 'Revert "chore(data): removed redundant guarding in linear regression hook"', + parents: [ + '01068d1' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'ddca752' + ], + isBranchTip: false + }, + { + hash: '01068d1', + committerDate: '2024-10-20T16:41:32+01:00', + authorDate: '2024-10-17 16:41:32 +0100', + message: 'chore(data): removed redundant guarding in linear regression hook', + parents: [ + 'c61415e' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'f32e3d4' + ], + isBranchTip: false + }, + { + hash: 'c61415e', + committerDate: '2024-10-20T16:34:33+01:00', + authorDate: '2024-10-17 16:34:33 +0100', + message: 'chore(data): filtered out invalid awake time values', + parents: [ + '66a1d30' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '01068d1' + ], + isBranchTip: false + }, + { + hash: '66a1d30', + committerDate: '2024-10-20T16:30:39+01:00', + authorDate: '2024-10-17 16:30:39 +0100', + message: 'feat(graph): migrated xAxisInterval to axes hook and added one more level of granularity', + parents: [ + '76baba0' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'c61415e' + ], + isBranchTip: false + }, + { + hash: '8f95b4a', + committerDate: '2024-10-20T16:22:19+01:00', + authorDate: '2024-10-17 15:22:19 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@5f4518bb04c3e9c8fe74c2815da5b0584d1cdbc7 🚀', + parents: [ + '9f93e5f' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + 'bff718f' + ], + isBranchTip: false + }, + { + hash: '5f4518b', + committerDate: '2024-10-20T16:21:40+01:00', + authorDate: '2024-10-17 16:21:40 +0100', + message: 'Merge pull request #12 from TomPlum/develop', + parents: [ + '34aa1bf', + '76baba0' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'c9c48c0' + ], + isBranchTip: false + }, + { + hash: '76baba0', + committerDate: '2024-10-20T16:21:03+01:00', + authorDate: '2024-10-17 16:21:03 +0100', + message: 'feat(locale): default locale and switch position is now en', + parents: [ + 'ae9b6bc' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '66a1d30', + '5f4518b' + ], + isBranchTip: false + }, + { + hash: 'ae9b6bc', + committerDate: '2024-10-20T16:19:51+01:00', + authorDate: '2024-10-17 16:19:51 +0100', + message: 'feat(graph): custom x tick now offsets first/last date strings to fit on screen', + parents: [ + '924c8f9' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '76baba0' + ], + isBranchTip: false + }, + { + hash: '924c8f9', + committerDate: '2024-10-20T16:12:38+01:00', + authorDate: '2024-10-17 16:12:38 +0100', + message: 'chore(data): extracted axes 2d hook', + parents: [ + '8abcdd6' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'ae9b6bc' + ], + isBranchTip: false + }, + { + hash: '8abcdd6', + committerDate: '2024-10-20T16:04:33+01:00', + authorDate: '2024-10-17 16:04:33 +0100', + message: 'chore(data): hoisted earliest/latest active session dates into context and integrated with x-axis domain', + parents: [ + 'd4d645a' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '924c8f9' + ], + isBranchTip: false + }, + { + hash: 'd4d645a', + committerDate: '2024-10-20T15:30:01+01:00', + authorDate: '2024-10-17 15:30:01 +0100', + message: 'feat(data): reworked linear regression algorithm and x-axis domain to work better with dates and ensure line of best fit is linear', + parents: [ + '7a78b8d' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '8abcdd6' + ], + isBranchTip: false + }, + { + hash: '7a78b8d', + committerDate: '2024-10-20T11:25:24+01:00', + authorDate: '2024-10-17 11:25:24 +0100', + message: 'test(data): added linear regression hook unit tests and shortened english translations', + parents: [ + '827a805' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'd4d645a' + ], + isBranchTip: false + }, + { + hash: '9f93e5f', + committerDate: '2024-10-19T10:47:17+01:00', + authorDate: '2024-10-16 09:47:17 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@34aa1bf564af10c4d3ebeef73542b82385be5163 🚀', + parents: [ + '9950706' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '8f95b4a' + ], + isBranchTip: false + }, + { + hash: '34aa1bf', + committerDate: '2024-10-19T10:46:32+01:00', + authorDate: '2024-10-16 10:46:32 +0100', + message: 'Merge pull request #11 from TomPlum/develop', + parents: [ + '6a66ec6', + '827a805' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '5f4518b' + ], + isBranchTip: false + }, + { + hash: '827a805', + committerDate: '2024-10-19T10:45:53+01:00', + authorDate: '2024-10-16 10:45:53 +0100', + message: 'feat(routing): re-added sleep route to app navigation and added dynamic baseUrl based on mode', + parents: [ + '5ef49a3' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '7a78b8d', + '34aa1bf' + ], + isBranchTip: false + }, + { + hash: '9950706', + committerDate: '2024-10-19T10:39:12+01:00', + authorDate: '2024-10-16 09:39:12 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@6a66ec6e43d3e2961e869aa07bfed4bcfa369eed 🚀', + parents: [ + '38ff1c2' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '9f93e5f' + ], + isBranchTip: false + }, + { + hash: '6a66ec6', + committerDate: '2024-10-19T10:38:22+01:00', + authorDate: '2024-10-16 10:38:22 +0100', + message: 'Merge pull request #10 from TomPlum/develop', + parents: [ + '46a65f9', + '5ef49a3' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '34aa1bf' + ], + isBranchTip: false + }, + { + hash: '5ef49a3', + committerDate: '2024-10-19T10:37:53+01:00', + authorDate: '2024-10-16 10:37:53 +0100', + message: 'feat(graph): added language toggle button', + parents: [ + '3270ffd' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '827a805', + '6a66ec6' + ], + isBranchTip: false + }, + { + hash: '38ff1c2', + committerDate: '2024-10-18T18:51:27+01:00', + authorDate: '2024-10-15 17:51:27 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@46a65f9bf3c7bf3060a0fccc8b0e5ce4ccdf5310 🚀', + parents: [ + '4bebfe5' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '9950706' + ], + isBranchTip: false + }, + { + hash: '46a65f9', + committerDate: '2024-10-18T18:50:48+01:00', + authorDate: '2024-10-15 18:50:48 +0100', + message: 'Merge pull request #9 from TomPlum/develop', + parents: [ + '7125412', + '3270ffd' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '6a66ec6' + ], + isBranchTip: false + }, + { + hash: '3270ffd', + committerDate: '2024-10-18T18:49:22+01:00', + authorDate: '2024-10-15 18:49:22 +0100', + message: 'feat(graph): added duration to the tooltip', + parents: [ + 'fb7455a' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '5ef49a3', + '46a65f9' + ], + isBranchTip: false + }, + { + hash: 'fb7455a', + committerDate: '2024-10-18T18:43:22+01:00', + authorDate: '2024-10-15 18:43:22 +0100', + message: 'feat(graph): added healthy data range for sleep quality metric', + parents: [ + '1606c57' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '3270ffd' + ], + isBranchTip: false + }, + { + hash: '1606c57', + committerDate: '2024-10-18T18:22:41+01:00', + authorDate: '2024-10-15 18:22:41 +0100', + message: 'chore(graph): session count now renders in the current metric colour', + parents: [ + '5408eb4' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'fb7455a' + ], + isBranchTip: false + }, + { + hash: '5408eb4', + committerDate: '2024-10-18T16:52:42+01:00', + authorDate: '2024-10-15 16:52:42 +0100', + message: 'chore(graph): tweaked healthy ranges and added translations for session count', + parents: [ + 'adaf340' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '1606c57' + ], + isBranchTip: false + }, + { + hash: 'adaf340', + committerDate: '2024-10-18T16:45:46+01:00', + authorDate: '2024-10-15 16:45:46 +0100', + message: 'chore(styles): added antd dark theme and added total sessions to top left', + parents: [ + '95dcf41' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '5408eb4' + ], + isBranchTip: false + }, + { + hash: '95dcf41', + committerDate: '2024-10-18T16:37:33+01:00', + authorDate: '2024-10-15 16:37:33 +0100', + message: 'feat(graph): added label to typical session area and added missing jp translations', + parents: [ + '28293da' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'adaf340' + ], + isBranchTip: false + }, + { + hash: '28293da', + committerDate: '2024-10-18T16:26:56+01:00', + authorDate: '2024-10-15 16:26:56 +0100', + message: 'chore(graph): removed enum index signatures in sleep graph datum interface and removed casting', + parents: [ + 'c27bf01' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '95dcf41' + ], + isBranchTip: false + }, + { + hash: 'c27bf01', + committerDate: '2024-10-18T16:07:11+01:00', + authorDate: '2024-10-15 16:07:11 +0100', + message: 'feat(graph): added custom domain and ticks so the y domain is wrapped tighter around the value range', + parents: [ + 'eb84e73' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '28293da' + ], + isBranchTip: false + }, + { + hash: 'eb84e73', + committerDate: '2024-10-18T15:45:53+01:00', + authorDate: '2024-10-15 15:45:53 +0100', + message: 'feat(graph): 2d line graph now renders right up against the left viewport edge', + parents: [ + '1a19a6a' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'c27bf01' + ], + isBranchTip: false + }, + { + hash: '1a19a6a', + committerDate: '2024-10-18T14:40:52+01:00', + authorDate: '2024-10-15 14:40:52 +0100', + message: 'chore(graph): extracted typical sleep session hook for area data', + parents: [ + 'e28e441' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'eb84e73' + ], + isBranchTip: false + }, + { + hash: 'e28e441', + committerDate: '2024-10-18T14:33:17+01:00', + authorDate: '2024-10-15 14:33:17 +0100', + message: 'chore(graph): encapsulated properties into linear regression hook', + parents: [ + '7f58f11' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '1a19a6a' + ], + isBranchTip: false + }, + { + hash: '7f58f11', + committerDate: '2024-10-18T14:30:56+01:00', + authorDate: '2024-10-15 14:30:56 +0100', + message: 'chore(graph): moved linear regression line delta reference lines into hook', + parents: [ + 'b854f35' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'e28e441' + ], + isBranchTip: false + }, + { + hash: 'b854f35', + committerDate: '2024-10-18T14:24:51+01:00', + authorDate: '2024-10-15 14:24:51 +0100', + message: 'feat(graph): added typical sleep session reference areas', + parents: [ + 'ddc31b5' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '7f58f11' + ], + isBranchTip: false + }, + { + hash: 'ddc31b5', + committerDate: '2024-10-18T13:40:21+01:00', + authorDate: '2024-10-15 13:40:21 +0100', + message: 'feat(graph): added reference lines to show regression delta', + parents: [ + '7e82560' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'b854f35' + ], + isBranchTip: false + }, + { + hash: '7e82560', + committerDate: '2024-10-18T11:06:18+01:00', + authorDate: '2024-10-15 11:06:18 +0100', + message: 'chore(hooks): moved more graph styling logic into a hook', + parents: [ + '55c405d' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'ddc31b5' + ], + isBranchTip: false + }, + { + hash: '4bebfe5', + committerDate: '2024-10-18T10:31:40+01:00', + authorDate: '2024-10-15 09:31:40 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@71254127053aea2018fab52895ce039a5bcb607c 🚀', + parents: [ + '7d32883' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '38ff1c2' + ], + isBranchTip: false + }, + { + hash: '7125412', + committerDate: '2024-10-18T10:31:01+01:00', + authorDate: '2024-10-15 10:31:01 +0100', + message: 'Merge pull request #8 from TomPlum/develop', + parents: [ + '3cf1df4', + '55c405d' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '46a65f9' + ], + isBranchTip: false + }, + { + hash: '55c405d', + committerDate: '2024-10-18T10:29:58+01:00', + authorDate: '2024-10-15 10:29:58 +0100', + message: 'feat(routing): removed internal use of /sleep in favour of / since gh-pages hosts at /sleep anyway', + parents: [ + '758174d' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '7e82560', + '7125412' + ], + isBranchTip: false + }, + { + hash: '758174d', + committerDate: '2024-10-18T10:25:57+01:00', + authorDate: '2024-10-15 10:25:57 +0100', + message: 'feat(graph): encapsulated more graph styling into custom hook and added active dot radius value', + parents: [ + 'b081373' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '55c405d' + ], + isBranchTip: false + }, + { + hash: 'b081373', + committerDate: '2024-10-18T10:04:16+01:00', + authorDate: '2024-10-15 10:04:16 +0100', + message: 'chore(state): hoisted graph data to react context and fixed render instability', + parents: [ + 'e50f872' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '758174d' + ], + isBranchTip: false + }, + { + hash: 'e50f872', + committerDate: '2024-10-18T09:42:31+01:00', + authorDate: '2024-10-15 09:42:31 +0100', + message: 'chore(state): hoisted sleep page state management to react context', + parents: [ + '5b5f0a9' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'b081373' + ], + isBranchTip: false + }, + { + hash: '5b5f0a9', + committerDate: '2024-10-18T09:23:48+01:00', + authorDate: '2024-10-15 09:23:48 +0100', + message: 'feat(graph): graph config now render translucent and becomes opaque on hover', + parents: [ + '9e6b6d9' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'e50f872' + ], + isBranchTip: false + }, + { + hash: '9e6b6d9', + committerDate: '2024-10-17T19:45:07+01:00', + authorDate: '2024-10-14 19:45:07 +0100', + message: 'feat(graph): lines now start on the left viewport edge and y-ticks have a background', + parents: [ + 'e544bc3' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '5b5f0a9' + ], + isBranchTip: false + }, + { + hash: 'e544bc3', + committerDate: '2024-10-17T19:03:44+01:00', + authorDate: '2024-10-14 19:03:44 +0100', + message: 'feat(routing): added 404 not found page', + parents: [ + 'd683d57' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '9e6b6d9' + ], + isBranchTip: false + }, + { + hash: '7d32883', + committerDate: '2024-10-17T18:38:12+01:00', + authorDate: '2024-10-14 17:38:12 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@3cf1df49c0ef97fd2954882c882f8013d59f6c87 🚀', + parents: [ + '9744f6f' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '4bebfe5' + ], + isBranchTip: false + }, + { + hash: '3cf1df4', + committerDate: '2024-10-17T18:37:31+01:00', + authorDate: '2024-10-14 18:37:31 +0100', + message: 'Merge pull request #7 from TomPlum/develop', + parents: [ + '67d24a6', + 'd683d57' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '7125412' + ], + isBranchTip: false + }, + { + hash: 'd683d57', + committerDate: '2024-10-17T18:37:03+01:00', + authorDate: '2024-10-14 18:37:03 +0100', + message: 'chore(build): added vite base path for gh-pages deployment', + parents: [ + '3a9d56e' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'e544bc3', + '3cf1df4' + ], + isBranchTip: false + }, + { + hash: '9744f6f', + committerDate: '2024-10-17T14:57:51+01:00', + authorDate: '2024-10-14 13:57:51 +0000', + message: 'Deploying to gh-pages from @ TomPlum/sleep@67d24a6224871536699e9ef78e8ac62a61c442f7 🚀', + parents: [ + 'e74f89d' + ], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '7d32883' + ], + isBranchTip: false + }, + { + hash: 'e74f89d', + committerDate: '2024-10-17T14:57:51+01:00', + authorDate: '2024-10-14 13:57:51 +0000', + message: 'Initial gh-pages commit', + parents: [], + branch: 'refs/remotes/origin/gh-pages', + children: [ + '9744f6f' + ], + isBranchTip: false + }, + { + hash: '67d24a6', + committerDate: '2024-10-17T14:57:04+01:00', + authorDate: '2024-10-14 14:57:04 +0100', + message: 'Merge pull request #6 from TomPlum/develop', + parents: [ + 'bffed4c', + '3a9d56e' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '3cf1df4' + ], + isBranchTip: false + }, + { + hash: '3a9d56e', + committerDate: '2024-10-17T14:56:00+01:00', + authorDate: '2024-10-14 14:56:00 +0100', + message: 'chore(build): fixed build issues for release', + parents: [ + '17b8e10' + ], + branch: 'refs/tags/v2.0.0', + children: [ + 'd683d57', + '67d24a6' + ], + isBranchTip: false + }, + { + hash: 'bffed4c', + committerDate: '2024-10-17T14:47:46+01:00', + authorDate: '2024-10-14 14:47:46 +0100', + message: 'Merge pull request #5 from TomPlum/develop', + parents: [ + 'fd2f791', + '17b8e10' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '67d24a6' + ], + isBranchTip: false + }, + { + hash: '17b8e10', + committerDate: '2024-10-17T14:47:19+01:00', + authorDate: '2024-10-14 14:47:19 +0100', + message: 'chore(ci): renamed main workflow -> release', + parents: [ + 'fd2f791' + ], + branch: 'refs/tags/v2.0.0', + children: [ + '3a9d56e', + 'bffed4c' + ], + isBranchTip: false + }, + { + hash: 'fd2f791', + committerDate: '2024-10-17T14:45:08+01:00', + authorDate: '2024-10-14 14:45:08 +0100', + message: 'Merge pull request #4 from TomPlum/renovate/all-minor-patch', + parents: [ + 'b166be8', + 'a3aad32' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'bffed4c', + '17b8e10' + ], + isBranchTip: false + }, + { + hash: 'a3aad32', + committerDate: '2024-10-17T14:44:02+01:00', + authorDate: '2024-10-14 13:44:02 +0000', + message: 'chore(deps): update all non-major dependencies', + parents: [ + 'b166be8' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'fd2f791' + ], + isBranchTip: false + }, + { + hash: 'b166be8', + committerDate: '2024-10-17T14:41:43+01:00', + authorDate: '2024-10-14 14:41:43 +0100', + message: 'Merge pull request #2 from TomPlum/develop', + parents: [ + 'd399e92', + '6376640' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'fd2f791', + 'a3aad32' + ], + isBranchTip: false + }, + { + hash: '6376640', + committerDate: '2024-10-17T14:41:24+01:00', + authorDate: '2024-10-14 14:41:24 +0100', + message: 'chore(config): updated renovate rules, schedule and assignee', + parents: [ + '30d449b' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'b166be8' + ], + isBranchTip: false + }, + { + hash: '30d449b', + committerDate: '2024-10-17T14:39:59+01:00', + authorDate: '2024-10-14 14:39:59 +0100', + message: 'Merge pull request #1 from TomPlum/renovate/configure', + parents: [ + 'd399e92', + '949b36d' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '6376640' + ], + isBranchTip: false + }, + { + hash: '949b36d', + committerDate: '2024-10-17T14:37:36+01:00', + authorDate: '2024-10-14 13:37:36 +0000', + message: 'Add renovate.json', + parents: [ + 'd399e92' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '30d449b' + ], + isBranchTip: false + }, + { + hash: 'd399e92', + committerDate: '2024-10-17T10:45:28+01:00', + authorDate: '2024-10-14 10:45:28 +0100', + message: 'chore(ci): added gh-pages package and added github actions main workflow', + parents: [ + '96d0ac5' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'b166be8', + '30d449b', + '949b36d' + ], + isBranchTip: false + }, + { + hash: '96d0ac5', + committerDate: '2024-10-17T10:41:44+01:00', + authorDate: '2024-10-14 10:41:44 +0100', + message: 'feat(graph): extracted metric checkbox component and changed colours based on metric', + parents: [ + '1e65c1d' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'd399e92' + ], + isBranchTip: false + }, + { + hash: '1e65c1d', + committerDate: '2024-10-17T10:07:12+01:00', + authorDate: '2024-10-14 10:07:12 +0100', + message: 'feat(graph): added pie to to tooltip and extracted graph styles hook', + parents: [ + '30dcafd' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '96d0ac5' + ], + isBranchTip: false + }, + { + hash: '30dcafd', + committerDate: '2024-10-17T09:28:43+01:00', + authorDate: '2024-10-14 09:28:43 +0100', + message: 'chore(graph): minor improvements to graph formatting & styling', + parents: [ + '72b1f86' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '1e65c1d' + ], + isBranchTip: false + }, + { + hash: '72b1f86', + committerDate: '2024-10-17T07:55:23+01:00', + authorDate: '2024-10-14 07:55:23 +0100', + message: 'chore(graph): extracted sleep data 2d hook', + parents: [ + '2115a48' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '30dcafd' + ], + isBranchTip: false + }, + { + hash: '2115a48', + committerDate: '2024-10-17T07:45:57+01:00', + authorDate: '2024-10-14 07:45:57 +0100', + message: 'feat(graph): increased axis tick stroke width', + parents: [ + '0bf74b1' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '72b1f86' + ], + isBranchTip: false + }, + { + hash: '0bf74b1', + committerDate: '2024-10-17T07:43:44+01:00', + authorDate: '2024-10-14 07:43:44 +0100', + message: 'feat(graph): added custom x-axis tick component', + parents: [ + '5a6b882' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '2115a48' + ], + isBranchTip: false + }, + { + hash: '5a6b882', + committerDate: '2024-10-16T16:27:42+01:00', + authorDate: '2024-10-13 16:27:42 +0100', + message: 'feat(graph): tweaked colours and now stroke width is dynamic based on dataset size', + parents: [ + '9cfcece' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '0bf74b1' + ], + isBranchTip: false + }, + { + hash: '9cfcece', + committerDate: '2024-10-16T16:19:46+01:00', + authorDate: '2024-10-13 16:19:46 +0100', + message: 'feat(routing): sleep route now adds default query params if not present', + parents: [ + '603fbbc' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '5a6b882' + ], + isBranchTip: false + }, + { + hash: '603fbbc', + committerDate: '2024-10-16T15:24:07+01:00', + authorDate: '2024-10-13 15:24:07 +0100', + message: 'chore(test): fixed failing data test and added eslint stylistic plugin', + parents: [ + 'f892161' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '9cfcece' + ], + isBranchTip: false + }, + { + hash: 'f892161', + committerDate: '2024-10-16T12:31:54+01:00', + authorDate: '2024-10-13 12:31:54 +0100', + message: 'feat(graph): added custom tooltip and filtered out data with no breakdown', + parents: [ + '9df8d6c' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '603fbbc' + ], + isBranchTip: false + }, + { + hash: '9df8d6c', + committerDate: '2024-10-16T11:26:08+01:00', + authorDate: '2024-10-13 11:26:08 +0100', + message: 'chore(refactor): extracted custom y-axis tick component into its own file', + parents: [ + 'bb8d532' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'f892161' + ], + isBranchTip: false + }, + { + hash: 'bb8d532', + committerDate: '2024-10-16T11:19:26+01:00', + authorDate: '2024-10-13 11:19:26 +0100', + message: 'chore(state): hoisted sleep data state management into a react context', + parents: [ + '7955da7' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '9df8d6c' + ], + isBranchTip: false + }, + { + hash: '7955da7', + committerDate: '2024-10-15T22:14:12+01:00', + authorDate: '2024-10-12 22:14:12 +0100', + message: 'feat(graph): formatting and styling improvements to 2d graph', + parents: [ + '5109e9d' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'bb8d532' + ], + isBranchTip: false + }, + { + hash: '5109e9d', + committerDate: '2024-10-15T22:01:25+01:00', + authorDate: '2024-10-12 22:01:25 +0100', + message: 'feat(routing): added custom query params hook and serialised date range in query params', + parents: [ + 'd160456' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '7955da7' + ], + isBranchTip: false + }, + { + hash: 'd160456', + committerDate: '2024-10-15T21:41:17+01:00', + authorDate: '2024-10-12 21:41:17 +0100', + message: 'feat(routing): added router, new base URL and serialised metric in query param', + parents: [ + 'a09ca48' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '5109e9d' + ], + isBranchTip: false + }, + { + hash: 'a09ca48', + committerDate: '2024-10-15T19:54:44+01:00', + authorDate: '2024-10-12 19:54:44 +0100', + message: 'feat(graph): first pass at linear regression line', + parents: [ + 'c2ed208' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'd160456' + ], + isBranchTip: false + }, + { + hash: 'c2ed208', + committerDate: '2024-10-15T19:10:12+01:00', + authorDate: '2024-10-12 19:10:12 +0100', + message: 'feat(graph): added date range picker', + parents: [ + '4522569' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'a09ca48' + ], + isBranchTip: false + }, + { + hash: '4522569', + committerDate: '2024-10-15T17:05:28+01:00', + authorDate: '2024-10-12 17:05:28 +0100', + message: 'feat(graph): added colours to each sleep metric line', + parents: [ + 'eb371fa' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'c2ed208' + ], + isBranchTip: false + }, + { + hash: 'eb371fa', + committerDate: '2024-10-15T16:52:25+01:00', + authorDate: '2024-10-12 16:52:25 +0100', + message: 'feat(graph): added metric configuration panel', + parents: [ + '6530e27' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '4522569' + ], + isBranchTip: false + }, + { + hash: '6530e27', + committerDate: '2024-10-15T10:55:38+01:00', + authorDate: '2024-10-12 10:55:38 +0100', + message: 'feat(graph): basic first pass at a 2D graph with recharts', + parents: [ + 'd94993e' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'eb371fa' + ], + isBranchTip: false + }, + { + hash: 'd94993e', + committerDate: '2024-10-10T19:38:04+01:00', + authorDate: '2024-10-07 19:38:04 +0100', + message: 'feat(graph): added awake time to the 3d graph', + parents: [ + '72de5c9' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '6530e27' + ], + isBranchTip: false + }, + { + hash: '72de5c9', + committerDate: '2024-10-09T17:11:49+01:00', + authorDate: '2024-10-06 17:11:49 +0100', + message: 'feat(graph): first pass of rendering a 2D sleep quality graph in 3D', + parents: [ + '7e68687' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'd94993e' + ], + isBranchTip: false + }, + { + hash: '7e68687', + committerDate: '2024-10-09T16:31:02+01:00', + authorDate: '2024-10-06 16:31:02 +0100', + message: 'feat(data): mapped pillow data into custom domain object and parsed raw values', + parents: [ + 'ab657c9' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '72de5c9' + ], + isBranchTip: false + }, + { + hash: 'ab657c9', + committerDate: '2024-10-09T12:47:24+01:00', + authorDate: '2024-10-06 12:47:24 +0100', + message: 'feat(data): started parsing pillow CSV data', + parents: [ + 'b3e99e8' + ], + branch: 'refs/tags/v1.0.0', + children: [ + '7e68687' + ], + isBranchTip: false + }, + { + hash: 'b3e99e8', + committerDate: '2024-10-09T10:42:01+01:00', + authorDate: '2024-10-06 10:42:01 +0100', + message: 'chore(config): added react-force-graph and vitest dependencies + pillow data', + parents: [ + '1e5c110' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'ab657c9' + ], + isBranchTip: false + }, + { + hash: '1e5c110', + committerDate: '2024-10-09T10:34:20+01:00', + authorDate: '2024-10-06 10:34:20 +0100', + message: 'chore(config): added placeholder page title and favicon', + parents: [ + '05d1859' + ], + branch: 'refs/tags/v1.0.0', + children: [ + 'b3e99e8' + ], + isBranchTip: false + }, + { + hash: '05d1859', + committerDate: '2024-10-09T09:36:22+01:00', + authorDate: '2024-10-06 09:36:22 +0100', + message: 'chore(setup): ran vite@latest with react-swc-ts template', + parents: [], + branch: 'refs/tags/v1.0.0', + children: [ + '1e5c110' + ], + isBranchTip: false + } +] \ No newline at end of file diff --git a/packages/library/src/_test/data/sleepState.ts b/packages/library/src/_test/data/sleepState.ts new file mode 100644 index 00000000..4e36000b --- /dev/null +++ b/packages/library/src/_test/data/sleepState.ts @@ -0,0 +1,9645 @@ +export const sleepRepositoryRowColumnState = { + 1: [ + { + isVerticalLine: true, + isVerticalIndexLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {} +], + 2: [ + { + isVerticalLine: true, + isVerticalIndexLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: true, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {} +], + 3: [ + { + isVerticalLine: true, + isVerticalIndexLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: true, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 4: [ + { + isVerticalLine: true, + isVerticalIndexLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: true, + isColumnBelowEmpty: false + }, + {}, + {} +], + 5: [ + { + isVerticalLine: true, + isVerticalIndexLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: true, + isColumnBelowEmpty: false + }, + {} +], + 6: [ + { + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 4, + 5, + 1 + ], + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: true, + isColumnBelowEmpty: false, + isVerticalIndexLine: true + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 5 + ], + isLeftDownCurve: true + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 5 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 5 + ] + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isLeftUpCurve: true + }, + {} +], + 7: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 8: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 9: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 10: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 11: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 12: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 13: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 14: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 15: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 16: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 17: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 18: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 19: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 20: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 21: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 22: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 23: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 24: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 25: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 26: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 27: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 28: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 29: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 30: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: true, + isColumnBelowEmpty: false + }, + {}, + {} +], + 31: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 32: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {} +], + 33: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 34: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 4, + 2, + 6 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 2, + 6 + ] + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 6 + ], + isVerticalLine: true, + isLeftUpCurve: true + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 6 + ], + isVerticalLine: true + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 6 + ] + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 6 + ] + }, + { + isLeftDownCurve: true + } +], + 35: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 36: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 37: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 38: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 39: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 40: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 41: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 42: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + { + isVerticalLine: true + } +], + 43: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 44: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 45: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 46: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 47: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 48: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 49: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 50: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 51: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 52: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 53: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 54: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 55: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + { + isVerticalLine: true + } +], + 56: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 2 + ] + }, + { + isLeftUpCurve: true, + isVerticalLine: true, + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 57: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 58: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 59: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 60: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 61: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + { + isVerticalLine: true + } +], + 62: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ] + }, + { + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + } +], + 63: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + } +], + 64: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + } +], + 65: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + } +], + 66: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + } +], + 67: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + } +], + 68: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + } +], + 69: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + } +], + 70: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + } +], + 71: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + } +], + 72: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + } +], + 73: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + } +], + 74: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 4, + 5, + 2, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 5, + 2 + ], + isLeftDownCurve: true + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 5 + ], + isLeftUpCurve: true + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 5 + ], + isVerticalLine: true + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isLeftUpCurve: true + }, + { + isVerticalLine: true + } +], + 75: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + } +], + 76: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + { + isVerticalLine: true + } +], + 77: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + { + isVerticalLine: true + } +], + 78: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 6, + 1, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 6 + ], + isLeftUpCurve: true, + isLeftDownCurve: true + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 6 + ] + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 6 + ], + isVerticalLine: true + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 6 + ] + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 6 + ] + }, + { + isLeftUpCurve: true + } +], + 79: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 80: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 81: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 82: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 83: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 84: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 85: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 86: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 1, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 2 + ], + isVerticalLine: true, + isLeftUpCurve: true + }, + { + isLeftUpCurve: true, + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 87: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ] + }, + { + isLeftDownCurve: true + }, + {} +], + 88: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ] + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {} +], + 89: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {} +], + 90: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {} +], + 91: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {} +], + 92: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 2, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 2 + ] + }, + { + isLeftUpCurve: true, + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {} +], + 93: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {} +], + 94: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {} +], + 95: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {} +], + 96: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 4, + 5, + 4 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 4, + 5, + 4 + ] + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 5, + 4 + ] + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4, + 5, + 4 + ] + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 5 + ], + isLeftDownCurve: true + }, + { + isLeftUpCurve: true + }, + {} +], + 97: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 98: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 99: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {} +], + 100: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 101: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 102: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {} +], + 103: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 104: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 105: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 106: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 107: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 108: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 109: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 110: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 111: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 112: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 113: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 114: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 115: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 116: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 117: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 118: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 119: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 120: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 121: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 122: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {} +], + 123: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {} +], + 124: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 4, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 4, + 2 + ], + isVerticalLine: true + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ], + isLeftDownCurve: true + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 4 + ], + isVerticalLine: true + }, + { + isLeftUpCurve: true + }, + {}, + {} +], + 125: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: true + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 126: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 127: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 128: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 129: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 130: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 131: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 132: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 133: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 134: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 135: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 136: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 137: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 138: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 139: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 140: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 141: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 142: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 143: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 144: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 145: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 146: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 147: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 148: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 149: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 150: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 151: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 152: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 153: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 154: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 155: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 156: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 157: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 158: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 159: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 160: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 161: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 162: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isLeftDownCurve: true + }, + { + isVerticalLine: true, + isLeftUpCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 163: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 164: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 165: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 166: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 167: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 168: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 169: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 170: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 171: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 172: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 173: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 174: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 175: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 176: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 177: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 178: [ + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 179: [ + { + isVerticalLine: true + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: true, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftUpCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 180: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 181: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 182: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 183: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 184: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 185: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 186: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 187: [ + { + isVerticalLine: true + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 188: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 189: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 190: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 191: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 192: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 193: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 194: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 195: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 196: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 197: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 198: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 199: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isVerticalLine: true, + isLeftDownCurve: true + }, + { + isLeftUpCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 200: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 201: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 202: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 203: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 204: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 205: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 206: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 207: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 208: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 209: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 210: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 211: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 212: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 213: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 214: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 215: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 216: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 217: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 218: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 219: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 220: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 221: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 222: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 223: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 224: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 225: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 226: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 227: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 228: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 229: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 230: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 231: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 232: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 233: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 234: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 235: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 236: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 237: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 238: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 239: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 240: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 241: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 242: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 243: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 244: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 245: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 246: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 247: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 248: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 249: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 250: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 251: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 252: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 253: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 254: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 255: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 256: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 257: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 258: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 259: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 260: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 261: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 262: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 263: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 264: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 265: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 266: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 267: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 268: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 269: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 270: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 271: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 272: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 273: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 274: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 275: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 276: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 277: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 278: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 279: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 280: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 281: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 282: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 283: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 2 + ], + isVerticalLine: true + }, + { + isLeftUpCurve: true, + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 284: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 285: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 286: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 287: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 288: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 289: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 290: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 291: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 292: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 293: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 1, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isLeftUpCurve: true, + isLeftDownCurve: true + }, + { + isLeftUpCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 294: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 295: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 296: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 297: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 298: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 299: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 300: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 301: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 302: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 303: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 304: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 305: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 306: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 307: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 308: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 309: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 310: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 311: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 312: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 313: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 314: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 315: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 316: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 317: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isVerticalLine: true, + isLeftDownCurve: true + }, + { + isLeftUpCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 318: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 319: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 320: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 321: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 322: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 323: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 324: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 325: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 326: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 327: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 328: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 329: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 330: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 331: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 332: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 333: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 334: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 335: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 336: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 337: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 338: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 339: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 340: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 341: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 342: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 343: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true, + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 344: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 345: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 346: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 347: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 348: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 349: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 350: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 351: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 352: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 353: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 354: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 355: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 356: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 357: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 358: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true, + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 359: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 360: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 361: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 362: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 363: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 364: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 365: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 366: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 367: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 368: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 369: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 370: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 371: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 372: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 373: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isLeftDownCurve: true + }, + { + isLeftUpCurve: true + }, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 374: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 375: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 376: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 377: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 378: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 379: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 380: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 381: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 382: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 383: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 384: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 385: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 386: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 387: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 388: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 389: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 390: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 391: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 392: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 393: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 394: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 395: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 396: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 397: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 398: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 399: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 400: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 401: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 402: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 403: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 404: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 405: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 406: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 407: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 408: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 409: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 410: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 411: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 412: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 413: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 414: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 415: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 416: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 417: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 418: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 419: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 420: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 421: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 422: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 423: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 424: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 425: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 426: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 427: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 428: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 429: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 430: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 431: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 432: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + { + isVerticalLine: true + }, + {}, + {}, + {} +], + 433: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {} +], + 434: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + {}, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: true + }, + {}, + {}, + {} +], + 435: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + {}, + {}, + {}, + {} +], + 436: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {} +], + 437: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isVerticalLine: true, + isLeftDownCurve: true + }, + {}, + {}, + {}, + {}, + {} +], + 438: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {} +], + 439: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true, + isLeftDownCurve: true + }, + {}, + {}, + {}, + {}, + {} +], + 440: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {} +], + 441: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 1 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true, + isLeftDownCurve: true + }, + {}, + {}, + {}, + {}, + {} +], + 442: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {} +], + 443: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftDownCurve: true + }, + {}, + {}, + {}, + {} +], + 444: [ + { + isVerticalLine: true + }, + { + isVerticalLine: true + }, + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {} +], + 445: [ + { + isVerticalLine: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 1, + 2 + ], + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + { + isLeftUpCurve: true, + isHorizontalLine: true, + mergeSourceColumns: [ + 2 + ] + }, + { + isLeftUpCurve: true + }, + {}, + {}, + {}, + {} +], + 446: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 447: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 448: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 449: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 450: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 451: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 452: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 453: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 454: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 455: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 456: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 457: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 458: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 459: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 460: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 461: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 462: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 463: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 464: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 465: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 466: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 467: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 468: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 469: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 470: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 471: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +], + 472: [ + { + isVerticalLine: true, + isNode: true, + isColumnAboveEmpty: false, + isColumnBelowEmpty: false + }, + {}, + {}, + {}, + {}, + {}, + {} +] +} \ No newline at end of file diff --git a/packages/library/src/_test/elements/GraphColumn.ts b/packages/library/src/_test/elements/GraphColumn.ts index de856eb1..eb05eb1e 100644 --- a/packages/library/src/_test/elements/GraphColumn.ts +++ b/packages/library/src/_test/elements/GraphColumn.ts @@ -19,72 +19,98 @@ class GraphColumnElement { return (shouldExist ? screen.getByTestId(testId) : screen.queryByTestId(testId)) as any } + public id({ row, column }: At) { + return `graph-column-row-${row}-col-${column}` + } + + public commitNodeId({ hash }: Node) { + return `commit-node-${hash}` + } + + public backgroundId({ column }: Background, type: 'selected' | 'previewed') { + return `column-background-${column}-${type}` + } + + public indexPseudoCommitNodeId = 'index-pseudo-commit-node' + public fullHeightVerticalLineId = 'vertical-line-full-height' + public headCommitVerticalLineId = 'head-commit-vertical-line' + public fullWidthHorizontalLineId = 'horizontal-line-full-width' + public halfWidthRightHorizontalLineId = 'horizontal-line-right-half' + public leftDownCurveId = 'left-down-curve' + public leftDownCurveCurvedLineId = 'left-down-curve-curved-line' + public leftDownCurveLeftLineId = 'left-down-curve-left-line' + public leftDownCurveBottomLineId = 'left-down-curve-bottom-line' + public leftUpCurveId = 'left-up-curve' + public leftUpCurveCurvedLineId = 'left-up-curve-curved-line' + public leftUpCurveLeftLineId = 'left-up-curve-left-line' + public leftUpCurveTopLineId = 'left-up-curve-top-line' + public at({ row, column, shouldExist }: At = {} as At) { - return this.getElement(`graph-column-row-${row}-col-${column}`, shouldExist) + return this.getElement(this.id({ row, column }), shouldExist) } public withCommitNode({ hash, shouldExist }: Node = {} as Node) { - return this.getElement(`commit-node-${hash}`, shouldExist) + return this.getElement(this.commitNodeId({ hash }), shouldExist) } public withIndexPseudoCommitNode({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('index-pseudo-commit-node', shouldExist) + return this.getElement(this.indexPseudoCommitNodeId, shouldExist) } public withFullHeightVerticalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('vertical-line-full-height', shouldExist) + return this.getElement(this.fullHeightVerticalLineId, shouldExist) } public withHeadCommitVerticalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('head-commit-vertical-line', shouldExist) + return this.getElement(this.headCommitVerticalLineId, shouldExist) } public withFullWidthHorizontalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('horizontal-line-full-width', shouldExist) + return this.getElement(this.fullWidthHorizontalLineId, shouldExist) } public withHalfWidthRightHorizontalLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('horizontal-line-right-half', shouldExist) + return this.getElement(this.halfWidthRightHorizontalLineId, shouldExist) } public withSelectedBackground({ column, shouldExist }: Background = {} as Background) { - return this.getElement(`column-background-${column}-selected`, shouldExist) + return this.getElement(this.backgroundId({ column }, 'selected'), shouldExist) } public withPreviewedBackground({ column, shouldExist }: Background = {} as Background) { - return this.getElement(`column-background-${column}-previewed`, shouldExist) + return this.getElement(this.backgroundId({ column }, 'previewed'), shouldExist) } public withLeftDownCurve({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('left-down-curve', shouldExist) + return this.getElement(this.leftDownCurveId, shouldExist) } public withLeftDownCurveCurvedLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('left-down-curve-curved-line', shouldExist) + return this.getElement(this.leftDownCurveCurvedLineId, shouldExist) } public withLeftDownCurveLeftLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('left-down-curve-left-line', shouldExist) + return this.getElement(this.leftDownCurveLeftLineId, shouldExist) } public withLeftDownCurveBottomLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('left-down-curve-bottom-line', shouldExist) + return this.getElement(this.leftDownCurveBottomLineId, shouldExist) } public withLeftUpCurve({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('left-up-curve', shouldExist) + return this.getElement(this.leftUpCurveId, shouldExist) } public withLeftUpCurveCurvedLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('left-up-curve-curved-line', shouldExist) + return this.getElement(this.leftUpCurveCurvedLineId, shouldExist) } public withLeftUpCurveLeftLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('left-up-curve-left-line', shouldExist) + return this.getElement(this.leftUpCurveLeftLineId, shouldExist) } public withLeftUpCurveTopLine({ shouldExist }: ShouldExist = {} as ShouldExist) { - return this.getElement('left-up-curve-top-line', shouldExist) + return this.getElement(this.leftUpCurveTopLineId, shouldExist) } } diff --git a/packages/library/src/modules/Graph/Graph.tsx b/packages/library/src/modules/Graph/Graph.tsx index f1c47762..256f89f9 100644 --- a/packages/library/src/modules/Graph/Graph.tsx +++ b/packages/library/src/modules/Graph/Graph.tsx @@ -25,7 +25,7 @@ export const Graph = () => { }, [commits, paging]) const commitQuantity = useMemo(() => { - // If there is no data being show, then we'll + // If there is no data being shown, then we'll // be rendering the skeleton graph placeholder which // shows fake commits. if (visibleCommits.length === 0) { diff --git a/packages/library/src/modules/Table/components/TableRow/TableRow.tsx b/packages/library/src/modules/Table/components/TableRow/TableRow.tsx index dc5efbb9..0a66af7b 100644 --- a/packages/library/src/modules/Table/components/TableRow/TableRow.tsx +++ b/packages/library/src/modules/Table/components/TableRow/TableRow.tsx @@ -80,7 +80,6 @@ export const TableRow = ({ index, commit, isPlaceholder, ...props }: GitLogTable return (
Date: Sun, 23 Mar 2025 13:30:38 +0000 Subject: [PATCH 32/38] test(config): split unit vs integration test scripts, updated workflows and xml configs --- .github/workflows/develop.yml | 7 ++++++- .github/workflows/release.yml | 10 ++++++++++ .run/library _ test_integration.run.xml | 12 ++++++++++++ ...ry _ test.run.xml => library _ test_unit.run.xml} | 4 ++-- packages/library/package.json | 6 ++++-- packages/library/src/GitLog.integration.spec.tsx | 4 ++-- 6 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 .run/library _ test_integration.run.xml rename .run/{library _ test.run.xml => library _ test_unit.run.xml} (65%) diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml index 3054c524..b41a061d 100644 --- a/.github/workflows/develop.yml +++ b/.github/workflows/develop.yml @@ -33,5 +33,10 @@ jobs: - name: Run Unit Tests env: TZ: UTC - run: npm run test:ci --workspace=@tomplum/react-git-log + run: npm run test:unit:ci --workspace=@tomplum/react-git-log + + - name: Run Integration Tests + env: + TZ: UTC + run: npm run test:integration:ci --workspace=@tomplum/react-git-log diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 444cb8bf..67ea206e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,6 +24,16 @@ jobs: - name: Build Library run: npm run build --workspace=@tomplum/react-git-log + - name: Run Unit Tests + env: + TZ: UTC + run: npm run test:unit:ci --workspace=@tomplum/react-git-log + + - name: Run Integration Tests + env: + TZ: UTC + run: npm run test:integration:ci --workspace=@tomplum/react-git-log + - name: Build Storybook run: npm run build-storybook --workspace=@tomplum/react-git-log-demo diff --git a/.run/library _ test_integration.run.xml b/.run/library _ test_integration.run.xml new file mode 100644 index 00000000..7af91cf0 --- /dev/null +++ b/.run/library _ test_integration.run.xml @@ -0,0 +1,12 @@ + + + + + +