From 989431fcc254ca51dd7bc4557ded17fb5509cc08 Mon Sep 17 00:00:00 2001 From: gka Date: Tue, 27 May 2025 00:48:25 +0200 Subject: [PATCH 1/4] fix: line chart grouping (resolves #45) --- package.json | 2 +- pnpm-lock.yaml | 16 +++++++-------- src/lib/marks/Line.svelte | 6 +----- src/routes/transforms/jitter/+page.md | 7 ------- src/tests/line.test.ts | 28 +++++++++++++++++++++++++++ 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 8db0e438..bacc6197 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "svg-path-parser": "^1.1.0", "topojson-client": "^3.1.0", "tslib": "^2.8.1", - "typedoc": "^0.28.4", + "typedoc": "^0.28.5", "typedoc-plugin-markdown": "^4.6.3", "typescript": "^5.8.3", "vite": "^6.3.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2836b37a..16156d65 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -196,11 +196,11 @@ importers: specifier: ^2.8.1 version: 2.8.1 typedoc: - specifier: ^0.28.4 - version: 0.28.4(typescript@5.8.3) + specifier: ^0.28.5 + version: 0.28.5(typescript@5.8.3) typedoc-plugin-markdown: specifier: ^4.6.3 - version: 4.6.3(typedoc@0.28.4(typescript@5.8.3)) + version: 4.6.3(typedoc@0.28.5(typescript@5.8.3)) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -4273,8 +4273,8 @@ packages: peerDependencies: typedoc: 0.28.x - typedoc@0.28.4: - resolution: {integrity: sha512-xKvKpIywE1rnqqLgjkoq0F3wOqYaKO9nV6YkkSat6IxOWacUCc/7Es0hR3OPmkIqkPoEn7U3x+sYdG72rstZQA==} + typedoc@0.28.5: + resolution: {integrity: sha512-5PzUddaA9FbaarUzIsEc4wNXCiO4Ot3bJNeMF2qKpYlTmM9TTaSHQ7162w756ERCkXER/+o2purRG6YOAv6EMA==} engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: @@ -9366,11 +9366,11 @@ snapshots: for-each: 0.3.3 is-typed-array: 1.1.12 - typedoc-plugin-markdown@4.6.3(typedoc@0.28.4(typescript@5.8.3)): + typedoc-plugin-markdown@4.6.3(typedoc@0.28.5(typescript@5.8.3)): dependencies: - typedoc: 0.28.4(typescript@5.8.3) + typedoc: 0.28.5(typescript@5.8.3) - typedoc@0.28.4(typescript@5.8.3): + typedoc@0.28.5(typescript@5.8.3): dependencies: '@gerrit0/mini-shiki': 3.2.2 lunr: 2.3.9 diff --git a/src/lib/marks/Line.svelte b/src/lib/marks/Line.svelte index 8d524a93..8ee23417 100644 --- a/src/lib/marks/Line.svelte +++ b/src/lib/marks/Line.svelte @@ -21,7 +21,7 @@ outlineStroke?: string; outlineStrokeWidth?: number; outlineStrokeOpacity?: number; - curve?: CurveName | CurveFactory; + curve?: CurveName | CurveFactory | 'auto'; tension?: number; sort?: ConstantAccessor | { channel: 'stroke' | 'fill' }; text?: ConstantAccessor; @@ -76,10 +76,6 @@ if (groupValue === lastGroupValue) { group.push(d); } else { - if (group.length === 1) { - // just one point makes a bad line, add this one, too - group.push(d); - } // new group group = [d]; groups.push(group); diff --git a/src/routes/transforms/jitter/+page.md b/src/routes/transforms/jitter/+page.md index 4fe9503b..6d8e64c6 100644 --- a/src/routes/transforms/jitter/+page.md +++ b/src/routes/transforms/jitter/+page.md @@ -76,13 +76,6 @@ The jitter transform accepts the following options: - Useful for deterministic jittering (testing or reproducibility) - Can be used with d3's random generators: `randomLcg()` from d3-random -The following time interval strings are supported for temporal jittering: - -- `'1 day'`, `'3 days'` -- `'1 week'`, `'2 weeks'`, `'3 weeks'` -- `'1 month'`, `'2 months'` -- `'1 quarter'` -- `'1 year'` ## jitterX diff --git a/src/tests/line.test.ts b/src/tests/line.test.ts index bf43e795..6af55947 100644 --- a/src/tests/line.test.ts +++ b/src/tests/line.test.ts @@ -227,4 +227,32 @@ describe('Line mark', () => { // Verify we have two distinct lines with different stroke colors expect(lines[0]?.style.stroke).not.toBe(lines[1]?.style.stroke); }); + + it('does not connect points from different groups', () => { + + const { container } = render(LineTest, { + props: { + data: [ + { x: 0, y: 0, category: 'A' }, + { x: 1, y: 1, category: 'A' }, + { x: 0, y: 1, category: 'B' }, + { x: 0.5, y: 1, category: 'C' } + ], + x: 'x', + y: 'y', + z: 'category' + } + }); + + const lines = container.querySelectorAll( + 'g.lines > g > path' + ) as NodeListOf; + expect(lines).toHaveLength(3); + + const ds = Array.from(lines).map(l => l.getAttribute('d')); + expect(ds[0]).toBe('M1,95L96,5'); + expect(ds[1]).toBe('M1,5Z'); + expect(ds[2]).toBe('M48.5,5Z'); + + }) }); From 0f429e5c6e8999ae1b769d198c0247818531241a Mon Sep 17 00:00:00 2001 From: gka Date: Tue, 27 May 2025 00:51:56 +0200 Subject: [PATCH 2/4] format + fix workflow --- .github/workflows/npm-prerelease.yml | 3 +-- src/routes/transforms/jitter/+page.md | 1 - src/tests/line.test.ts | 6 ++---- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/npm-prerelease.yml b/.github/workflows/npm-prerelease.yml index d5c8b22b..e1ff30d0 100644 --- a/.github/workflows/npm-prerelease.yml +++ b/.github/workflows/npm-prerelease.yml @@ -35,8 +35,7 @@ jobs: publish-preview: # Prevent this job from running on forks - if: github.repository == 'svelteplot/svelteplot' - if: github.event.pull_request.draft == false + if: github.repository == 'svelteplot/svelteplot' && github.event.pull_request.draft == false needs: test runs-on: ubuntu-latest environment: diff --git a/src/routes/transforms/jitter/+page.md b/src/routes/transforms/jitter/+page.md index 6d8e64c6..d5b4348c 100644 --- a/src/routes/transforms/jitter/+page.md +++ b/src/routes/transforms/jitter/+page.md @@ -76,7 +76,6 @@ The jitter transform accepts the following options: - Useful for deterministic jittering (testing or reproducibility) - Can be used with d3's random generators: `randomLcg()` from d3-random - ## jitterX Jitters along the x dimension: diff --git a/src/tests/line.test.ts b/src/tests/line.test.ts index 6af55947..fcaacd9a 100644 --- a/src/tests/line.test.ts +++ b/src/tests/line.test.ts @@ -229,7 +229,6 @@ describe('Line mark', () => { }); it('does not connect points from different groups', () => { - const { container } = render(LineTest, { props: { data: [ @@ -249,10 +248,9 @@ describe('Line mark', () => { ) as NodeListOf; expect(lines).toHaveLength(3); - const ds = Array.from(lines).map(l => l.getAttribute('d')); + const ds = Array.from(lines).map((l) => l.getAttribute('d')); expect(ds[0]).toBe('M1,95L96,5'); expect(ds[1]).toBe('M1,5Z'); expect(ds[2]).toBe('M48.5,5Z'); - - }) + }); }); From 8223e1e40d9d0a220d549368b244c6a7dee5db1a Mon Sep 17 00:00:00 2001 From: gka Date: Tue, 27 May 2025 00:52:38 +0200 Subject: [PATCH 3/4] format --- .github/workflows/npm-prerelease.yml | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/.github/workflows/npm-prerelease.yml b/.github/workflows/npm-prerelease.yml index e1ff30d0..35081c69 100644 --- a/.github/workflows/npm-prerelease.yml +++ b/.github/workflows/npm-prerelease.yml @@ -5,13 +5,13 @@ on: branches: [main] permissions: - contents: write - pull-requests: write + contents: write + pull-requests: write jobs: test: runs-on: ubuntu-latest - + steps: - uses: actions/checkout@v4 @@ -32,7 +32,7 @@ jobs: - name: Run Vitest tests run: pnpm test - + publish-preview: # Prevent this job from running on forks if: github.repository == 'svelteplot/svelteplot' && github.event.pull_request.draft == false @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-latest environment: name: npm - + steps: - uses: actions/checkout@v4 @@ -55,7 +55,7 @@ jobs: with: node-version: '22' cache: 'pnpm' - registry-url: "https://registry.npmjs.org" + registry-url: 'https://registry.npmjs.org' - name: Install dependencies run: pnpm install @@ -99,8 +99,6 @@ jobs: echo "Generated version: $(node -p "require('./package.json').version")" - - - name: Publish to npm env: NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH }} @@ -109,14 +107,14 @@ jobs: # Save version for use in PR comment - name: Save version run: echo "PACKAGE_VERSION=$(node -p "require('./package.json').version")" >> $GITHUB_ENV - + - name: Comment on PR uses: peter-evans/create-or-update-comment@v3 with: issue-number: ${{ github.event.pull_request.number }} body: | 📦 Preview package for this PR is published! - + Version: `${{ env.PACKAGE_VERSION }}` Install it with: From 68250298ba3de94694ffcec9bdd033f47569d90a Mon Sep 17 00:00:00 2001 From: gka Date: Tue, 27 May 2025 00:55:40 +0200 Subject: [PATCH 4/4] chore: fix vscode settings --- .vscode/extensions.json | 8 ++++++++ .vscode/settings.json | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..0ab05dcf --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "svelte.svelte-vscode", + "dbaeumer.vscode-eslint", + "typescript-svelte-plugin" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 0967ef42..46d9035f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1 +1,35 @@ -{} +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[svelte]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "svelte" + ], + "prettier.useTabs": false, + "prettier.singleQuote": true, + "prettier.tabWidth": 4, + "prettier.trailingComma": "none", + "prettier.printWidth": 100, + "svelte.plugin.svelte.format.enable": false, + "eslint.probe": [ + "javascript", + "typescript", + "svelte" + ], + "eslint.experimental.useFlatConfig": true +}