Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
9b00b08
Ignore node modules
chrisle Apr 28, 2024
59a3553
add iconv-lite
chrisle Jul 6, 2024
66f02c6
Upgrade sqlite3
chrisle Jul 6, 2024
a20fa24
Add compiled lib. bump version.
chrisle Jul 6, 2024
ae25be4
bump version
chrisle Jul 6, 2024
bd64939
Update for CDJ3000
chrisle Jan 4, 2025
1b67454
Update the build
chrisle Jan 4, 2025
9fd06d5
Identify as Now Playing in ProLink network
chrisle Feb 2, 2025
22d75a6
Update CDJ name
chrisle Feb 2, 2025
e322de8
Launch CLI via VSC.
chrisle Jun 19, 2022
2b8d70d
Get file POC.
chrisle Jun 19, 2022
fece233
Update to be closer to what it was originally.
chrisle Jun 19, 2022
bde19e8
Rename getArtwork to reflect it gets thumbnails.
chrisle Jun 19, 2022
2dbcf3d
Add parameter to allow getFile to read 8k chunks.
chrisle Jun 22, 2022
137ccc7
Closing the announce sockets shouldn't depend on attachment to the de…
chrisle Jul 4, 2022
35f48b7
feat: Add opt-in telemetry and fix npm install from git
chrisle Dec 14, 2025
c589950
docs: add project instructions
chrisle Dec 14, 2025
b2578d9
feat: enable socket reuse for Rekordbox coexistence
chrisle Dec 14, 2025
eac6c54
build: update compiled output
chrisle Dec 14, 2025
bcad531
fix: add lru_map dependency for Sentry v6 compatibility
chrisle Dec 15, 2025
0d34f6e
Rebuild lib output
chrisle Dec 20, 2025
42b85e4
feat: add absolute position packet support for CDJ-3000+
chrisle Dec 23, 2025
32aba8a
feat: implement extended ANLZ features (PCO2, PSSI, waveforms)
chrisle Dec 23, 2025
a9a9552
feat: implement 6-channel on-air support for CDJ-3000 + DJM-V10
chrisle Dec 23, 2025
24ac760
feat: implement optional full DJ Link startup protocol
chrisle Dec 25, 2025
f176d6b
fix: resolve lint errors and fix tests for upstream compatibility
chrisle Dec 28, 2025
4725fbf
test: improve code coverage with additional unit tests
chrisle Dec 28, 2025
36acb36
chore: add coverage to gitignore
chrisle Dec 28, 2025
a204d77
feat: make virtual CDJ name configurable
chrisle Dec 28, 2025
fc2a924
chore: update dependencies to latest versions
chrisle Dec 28, 2025
c0b9c69
chore: bump all dependencies to latest versions
chrisle Dec 28, 2025
7ecdbb7
feat(telemetry): allow Sentry DSN to be configured via environment va…
chrisle Dec 28, 2025
a7cdc2e
Replace js-xdr internal imports with local implementations
chrisle Dec 29, 2025
a74d407
Update build artifacts and lock files
chrisle Dec 29, 2025
6225442
fix: correct TypeScript type union order in field declarations
chrisle Dec 30, 2025
85bbcf8
temp: disable Sentry to fix Electron asar bundling issues
chrisle Dec 31, 2025
ee4f055
fix: correct TypeScript type union order in field declarations
chrisle Jan 2, 2026
f177914
Add CI workflows and release script for automated npm publishing
chrisle Jan 3, 2026
e0d2949
fix: correct 1Password secret path for npm token
chrisle Jan 3, 2026
a431281
Stop tracking build artifacts to prevent non-deterministic diffs
chrisle Jan 4, 2026
2286716
fix: improve network handling
chrisle Jan 6, 2026
de987d1
fix: NFS buffer handling for reliable database streaming
chrisle Jan 16, 2026
820d556
feat: optimize database hydration with SQLite transactions
chrisle Jan 16, 2026
44deba2
chore: remove debug logging from status emitter
chrisle Jan 16, 2026
2c7f6f7
chore: fix prettier formatting in telemetry
chrisle Jan 16, 2026
826a919
fix: resolve lint errors in localdb and telemetry
chrisle Jan 16, 2026
ed7fff6
chore: bump version to 0.14.0
chrisle Jan 16, 2026
a876899
feat: add artwork extraction from audio files via NFS
chrisle Jan 17, 2026
899f13a
refactor: rename getArtworkFromFile to getArtwork as the default method
chrisle Jan 17, 2026
4ca1275
feat: add passive mode for pcap-based Pro DJ Link monitoring
chrisle Jan 18, 2026
8ac786c
chore: add jest mock for .ksy parser files
chrisle Jan 18, 2026
add26d2
feat: add comprehensive LocalDB and OneLibrary test suite
chrisle Jan 18, 2026
a8ed9ec
chore: code formatting and OneLibrary schema types
chrisle Jan 19, 2026
6152356
chore: move cap to optionalDependencies for passive mode
chrisle Jan 19, 2026
2ee4260
chore: bump version to 0.15.0
chrisle Jan 19, 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
Binary file added .DS_Store
Binary file not shown.
210 changes: 210 additions & 0 deletions .github/release.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
#!/usr/bin/env node
/**
* Release Script
* ==============
*
* This script automates the release process:
* 1. Runs tests to ensure everything passes
* 2. Bumps the minor version in package.json
* 3. Generates CHANGELOG.md from commit messages since last tag
* 4. Commits the version bump and changelog
* 5. Pushes to main (which triggers the publish workflow)
*
* Usage:
* node scripts/release.js [--major|--minor|--patch]
*
* Options:
* --major Bump major version (1.0.0 -> 2.0.0)
* --minor Bump minor version (1.0.0 -> 1.1.0) [default]
* --patch Bump patch version (1.0.0 -> 1.0.1)
* --dry-run Show what would happen without making changes
*/

