From f02ff108dc384e4640e2f9f70edad71875170574 Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Wed, 3 Sep 2025 02:33:03 -0400 Subject: [PATCH 01/14] big improvement to UI --- src/components/ConfigModal.tsx | 96 +++++++ src/components/MidiDevices.tsx | 32 +++ src/hooks/use_module.ts | 7 + src/jamscribe_module.tsx | 115 +++++--- src/styles.css | 484 +++++++++++++++++++++++++++++++++ 5 files changed, 693 insertions(+), 41 deletions(-) create mode 100644 src/components/ConfigModal.tsx create mode 100644 src/components/MidiDevices.tsx create mode 100644 src/hooks/use_module.ts create mode 100644 src/styles.css diff --git a/src/components/ConfigModal.tsx b/src/components/ConfigModal.tsx new file mode 100644 index 0000000..aa4a8e7 --- /dev/null +++ b/src/components/ConfigModal.tsx @@ -0,0 +1,96 @@ +import React, { useRef, useEffect } from 'react'; +import { RecordingConfig } from '../services/recorder'; + +type ConfigModalProps = { + isOpen: boolean; + onClose: () => void; + recordingConfig: RecordingConfig; + draftInactivityTimeLimit: number; + onDraftInactivityTimeLimitChange: (newLimit: number) => void; + submitInactivityTimeLimitChange: () => void; +}; + +export function asModal

void }>( + Component: React.ComponentType

+) { + return (props: P) => { + const dialogRef = useRef(null); + + useEffect(() => { + const dialog = dialogRef.current; + if (!dialog) return; + + if (props.isOpen) { + dialog.showModal(); + } else { + dialog.close(); + } + }, [props.isOpen]); + + const handleClose = () => { + props.onClose(); + }; + + return ( +

+ + + ); + }; +} + +function ConfigModalBase({ + onClose, + recordingConfig, + draftInactivityTimeLimit, + onDraftInactivityTimeLimitChange, + submitInactivityTimeLimitChange +}: ConfigModalProps) { + return ( +
+
+

⚙️ Recording Settings

+
+
+
+ + onDraftInactivityTimeLimitChange(parseInt(e.target.value))} + min={1} + max={300} + /> +

+ Recording will automatically stop after this many seconds of inactivity +

+
+
+
+ + +
+
+ ); +} + +export const ConfigModal = asModal(ConfigModalBase); \ No newline at end of file diff --git a/src/components/MidiDevices.tsx b/src/components/MidiDevices.tsx new file mode 100644 index 0000000..df3d6e7 --- /dev/null +++ b/src/components/MidiDevices.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import '@jamtools/core/modules/io/io_module'; +import {useModule} from '../hooks/use_module'; + +export const MidiDevices: React.FC = () => { + const ioModule = useModule('io'); + const midiDevices = ioModule.midiDeviceState.useState().midiInputDevices; + + return ( +
+
+

🎹 MIDI Input Devices

+
+ {midiDevices && midiDevices.length > 0 ? ( + + ) : ( +
+
🎹
+

No MIDI input devices connected

+

Connect a MIDI device to start recording

+
+ )} +
+ ); +}; diff --git a/src/hooks/use_module.ts b/src/hooks/use_module.ts new file mode 100644 index 0000000..6c51d85 --- /dev/null +++ b/src/hooks/use_module.ts @@ -0,0 +1,7 @@ +import {useSpringboardEngine} from 'springboard/engine/engine'; +import {AllModules} from 'springboard/module_registry/module_registry'; + +export const useModule = (moduleId: ModuleId): AllModules[ModuleId] => { + const engine = useSpringboardEngine(); + return engine.moduleRegistry.getModule(moduleId); +}; diff --git a/src/jamscribe_module.tsx b/src/jamscribe_module.tsx index 23e3979..4c356c2 100644 --- a/src/jamscribe_module.tsx +++ b/src/jamscribe_module.tsx @@ -1,5 +1,5 @@ // TODO: useState isn't working for some reason -import React from 'react'; +import React, {useState} from 'react'; import springboard from 'springboard'; @@ -25,6 +25,9 @@ fileSaver = { // @platform end import {MidiRecorderImpl} from './services/recorder'; +import {ConfigModal} from './components/ConfigModal'; +import {MidiDevices} from './components/MidiDevices'; +import './styles.css'; type DraftedFile = { name: string; @@ -122,51 +125,81 @@ const Main = ({ onDraftInactivityTimeLimitChange, submitInactivityTimeLimitChange }: MainProps) => { + const [isConfigModalOpen, setIsConfigModalOpen] = useState(false); + return ( - <> -
- - Config - -
-                    {JSON.stringify(recordingConfig, null, 2)}
-                
- onDraftInactivityTimeLimitChange(parseInt(e.target.value))} - /> +
+
+

🎵 JamScribe

-
-
- Files - -
-
- + + + setIsConfigModalOpen(false)} + recordingConfig={recordingConfig} + draftInactivityTimeLimit={draftInactivityTimeLimit} + onDraftInactivityTimeLimitChange={onDraftInactivityTimeLimitChange} + submitInactivityTimeLimitChange={submitInactivityTimeLimitChange} + /> + +
+
+ + +
+
+

📁 Recorded Files

