Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
8e1b215
fix(website): remove three/wild-forest from sidebar until doc page ex…
charlieforward9 Mar 1, 2026
f854ecd
feat(ci): add PR test workflow, vitest coverage, and unit tests
charlieforward9 Mar 5, 2026
ac06d49
chore: remove dev/ directory — RFCs move to GitHub Issues/Discussions
charlieforward9 Mar 5, 2026
a39314c
refactor: flat dev/ for WIP modules and examples, published modules s…
charlieforward9 Mar 5, 2026
8a8acf4
chore: update yarn.lock after timeline-layers workspace path change
charlieforward9 Mar 5, 2026
9d54c58
fix(website): update horizon-graph-layer path after move to dev/timel…
charlieforward9 Mar 5, 2026
96f1e60
fix(website): update timeline-layers webpack alias to dev/ path
charlieforward9 Mar 5, 2026
674ddfc
feat: add TimelineLayer to timeline-layers module with example
Copilot Feb 20, 2026
0256d9a
fix(timeline-layers): resolve TS2345 - move ClipWithSubtrack to timel…
Copilot Feb 20, 2026
26967c4
test(timeline-layers): add unit tests for TimelineLayer, collision de…
Copilot Feb 20, 2026
d55b207
chore(dev/timeline-layers): wire example into workspace + local dev s…
charlieforward9 Mar 5, 2026
85590fc
fix(ci): grant pull-requests+checks write for Coveralls PR comment
charlieforward9 Mar 5, 2026
fd97dbb
fix(ci): post coverage summary directly as PR comment
charlieforward9 Mar 5, 2026
80ccadd
chore(ci): remove duplicate test.yaml superseded by test.yml
charlieforward9 Mar 5, 2026
aa2e4bd
fix(ci): compact coverage comment to overall % only
charlieforward9 Mar 5, 2026
a4ec9c2
feat(ci): show coverage delta vs master in PR comment
charlieforward9 Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 0 additions & 101 deletions .github/workflows/test.yaml

This file was deleted.

242 changes: 242 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,242 @@
name: test

on:
push:
branches:
- master
pull_request:

permissions:
contents: read

jobs:
lint:
runs-on: ubuntu-22.04

steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Enable Corepack / Yarn 4
run: |
corepack enable
corepack prepare yarn@4.10.3 --activate

- name: Cache Yarn 4 artifacts
uses: actions/cache@v4
with:
path: |
.yarn/cache
.pnp.*
.yarn/install-state.gz
key: yarn-cache-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
yarn-cache-${{ runner.os }}-

- name: Install dependencies
run: yarn

- name: Lint
run: yarn lint

test-node:
runs-on: ubuntu-22.04
permissions:
contents: read
actions: read
pull-requests: write
checks: write

steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Enable Corepack / Yarn 4
run: |
corepack enable
corepack prepare yarn@4.10.3 --activate

- name: Cache Yarn 4 artifacts
uses: actions/cache@v4
with:
path: |
.yarn/cache
.pnp.*
.yarn/install-state.gz
key: yarn-cache-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
yarn-cache-${{ runner.os }}-

- name: Install dependencies
run: yarn

- name: Build packages
run: yarn build

- name: Run node tests with coverage
run: yarn test-ci 2>&1 | tee /tmp/coverage.txt; exit ${PIPESTATUS[0]}

- name: Save coverage summary
if: always()
run: grep -m1 "^All files" /tmp/coverage.txt > /tmp/coverage-summary.txt || true

- name: Upload coverage baseline
if: github.ref == 'refs/heads/master'
uses: actions/upload-artifact@v4
with:
name: coverage-baseline
path: /tmp/coverage-summary.txt
retention-days: 90

- name: Find latest master run with baseline
if: github.event_name == 'pull_request'
id: find-baseline
uses: actions/github-script@v7
with:
result-encoding: string
script: |
const runs = await github.rest.actions.listWorkflowRuns({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'test.yml',
branch: 'master',
status: 'success',
per_page: 5,
});
for (const run of runs.data.workflow_runs) {
const {data} = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: run.id,
});
if (data.artifacts.find(a => a.name === 'coverage-baseline')) {
return String(run.id);
}
}
return '';

- name: Download coverage baseline
if: github.event_name == 'pull_request' && steps.find-baseline.outputs.result != ''
uses: actions/download-artifact@v4
continue-on-error: true
with:
name: coverage-baseline
path: /tmp/baseline
run-id: ${{ steps.find-baseline.outputs.result }}
github-token: ${{ secrets.GITHUB_TOKEN }}

- name: Post coverage summary to PR
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const raw = fs.readFileSync('/tmp/coverage.txt', 'utf8');
const lines = raw.split('\n');

const parseAllFiles = text => {
const line = text.split('\n').find(l => l.match(/^All files\s*\|/));
if (!line) return null;
const [, stmts, branch, funcs, ln] = line.split('|').map(s => s.trim());
return {stmts: parseFloat(stmts), branch: parseFloat(branch), funcs: parseFloat(funcs), ln: parseFloat(ln)};
};

const current = parseAllFiles(raw);
let baseline = null;
try { baseline = parseAllFiles(fs.readFileSync('/tmp/baseline/coverage-summary.txt', 'utf8')); } catch {}

const fmt = (val, baseVal) => {
const str = `**${val.toFixed(2)}%**`;
if (baseline === null || isNaN(baseVal)) return str;
const d = (val - baseVal).toFixed(2);
const sign = d >= 0 ? '+' : '';
const color = d > 0 ? '▲' : d < 0 ? '▼' : '●';
return `${str} ${color}${sign}${d}%`;
};

let coverageLine = '_Coverage data not found_';
if (current) {
const b = baseline || {};
coverageLine = [
`Stmts: ${fmt(current.stmts, b.stmts)}`,
`Branch: ${fmt(current.branch, b.branch)}`,
`Funcs: ${fmt(current.funcs, b.funcs)}`,
`Lines: ${fmt(current.ln, b.ln)}`,
].join(' | ');
}

const testLine = lines.find(l => l.includes('Test Files')) || '';
const body = [
'## Coverage',
coverageLine,
testLine.trim() ? `> ${testLine.trim()}` : '',
].filter(Boolean).join('\n');

const {data: comments} = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
const existing = comments.find(c => c.body.startsWith('## Coverage'));
if (existing) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existing.id,
body,
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body,
});
}

test-headless:
runs-on: ubuntu-22.04

steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Enable Corepack / Yarn 4
run: |
corepack enable
corepack prepare yarn@4.10.3 --activate

- name: Cache Yarn 4 artifacts
uses: actions/cache@v4
with:
path: |
.yarn/cache
.pnp.*
.yarn/install-state.gz
key: yarn-cache-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
yarn-cache-${{ runner.os }}-

- name: Install dependencies
run: yarn

- name: Build packages
run: yarn build

- name: Install Playwright browsers
run: npx playwright install chromium --with-deps

- name: Run headless browser tests
run: yarn test-headless
10 changes: 10 additions & 0 deletions dev/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# dev/

Work-in-progress modules and examples. Not published to npm or indexed by the docs site.

| Directory | Type | Status |
|---|---|---|
| `timeline-layers/` | module + examples | in progress — see #517, #379 |
| `arrow-layers/` | examples | arrow-layers WIP examples |

Design proposals and RFCs belong in [GitHub Issues/Discussions](https://github.com/visgl/deck.gl-community/issues).
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading
Loading