const { execSync } = require('child_process')
const fs = require('fs')
const path = require('path')

const ROOT = path.resolve(__dirname, '..')
const PACKAGE_JSON = path.join(ROOT, 'package.json')
const CHANGELOG = path.join(ROOT, 'CHANGELOG.md')

// Parse arguments
const args = process.argv.slice(2)
const dryRun = args.includes('--dry-run')
const bumpType = args.includes('--major')
? 'major'
: args.includes('--patch')
? 'patch'
: 'minor'

function exec(cmd, options = {}) {
console.log(`\x1b[90m$ ${cmd}\x1b[0m`)
if (dryRun && !options.allowInDryRun) {
console.log('\x1b[33m[dry-run] Skipped\x1b[0m')
return ''
}
return execSync(cmd, { cwd: ROOT, encoding: 'utf-8', ...options }).trim()
}

function log(msg) {
console.log(`\x1b[32m[release]\x1b[0m ${msg}`)
}

function error(msg) {
console.error(`\x1b[31m[error]\x1b[0m ${msg}`)
process.exit(1)
}

function bumpVersion(version, type) {
const [major, minor, patch] = version.split('.').map(Number)
switch (type) {
case 'major':
return `${major + 1}.0.0`
case 'minor':
return `${major}.${minor + 1}.0`
case 'patch':
return `${major}.${minor}.${patch + 1}`
default:
return `${major}.${minor + 1}.0`
}
}

function getLastTag() {
try {
return exec('git describe --tags --abbrev=0 2>/dev/null', { allowInDryRun: true })
} catch {
return null
}
}

function getCommitsSinceTag(tag) {
const range = tag ? `${tag}..HEAD` : 'HEAD'
try {
const output = exec(`git log ${range} --pretty=format:"%s" --no-merges`, {
allowInDryRun: true,
})
return output ? output.split('\n').filter(Boolean) : []
} catch {
return []
}
}

function generateChangelog(version, commits) {
let content = ''

// Read existing changelog if it exists
if (fs.existsSync(CHANGELOG)) {
content = fs.readFileSync(CHANGELOG, 'utf-8')
}

// Generate new entry
const newEntry = [
`## v${version}`,
'',
...commits.map((msg) => `- ${msg}`),
].join('\n')

// Prepend new entry (after header if exists)
if (content.startsWith('# Change log')) {
const headerEnd = content.indexOf('\n\n') + 2
content = content.slice(0, headerEnd) + newEntry + '\n\n' + content.slice(headerEnd)
} else {
content = `# Change log\n\n${newEntry}\n\n${content}`
}

return content
}