+
+ {availableFiles.length > 0 ? ( +
+ {availableFiles.map(file => ( +
{ + // Handle file click + }} + > +
🎼
+
{file.name}
+
+ ))} +
+ ) : ( +
+
📭
+

No recordings yet. Start playing to record MIDI!

+
+ )} +
+
+ +
+
+

📋 Activity Log

+
+
    + {logs.length > 0 ? ( + logs.map((msg, i) => ( +
  • + {msg} +
  • + )) + ) : ( +
  • + Waiting for activity... +
  • + )} +
+
- +
); } diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..bca1eed --- /dev/null +++ b/src/styles.css @@ -0,0 +1,484 @@ +/* Root variables for consistent theming */ +:root { + --primary-color: #5e72e4; + --primary-hover: #4c63d2; + --secondary-color: #6c757d; + --success-color: #2dce89; + --danger-color: #f5365c; + --warning-color: #fb6340; + --info-color: #11cdef; + --dark: #32325d; + --darker: #212529; + --light: #f4f5f7; + --lighter: #fafbfc; + --text-primary: #32325d; + --text-secondary: #8898aa; + --border-color: #e9ecef; + --shadow-sm: 0 1px 3px rgba(50, 50, 93, 0.15), 0 1px 0 rgba(0, 0, 0, 0.02); + --shadow-md: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08); + --shadow-lg: 0 15px 35px rgba(50, 50, 93, 0.1), 0 5px 15px rgba(0, 0, 0, 0.07); + --transition: all 0.2s ease; + --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; +} + +/* Global styles */ +* { + box-sizing: border-box; +} + +body { + font-family: var(--font-family); + color: var(--text-primary); + background-color: var(--lighter); + margin: 0; + padding: 0; +} + +/* App container */ +.app-container { + min-height: 100vh; + padding: 2rem; + max-width: 1200px; + margin: 0 auto; +} + +/* Header */ +.app-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; + padding-bottom: 1.5rem; + border-bottom: 1px solid var(--border-color); +} + +.app-title { + font-size: 2rem; + font-weight: 600; + color: var(--text-primary); + margin: 0; +} + +/* Button styles */ +button { + font-family: var(--font-family); + font-size: 0.875rem; + font-weight: 500; + padding: 0.625rem 1.25rem; + border-radius: 0.375rem; + border: none; + cursor: pointer; + transition: var(--transition); + outline: none; + display: inline-flex; + align-items: center; + gap: 0.5rem; +} + +.btn-primary { + background-color: var(--primary-color); + color: white; +} + +.btn-primary:hover { + background-color: var(--primary-hover); + transform: translateY(-1px); + box-shadow: var(--shadow-md); +} + +.btn-secondary { + background-color: var(--secondary-color); + color: white; +} + +.btn-secondary:hover { + background-color: #5a6268; + transform: translateY(-1px); +} + +.btn-outline { + background-color: transparent; + color: var(--primary-color); + border: 1px solid var(--primary-color); +} + +.btn-outline:hover { + background-color: var(--primary-color); + color: white; +} + +/* Card component */ +.card { + background-color: white; + border-radius: 0.5rem; + border: 1px solid var(--border-color); + padding: 1.5rem; + margin-bottom: 1.5rem; + box-shadow: var(--shadow-sm); + transition: var(--transition); +} + +.card:hover { + box-shadow: var(--shadow-md); +} + +.card-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; +} + +.card-title { + font-size: 1.125rem; + font-weight: 600; + color: var(--text-primary); + margin: 0; +} + +/* Grid layout */ +.main-grid { + display: grid; + grid-template-columns: 1fr; + gap: 1.5rem; +} + +@media (min-width: 768px) { + .main-grid { + grid-template-columns: 2fr 1fr; + } +} + +/* MIDI devices section */ +.midi-devices-card { + background-color: white; +} + +.device-list { + list-style: none; + padding: 0; + margin: 0; +} + +.device-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.875rem 1rem; + background-color: var(--light); + border-radius: 0.375rem; + margin-bottom: 0.5rem; + border: 1px solid transparent; + transition: var(--transition); +} + +.device-item:hover { + background-color: var(--lighter); + border-color: var(--primary-color); +} + +.device-icon { + font-size: 1.5rem; +} + +.device-name { + font-weight: 500; + color: var(--text-primary); +} + +.empty-state { + text-align: center; + padding: 2rem; + color: var(--text-secondary); +} + +.empty-state-icon { + font-size: 3rem; + margin-bottom: 0.5rem; + opacity: 0.5; +} + +/* Files section */ +.files-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 1rem; +} + +.file-item { + padding: 1rem; + background-color: var(--light); + border-radius: 0.375rem; + border: 1px solid transparent; + cursor: pointer; + transition: var(--transition); + text-align: center; +} + +.file-item:hover { + background-color: var(--lighter); + border-color: var(--primary-color); + transform: translateY(-2px); +} + +.file-icon { + font-size: 2rem; + margin-bottom: 0.5rem; + color: var(--primary-color); +} + +.file-name { + font-size: 0.875rem; + color: var(--text-primary); + word-break: break-word; +} + +/* Logs section */ +.logs-card { + max-height: 400px; + overflow-y: auto; +} + +.log-list { + list-style: none; + padding: 0; + margin: 0; +} + +.log-item { + padding: 0.5rem 0.75rem; + border-bottom: 1px solid var(--border-color); + font-size: 0.875rem; + color: var(--text-secondary); + font-family: 'Monaco', 'Consolas', monospace; +} + +.log-item:last-child { + border-bottom: none; +} + +/* Modal/Dialog styles */ +dialog { + padding: 0; + border: none; + border-radius: 0.5rem; + box-shadow: var(--shadow-lg); + max-width: 500px; + width: 90%; +} + +dialog::backdrop { + background-color: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(4px); +} + +.modal-header { + padding: 1.5rem; + border-bottom: 1px solid var(--border-color); +} + +.modal-title { + font-size: 1.25rem; + font-weight: 600; + color: var(--text-primary); + margin: 0; +} + +.modal-body { + padding: 1.5rem; +} + +.modal-footer { + padding: 1rem 1.5rem; + background-color: var(--light); + border-top: 1px solid var(--border-color); + display: flex; + justify-content: flex-end; + gap: 0.5rem; +} + +/* Form elements */ +.form-group { + margin-bottom: 1.5rem; +} + +.form-label { + display: block; + font-size: 0.875rem; + font-weight: 500; + color: var(--text-primary); + margin-bottom: 0.5rem; +} + +.form-input { + width: 100%; + padding: 0.625rem 0.875rem; + font-size: 0.875rem; + border: 1px solid var(--border-color); + border-radius: 0.375rem; + transition: var(--transition); + font-family: var(--font-family); +} + +.form-input:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgba(94, 114, 228, 0.1); +} + +input[type="number"] { + width: auto; + min-width: 100px; +} + +/* Utility classes */ +.text-muted { + color: var(--text-secondary); +} + +.mb-0 { + margin-bottom: 0; +} + +/* Animations */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.fade-in { + animation: fadeIn 0.3s ease; +} + +/* Scrollbar styling */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: var(--light); +} + +::-webkit-scrollbar-thumb { + background: var(--border-color); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--text-secondary); +} + +/* Recording status indicator */ +.recording-status { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + background-color: var(--lighter); + border-radius: 9999px; + font-size: 0.875rem; + font-weight: 500; +} + +.recording-status.active { + background-color: #fef3f2; + color: var(--danger-color); +} + +.recording-indicator { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--text-secondary); +} + +.recording-status.active .recording-indicator { + background-color: var(--danger-color); + animation: pulse 1.5s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.3; + } +} + +/* Badge styles */ +.badge { + display: inline-flex; + align-items: center; + padding: 0.25rem 0.75rem; + font-size: 0.75rem; + font-weight: 600; + border-radius: 9999px; + background-color: var(--light); + color: var(--text-secondary); +} + +.badge-success { + background-color: #d1fae5; + color: var(--success-color); +} + +.badge-primary { + background-color: #e0e7ff; + color: var(--primary-color); +} + +/* File item hover effects */ +.file-item { + position: relative; + overflow: hidden; +} + +.file-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, transparent, rgba(94, 114, 228, 0.1)); + opacity: 0; + transition: opacity 0.3s ease; +} + +.file-item:hover::before { + opacity: 1; +} + +/* Device status indicators */ +.device-status { + width: 8px; + height: 8px; + border-radius: 50%; + background-color: var(--success-color); + flex-shrink: 0; +} + +/* Loading spinner */ +.spinner { + display: inline-block; + width: 20px; + height: 20px; + border: 2px solid var(--light); + border-top-color: var(--primary-color); + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} From eea4caba980ba3b55ff47844f3ab1816b7abb99b Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Wed, 3 Sep 2025 02:33:17 -0400 Subject: [PATCH 02/14] upgrade springboard to 0.16.0 --- package.json | 16 +- pnpm-lock.yaml | 501 +++++++++++++++++++++---------------------------- 2 files changed, 218 insertions(+), 299 deletions(-) diff --git a/package.json b/package.json index c290144..fdd7a39 100644 --- a/package.json +++ b/package.json @@ -11,17 +11,19 @@ "license": "ISC", "description": "", "dependencies": { - "@jamtools/core": "0.15.0-rc20", - "@springboardjs/data-storage": "0.15.0-rc20", - "@springboardjs/platforms-browser": "0.15.0-rc20", - "@springboardjs/platforms-node": "0.15.0-rc20", + "@jamtools/core": "0.16.0", + "@springboardjs/data-storage": "0.16.0", + "@springboardjs/platforms-browser": "0.16.0", + "@springboardjs/platforms-node": "0.16.0", "hono": "4.7.6", + "mic": "^2.1.2", "react": "^19.1.0", - "springboard": "0.15.0-rc20", - "springboard-cli": "0.15.0-rc20", - "springboard-server": "0.15.0-rc20" + "springboard": "0.16.0", + "springboard-cli": "0.16.0", + "springboard-server": "0.16.0" }, "devDependencies": { + "@types/node": "^24.0.14", "@types/react": "^19.1.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4f4b53..f937d6a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,33 +9,39 @@ importers: .: dependencies: '@jamtools/core': - specifier: 0.15.0-rc20 - version: 0.15.0-rc20(@tonejs/midi@2.0.28)(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.16.0 + version: 0.16.0(@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/data-storage': - specifier: 0.15.0-rc20 - version: 0.15.0-rc20(kysely@0.28.1) + specifier: 0.16.0 + version: 0.16.0(kysely@0.28.1) '@springboardjs/platforms-browser': - specifier: 0.15.0-rc20 - version: 0.15.0-rc20(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.16.0 + version: 0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/platforms-node': - specifier: 0.15.0-rc20 - version: 0.15.0-rc20(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + specifier: 0.16.0 + version: 0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: specifier: 4.7.6 version: 4.7.6 + mic: + specifier: ^2.1.2 + version: 2.1.2 react: specifier: ^19.1.0 version: 19.1.0 springboard: - specifier: 0.15.0-rc20 - version: 0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + specifier: 0.16.0 + version: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) springboard-cli: - specifier: 0.15.0-rc20 - version: 0.15.0-rc20(@springboardjs/platforms-browser@0.15.0-rc20(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@springboardjs/platforms-node@0.15.0-rc20(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(springboard-server@0.15.0-rc20(@springboardjs/data-storage@0.15.0-rc20(kysely@0.28.1))(@trpc/server@10.45.2)(hono@4.7.6)(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.16.0 + version: 0.16.0(@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(springboard-server@0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) springboard-server: - specifier: 0.15.0-rc20 - version: 0.15.0-rc20(@springboardjs/data-storage@0.15.0-rc20(kysely@0.28.1))(@trpc/server@10.45.2)(hono@4.7.6)(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.16.0 + version: 0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) devDependencies: + '@types/node': + specifier: ^24.0.14 + version: 24.0.14 '@types/react': specifier: ^19.1.2 version: 19.1.2 @@ -46,146 +52,158 @@ packages: resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -203,18 +221,16 @@ packages: '@hono/node-server': ^1.11.1 hono: ^4.6.0 - '@hono/trpc-server@0.3.4': - resolution: {integrity: sha512-xFOPjUPnII70FgicDzOJy1ufIoBTu8eF578zGiDOrYOrYN8CJe140s9buzuPkX+SwJRYK8LjEBHywqZtxdm8aA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@trpc/server': ^10.10.0 || >11.0.0-rc - hono: '>=4.*' - - '@jamtools/core@0.15.0-rc20': - resolution: {integrity: sha512-ZfpSYOnCQnwS4AUUljF9dMFmcaKArGwNbpGYitkfZ5tUIJdMMNhVxC47YSpA0MFftl/Kk2cZGOabFHPYw/GKIQ==} + '@jamtools/core@0.16.0': + resolution: {integrity: sha512-LfQ7EcYly7m1B2UUwoLp/xkhWiJ/ID1KXw7XV/8HYEuatJ7SvbFGAy7MzOhzJPzWi9HZpyj4RcGID6akz9/nZQ==} peerDependencies: + '@springboardjs/platforms-browser': 0.16.0 '@tonejs/midi': ^2.0.0 - springboard: 0.15.0-rc20 + springboard: 0.16.0 + svelte: '>= 5' + peerDependenciesMeta: + svelte: + optional: true '@julusian/midi@3.6.1': resolution: {integrity: sha512-sC6tTMAMZsHOQILAv/R0On5tKKhzBQUjdyYWzh9l0UQeNry12CFIyRWK1Mep5xCHWCTUB0w4gxngpciA5PgN/Q==} @@ -224,34 +240,29 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} - '@springboardjs/data-storage@0.15.0-rc20': - resolution: {integrity: sha512-ff7kd/NgieXQj/15644NTVvWz904oNXIpJ7BSrjlBnmsRGDRHrt9YrCB3v03Y1NXCn/3GsM4qiMO13MEDCcq1Q==} + '@springboardjs/data-storage@0.16.0': + resolution: {integrity: sha512-g1KLUtq6kw5BAfuxFjhAzIVR9eLQXwzMNLCRgPU/9KW5NHfL8DUVSUha7Nb7tt+1jPwtH4AIfraDIrSbrbSsBQ==} peerDependencies: kysely: '>= 0.24.0' - '@springboardjs/platforms-browser@0.15.0-rc20': - resolution: {integrity: sha512-6EcpEeEcgTYCbvXmiUZTvm/gL7hq23js9bA1tlWi9RmHnH5kIQSUACSuJwF87Yu4o+amOSMrD4yXZBg73l2e9g==} + '@springboardjs/platforms-browser@0.16.0': + resolution: {integrity: sha512-1XgKgdOtUX3skK6cOy30B2dG7XBDH+yBHmEhIXXc2VJ7L7f9CjuJvTatwApNdV9N1tFe3AQYX5VOpGRmVuhQZQ==} peerDependencies: react-router-dom: ^6 - springboard: 0.15.0-rc20 + springboard: 0.16.0 - '@springboardjs/platforms-node@0.15.0-rc20': - resolution: {integrity: sha512-gEeC8HIWHPTH48nMVXaLJDXi1cWPc9o5ZDEA+v3dsob2/5YPQ4+JLXoIDPWKO7hqKDlbeSiiUC3LwJjHdq514A==} + '@springboardjs/platforms-node@0.16.0': + resolution: {integrity: sha512-MZvBU0ugpW+NeR5dH93PkGKyDuJd8G2LEg4ysFug6Tgt0HKJ9DqV0AoYy2fKIwsJ+v46BhkO+YlXQlTg8criiA==} peerDependencies: isomorphic-ws: ^4.0.1 - springboard: 0.15.0-rc20 + springboard: 0.16.0 ws: ^8.18.0 '@tonejs/midi@2.0.28': resolution: {integrity: sha512-RII6YpInPsOZ5t3Si/20QKpNqB1lZ2OCFJSOzJxz38YdY/3zqDr3uaml4JuCWkdixuPqP1/TBnXzhQ39csyoVg==} - '@trpc/client@10.45.2': - resolution: {integrity: sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg==} - peerDependencies: - '@trpc/server': 10.45.2 - - '@trpc/server@10.45.2': - resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} + '@types/node@24.0.14': + resolution: {integrity: sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==} '@types/react@19.1.2': resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} @@ -349,8 +360,8 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -421,6 +432,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + mic@2.1.2: + resolution: {integrity: sha512-rpl4tgdXX24sAzYwjRc5OZfGNAuhUIIjdd0cw8+Ubq7rp3iGhi40AdqcwurDWhEZADk60tPOxb3E2MpoeLeyxw==} + midi-file@1.2.4: resolution: {integrity: sha512-B5SnBC6i2bwJIXTY9MElIydJwAmnKx+r5eJ1jknTLetzLflEl0GWveuBB6ACrQpecSRkOB6fhTx1PwXk2BVxnA==} @@ -456,61 +470,11 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - pg-cloudflare@1.1.1: - resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - - pg-connection-string@2.7.0: - resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} - - pg-int8@1.0.1: - resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} - engines: {node: '>=4.0.0'} - - pg-pool@3.8.0: - resolution: {integrity: sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw==} - peerDependencies: - pg: '>=8.0' - - pg-protocol@1.8.0: - resolution: {integrity: sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==} - - pg-types@2.2.0: - resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} - engines: {node: '>=4'} - - pg@8.14.1: - resolution: {integrity: sha512-0TdbqfjwIun9Fm/r89oB7RFQ0bLgduAhiIqIXOsyKoiC/L54DbuAAzIEN/9Op0f1Po9X7iCPXGoa/Ah+2aI8Xw==} - engines: {node: '>= 8.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true - - pgpass@1.0.5: - resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - pkg-prebuilds@1.0.0: resolution: {integrity: sha512-D9wlkXZCmjxj2kBHTw3fGSyjoahr33breGBoJcoezpi7ouYS59DJVOHMZ+dgqacSrZiJo4qtkXxLQTE+BqXJmQ==} engines: {node: '>= 14.15.0'} hasBin: true - postgres-array@2.0.0: - resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} - engines: {node: '>=4'} - - postgres-bytea@1.0.0: - resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} - engines: {node: '>=0.10.0'} - - postgres-date@1.0.7: - resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} - engines: {node: '>=0.10.0'} - - postgres-interval@1.2.0: - resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} - engines: {node: '>=0.10.0'} - prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -589,30 +553,27 @@ packages: soundfont-player@0.12.0: resolution: {integrity: sha512-8BJIsAt7h1PK3thSZDgF6zecgGhYkK74JnZO8WRZi3h34qG6H/DYlnv7cpRvL7Q9C8N6qld4Qwj7nJsX1gYjEA==} - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - - springboard-cli@0.15.0-rc20: - resolution: {integrity: sha512-yfO+YVR8RuMfSOWfawnRVq4ep+j+DpGf53Ul+cJx8DlgN0GqcAdMAMJalALiFiTExN2SAYHCUK/F+WnYNnhtJQ==} + springboard-cli@0.16.0: + resolution: {integrity: sha512-WggFT3NWiReHlDJ/WbjCrXgneCPRqakma960F2UtwxKMwxqahSOHajKU2rTmMMR389FJ5X0IHzJZfqT/kl3S5Q==} hasBin: true peerDependencies: - '@springboardjs/platforms-browser': 0.15.0-rc20 - '@springboardjs/platforms-node': 0.15.0-rc20 - springboard: 0.15.0-rc20 - springboard-server: 0.15.0-rc20 + '@springboardjs/platforms-browser': 0.16.0 + '@springboardjs/platforms-node': 0.16.0 + springboard: 0.16.0 + springboard-server: 0.16.0 - springboard-server@0.15.0-rc20: - resolution: {integrity: sha512-sEbT8bXwY5fF9/DmWBU6l+zrbwOSNPa+Mr+cdjHfbkgc1Tij/Zxl7O9f6o00HIQNA+kBrQrAuxy5G/LzHv4rGg==} + springboard-server@0.16.0: + resolution: {integrity: sha512-E2XkkZqsuD9Eih36LNRzjSQt2+q/xYR3G5ZHUf/XgjvfhOU2yIb6NoN/IkC2N7rD+B0LfssVpM04K5uCX0JIiQ==} peerDependencies: - '@springboardjs/data-storage': 0.15.0-rc20 + '@springboardjs/data-storage': 0.16.0 + '@springboardjs/platforms-node': 0.16.0 hono: ^4.6.7 - springboard: 0.15.0-rc20 + springboard: 0.16.0 - springboard@0.15.0-rc20: - resolution: {integrity: sha512-Hy1wu2Mk8b+3hyRPppy/hiwRF9HHQ7qeOjW2l6MS7AKrD7Dt2HygkgaH5sXZySE8N9cJQodj1WkBPpvxMuI/Cw==} + springboard@0.16.0: + resolution: {integrity: sha512-W+3Pkum1dw/RCh+q5LmhPFvUGFY9mfnFlU43JiJ+AX9IFuKG5iPG0oH8dYh0XJVZ1BxTmNnAr2r0m5a8qJeqUA==} peerDependencies: - '@trpc/client': ^10.45.2 + immer: ^10.1.1 json-rpc-2.0: ^1.7.0 react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -663,6 +624,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -689,10 +653,6 @@ packages: utf-8-validate: optional: true - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -714,76 +674,82 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@esbuild/aix-ppc64@0.23.1': + '@esbuild/aix-ppc64@0.25.9': + optional: true + + '@esbuild/android-arm64@0.25.9': + optional: true + + '@esbuild/android-arm@0.25.9': optional: true - '@esbuild/android-arm64@0.23.1': + '@esbuild/android-x64@0.25.9': optional: true - '@esbuild/android-arm@0.23.1': + '@esbuild/darwin-arm64@0.25.9': optional: true - '@esbuild/android-x64@0.23.1': + '@esbuild/darwin-x64@0.25.9': optional: true - '@esbuild/darwin-arm64@0.23.1': + '@esbuild/freebsd-arm64@0.25.9': optional: true - '@esbuild/darwin-x64@0.23.1': + '@esbuild/freebsd-x64@0.25.9': optional: true - '@esbuild/freebsd-arm64@0.23.1': + '@esbuild/linux-arm64@0.25.9': optional: true - '@esbuild/freebsd-x64@0.23.1': + '@esbuild/linux-arm@0.25.9': optional: true - '@esbuild/linux-arm64@0.23.1': + '@esbuild/linux-ia32@0.25.9': optional: true - '@esbuild/linux-arm@0.23.1': + '@esbuild/linux-loong64@0.25.9': optional: true - '@esbuild/linux-ia32@0.23.1': + '@esbuild/linux-mips64el@0.25.9': optional: true - '@esbuild/linux-loong64@0.23.1': + '@esbuild/linux-ppc64@0.25.9': optional: true - '@esbuild/linux-mips64el@0.23.1': + '@esbuild/linux-riscv64@0.25.9': optional: true - '@esbuild/linux-ppc64@0.23.1': + '@esbuild/linux-s390x@0.25.9': optional: true - '@esbuild/linux-riscv64@0.23.1': + '@esbuild/linux-x64@0.25.9': optional: true - '@esbuild/linux-s390x@0.23.1': + '@esbuild/netbsd-arm64@0.25.9': optional: true - '@esbuild/linux-x64@0.23.1': + '@esbuild/netbsd-x64@0.25.9': optional: true - '@esbuild/netbsd-x64@0.23.1': + '@esbuild/openbsd-arm64@0.25.9': optional: true - '@esbuild/openbsd-arm64@0.23.1': + '@esbuild/openbsd-x64@0.25.9': optional: true - '@esbuild/openbsd-x64@0.23.1': + '@esbuild/openharmony-arm64@0.25.9': optional: true - '@esbuild/sunos-x64@0.23.1': + '@esbuild/sunos-x64@0.25.9': optional: true - '@esbuild/win32-arm64@0.23.1': + '@esbuild/win32-arm64@0.25.9': optional: true - '@esbuild/win32-ia32@0.23.1': + '@esbuild/win32-ia32@0.25.9': optional: true - '@esbuild/win32-x64@0.23.1': + '@esbuild/win32-x64@0.25.9': optional: true '@hono/node-server@1.14.1(hono@4.7.6)': @@ -799,18 +765,15 @@ snapshots: - bufferutil - utf-8-validate - '@hono/trpc-server@0.3.4(@trpc/server@10.45.2)(hono@4.7.6)': - dependencies: - '@trpc/server': 10.45.2 - hono: 4.7.6 - - '@jamtools/core@0.15.0-rc20(@tonejs/midi@2.0.28)(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@jamtools/core@0.16.0(@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: + '@springboardjs/platforms-browser': 0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@tonejs/midi': 2.0.28 easymidi: 3.1.0 + immer: 10.1.1 midi-file: 1.2.4 soundfont-player: 0.12.0 - springboard: 0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) webmidi: 3.1.12 '@julusian/midi@3.6.1': @@ -820,26 +783,25 @@ snapshots: '@remix-run/router@1.23.0': {} - '@springboardjs/data-storage@0.15.0-rc20(kysely@0.28.1)': + '@springboardjs/data-storage@0.16.0(kysely@0.28.1)': dependencies: - '@trpc/client': 10.45.2(@trpc/server@10.45.2) - '@trpc/server': 10.45.2 better-sqlite3: 11.9.1 kysely: 0.28.1 - pg: 8.14.1 zod: 3.24.3 - transitivePeerDependencies: - - pg-native - '@springboardjs/platforms-browser@0.15.0-rc20(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: + json-rpc-2.0: 1.7.0 react-router-dom: 6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - springboard: 0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + reconnecting-websocket: 4.4.0 + springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - '@springboardjs/platforms-node@0.15.0-rc20(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': + '@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': dependencies: isomorphic-ws: 4.0.1(ws@8.18.1) - springboard: 0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + json-rpc-2.0: 1.7.0 + reconnecting-websocket: 4.4.0 + springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) ws: 8.18.1 '@tonejs/midi@2.0.28': @@ -847,11 +809,9 @@ snapshots: array-flatten: 3.0.0 midi-file: 1.2.4 - '@trpc/client@10.45.2(@trpc/server@10.45.2)': + '@types/node@24.0.14': dependencies: - '@trpc/server': 10.45.2 - - '@trpc/server@10.45.2': {} + undici-types: 7.8.0 '@types/react@19.1.2': dependencies: @@ -951,32 +911,34 @@ snapshots: dependencies: once: 1.4.0 - esbuild@0.23.1: + esbuild@0.25.9: optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 escalade@3.2.0: {} @@ -1023,6 +985,8 @@ snapshots: lodash@4.17.21: {} + mic@2.1.2: {} + midi-file@1.2.4: {} midimessage@1.0.5: {} @@ -1049,55 +1013,10 @@ snapshots: dependencies: wrappy: 1.0.2 - pg-cloudflare@1.1.1: - optional: true - - pg-connection-string@2.7.0: {} - - pg-int8@1.0.1: {} - - pg-pool@3.8.0(pg@8.14.1): - dependencies: - pg: 8.14.1 - - pg-protocol@1.8.0: {} - - pg-types@2.2.0: - dependencies: - pg-int8: 1.0.1 - postgres-array: 2.0.0 - postgres-bytea: 1.0.0 - postgres-date: 1.0.7 - postgres-interval: 1.2.0 - - pg@8.14.1: - dependencies: - pg-connection-string: 2.7.0 - pg-pool: 3.8.0(pg@8.14.1) - pg-protocol: 1.8.0 - pg-types: 2.2.0 - pgpass: 1.0.5 - optionalDependencies: - pg-cloudflare: 1.1.1 - - pgpass@1.0.5: - dependencies: - split2: 4.2.0 - pkg-prebuilds@1.0.0: dependencies: yargs: 17.7.2 - postgres-array@2.0.0: {} - - postgres-bytea@1.0.0: {} - - postgres-date@1.0.7: {} - - postgres-interval@1.2.0: - dependencies: - xtend: 4.0.2 - prebuild-install@7.1.3: dependencies: detect-libc: 2.0.3 @@ -1188,35 +1107,33 @@ snapshots: note-parser: 2.0.1 sample-player: 0.5.5 - split2@4.2.0: {} - - springboard-cli@0.15.0-rc20(@springboardjs/platforms-browser@0.15.0-rc20(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@springboardjs/platforms-node@0.15.0-rc20(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(springboard-server@0.15.0-rc20(@springboardjs/data-storage@0.15.0-rc20(kysely@0.28.1))(@trpc/server@10.45.2)(hono@4.7.6)(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): + springboard-cli@0.16.0(@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(springboard-server@0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): dependencies: - '@springboardjs/platforms-browser': 0.15.0-rc20(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) - '@springboardjs/platforms-node': 0.15.0-rc20(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + '@springboardjs/platforms-browser': 0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + '@springboardjs/platforms-node': 0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) commander: 12.1.0 concurrently: 9.1.2 - esbuild: 0.23.1 - springboard: 0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - springboard-server: 0.15.0-rc20(@springboardjs/data-storage@0.15.0-rc20(kysely@0.28.1))(@trpc/server@10.45.2)(hono@4.7.6)(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + esbuild: 0.25.9 + springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard-server: 0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + tslib: 2.8.1 typescript: 5.8.3 - springboard-server@0.15.0-rc20(@springboardjs/data-storage@0.15.0-rc20(kysely@0.28.1))(@trpc/server@10.45.2)(hono@4.7.6)(springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): + springboard-server@0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): dependencies: '@hono/node-server': 1.14.1(hono@4.7.6) '@hono/node-ws': 1.1.1(@hono/node-server@1.14.1(hono@4.7.6))(hono@4.7.6) - '@hono/trpc-server': 0.3.4(@trpc/server@10.45.2)(hono@4.7.6) - '@springboardjs/data-storage': 0.15.0-rc20(kysely@0.28.1) + '@springboardjs/data-storage': 0.16.0(kysely@0.28.1) + '@springboardjs/platforms-node': 0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: 4.7.6 - springboard: 0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + json-rpc-2.0: 1.7.0 + springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) transitivePeerDependencies: - - '@trpc/server' - bufferutil - utf-8-validate - springboard@0.15.0-rc20(@trpc/client@10.45.2(@trpc/server@10.45.2))(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): + springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): dependencies: - '@trpc/client': 10.45.2(@trpc/server@10.45.2) dexie: 4.0.11 immer: 10.1.1 json-rpc-2.0: 1.7.0 @@ -1278,6 +1195,8 @@ snapshots: typescript@5.8.3: {} + undici-types@7.8.0: {} + util-deprecate@1.0.2: {} webmidi@3.1.12: @@ -1296,8 +1215,6 @@ snapshots: ws@8.18.1: {} - xtend@4.0.2: {} - y18n@5.0.8: {} yargs-parser@21.1.1: {} From a795f1cfb242170129fc9d9aa31edaa8b1c7828e Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Wed, 3 Sep 2025 02:33:30 -0400 Subject: [PATCH 03/14] add tsconfig.json --- tsconfig.json | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 tsconfig.json diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0a40a16 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,114 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + "jsx": "react", + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */, + "paths": { + // "~/*": ["./packages/jamtools/*"], + } + }, + "exclude": [] +} From 4738248de590c47231eda33c73a1c48ea1421ad6 Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Wed, 3 Sep 2025 02:37:40 -0400 Subject: [PATCH 04/14] add ci.yml for type checking --- .github/workflows/ci.yml | 45 ++++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..94c63f4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9.13.2 + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install modules + run: pnpm i + - name: Build app + run: npm run build + + types: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9.13.2 + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + - name: Install modules + run: pnpm i + - name: Check Types + run: npm run check-types diff --git a/package.json b/package.json index fdd7a39..221bfb5 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "main": "index.js", "scripts": { "dev": "sb dev src/index.tsx", - "build": "sb build src/index.tsx" + "build": "sb build src/index.tsx", + "check-types": "tsc --noEmit" }, "keywords": [], "author": "", From 80181e1094e1e55ec1e41cfc59b93d329e3397b5 Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Thu, 11 Sep 2025 01:24:50 -0400 Subject: [PATCH 05/14] update jamtools core --- package.json | 14 +++--- pnpm-lock.yaml | 114 ++++++++++++++++++++++++------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index 221bfb5..fb37f3e 100644 --- a/package.json +++ b/package.json @@ -12,16 +12,16 @@ "license": "ISC", "description": "", "dependencies": { - "@jamtools/core": "0.16.0", - "@springboardjs/data-storage": "0.16.0", - "@springboardjs/platforms-browser": "0.16.0", - "@springboardjs/platforms-node": "0.16.0", + "@jamtools/core": "0.0.1-dev-midipoller-1", + "@springboardjs/data-storage": "0.0.1-dev-midipoller-1", + "@springboardjs/platforms-browser": "0.0.1-dev-midipoller-1", + "@springboardjs/platforms-node": "0.0.1-dev-midipoller-1", "hono": "4.7.6", "mic": "^2.1.2", "react": "^19.1.0", - "springboard": "0.16.0", - "springboard-cli": "0.16.0", - "springboard-server": "0.16.0" + "springboard": "0.0.1-dev-midipoller-1", + "springboard-cli": "0.0.1-dev-midipoller-1", + "springboard-server": "0.0.1-dev-midipoller-1" }, "devDependencies": { "@types/node": "^24.0.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f937d6a..75aec78 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: dependencies: '@jamtools/core': - specifier: 0.16.0 - version: 0.16.0(@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-1 + version: 0.0.1-dev-midipoller-1(@springboardjs/platforms-browser@0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/data-storage': - specifier: 0.16.0 - version: 0.16.0(kysely@0.28.1) + specifier: 0.0.1-dev-midipoller-1 + version: 0.0.1-dev-midipoller-1(kysely@0.28.1) '@springboardjs/platforms-browser': - specifier: 0.16.0 - version: 0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-1 + version: 0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/platforms-node': - specifier: 0.16.0 - version: 0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + specifier: 0.0.1-dev-midipoller-1 + version: 0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: specifier: 4.7.6 version: 4.7.6 @@ -30,14 +30,14 @@ importers: specifier: ^19.1.0 version: 19.1.0 springboard: - specifier: 0.16.0 - version: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + specifier: 0.0.1-dev-midipoller-1 + version: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) springboard-cli: - specifier: 0.16.0 - version: 0.16.0(@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(springboard-server@0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-1 + version: 0.0.1-dev-midipoller-1(bfcad46c28e361a461b4556f25d6c4d5) springboard-server: - specifier: 0.16.0 - version: 0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-1 + version: 0.0.1-dev-midipoller-1(@springboardjs/data-storage@0.0.1-dev-midipoller-1(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) devDependencies: '@types/node': specifier: ^24.0.14 @@ -221,12 +221,12 @@ packages: '@hono/node-server': ^1.11.1 hono: ^4.6.0 - '@jamtools/core@0.16.0': - resolution: {integrity: sha512-LfQ7EcYly7m1B2UUwoLp/xkhWiJ/ID1KXw7XV/8HYEuatJ7SvbFGAy7MzOhzJPzWi9HZpyj4RcGID6akz9/nZQ==} + '@jamtools/core@0.0.1-dev-midipoller-1': + resolution: {integrity: sha512-gLFlMvor5nXZlUtimRXVKohuaZNxzph7+2EZA0SEuGFsBGrwlrfmOxmGRqenNzcrmO+G1IVItiacifIiY4q24g==} peerDependencies: - '@springboardjs/platforms-browser': 0.16.0 + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-1 '@tonejs/midi': ^2.0.0 - springboard: 0.16.0 + springboard: 0.0.1-dev-midipoller-1 svelte: '>= 5' peerDependenciesMeta: svelte: @@ -240,22 +240,22 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} - '@springboardjs/data-storage@0.16.0': - resolution: {integrity: sha512-g1KLUtq6kw5BAfuxFjhAzIVR9eLQXwzMNLCRgPU/9KW5NHfL8DUVSUha7Nb7tt+1jPwtH4AIfraDIrSbrbSsBQ==} + '@springboardjs/data-storage@0.0.1-dev-midipoller-1': + resolution: {integrity: sha512-a1tRfUzr6sUCYnOqG5nB9GqusFYXxaiHCuJAc5QUlpTvqsEvg27mUb6nqpUyLUvhgBFb3E7pbkv9lO1jvA8vzA==} peerDependencies: kysely: '>= 0.24.0' - '@springboardjs/platforms-browser@0.16.0': - resolution: {integrity: sha512-1XgKgdOtUX3skK6cOy30B2dG7XBDH+yBHmEhIXXc2VJ7L7f9CjuJvTatwApNdV9N1tFe3AQYX5VOpGRmVuhQZQ==} + '@springboardjs/platforms-browser@0.0.1-dev-midipoller-1': + resolution: {integrity: sha512-LdandEat3Dr6C559sdqgNzNjat4FdytlIoZeUPUpcC6Of8yFd406sYXUpdAZo57ynbwjh/2W9sJzW1fBlxP5DQ==} peerDependencies: react-router-dom: ^6 - springboard: 0.16.0 + springboard: 0.0.1-dev-midipoller-1 - '@springboardjs/platforms-node@0.16.0': - resolution: {integrity: sha512-MZvBU0ugpW+NeR5dH93PkGKyDuJd8G2LEg4ysFug6Tgt0HKJ9DqV0AoYy2fKIwsJ+v46BhkO+YlXQlTg8criiA==} + '@springboardjs/platforms-node@0.0.1-dev-midipoller-1': + resolution: {integrity: sha512-ZRwQ/JsYYz9Ph2nHXs7pYIveTx82+G1hdFKwYOMqlt3oqfJGFQ39cQg5LniPpuakAtQJPGh5fFAzcH+AY+jOyw==} peerDependencies: isomorphic-ws: ^4.0.1 - springboard: 0.16.0 + springboard: 0.0.1-dev-midipoller-1 ws: ^8.18.0 '@tonejs/midi@2.0.28': @@ -553,25 +553,25 @@ packages: soundfont-player@0.12.0: resolution: {integrity: sha512-8BJIsAt7h1PK3thSZDgF6zecgGhYkK74JnZO8WRZi3h34qG6H/DYlnv7cpRvL7Q9C8N6qld4Qwj7nJsX1gYjEA==} - springboard-cli@0.16.0: - resolution: {integrity: sha512-WggFT3NWiReHlDJ/WbjCrXgneCPRqakma960F2UtwxKMwxqahSOHajKU2rTmMMR389FJ5X0IHzJZfqT/kl3S5Q==} + springboard-cli@0.0.1-dev-midipoller-1: + resolution: {integrity: sha512-M1jR01TLej1umDtIdv9egm5jGwDs2/dLwJD2C5jZDa26brcNPDKOs3MT/GoOx6m0qrk6MzXme0GacCczMA5WEw==} hasBin: true peerDependencies: - '@springboardjs/platforms-browser': 0.16.0 - '@springboardjs/platforms-node': 0.16.0 - springboard: 0.16.0 - springboard-server: 0.16.0 + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-1 + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-1 + springboard: 0.0.1-dev-midipoller-1 + springboard-server: 0.0.1-dev-midipoller-1 - springboard-server@0.16.0: - resolution: {integrity: sha512-E2XkkZqsuD9Eih36LNRzjSQt2+q/xYR3G5ZHUf/XgjvfhOU2yIb6NoN/IkC2N7rD+B0LfssVpM04K5uCX0JIiQ==} + springboard-server@0.0.1-dev-midipoller-1: + resolution: {integrity: sha512-uSQhDFW8c+Dk1Di0ZTT9i2q64QsuguFKIFUAcpoWHMxhYxXedK0WXfVO2+S/2gz3nmIm6biIhgt3IzGLULfNiA==} peerDependencies: - '@springboardjs/data-storage': 0.16.0 - '@springboardjs/platforms-node': 0.16.0 + '@springboardjs/data-storage': 0.0.1-dev-midipoller-1 + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-1 hono: ^4.6.7 - springboard: 0.16.0 + springboard: 0.0.1-dev-midipoller-1 - springboard@0.16.0: - resolution: {integrity: sha512-W+3Pkum1dw/RCh+q5LmhPFvUGFY9mfnFlU43JiJ+AX9IFuKG5iPG0oH8dYh0XJVZ1BxTmNnAr2r0m5a8qJeqUA==} + springboard@0.0.1-dev-midipoller-1: + resolution: {integrity: sha512-m/8PQUMIJzw6F1UE7wCMkSlL3x4W7zXwn5yCkCI9jlwvh8xQcPto6NnfzU4RcfmbkJtxNjvgW5zgBaMCJYgfiw==} peerDependencies: immer: ^10.1.1 json-rpc-2.0: ^1.7.0 @@ -765,15 +765,15 @@ snapshots: - bufferutil - utf-8-validate - '@jamtools/core@0.16.0(@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@jamtools/core@0.0.1-dev-midipoller-1(@springboardjs/platforms-browser@0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: - '@springboardjs/platforms-browser': 0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@tonejs/midi': 2.0.28 easymidi: 3.1.0 immer: 10.1.1 midi-file: 1.2.4 soundfont-player: 0.12.0 - springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) webmidi: 3.1.12 '@julusian/midi@3.6.1': @@ -783,25 +783,25 @@ snapshots: '@remix-run/router@1.23.0': {} - '@springboardjs/data-storage@0.16.0(kysely@0.28.1)': + '@springboardjs/data-storage@0.0.1-dev-midipoller-1(kysely@0.28.1)': dependencies: better-sqlite3: 11.9.1 kysely: 0.28.1 zod: 3.24.3 - '@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@springboardjs/platforms-browser@0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: json-rpc-2.0: 1.7.0 react-router-dom: 6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) reconnecting-websocket: 4.4.0 - springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - '@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': + '@springboardjs/platforms-node@0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': dependencies: isomorphic-ws: 4.0.1(ws@8.18.1) json-rpc-2.0: 1.7.0 reconnecting-websocket: 4.4.0 - springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) ws: 8.18.1 '@tonejs/midi@2.0.28': @@ -1107,32 +1107,32 @@ snapshots: note-parser: 2.0.1 sample-player: 0.5.5 - springboard-cli@0.16.0(@springboardjs/platforms-browser@0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(springboard-server@0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): + springboard-cli@0.0.1-dev-midipoller-1(bfcad46c28e361a461b4556f25d6c4d5): dependencies: - '@springboardjs/platforms-browser': 0.16.0(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) - '@springboardjs/platforms-node': 0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) commander: 12.1.0 concurrently: 9.1.2 esbuild: 0.25.9 - springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - springboard-server: 0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard-server: 0.0.1-dev-midipoller-1(@springboardjs/data-storage@0.0.1-dev-midipoller-1(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) tslib: 2.8.1 typescript: 5.8.3 - springboard-server@0.16.0(@springboardjs/data-storage@0.16.0(kysely@0.28.1))(@springboardjs/platforms-node@0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): + springboard-server@0.0.1-dev-midipoller-1(@springboardjs/data-storage@0.0.1-dev-midipoller-1(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): dependencies: '@hono/node-server': 1.14.1(hono@4.7.6) '@hono/node-ws': 1.1.1(@hono/node-server@1.14.1(hono@4.7.6))(hono@4.7.6) - '@springboardjs/data-storage': 0.16.0(kysely@0.28.1) - '@springboardjs/platforms-node': 0.16.0(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + '@springboardjs/data-storage': 0.0.1-dev-midipoller-1(kysely@0.28.1) + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: 4.7.6 json-rpc-2.0: 1.7.0 - springboard: 0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) transitivePeerDependencies: - bufferutil - utf-8-validate - springboard@0.16.0(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): + springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): dependencies: dexie: 4.0.11 immer: 10.1.1 From 379d7d68e3970c92301228c42a6d1b0e38910a59 Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Wed, 17 Sep 2025 14:46:55 -0400 Subject: [PATCH 06/14] fix midi file write issue, and make UI log messages look better --- .gitignore | 1 + src/jamscribe_module.tsx | 46 ++++++++++++++++++++++++++++++++++------ src/services/recorder.ts | 22 ++++++++++++++----- src/styles.css | 18 ++++++++++++++++ 4 files changed, 75 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index f06235c..f1df25c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules dist +midi_files diff --git a/src/jamscribe_module.tsx b/src/jamscribe_module.tsx index 4c356c2..1342b83 100644 --- a/src/jamscribe_module.tsx +++ b/src/jamscribe_module.tsx @@ -18,8 +18,7 @@ fileSaver = { fs.mkdirSync('midi_files') } - const content = buffer.toString(); - await fs.promises.writeFile(fileName, content); + await fs.promises.writeFile(fileName, buffer); }, }; // @platform end @@ -46,7 +45,11 @@ springboard.registerModule('JamScribe', {}, async (moduleAPI) => { const recordingConfig = await moduleAPI.statesAPI.createPersistentState('recordingConfig', initialRecordingConfig); const draftRecordingConfig = await moduleAPI.statesAPI.createSharedState('draftRecordingConfig', recordingConfig.getState()); - const logMessages = await moduleAPI.statesAPI.createSharedState('logMessages', []); + type LogMessage = { + message: string; + timestamp: Date; + }; + const logMessages = await moduleAPI.statesAPI.createSharedState('logMessages', []); const draftedFiles = await moduleAPI.statesAPI.createSharedState('draftedFiles', []); const changeDraftInactivityTimeLimit = moduleAPI.createAction('changeDraftInactivityTimeLimit', {}, async ({limit}: {limit: number}) => { @@ -106,8 +109,13 @@ springboard.registerModule('JamScribe', {}, async (moduleAPI) => { recorder.initialize(); }); +type LogMessage = { + message: string; + timestamp: Date; +}; + type MainProps = { - logs: string[]; + logs: LogMessage[]; availableFiles: DraftedFile[]; recordingConfig: RecordingConfig; @@ -187,11 +195,35 @@ const Main = ({
    {logs.length > 0 ? ( - logs.map((msg, i) => ( + [...logs].reverse().map((logEntry, i) => { + const formatTime = (date: Date | string | number) => { + const dateObj = new Date(date); + const now = new Date(); + const isToday = dateObj.toDateString() === now.toDateString(); + const timeStr = dateObj.toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit', + hour12: true + }); + + if (isToday) { + return timeStr; + } else { + const dateStr = dateObj.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric' + }); + return `${dateStr} ${timeStr}`; + } + }; + + return (
  • - {msg} + {formatTime(logEntry.timestamp)} + {logEntry.message}
  • - )) + ); + }) ) : (
  • Waiting for activity... diff --git a/src/services/recorder.ts b/src/services/recorder.ts index f44c07a..cd6e267 100644 --- a/src/services/recorder.ts +++ b/src/services/recorder.ts @@ -23,7 +23,7 @@ type Logger = { }; export type FileSaver = { - writeFile: (fileName: string, buffer: Buffer) => void; + writeFile: (fileName: string, buffer: Buffer) => void | Promise; } export type RecordingConfig = { @@ -38,6 +38,18 @@ export class MidiRecorderImpl { constructor(private onInputEvent: Subject, private logger: Logger, private fileSaver: FileSaver, private recordingConfigState: StateSupervisor) { } + private formatDeviceName(deviceName: string): string { + // Truncate long device names and remove common suffixes + const cleaned = deviceName.replace(/ Air Bluetooth$/, '').replace(/ Bluetooth$/, ''); + return cleaned.length > 20 ? cleaned.substring(0, 17) + '...' : cleaned; + } + + private formatFilePath(filePath: string): string { + // Show just the filename without the full path + const fileName = filePath.split('/').pop() || filePath; + return fileName.length > 30 ? '...' + fileName.substring(fileName.length - 27) : fileName; + } + public initialize = () => { this.onInputEvent.subscribe(this.handleMidiEvent); }; @@ -51,7 +63,7 @@ export class MidiRecorderImpl { // Store the event in memory if (!this.recordedEvents[deviceName]?.length) { - this.logger.log(`Started recording ${deviceName}. Will stop after ${this.getInactivityLimit() / 1000} seconds`); + this.logger.log(`Started recording ${this.formatDeviceName(deviceName)}`); this.recordedEvents[deviceName] = []; this.notifyUserOfStartRecording(); } @@ -62,7 +74,7 @@ export class MidiRecorderImpl { // Stop recording and save all recorded MIDI events to a file private stopRecordingForAllDevices = () => { - this.logger.log('Stopping all recordings due to inactivity...'); + this.logger.log('Stopping recordings due to inactivity'); Object.keys(this.recordedEvents).forEach((deviceName) => { this.saveRecordedMidiToFile(deviceName); @@ -81,7 +93,7 @@ export class MidiRecorderImpl { } this.deviceTimeouts[deviceName] = setTimeout(() => { - this.logger.log(`Device ${deviceName} is now inactive.`); + this.logger.log(`${this.formatDeviceName(deviceName)} inactive`); this.deviceActivity[deviceName] = false; const allInactive = Object.values(this.deviceActivity).every(isActive => !isActive); @@ -132,7 +144,7 @@ export class MidiRecorderImpl { try { const outputBuffer = Buffer.from(writeMidi(midiData)); this.fileSaver.writeFile(midiFilePath, outputBuffer); - this.logger.log(`MIDI file saved for device: ${deviceName} at ${midiFilePath}`); + this.logger.log(`MIDI saved: ${this.formatFilePath(midiFilePath)}`); this.notifyUserOfNewRecordedSession(); } catch (error) { this.logger.log(`Error while saving MIDI file for ${deviceName}: ${(error as Error).message}`); diff --git a/src/styles.css b/src/styles.css index bca1eed..849b080 100644 --- a/src/styles.css +++ b/src/styles.css @@ -251,12 +251,30 @@ button { font-size: 0.875rem; color: var(--text-secondary); font-family: 'Monaco', 'Consolas', monospace; + display: flex; + gap: 0.75rem; + align-items: flex-start; + line-height: 1.4; } .log-item:last-child { border-bottom: none; } +.log-timestamp { + flex-shrink: 0; + color: var(--text-secondary); + font-weight: 500; + min-width: 60px; +} + +.log-message { + color: var(--text-primary); + word-break: break-word; + overflow-wrap: break-word; + flex: 1; +} + /* Modal/Dialog styles */ dialog { padding: 0; From bc6d0402a1ea586c83a51aea825b619c463f19cc Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Wed, 17 Sep 2025 14:53:07 -0400 Subject: [PATCH 07/14] fix log styling --- src/jamscribe_module.tsx | 9 +++------ tsconfig.json | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/jamscribe_module.tsx b/src/jamscribe_module.tsx index 1342b83..3ce8f4e 100644 --- a/src/jamscribe_module.tsx +++ b/src/jamscribe_module.tsx @@ -45,10 +45,6 @@ springboard.registerModule('JamScribe', {}, async (moduleAPI) => { const recordingConfig = await moduleAPI.statesAPI.createPersistentState('recordingConfig', initialRecordingConfig); const draftRecordingConfig = await moduleAPI.statesAPI.createSharedState('draftRecordingConfig', recordingConfig.getState()); - type LogMessage = { - message: string; - timestamp: Date; - }; const logMessages = await moduleAPI.statesAPI.createSharedState('logMessages', []); const draftedFiles = await moduleAPI.statesAPI.createSharedState('draftedFiles', []); @@ -94,7 +90,7 @@ springboard.registerModule('JamScribe', {}, async (moduleAPI) => { const log = (msg: string) => { console.log(msg); logMessages.setState(logs => { - return [...logs, msg] + return [...logs, { message: msg, timestamp: new Date(), id: Math.random().toString().slice(2) }] }); } @@ -110,6 +106,7 @@ springboard.registerModule('JamScribe', {}, async (moduleAPI) => { }); type LogMessage = { + id: string; message: string; timestamp: Date; }; @@ -218,7 +215,7 @@ const Main = ({ }; return ( -
  • +
  • {formatTime(logEntry.timestamp)} {logEntry.message}
  • diff --git a/tsconfig.json b/tsconfig.json index 0a40a16..957d748 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -110,5 +110,5 @@ // "~/*": ["./packages/jamtools/*"], } }, - "exclude": [] + "exclude": ["./daw", "src/services/audio_recorder.ts"] } From dbfaca3f7d79769031ecf5de05feae16b2a3dfbb Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Sat, 20 Sep 2025 20:09:38 -0400 Subject: [PATCH 08/14] update jamtools --- package.json | 14 +++--- pnpm-lock.yaml | 114 ++++++++++++++++++++++++------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index fb37f3e..27c5c9d 100644 --- a/package.json +++ b/package.json @@ -12,16 +12,16 @@ "license": "ISC", "description": "", "dependencies": { - "@jamtools/core": "0.0.1-dev-midipoller-1", - "@springboardjs/data-storage": "0.0.1-dev-midipoller-1", - "@springboardjs/platforms-browser": "0.0.1-dev-midipoller-1", - "@springboardjs/platforms-node": "0.0.1-dev-midipoller-1", + "@jamtools/core": "0.0.1-dev-midipoller-2", + "@springboardjs/data-storage": "0.0.1-dev-midipoller-2", + "@springboardjs/platforms-browser": "0.0.1-dev-midipoller-2", + "@springboardjs/platforms-node": "0.0.1-dev-midipoller-2", "hono": "4.7.6", "mic": "^2.1.2", "react": "^19.1.0", - "springboard": "0.0.1-dev-midipoller-1", - "springboard-cli": "0.0.1-dev-midipoller-1", - "springboard-server": "0.0.1-dev-midipoller-1" + "springboard": "0.0.1-dev-midipoller-2", + "springboard-cli": "0.0.1-dev-midipoller-2", + "springboard-server": "0.0.1-dev-midipoller-2" }, "devDependencies": { "@types/node": "^24.0.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75aec78..62909a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: dependencies: '@jamtools/core': - specifier: 0.0.1-dev-midipoller-1 - version: 0.0.1-dev-midipoller-1(@springboardjs/platforms-browser@0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-2 + version: 0.0.1-dev-midipoller-2(@springboardjs/platforms-browser@0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/data-storage': - specifier: 0.0.1-dev-midipoller-1 - version: 0.0.1-dev-midipoller-1(kysely@0.28.1) + specifier: 0.0.1-dev-midipoller-2 + version: 0.0.1-dev-midipoller-2(kysely@0.28.1) '@springboardjs/platforms-browser': - specifier: 0.0.1-dev-midipoller-1 - version: 0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-2 + version: 0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/platforms-node': - specifier: 0.0.1-dev-midipoller-1 - version: 0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + specifier: 0.0.1-dev-midipoller-2 + version: 0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: specifier: 4.7.6 version: 4.7.6 @@ -30,14 +30,14 @@ importers: specifier: ^19.1.0 version: 19.1.0 springboard: - specifier: 0.0.1-dev-midipoller-1 - version: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + specifier: 0.0.1-dev-midipoller-2 + version: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) springboard-cli: - specifier: 0.0.1-dev-midipoller-1 - version: 0.0.1-dev-midipoller-1(bfcad46c28e361a461b4556f25d6c4d5) + specifier: 0.0.1-dev-midipoller-2 + version: 0.0.1-dev-midipoller-2(eea953fa3fbba9b1873e34c60da1549e) springboard-server: - specifier: 0.0.1-dev-midipoller-1 - version: 0.0.1-dev-midipoller-1(@springboardjs/data-storage@0.0.1-dev-midipoller-1(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-2 + version: 0.0.1-dev-midipoller-2(@springboardjs/data-storage@0.0.1-dev-midipoller-2(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) devDependencies: '@types/node': specifier: ^24.0.14 @@ -221,12 +221,12 @@ packages: '@hono/node-server': ^1.11.1 hono: ^4.6.0 - '@jamtools/core@0.0.1-dev-midipoller-1': - resolution: {integrity: sha512-gLFlMvor5nXZlUtimRXVKohuaZNxzph7+2EZA0SEuGFsBGrwlrfmOxmGRqenNzcrmO+G1IVItiacifIiY4q24g==} + '@jamtools/core@0.0.1-dev-midipoller-2': + resolution: {integrity: sha512-VnIhN4epRoy4FC8W3ycaMvdRJUN9JW+0P9EOf9dtJZeK+k12EeIJAhE+tFfTdZ84eSS1FbJgMqULmmH9/vxPLw==} peerDependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-1 + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-2 '@tonejs/midi': ^2.0.0 - springboard: 0.0.1-dev-midipoller-1 + springboard: 0.0.1-dev-midipoller-2 svelte: '>= 5' peerDependenciesMeta: svelte: @@ -240,22 +240,22 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} - '@springboardjs/data-storage@0.0.1-dev-midipoller-1': - resolution: {integrity: sha512-a1tRfUzr6sUCYnOqG5nB9GqusFYXxaiHCuJAc5QUlpTvqsEvg27mUb6nqpUyLUvhgBFb3E7pbkv9lO1jvA8vzA==} + '@springboardjs/data-storage@0.0.1-dev-midipoller-2': + resolution: {integrity: sha512-OV9igDtRxYSQaJ6B2ozdI5SQPYrrQ4uFvrx/jwTI8Ad8OnlvQIRDzWx8lZNTiR084VevPqDrK0tl8hO8tYqKWA==} peerDependencies: kysely: '>= 0.24.0' - '@springboardjs/platforms-browser@0.0.1-dev-midipoller-1': - resolution: {integrity: sha512-LdandEat3Dr6C559sdqgNzNjat4FdytlIoZeUPUpcC6Of8yFd406sYXUpdAZo57ynbwjh/2W9sJzW1fBlxP5DQ==} + '@springboardjs/platforms-browser@0.0.1-dev-midipoller-2': + resolution: {integrity: sha512-9XA9Smrb6bt2tLiw18hdHTBsafX1Hf1v0m17tI8UnHwh6emHooT4wjcPac95uROd0S7zRo/pO8Q8AeQFZvCvzQ==} peerDependencies: react-router-dom: ^6 - springboard: 0.0.1-dev-midipoller-1 + springboard: 0.0.1-dev-midipoller-2 - '@springboardjs/platforms-node@0.0.1-dev-midipoller-1': - resolution: {integrity: sha512-ZRwQ/JsYYz9Ph2nHXs7pYIveTx82+G1hdFKwYOMqlt3oqfJGFQ39cQg5LniPpuakAtQJPGh5fFAzcH+AY+jOyw==} + '@springboardjs/platforms-node@0.0.1-dev-midipoller-2': + resolution: {integrity: sha512-K/GpNsOxopb/tmCHHzuW1WN+XdfZMQ0sOX8pobh+KRSW/mQpy/GG2YEvLUQRDieKUf7O4oQhTGDT6KvElsJVig==} peerDependencies: isomorphic-ws: ^4.0.1 - springboard: 0.0.1-dev-midipoller-1 + springboard: 0.0.1-dev-midipoller-2 ws: ^8.18.0 '@tonejs/midi@2.0.28': @@ -553,25 +553,25 @@ packages: soundfont-player@0.12.0: resolution: {integrity: sha512-8BJIsAt7h1PK3thSZDgF6zecgGhYkK74JnZO8WRZi3h34qG6H/DYlnv7cpRvL7Q9C8N6qld4Qwj7nJsX1gYjEA==} - springboard-cli@0.0.1-dev-midipoller-1: - resolution: {integrity: sha512-M1jR01TLej1umDtIdv9egm5jGwDs2/dLwJD2C5jZDa26brcNPDKOs3MT/GoOx6m0qrk6MzXme0GacCczMA5WEw==} + springboard-cli@0.0.1-dev-midipoller-2: + resolution: {integrity: sha512-FDP4/RDbWoq3J0dZ2zlSq92Ler9w61nzSVQBaql3HptiHDt4XdV/T2rG4V3OuCI8DUcKpGFM04VQEujcgq/Kqg==} hasBin: true peerDependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-1 - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-1 - springboard: 0.0.1-dev-midipoller-1 - springboard-server: 0.0.1-dev-midipoller-1 + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-2 + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-2 + springboard: 0.0.1-dev-midipoller-2 + springboard-server: 0.0.1-dev-midipoller-2 - springboard-server@0.0.1-dev-midipoller-1: - resolution: {integrity: sha512-uSQhDFW8c+Dk1Di0ZTT9i2q64QsuguFKIFUAcpoWHMxhYxXedK0WXfVO2+S/2gz3nmIm6biIhgt3IzGLULfNiA==} + springboard-server@0.0.1-dev-midipoller-2: + resolution: {integrity: sha512-7vs9dCpWswczNdSUlLoZPZe0pZI0uHkXay4OfBrBzPcFq422NCPXS+Gluvrl+hikG0k4IMsO72DdS7MVe+wRYg==} peerDependencies: - '@springboardjs/data-storage': 0.0.1-dev-midipoller-1 - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-1 + '@springboardjs/data-storage': 0.0.1-dev-midipoller-2 + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-2 hono: ^4.6.7 - springboard: 0.0.1-dev-midipoller-1 + springboard: 0.0.1-dev-midipoller-2 - springboard@0.0.1-dev-midipoller-1: - resolution: {integrity: sha512-m/8PQUMIJzw6F1UE7wCMkSlL3x4W7zXwn5yCkCI9jlwvh8xQcPto6NnfzU4RcfmbkJtxNjvgW5zgBaMCJYgfiw==} + springboard@0.0.1-dev-midipoller-2: + resolution: {integrity: sha512-7BZmoui1kNMmKql0Gejecnm7zS7X+DYieCylzTt/ihAgpVwDw6mqguNEca1SslkC8w9RRGKSS9cHqev9Bujx4w==} peerDependencies: immer: ^10.1.1 json-rpc-2.0: ^1.7.0 @@ -765,15 +765,15 @@ snapshots: - bufferutil - utf-8-validate - '@jamtools/core@0.0.1-dev-midipoller-1(@springboardjs/platforms-browser@0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@jamtools/core@0.0.1-dev-midipoller-2(@springboardjs/platforms-browser@0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@tonejs/midi': 2.0.28 easymidi: 3.1.0 immer: 10.1.1 midi-file: 1.2.4 soundfont-player: 0.12.0 - springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) webmidi: 3.1.12 '@julusian/midi@3.6.1': @@ -783,25 +783,25 @@ snapshots: '@remix-run/router@1.23.0': {} - '@springboardjs/data-storage@0.0.1-dev-midipoller-1(kysely@0.28.1)': + '@springboardjs/data-storage@0.0.1-dev-midipoller-2(kysely@0.28.1)': dependencies: better-sqlite3: 11.9.1 kysely: 0.28.1 zod: 3.24.3 - '@springboardjs/platforms-browser@0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@springboardjs/platforms-browser@0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: json-rpc-2.0: 1.7.0 react-router-dom: 6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) reconnecting-websocket: 4.4.0 - springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - '@springboardjs/platforms-node@0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': + '@springboardjs/platforms-node@0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': dependencies: isomorphic-ws: 4.0.1(ws@8.18.1) json-rpc-2.0: 1.7.0 reconnecting-websocket: 4.4.0 - springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) ws: 8.18.1 '@tonejs/midi@2.0.28': @@ -1107,32 +1107,32 @@ snapshots: note-parser: 2.0.1 sample-player: 0.5.5 - springboard-cli@0.0.1-dev-midipoller-1(bfcad46c28e361a461b4556f25d6c4d5): + springboard-cli@0.0.1-dev-midipoller-2(eea953fa3fbba9b1873e34c60da1549e): dependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-1(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) commander: 12.1.0 concurrently: 9.1.2 esbuild: 0.25.9 - springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - springboard-server: 0.0.1-dev-midipoller-1(@springboardjs/data-storage@0.0.1-dev-midipoller-1(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard-server: 0.0.1-dev-midipoller-2(@springboardjs/data-storage@0.0.1-dev-midipoller-2(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) tslib: 2.8.1 typescript: 5.8.3 - springboard-server@0.0.1-dev-midipoller-1(@springboardjs/data-storage@0.0.1-dev-midipoller-1(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): + springboard-server@0.0.1-dev-midipoller-2(@springboardjs/data-storage@0.0.1-dev-midipoller-2(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): dependencies: '@hono/node-server': 1.14.1(hono@4.7.6) '@hono/node-ws': 1.1.1(@hono/node-server@1.14.1(hono@4.7.6))(hono@4.7.6) - '@springboardjs/data-storage': 0.0.1-dev-midipoller-1(kysely@0.28.1) - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-1(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + '@springboardjs/data-storage': 0.0.1-dev-midipoller-2(kysely@0.28.1) + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: 4.7.6 json-rpc-2.0: 1.7.0 - springboard: 0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) transitivePeerDependencies: - bufferutil - utf-8-validate - springboard@0.0.1-dev-midipoller-1(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): + springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): dependencies: dexie: 4.0.11 immer: 10.1.1 From 2a28d133f0d434d49a3a57c0e6c93bee3d997f9d Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Sat, 20 Sep 2025 21:35:49 -0400 Subject: [PATCH 09/14] update jamtools --- package.json | 14 +++--- pnpm-lock.yaml | 114 ++++++++++++++++++++++++------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index 27c5c9d..3085dd4 100644 --- a/package.json +++ b/package.json @@ -12,16 +12,16 @@ "license": "ISC", "description": "", "dependencies": { - "@jamtools/core": "0.0.1-dev-midipoller-2", - "@springboardjs/data-storage": "0.0.1-dev-midipoller-2", - "@springboardjs/platforms-browser": "0.0.1-dev-midipoller-2", - "@springboardjs/platforms-node": "0.0.1-dev-midipoller-2", + "@jamtools/core": "0.0.1-dev-midipoller-3", + "@springboardjs/data-storage": "0.0.1-dev-midipoller-3", + "@springboardjs/platforms-browser": "0.0.1-dev-midipoller-3", + "@springboardjs/platforms-node": "0.0.1-dev-midipoller-3", "hono": "4.7.6", "mic": "^2.1.2", "react": "^19.1.0", - "springboard": "0.0.1-dev-midipoller-2", - "springboard-cli": "0.0.1-dev-midipoller-2", - "springboard-server": "0.0.1-dev-midipoller-2" + "springboard": "0.0.1-dev-midipoller-3", + "springboard-cli": "0.0.1-dev-midipoller-3", + "springboard-server": "0.0.1-dev-midipoller-3" }, "devDependencies": { "@types/node": "^24.0.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62909a8..b13f2dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: dependencies: '@jamtools/core': - specifier: 0.0.1-dev-midipoller-2 - version: 0.0.1-dev-midipoller-2(@springboardjs/platforms-browser@0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-3 + version: 0.0.1-dev-midipoller-3(@springboardjs/platforms-browser@0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/data-storage': - specifier: 0.0.1-dev-midipoller-2 - version: 0.0.1-dev-midipoller-2(kysely@0.28.1) + specifier: 0.0.1-dev-midipoller-3 + version: 0.0.1-dev-midipoller-3(kysely@0.28.1) '@springboardjs/platforms-browser': - specifier: 0.0.1-dev-midipoller-2 - version: 0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-3 + version: 0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/platforms-node': - specifier: 0.0.1-dev-midipoller-2 - version: 0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + specifier: 0.0.1-dev-midipoller-3 + version: 0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: specifier: 4.7.6 version: 4.7.6 @@ -30,14 +30,14 @@ importers: specifier: ^19.1.0 version: 19.1.0 springboard: - specifier: 0.0.1-dev-midipoller-2 - version: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + specifier: 0.0.1-dev-midipoller-3 + version: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) springboard-cli: - specifier: 0.0.1-dev-midipoller-2 - version: 0.0.1-dev-midipoller-2(eea953fa3fbba9b1873e34c60da1549e) + specifier: 0.0.1-dev-midipoller-3 + version: 0.0.1-dev-midipoller-3(64188156b58cb552eb5d4b56612341ae) springboard-server: - specifier: 0.0.1-dev-midipoller-2 - version: 0.0.1-dev-midipoller-2(@springboardjs/data-storage@0.0.1-dev-midipoller-2(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-3 + version: 0.0.1-dev-midipoller-3(@springboardjs/data-storage@0.0.1-dev-midipoller-3(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) devDependencies: '@types/node': specifier: ^24.0.14 @@ -221,12 +221,12 @@ packages: '@hono/node-server': ^1.11.1 hono: ^4.6.0 - '@jamtools/core@0.0.1-dev-midipoller-2': - resolution: {integrity: sha512-VnIhN4epRoy4FC8W3ycaMvdRJUN9JW+0P9EOf9dtJZeK+k12EeIJAhE+tFfTdZ84eSS1FbJgMqULmmH9/vxPLw==} + '@jamtools/core@0.0.1-dev-midipoller-3': + resolution: {integrity: sha512-sLTBCd8ERBSpbxE6WbTaHtFTFVQfeo6cMxgF8yBhpDR8muiSMJOJLUR1ly0sfSrsTVXBVCzeAjtjTluas84hBQ==} peerDependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-2 + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-3 '@tonejs/midi': ^2.0.0 - springboard: 0.0.1-dev-midipoller-2 + springboard: 0.0.1-dev-midipoller-3 svelte: '>= 5' peerDependenciesMeta: svelte: @@ -240,22 +240,22 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} - '@springboardjs/data-storage@0.0.1-dev-midipoller-2': - resolution: {integrity: sha512-OV9igDtRxYSQaJ6B2ozdI5SQPYrrQ4uFvrx/jwTI8Ad8OnlvQIRDzWx8lZNTiR084VevPqDrK0tl8hO8tYqKWA==} + '@springboardjs/data-storage@0.0.1-dev-midipoller-3': + resolution: {integrity: sha512-PHciZ8f/0UWflas2fLb3zACfwXSiQxnPFDx29495XlYgpXv4qHjeRjqjhIEN8K8qNfKvilwuu09y0DHrk/tH4g==} peerDependencies: kysely: '>= 0.24.0' - '@springboardjs/platforms-browser@0.0.1-dev-midipoller-2': - resolution: {integrity: sha512-9XA9Smrb6bt2tLiw18hdHTBsafX1Hf1v0m17tI8UnHwh6emHooT4wjcPac95uROd0S7zRo/pO8Q8AeQFZvCvzQ==} + '@springboardjs/platforms-browser@0.0.1-dev-midipoller-3': + resolution: {integrity: sha512-mNNy0aNcVhrD3Z2SB/fXyRxYGqC0O9jy6NWRnJ2oITRythsSvNceegDsnq/9Vk4cCQcQFXXwN1bSVdkjR7f6eg==} peerDependencies: react-router-dom: ^6 - springboard: 0.0.1-dev-midipoller-2 + springboard: 0.0.1-dev-midipoller-3 - '@springboardjs/platforms-node@0.0.1-dev-midipoller-2': - resolution: {integrity: sha512-K/GpNsOxopb/tmCHHzuW1WN+XdfZMQ0sOX8pobh+KRSW/mQpy/GG2YEvLUQRDieKUf7O4oQhTGDT6KvElsJVig==} + '@springboardjs/platforms-node@0.0.1-dev-midipoller-3': + resolution: {integrity: sha512-XBGQFTy6M8yZqZSs2Mh7GdamU1D8RCfCckJW+gZaTbGfpgeH3jd6c/U7vuyQb4mXydeiPFC6fOHtvekepT7uYA==} peerDependencies: isomorphic-ws: ^4.0.1 - springboard: 0.0.1-dev-midipoller-2 + springboard: 0.0.1-dev-midipoller-3 ws: ^8.18.0 '@tonejs/midi@2.0.28': @@ -553,25 +553,25 @@ packages: soundfont-player@0.12.0: resolution: {integrity: sha512-8BJIsAt7h1PK3thSZDgF6zecgGhYkK74JnZO8WRZi3h34qG6H/DYlnv7cpRvL7Q9C8N6qld4Qwj7nJsX1gYjEA==} - springboard-cli@0.0.1-dev-midipoller-2: - resolution: {integrity: sha512-FDP4/RDbWoq3J0dZ2zlSq92Ler9w61nzSVQBaql3HptiHDt4XdV/T2rG4V3OuCI8DUcKpGFM04VQEujcgq/Kqg==} + springboard-cli@0.0.1-dev-midipoller-3: + resolution: {integrity: sha512-uJTcPNDkFy4/j1CHNPpGwnnWIovcxA6uv/wXnxgBIuJcz8CmaxhvZaA/2GDiRUeEJc19RnPpxsFmYC5Zm6OLxA==} hasBin: true peerDependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-2 - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-2 - springboard: 0.0.1-dev-midipoller-2 - springboard-server: 0.0.1-dev-midipoller-2 + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-3 + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-3 + springboard: 0.0.1-dev-midipoller-3 + springboard-server: 0.0.1-dev-midipoller-3 - springboard-server@0.0.1-dev-midipoller-2: - resolution: {integrity: sha512-7vs9dCpWswczNdSUlLoZPZe0pZI0uHkXay4OfBrBzPcFq422NCPXS+Gluvrl+hikG0k4IMsO72DdS7MVe+wRYg==} + springboard-server@0.0.1-dev-midipoller-3: + resolution: {integrity: sha512-pBIW5XNESJQVsqGgB2ibtnYeSjTI614+aw6Rmjj7ULZdsCXoa9zdxep+QzKnoRQ49uFvgcS6GKc8KutecZ0HXA==} peerDependencies: - '@springboardjs/data-storage': 0.0.1-dev-midipoller-2 - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-2 + '@springboardjs/data-storage': 0.0.1-dev-midipoller-3 + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-3 hono: ^4.6.7 - springboard: 0.0.1-dev-midipoller-2 + springboard: 0.0.1-dev-midipoller-3 - springboard@0.0.1-dev-midipoller-2: - resolution: {integrity: sha512-7BZmoui1kNMmKql0Gejecnm7zS7X+DYieCylzTt/ihAgpVwDw6mqguNEca1SslkC8w9RRGKSS9cHqev9Bujx4w==} + springboard@0.0.1-dev-midipoller-3: + resolution: {integrity: sha512-+ayLHoLC1Rc8ZQOVn2PsprCEb32gnwqMmu2n+Kfhkp84xIlCK/j2YgWU4X/sEOHMo7RstITvnxC34up44Jm+hA==} peerDependencies: immer: ^10.1.1 json-rpc-2.0: ^1.7.0 @@ -765,15 +765,15 @@ snapshots: - bufferutil - utf-8-validate - '@jamtools/core@0.0.1-dev-midipoller-2(@springboardjs/platforms-browser@0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@jamtools/core@0.0.1-dev-midipoller-3(@springboardjs/platforms-browser@0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@tonejs/midi': 2.0.28 easymidi: 3.1.0 immer: 10.1.1 midi-file: 1.2.4 soundfont-player: 0.12.0 - springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) webmidi: 3.1.12 '@julusian/midi@3.6.1': @@ -783,25 +783,25 @@ snapshots: '@remix-run/router@1.23.0': {} - '@springboardjs/data-storage@0.0.1-dev-midipoller-2(kysely@0.28.1)': + '@springboardjs/data-storage@0.0.1-dev-midipoller-3(kysely@0.28.1)': dependencies: better-sqlite3: 11.9.1 kysely: 0.28.1 zod: 3.24.3 - '@springboardjs/platforms-browser@0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@springboardjs/platforms-browser@0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: json-rpc-2.0: 1.7.0 react-router-dom: 6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) reconnecting-websocket: 4.4.0 - springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - '@springboardjs/platforms-node@0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': + '@springboardjs/platforms-node@0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': dependencies: isomorphic-ws: 4.0.1(ws@8.18.1) json-rpc-2.0: 1.7.0 reconnecting-websocket: 4.4.0 - springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) ws: 8.18.1 '@tonejs/midi@2.0.28': @@ -1107,32 +1107,32 @@ snapshots: note-parser: 2.0.1 sample-player: 0.5.5 - springboard-cli@0.0.1-dev-midipoller-2(eea953fa3fbba9b1873e34c60da1549e): + springboard-cli@0.0.1-dev-midipoller-3(64188156b58cb552eb5d4b56612341ae): dependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-2(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) commander: 12.1.0 concurrently: 9.1.2 esbuild: 0.25.9 - springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - springboard-server: 0.0.1-dev-midipoller-2(@springboardjs/data-storage@0.0.1-dev-midipoller-2(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard-server: 0.0.1-dev-midipoller-3(@springboardjs/data-storage@0.0.1-dev-midipoller-3(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) tslib: 2.8.1 typescript: 5.8.3 - springboard-server@0.0.1-dev-midipoller-2(@springboardjs/data-storage@0.0.1-dev-midipoller-2(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): + springboard-server@0.0.1-dev-midipoller-3(@springboardjs/data-storage@0.0.1-dev-midipoller-3(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): dependencies: '@hono/node-server': 1.14.1(hono@4.7.6) '@hono/node-ws': 1.1.1(@hono/node-server@1.14.1(hono@4.7.6))(hono@4.7.6) - '@springboardjs/data-storage': 0.0.1-dev-midipoller-2(kysely@0.28.1) - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-2(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + '@springboardjs/data-storage': 0.0.1-dev-midipoller-3(kysely@0.28.1) + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: 4.7.6 json-rpc-2.0: 1.7.0 - springboard: 0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) transitivePeerDependencies: - bufferutil - utf-8-validate - springboard@0.0.1-dev-midipoller-2(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): + springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): dependencies: dexie: 4.0.11 immer: 10.1.1 From 35a6d2f9342c9c90275c486cb83dcbb72ef5049f Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Mon, 22 Sep 2025 00:19:31 -0400 Subject: [PATCH 10/14] update jamtools --- package.json | 14 +++--- pnpm-lock.yaml | 114 ++++++++++++++++++++++++------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index 3085dd4..65daf0a 100644 --- a/package.json +++ b/package.json @@ -12,16 +12,16 @@ "license": "ISC", "description": "", "dependencies": { - "@jamtools/core": "0.0.1-dev-midipoller-3", - "@springboardjs/data-storage": "0.0.1-dev-midipoller-3", - "@springboardjs/platforms-browser": "0.0.1-dev-midipoller-3", - "@springboardjs/platforms-node": "0.0.1-dev-midipoller-3", + "@jamtools/core": "0.0.1-dev-midipoller-4", + "@springboardjs/data-storage": "0.0.1-dev-midipoller-4", + "@springboardjs/platforms-browser": "0.0.1-dev-midipoller-4", + "@springboardjs/platforms-node": "0.0.1-dev-midipoller-4", "hono": "4.7.6", "mic": "^2.1.2", "react": "^19.1.0", - "springboard": "0.0.1-dev-midipoller-3", - "springboard-cli": "0.0.1-dev-midipoller-3", - "springboard-server": "0.0.1-dev-midipoller-3" + "springboard": "0.0.1-dev-midipoller-4", + "springboard-cli": "0.0.1-dev-midipoller-4", + "springboard-server": "0.0.1-dev-midipoller-4" }, "devDependencies": { "@types/node": "^24.0.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b13f2dd..9671e0b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: dependencies: '@jamtools/core': - specifier: 0.0.1-dev-midipoller-3 - version: 0.0.1-dev-midipoller-3(@springboardjs/platforms-browser@0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-4 + version: 0.0.1-dev-midipoller-4(@springboardjs/platforms-browser@0.0.1-dev-midipoller-4(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/data-storage': - specifier: 0.0.1-dev-midipoller-3 - version: 0.0.1-dev-midipoller-3(kysely@0.28.1) + specifier: 0.0.1-dev-midipoller-4 + version: 0.0.1-dev-midipoller-4(kysely@0.28.1) '@springboardjs/platforms-browser': - specifier: 0.0.1-dev-midipoller-3 - version: 0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-4 + version: 0.0.1-dev-midipoller-4(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@springboardjs/platforms-node': - specifier: 0.0.1-dev-midipoller-3 - version: 0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + specifier: 0.0.1-dev-midipoller-4 + version: 0.0.1-dev-midipoller-4(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: specifier: 4.7.6 version: 4.7.6 @@ -30,14 +30,14 @@ importers: specifier: ^19.1.0 version: 19.1.0 springboard: - specifier: 0.0.1-dev-midipoller-3 - version: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + specifier: 0.0.1-dev-midipoller-4 + version: 0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) springboard-cli: - specifier: 0.0.1-dev-midipoller-3 - version: 0.0.1-dev-midipoller-3(64188156b58cb552eb5d4b56612341ae) + specifier: 0.0.1-dev-midipoller-4 + version: 0.0.1-dev-midipoller-4(3421f7862c3e9569aa4fc8ac57db8387) springboard-server: - specifier: 0.0.1-dev-midipoller-3 - version: 0.0.1-dev-midipoller-3(@springboardjs/data-storage@0.0.1-dev-midipoller-3(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + specifier: 0.0.1-dev-midipoller-4 + version: 0.0.1-dev-midipoller-4(@springboardjs/data-storage@0.0.1-dev-midipoller-4(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-4(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) devDependencies: '@types/node': specifier: ^24.0.14 @@ -221,12 +221,12 @@ packages: '@hono/node-server': ^1.11.1 hono: ^4.6.0 - '@jamtools/core@0.0.1-dev-midipoller-3': - resolution: {integrity: sha512-sLTBCd8ERBSpbxE6WbTaHtFTFVQfeo6cMxgF8yBhpDR8muiSMJOJLUR1ly0sfSrsTVXBVCzeAjtjTluas84hBQ==} + '@jamtools/core@0.0.1-dev-midipoller-4': + resolution: {integrity: sha512-nuf56NT+r9eroP2H8htxMaREVMEYFI4P3G1S1UN3+T7ftTp8M6a+bXVeM3UVGMovHEecALrq57SzD/DeJIDl3g==} peerDependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-3 + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-4 '@tonejs/midi': ^2.0.0 - springboard: 0.0.1-dev-midipoller-3 + springboard: 0.0.1-dev-midipoller-4 svelte: '>= 5' peerDependenciesMeta: svelte: @@ -240,22 +240,22 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} - '@springboardjs/data-storage@0.0.1-dev-midipoller-3': - resolution: {integrity: sha512-PHciZ8f/0UWflas2fLb3zACfwXSiQxnPFDx29495XlYgpXv4qHjeRjqjhIEN8K8qNfKvilwuu09y0DHrk/tH4g==} + '@springboardjs/data-storage@0.0.1-dev-midipoller-4': + resolution: {integrity: sha512-jTzEukK/e/3+5dtlOrYhJquOlFruzV3rTmeuMmJ7SvE853B3TG7NVBGAHxSonJ8Z6Ej9K5Rov9E/vhLEZyUoCw==} peerDependencies: kysely: '>= 0.24.0' - '@springboardjs/platforms-browser@0.0.1-dev-midipoller-3': - resolution: {integrity: sha512-mNNy0aNcVhrD3Z2SB/fXyRxYGqC0O9jy6NWRnJ2oITRythsSvNceegDsnq/9Vk4cCQcQFXXwN1bSVdkjR7f6eg==} + '@springboardjs/platforms-browser@0.0.1-dev-midipoller-4': + resolution: {integrity: sha512-NKiZwGVeslTEMc5k8v5MpDC4L4/2kDmI78uVv8AKwCv+J1Toc8Lfn0iW7EFwHq6xbdyuuV5HzOMbXVFlkO4gmg==} peerDependencies: react-router-dom: ^6 - springboard: 0.0.1-dev-midipoller-3 + springboard: 0.0.1-dev-midipoller-4 - '@springboardjs/platforms-node@0.0.1-dev-midipoller-3': - resolution: {integrity: sha512-XBGQFTy6M8yZqZSs2Mh7GdamU1D8RCfCckJW+gZaTbGfpgeH3jd6c/U7vuyQb4mXydeiPFC6fOHtvekepT7uYA==} + '@springboardjs/platforms-node@0.0.1-dev-midipoller-4': + resolution: {integrity: sha512-XxKfeisKoLwFLMkM8b4nUohvDKbyIMbq87MpQ2XXLxCuVWCDBOKRook+gWB5PI2DIYdkfAi0xrtN9a4acyvETA==} peerDependencies: isomorphic-ws: ^4.0.1 - springboard: 0.0.1-dev-midipoller-3 + springboard: 0.0.1-dev-midipoller-4 ws: ^8.18.0 '@tonejs/midi@2.0.28': @@ -553,25 +553,25 @@ packages: soundfont-player@0.12.0: resolution: {integrity: sha512-8BJIsAt7h1PK3thSZDgF6zecgGhYkK74JnZO8WRZi3h34qG6H/DYlnv7cpRvL7Q9C8N6qld4Qwj7nJsX1gYjEA==} - springboard-cli@0.0.1-dev-midipoller-3: - resolution: {integrity: sha512-uJTcPNDkFy4/j1CHNPpGwnnWIovcxA6uv/wXnxgBIuJcz8CmaxhvZaA/2GDiRUeEJc19RnPpxsFmYC5Zm6OLxA==} + springboard-cli@0.0.1-dev-midipoller-4: + resolution: {integrity: sha512-WW0WsYk1SJY8Sg3SHeHLuXH5AgLWUvmd3z7awZUQIAibEaNiBVDxvQxHQGPuAcbf77SOSYZSUldZO+lo4CoxhQ==} hasBin: true peerDependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-3 - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-3 - springboard: 0.0.1-dev-midipoller-3 - springboard-server: 0.0.1-dev-midipoller-3 + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-4 + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-4 + springboard: 0.0.1-dev-midipoller-4 + springboard-server: 0.0.1-dev-midipoller-4 - springboard-server@0.0.1-dev-midipoller-3: - resolution: {integrity: sha512-pBIW5XNESJQVsqGgB2ibtnYeSjTI614+aw6Rmjj7ULZdsCXoa9zdxep+QzKnoRQ49uFvgcS6GKc8KutecZ0HXA==} + springboard-server@0.0.1-dev-midipoller-4: + resolution: {integrity: sha512-o/NauJm9dKw1cTPBm7+4c4lttrNgAWUMohTxGaHFMgKHDAp3wBadAfoT88Y9k5U4lALw52UNXJORO9JiXu+FQA==} peerDependencies: - '@springboardjs/data-storage': 0.0.1-dev-midipoller-3 - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-3 + '@springboardjs/data-storage': 0.0.1-dev-midipoller-4 + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-4 hono: ^4.6.7 - springboard: 0.0.1-dev-midipoller-3 + springboard: 0.0.1-dev-midipoller-4 - springboard@0.0.1-dev-midipoller-3: - resolution: {integrity: sha512-+ayLHoLC1Rc8ZQOVn2PsprCEb32gnwqMmu2n+Kfhkp84xIlCK/j2YgWU4X/sEOHMo7RstITvnxC34up44Jm+hA==} + springboard@0.0.1-dev-midipoller-4: + resolution: {integrity: sha512-Qqbzu1pBj/aPDo1R91h28fIpttl1xC99eZ7q9uOj1Pk4jqxzUhrc//CpcgQ+skvRplQdhz7d5F1PWxxWlsEYmw==} peerDependencies: immer: ^10.1.1 json-rpc-2.0: ^1.7.0 @@ -765,15 +765,15 @@ snapshots: - bufferutil - utf-8-validate - '@jamtools/core@0.0.1-dev-midipoller-3(@springboardjs/platforms-browser@0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@jamtools/core@0.0.1-dev-midipoller-4(@springboardjs/platforms-browser@0.0.1-dev-midipoller-4(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)))(@tonejs/midi@2.0.28)(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-4(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) '@tonejs/midi': 2.0.28 easymidi: 3.1.0 immer: 10.1.1 midi-file: 1.2.4 soundfont-player: 0.12.0 - springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) webmidi: 3.1.12 '@julusian/midi@3.6.1': @@ -783,25 +783,25 @@ snapshots: '@remix-run/router@1.23.0': {} - '@springboardjs/data-storage@0.0.1-dev-midipoller-3(kysely@0.28.1)': + '@springboardjs/data-storage@0.0.1-dev-midipoller-4(kysely@0.28.1)': dependencies: better-sqlite3: 11.9.1 kysely: 0.28.1 zod: 3.24.3 - '@springboardjs/platforms-browser@0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': + '@springboardjs/platforms-browser@0.0.1-dev-midipoller-4(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))': dependencies: json-rpc-2.0: 1.7.0 react-router-dom: 6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) reconnecting-websocket: 4.4.0 - springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - '@springboardjs/platforms-node@0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': + '@springboardjs/platforms-node@0.0.1-dev-midipoller-4(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1)': dependencies: isomorphic-ws: 4.0.1(ws@8.18.1) json-rpc-2.0: 1.7.0 reconnecting-websocket: 4.4.0 - springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) ws: 8.18.1 '@tonejs/midi@2.0.28': @@ -1107,32 +1107,32 @@ snapshots: note-parser: 2.0.1 sample-player: 0.5.5 - springboard-cli@0.0.1-dev-midipoller-3(64188156b58cb552eb5d4b56612341ae): + springboard-cli@0.0.1-dev-midipoller-4(3421f7862c3e9569aa4fc8ac57db8387): dependencies: - '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-3(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + '@springboardjs/platforms-browser': 0.0.1-dev-midipoller-4(react-router-dom@6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-4(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) commander: 12.1.0 concurrently: 9.1.2 esbuild: 0.25.9 - springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) - springboard-server: 0.0.1-dev-midipoller-3(@springboardjs/data-storage@0.0.1-dev-midipoller-3(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) + springboard: 0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard-server: 0.0.1-dev-midipoller-4(@springboardjs/data-storage@0.0.1-dev-midipoller-4(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-4(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)) tslib: 2.8.1 typescript: 5.8.3 - springboard-server@0.0.1-dev-midipoller-3(@springboardjs/data-storage@0.0.1-dev-midipoller-3(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): + springboard-server@0.0.1-dev-midipoller-4(@springboardjs/data-storage@0.0.1-dev-midipoller-4(kysely@0.28.1))(@springboardjs/platforms-node@0.0.1-dev-midipoller-4(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1))(hono@4.7.6)(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2)): dependencies: '@hono/node-server': 1.14.1(hono@4.7.6) '@hono/node-ws': 1.1.1(@hono/node-server@1.14.1(hono@4.7.6))(hono@4.7.6) - '@springboardjs/data-storage': 0.0.1-dev-midipoller-3(kysely@0.28.1) - '@springboardjs/platforms-node': 0.0.1-dev-midipoller-3(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) + '@springboardjs/data-storage': 0.0.1-dev-midipoller-4(kysely@0.28.1) + '@springboardjs/platforms-node': 0.0.1-dev-midipoller-4(isomorphic-ws@4.0.1(ws@8.18.1))(springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2))(ws@8.18.1) hono: 4.7.6 json-rpc-2.0: 1.7.0 - springboard: 0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) + springboard: 0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2) transitivePeerDependencies: - bufferutil - utf-8-validate - springboard@0.0.1-dev-midipoller-3(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): + springboard@0.0.1-dev-midipoller-4(immer@10.1.1)(json-rpc-2.0@1.7.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rxjs@7.8.2): dependencies: dexie: 4.0.11 immer: 10.1.1 From 6585edbd18ccfba7f51ce0e7d951d4a500513d4c Mon Sep 17 00:00:00 2001 From: Michael Kochell <6913320+mickmister@users.noreply.github.com> Date: Tue, 28 Oct 2025 22:49:57 -0400 Subject: [PATCH 11/14] add uploader url feature --- src/components/ConfigModal.tsx | 26 +++++- src/jamscribe_module.tsx | 84 +++++++++++++------ src/services/recorder.ts | 1 + src/services/upload_service.ts | 149 +++++++++++++++++++++++++++++++++ 4 files changed, 235 insertions(+), 25 deletions(-) create mode 100644 src/services/upload_service.ts diff --git a/src/components/ConfigModal.tsx b/src/components/ConfigModal.tsx index aa4a8e7..d0ac79d 100644 --- a/src/components/ConfigModal.tsx +++ b/src/components/ConfigModal.tsx @@ -8,6 +8,9 @@ type ConfigModalProps = { draftInactivityTimeLimit: number; onDraftInactivityTimeLimitChange: (newLimit: number) => void; submitInactivityTimeLimitChange: () => void; + draftUploaderUrl: string; + onDraftUploaderUrlChange: (newUrl: string) => void; + submitUploaderUrlChange: () => void; }; export function asModal

    void }>( @@ -44,7 +47,10 @@ function ConfigModalBase({ recordingConfig, draftInactivityTimeLimit, onDraftInactivityTimeLimitChange, - submitInactivityTimeLimitChange + submitInactivityTimeLimitChange, + draftUploaderUrl, + onDraftUploaderUrlChange, + submitUploaderUrlChange }: ConfigModalProps) { return (

    @@ -69,6 +75,23 @@ function ConfigModalBase({ Recording will automatically stop after this many seconds of inactivity

    + +
    + + onDraftUploaderUrlChange(e.target.value)} + placeholder="https://example.com/upload" + /> +

    + URL endpoint for uploading recorded files (leave empty to disable uploads) +

    +