async function main() {
console.log('')
console.log('==========================================')
console.log(' Release Script')
console.log('==========================================')
console.log('')

if (dryRun) {
console.log('\x1b[33m[dry-run mode] No changes will be made\x1b[0m\n')
}

// Check we're on main branch
const branch = exec('git branch --show-current', { allowInDryRun: true })
if (branch !== 'main') {
error(`Must be on main branch to release (currently on ${branch})`)
}

// Check for uncommitted changes
const status = exec('git status --porcelain', { allowInDryRun: true })
if (status) {
error('Working directory has uncommitted changes. Please commit or stash them first.')
}

// Pull latest
log('Pulling latest changes...')
exec('git pull --rebase')

// Run tests
log('Running tests...')
try {
exec('npm test', { stdio: 'inherit', allowInDryRun: true })
} catch {
error('Tests failed. Fix them before releasing.')
}

// Read package.json
const pkg = JSON.parse(fs.readFileSync(PACKAGE_JSON, 'utf-8'))
const oldVersion = pkg.version
const newVersion = bumpVersion(oldVersion, bumpType)

log(`Bumping version: ${oldVersion} -> ${newVersion} (${bumpType})`)

// Get commits since last tag
const lastTag = getLastTag()
log(lastTag ? `Last tag: ${lastTag}` : 'No previous tags found')

const commits = getCommitsSinceTag(lastTag)
if (commits.length === 0) {
error('No commits since last tag. Nothing to release.')
}

log(`Found ${commits.length} commits since last release:`)
commits.forEach((msg) => console.log(` - ${msg}`))
console.log('')

// Update package.json
pkg.version = newVersion
if (!dryRun) {
fs.writeFileSync(PACKAGE_JSON, JSON.stringify(pkg, null, 2) + '\n')
}
log('Updated package.json')

// Generate changelog
const changelog = generateChangelog(newVersion, commits)
if (!dryRun) {
fs.writeFileSync(CHANGELOG, changelog)
}
log('Updated CHANGELOG.md')

// Commit changes
log('Committing changes...')
exec('git add package.json CHANGELOG.md')
exec(`git commit -m "chore: release v${newVersion}"`)

// Create tag
log(`Creating tag v${newVersion}...`)
exec(`git tag -a v${newVersion} -m "Release v${newVersion}"`)

// Push
log('Pushing to remote...')
exec('git push && git push --tags')

console.log('')
log(`\x1b[32mRelease v${newVersion} complete!\x1b[0m`)
console.log('')
console.log('The publish workflow will now run on GitHub Actions.')
console.log('')
}

main().catch((err) => {
console.error(err)
process.exit(1)
})
41 changes: 32 additions & 9 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,40 @@
name: publish
name: Publish to npm

on:
push:
tags: ['v*']
branches:
- main

jobs:
publish:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: volta-cli/action@v4
- run: yarn install
- run: yarn test
- run: yarn build
- run: npm set //registry.npmjs.org/:_authToken ${{ secrets.NPM_AUTH_TOKEN }}
- run: npm publish --access=public
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'

- name: Load NPM token from 1Password
uses: 1password/load-secrets-action@v2
with:
export-env: true
env:
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
NODE_AUTH_TOKEN: op://NPM/5f5d7gg4ptzjfhcllrygt734wi/add more/npm_access_token

- name: Install dependencies
run: npm ci

- name: Run tests
run: npm test

- name: Build
run: npm run build

- name: Publish to npm
run: npm publish --access public
32 changes: 32 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Test

on:
push:
branches:
- '**'
- '!main'
pull_request:
branches:
- main

jobs:
test:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

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

- name: Install dependencies
run: npm ci

- name: Run tests
run: npm test

- name: Build
run: npm run build
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
lib
docs
node_modules
coverage/
lib/
24 changes: 24 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"version": "0.2.0",
"configurations": [
{
// Run `yarn build` then run cli.js.
"type": "pwa-node",
"request": "launch",
"name": "Run CLI",
"skipFiles": [
"<node_internals>/**"
],
"internalConsoleOptions": "openOnSessionStart",
// This is so signale shows up in the VSC terminal
"console": "integratedTerminal",
"preLaunchTask": "yarn build",
"program": "${workspaceFolder}/lib/cli.js",
"resolveSourceMapLocations": [
"${workspaceFolder}/**",
"!**/node_modules/**"
],
"outFiles": ["${workspaceFolder}/lib/*.js"]
}
]
}
10 changes: 10 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "yarn build",
"type": "shell",
"command": "yarn build"
}
]
}
Loading