@scenetest/vite-plugin 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -5
- package/dist/index.js.map +1 -1
- package/dist/panels/observer/audio.d.ts +81 -0
- package/dist/panels/observer/audio.d.ts.map +1 -0
- package/dist/panels/observer/audio.js +296 -0
- package/dist/panels/observer/audio.js.map +1 -0
- package/dist/panels/observer/auto.d.ts +10 -0
- package/dist/panels/observer/auto.d.ts.map +1 -0
- package/dist/panels/observer/auto.js +11 -0
- package/dist/panels/observer/auto.js.map +1 -0
- package/dist/panels/observer/fs-viewer.d.ts +20 -0
- package/dist/panels/observer/fs-viewer.d.ts.map +1 -0
- package/dist/panels/observer/fs-viewer.js +536 -0
- package/dist/panels/observer/fs-viewer.js.map +1 -0
- package/dist/panels/observer/fullscreen.d.ts +24 -0
- package/dist/panels/observer/fullscreen.d.ts.map +1 -0
- package/dist/panels/observer/fullscreen.js +701 -0
- package/dist/panels/observer/fullscreen.js.map +1 -0
- package/dist/panels/observer/history.d.ts +41 -0
- package/dist/panels/observer/history.d.ts.map +1 -0
- package/dist/panels/observer/history.js +307 -0
- package/dist/panels/observer/history.js.map +1 -0
- package/dist/panels/observer/index.d.ts +33 -0
- package/dist/panels/observer/index.d.ts.map +1 -0
- package/dist/panels/observer/index.js +128 -0
- package/dist/panels/observer/index.js.map +1 -0
- package/dist/panels/observer/panel.d.ts +12 -0
- package/dist/panels/observer/panel.d.ts.map +1 -0
- package/dist/panels/observer/panel.js +461 -0
- package/dist/panels/observer/panel.js.map +1 -0
- package/dist/panels/observer/render.d.ts +109 -0
- package/dist/panels/observer/render.d.ts.map +1 -0
- package/dist/panels/observer/render.js +760 -0
- package/dist/panels/observer/render.js.map +1 -0
- package/dist/panels/observer/state.d.ts +57 -0
- package/dist/panels/observer/state.d.ts.map +1 -0
- package/dist/panels/observer/state.js +187 -0
- package/dist/panels/observer/state.js.map +1 -0
- package/dist/panels/observer/styles.d.ts +6 -0
- package/dist/panels/observer/styles.d.ts.map +1 -0
- package/dist/panels/observer/styles.js +1706 -0
- package/dist/panels/observer/styles.js.map +1 -0
- package/dist/panels/observer/types.d.ts +102 -0
- package/dist/panels/observer/types.d.ts.map +1 -0
- package/dist/panels/observer/types.js +5 -0
- package/dist/panels/observer/types.js.map +1 -0
- package/dist/panels/observer/utils.d.ts +45 -0
- package/dist/panels/observer/utils.d.ts.map +1 -0
- package/dist/panels/observer/utils.js +101 -0
- package/dist/panels/observer/utils.js.map +1 -0
- package/dist/panels/recorder/auto.d.ts +10 -0
- package/dist/panels/recorder/auto.d.ts.map +1 -0
- package/dist/panels/recorder/auto.js +11 -0
- package/dist/panels/recorder/auto.js.map +1 -0
- package/dist/panels/recorder/capture.d.ts +18 -0
- package/dist/panels/recorder/capture.d.ts.map +1 -0
- package/dist/panels/recorder/capture.js +218 -0
- package/dist/panels/recorder/capture.js.map +1 -0
- package/dist/panels/recorder/index.d.ts +41 -0
- package/dist/panels/recorder/index.d.ts.map +1 -0
- package/dist/panels/recorder/index.js +208 -0
- package/dist/panels/recorder/index.js.map +1 -0
- package/dist/panels/recorder/panel.d.ts +55 -0
- package/dist/panels/recorder/panel.d.ts.map +1 -0
- package/dist/panels/recorder/panel.js +284 -0
- package/dist/panels/recorder/panel.js.map +1 -0
- package/dist/panels/recorder/reverse-selector.d.ts +31 -0
- package/dist/panels/recorder/reverse-selector.d.ts.map +1 -0
- package/dist/panels/recorder/reverse-selector.js +116 -0
- package/dist/panels/recorder/reverse-selector.js.map +1 -0
- package/dist/panels/recorder/styles.d.ts +5 -0
- package/dist/panels/recorder/styles.d.ts.map +1 -0
- package/dist/panels/recorder/styles.js +300 -0
- package/dist/panels/recorder/styles.js.map +1 -0
- package/dist/panels/recorder/types.d.ts +51 -0
- package/dist/panels/recorder/types.d.ts.map +1 -0
- package/dist/panels/recorder/types.js +15 -0
- package/dist/panels/recorder/types.js.map +1 -0
- package/dist/strip.d.ts.map +1 -1
- package/dist/strip.js +6 -3
- package/dist/strip.js.map +1 -1
- package/dist/transform.d.ts.map +1 -1
- package/dist/transform.js +5 -2
- package/dist/transform.js.map +1 -1
- package/package.json +8 -6
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAA;AAqIjD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAE3B;;;;;;OAMG;IACH,GAAG,CAAC,EACA,OAAO,GACP;QACE;;;WAGG;QACH,OAAO,CAAC,EAAE,OAAO,CAAA;QAEjB;;;;WAIG;QACH,UAAU,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;KACpC,CAAA;CACN;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAUD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,sBAA2B,GAAG,MAAM,CAmOtE;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEhD,eAAe,SAAS,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -11,9 +11,12 @@ import { createScenetestMiddleware } from './middleware.js';
|
|
|
11
11
|
// Virtual module IDs for injected dev panel scripts
|
|
12
12
|
const OBSERVER_VIRTUAL_ID = '/@scenetest/observer.js';
|
|
13
13
|
const RECORDER_VIRTUAL_ID = '/@scenetest/recorder.js';
|
|
14
|
-
// The
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
// The panel entry points these resolve to. The observer is the viewing lens
|
|
15
|
+
// for @scenetest/checks' assertions and lives there (@scenetest/checks/panel,
|
|
16
|
+
// usable with no Vite at all); the recorder is dev tooling and ships inside
|
|
17
|
+
// this package as a self-referencing subpath export.
|
|
18
|
+
const OBSERVER_MODULE = '@scenetest/checks/panel';
|
|
19
|
+
const RECORDER_MODULE = '@scenetest/vite-plugin/panels/recorder';
|
|
17
20
|
function resolveFromPlugin(specifier) {
|
|
18
21
|
try {
|
|
19
22
|
return fileURLToPath(import.meta.resolve(specifier));
|
|
@@ -190,8 +193,11 @@ export function scenetest(options = {}) {
|
|
|
190
193
|
if (id === OBSERVER_VIRTUAL_ID || id === RECORDER_VIRTUAL_ID) {
|
|
191
194
|
return id;
|
|
192
195
|
}
|
|
193
|
-
// Resolve panel
|
|
194
|
-
//
|
|
196
|
+
// Resolve panel entries for the consumer. The observer resolves through
|
|
197
|
+
// this package's @scenetest/checks dependency and the recorder through a
|
|
198
|
+
// self-referencing subpath, so both work regardless of the consumer's
|
|
199
|
+
// hoisting setup (pnpm strict hoisting hides transitive deps from the
|
|
200
|
+
// project root)
|
|
195
201
|
if (id === OBSERVER_MODULE || id === RECORDER_MODULE) {
|
|
196
202
|
return resolveFromPlugin(id);
|
|
197
203
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,MAAM,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAG3D,oDAAoD;AACpD,MAAM,mBAAmB,GAAG,yBAAyB,CAAA;AACrD,MAAM,mBAAmB,GAAG,yBAAyB,CAAA;AAErD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musical Assertion Audio System
|
|
3
|
+
*
|
|
4
|
+
* Each assertion becomes a note on a musical scale.
|
|
5
|
+
* Passing assertions play their assigned note cleanly.
|
|
6
|
+
* Failing assertions play a detuned version (dissonance).
|
|
7
|
+
* Assertions that fire together within the grouping window form chords.
|
|
8
|
+
*/
|
|
9
|
+
import type { AssertionResult } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Initialize the audio context (must be called after user interaction)
|
|
12
|
+
*/
|
|
13
|
+
export declare function initAudio(): AudioContext | null;
|
|
14
|
+
/**
|
|
15
|
+
* Resume audio context if suspended (browsers require user interaction)
|
|
16
|
+
*/
|
|
17
|
+
export declare function resumeAudio(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Play assertion sound
|
|
20
|
+
* Called for each assertion - the grouping logic handles chord formation
|
|
21
|
+
*/
|
|
22
|
+
export declare function playAssertionSound(result: AssertionResult): void;
|
|
23
|
+
/**
|
|
24
|
+
* Play a chord for a group of assertions
|
|
25
|
+
*/
|
|
26
|
+
export declare function playGroupChord(results: AssertionResult[]): void;
|
|
27
|
+
/**
|
|
28
|
+
* Play the symphony - replay all recorded assertion chords
|
|
29
|
+
*/
|
|
30
|
+
export declare function playSymphony(speedMultiplier?: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* Stop symphony playback
|
|
33
|
+
*/
|
|
34
|
+
export declare function stopSymphony(): void;
|
|
35
|
+
/**
|
|
36
|
+
* Clear symphony recording
|
|
37
|
+
*/
|
|
38
|
+
export declare function clearSymphony(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Get symphony info
|
|
41
|
+
*/
|
|
42
|
+
export declare function getSymphonyInfo(): {
|
|
43
|
+
eventCount: number;
|
|
44
|
+
duration: number;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Toggle mute
|
|
48
|
+
*/
|
|
49
|
+
export declare function toggleMute(): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Set mute state
|
|
52
|
+
*/
|
|
53
|
+
export declare function setMuted(value: boolean): void;
|
|
54
|
+
/**
|
|
55
|
+
* Is currently muted?
|
|
56
|
+
*/
|
|
57
|
+
export declare function isMuted(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Set volume (0-1)
|
|
60
|
+
*/
|
|
61
|
+
export declare function setVolume(value: number): void;
|
|
62
|
+
/**
|
|
63
|
+
* Get current volume
|
|
64
|
+
*/
|
|
65
|
+
export declare function getVolume(): number;
|
|
66
|
+
/**
|
|
67
|
+
* Is symphony playing?
|
|
68
|
+
*/
|
|
69
|
+
export declare function isPlaying(): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Get note info for visualization
|
|
72
|
+
*/
|
|
73
|
+
export declare function getNoteInfo(description: string): {
|
|
74
|
+
noteIndex: number;
|
|
75
|
+
noteName: string;
|
|
76
|
+
};
|
|
77
|
+
export declare const _test: {
|
|
78
|
+
PENTATONIC_FREQUENCIES: number[];
|
|
79
|
+
SEMITONE_RATIO: number;
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=audio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../../src/panels/observer/audio.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAyCjD;;GAEG;AACH,wBAAgB,SAAS,IAAI,YAAY,GAAG,IAAI,CAU/C;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjD;AAwFD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAchE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAwB/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,eAAe,SAAI,GAAG,IAAI,CA4CtD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAMnC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAU1E;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOxF;AAGD,eAAO,MAAM,KAAK;;;CAGjB,CAAA"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musical Assertion Audio System
|
|
3
|
+
*
|
|
4
|
+
* Each assertion becomes a note on a musical scale.
|
|
5
|
+
* Passing assertions play their assigned note cleanly.
|
|
6
|
+
* Failing assertions play a detuned version (dissonance).
|
|
7
|
+
* Assertions that fire together within the grouping window form chords.
|
|
8
|
+
*/
|
|
9
|
+
// Audio context (lazy initialized)
|
|
10
|
+
let audioContext = null;
|
|
11
|
+
// State
|
|
12
|
+
let muted = false;
|
|
13
|
+
let volume = 0.3;
|
|
14
|
+
const noteAssignments = new Map(); // description -> note index
|
|
15
|
+
// Musical constants
|
|
16
|
+
// Using a pentatonic scale for natural harmony (no dissonance between notes)
|
|
17
|
+
// Octaves 3-5 for a pleasant range
|
|
18
|
+
const PENTATONIC_FREQUENCIES = [
|
|
19
|
+
// C3 pentatonic
|
|
20
|
+
130.81, 146.83, 164.81, 196.00, 220.00,
|
|
21
|
+
// C4 pentatonic
|
|
22
|
+
261.63, 293.66, 329.63, 392.00, 440.00,
|
|
23
|
+
// C5 pentatonic
|
|
24
|
+
523.25, 587.33, 659.25, 783.99, 880.00,
|
|
25
|
+
];
|
|
26
|
+
// A semitone (half step) ratio - 2^(1/12) ≈ 1.0595
|
|
27
|
+
const SEMITONE_RATIO = Math.pow(2, 1 / 12);
|
|
28
|
+
// Note duration in seconds
|
|
29
|
+
const NOTE_DURATION = 0.25;
|
|
30
|
+
const NOTE_ATTACK = 0.02;
|
|
31
|
+
// The dissonant note lingers longer, making it feel awkward/out of place
|
|
32
|
+
const DISSONANT_DURATION = 0.5;
|
|
33
|
+
const symphonyEvents = [];
|
|
34
|
+
let isPlayingSymphony = false;
|
|
35
|
+
let symphonyTimeoutId = null;
|
|
36
|
+
/**
|
|
37
|
+
* Initialize the audio context (must be called after user interaction)
|
|
38
|
+
*/
|
|
39
|
+
export function initAudio() {
|
|
40
|
+
if (audioContext)
|
|
41
|
+
return audioContext;
|
|
42
|
+
try {
|
|
43
|
+
audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
|
44
|
+
return audioContext;
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
console.warn('[scenetest] Web Audio API not available');
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resume audio context if suspended (browsers require user interaction)
|
|
53
|
+
*/
|
|
54
|
+
export async function resumeAudio() {
|
|
55
|
+
if (audioContext?.state === 'suspended') {
|
|
56
|
+
await audioContext.resume();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get a consistent note index for an assertion description
|
|
61
|
+
*/
|
|
62
|
+
function getNoteIndex(description) {
|
|
63
|
+
let existing = noteAssignments.get(description);
|
|
64
|
+
if (existing !== undefined)
|
|
65
|
+
return existing;
|
|
66
|
+
// Hash the description to get a note index
|
|
67
|
+
let hash = 0;
|
|
68
|
+
for (let i = 0; i < description.length; i++) {
|
|
69
|
+
hash = ((hash << 5) - hash) + description.charCodeAt(i);
|
|
70
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
71
|
+
}
|
|
72
|
+
const noteIndex = Math.abs(hash) % PENTATONIC_FREQUENCIES.length;
|
|
73
|
+
noteAssignments.set(description, noteIndex);
|
|
74
|
+
return noteIndex;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the frequency for an assertion
|
|
78
|
+
*/
|
|
79
|
+
function getFrequency(description) {
|
|
80
|
+
const noteIndex = getNoteIndex(description);
|
|
81
|
+
return PENTATONIC_FREQUENCIES[noteIndex];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Play a single note with envelope
|
|
85
|
+
* Passing notes: clean sine wave
|
|
86
|
+
* Failing notes: true note + half step away (subtle dissonance)
|
|
87
|
+
*/
|
|
88
|
+
function playNote(frequency, passed, time) {
|
|
89
|
+
if (!audioContext || muted)
|
|
90
|
+
return;
|
|
91
|
+
const startTime = time ?? audioContext.currentTime;
|
|
92
|
+
// Clean, pleasant sine wave for the main note
|
|
93
|
+
const oscillator = audioContext.createOscillator();
|
|
94
|
+
oscillator.type = 'sine';
|
|
95
|
+
oscillator.frequency.setValueAtTime(frequency, startTime);
|
|
96
|
+
const gainNode = audioContext.createGain();
|
|
97
|
+
gainNode.gain.setValueAtTime(0, startTime);
|
|
98
|
+
gainNode.gain.linearRampToValueAtTime(volume, startTime + NOTE_ATTACK);
|
|
99
|
+
gainNode.gain.exponentialRampToValueAtTime(0.001, startTime + NOTE_DURATION);
|
|
100
|
+
oscillator.connect(gainNode);
|
|
101
|
+
gainNode.connect(audioContext.destination);
|
|
102
|
+
oscillator.start(startTime);
|
|
103
|
+
oscillator.stop(startTime + NOTE_DURATION + 0.1);
|
|
104
|
+
if (passed === false) {
|
|
105
|
+
// Add a second note a half step up - creates subtle "off" dissonance
|
|
106
|
+
// This note lingers longer, making it feel awkward/out of place
|
|
107
|
+
const dissonantOsc = audioContext.createOscillator();
|
|
108
|
+
dissonantOsc.type = 'sine';
|
|
109
|
+
dissonantOsc.frequency.setValueAtTime(frequency * SEMITONE_RATIO, startTime);
|
|
110
|
+
const dissonantGain = audioContext.createGain();
|
|
111
|
+
dissonantGain.gain.setValueAtTime(0, startTime);
|
|
112
|
+
dissonantGain.gain.linearRampToValueAtTime(volume * 0.8, startTime + NOTE_ATTACK);
|
|
113
|
+
dissonantGain.gain.exponentialRampToValueAtTime(0.001, startTime + DISSONANT_DURATION);
|
|
114
|
+
dissonantOsc.connect(dissonantGain);
|
|
115
|
+
dissonantGain.connect(audioContext.destination);
|
|
116
|
+
dissonantOsc.start(startTime);
|
|
117
|
+
dissonantOsc.stop(startTime + DISSONANT_DURATION + 0.1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Play a chord (multiple notes simultaneously)
|
|
122
|
+
*/
|
|
123
|
+
function playChord(notes) {
|
|
124
|
+
if (!audioContext || muted || notes.length === 0)
|
|
125
|
+
return;
|
|
126
|
+
const now = audioContext.currentTime;
|
|
127
|
+
// Slightly stagger notes for a more natural "strum" effect
|
|
128
|
+
notes.forEach((note, i) => {
|
|
129
|
+
const stagger = i * 0.015; // 15ms between notes
|
|
130
|
+
playNote(note.frequency, note.passed, now + stagger);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Play assertion sound
|
|
135
|
+
* Called for each assertion - the grouping logic handles chord formation
|
|
136
|
+
*/
|
|
137
|
+
export function playAssertionSound(result) {
|
|
138
|
+
if (!audioContext) {
|
|
139
|
+
initAudio();
|
|
140
|
+
}
|
|
141
|
+
if (!audioContext || muted)
|
|
142
|
+
return;
|
|
143
|
+
// Resume if suspended
|
|
144
|
+
if (audioContext.state === 'suspended') {
|
|
145
|
+
audioContext.resume();
|
|
146
|
+
}
|
|
147
|
+
const frequency = getFrequency(result.description);
|
|
148
|
+
playNote(frequency, result.result);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Play a chord for a group of assertions
|
|
152
|
+
*/
|
|
153
|
+
export function playGroupChord(results) {
|
|
154
|
+
if (!audioContext) {
|
|
155
|
+
initAudio();
|
|
156
|
+
}
|
|
157
|
+
if (!audioContext || muted || results.length === 0)
|
|
158
|
+
return;
|
|
159
|
+
// Resume if suspended
|
|
160
|
+
if (audioContext.state === 'suspended') {
|
|
161
|
+
audioContext.resume();
|
|
162
|
+
}
|
|
163
|
+
const notes = results.map(r => ({
|
|
164
|
+
frequency: getFrequency(r.description),
|
|
165
|
+
passed: r.result,
|
|
166
|
+
}));
|
|
167
|
+
// Record for symphony playback
|
|
168
|
+
symphonyEvents.push({
|
|
169
|
+
timestamp: Date.now(),
|
|
170
|
+
notes,
|
|
171
|
+
});
|
|
172
|
+
playChord(notes);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Play the symphony - replay all recorded assertion chords
|
|
176
|
+
*/
|
|
177
|
+
export function playSymphony(speedMultiplier = 4) {
|
|
178
|
+
if (!audioContext) {
|
|
179
|
+
initAudio();
|
|
180
|
+
}
|
|
181
|
+
if (!audioContext || symphonyEvents.length === 0)
|
|
182
|
+
return;
|
|
183
|
+
// Stop any existing playback
|
|
184
|
+
stopSymphony();
|
|
185
|
+
isPlayingSymphony = true;
|
|
186
|
+
// Resume if suspended
|
|
187
|
+
if (audioContext.state === 'suspended') {
|
|
188
|
+
audioContext.resume();
|
|
189
|
+
}
|
|
190
|
+
// Calculate base timestamp
|
|
191
|
+
const baseTime = symphonyEvents[0].timestamp;
|
|
192
|
+
// Schedule all events
|
|
193
|
+
symphonyEvents.forEach((event, i) => {
|
|
194
|
+
const relativeTime = (event.timestamp - baseTime) / speedMultiplier;
|
|
195
|
+
symphonyTimeoutId = setTimeout(() => {
|
|
196
|
+
if (!isPlayingSymphony)
|
|
197
|
+
return;
|
|
198
|
+
playChord(event.notes);
|
|
199
|
+
// Update UI to show current position
|
|
200
|
+
if (typeof window !== 'undefined' && window.__scenetest_symphonyProgress) {
|
|
201
|
+
window.__scenetest_symphonyProgress(i, symphonyEvents.length);
|
|
202
|
+
}
|
|
203
|
+
// Mark as done after last event
|
|
204
|
+
if (i === symphonyEvents.length - 1) {
|
|
205
|
+
setTimeout(() => {
|
|
206
|
+
isPlayingSymphony = false;
|
|
207
|
+
if (typeof window !== 'undefined' && window.__scenetest_symphonyComplete) {
|
|
208
|
+
window.__scenetest_symphonyComplete();
|
|
209
|
+
}
|
|
210
|
+
}, NOTE_DURATION * 1000);
|
|
211
|
+
}
|
|
212
|
+
}, relativeTime);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Stop symphony playback
|
|
217
|
+
*/
|
|
218
|
+
export function stopSymphony() {
|
|
219
|
+
isPlayingSymphony = false;
|
|
220
|
+
if (symphonyTimeoutId) {
|
|
221
|
+
clearTimeout(symphonyTimeoutId);
|
|
222
|
+
symphonyTimeoutId = null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Clear symphony recording
|
|
227
|
+
*/
|
|
228
|
+
export function clearSymphony() {
|
|
229
|
+
symphonyEvents.length = 0;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get symphony info
|
|
233
|
+
*/
|
|
234
|
+
export function getSymphonyInfo() {
|
|
235
|
+
if (symphonyEvents.length === 0) {
|
|
236
|
+
return { eventCount: 0, duration: 0 };
|
|
237
|
+
}
|
|
238
|
+
const duration = symphonyEvents[symphonyEvents.length - 1].timestamp - symphonyEvents[0].timestamp;
|
|
239
|
+
return {
|
|
240
|
+
eventCount: symphonyEvents.length,
|
|
241
|
+
duration,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Toggle mute
|
|
246
|
+
*/
|
|
247
|
+
export function toggleMute() {
|
|
248
|
+
muted = !muted;
|
|
249
|
+
return muted;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Set mute state
|
|
253
|
+
*/
|
|
254
|
+
export function setMuted(value) {
|
|
255
|
+
muted = value;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Is currently muted?
|
|
259
|
+
*/
|
|
260
|
+
export function isMuted() {
|
|
261
|
+
return muted;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Set volume (0-1)
|
|
265
|
+
*/
|
|
266
|
+
export function setVolume(value) {
|
|
267
|
+
volume = Math.max(0, Math.min(1, value));
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Get current volume
|
|
271
|
+
*/
|
|
272
|
+
export function getVolume() {
|
|
273
|
+
return volume;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Is symphony playing?
|
|
277
|
+
*/
|
|
278
|
+
export function isPlaying() {
|
|
279
|
+
return isPlayingSymphony;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get note info for visualization
|
|
283
|
+
*/
|
|
284
|
+
export function getNoteInfo(description) {
|
|
285
|
+
const noteIndex = getNoteIndex(description);
|
|
286
|
+
const noteNames = ['C', 'D', 'E', 'G', 'A'];
|
|
287
|
+
const octave = Math.floor(noteIndex / 5) + 3;
|
|
288
|
+
const noteName = noteNames[noteIndex % 5] + octave;
|
|
289
|
+
return { noteIndex, noteName };
|
|
290
|
+
}
|
|
291
|
+
// Export for testing
|
|
292
|
+
export const _test = {
|
|
293
|
+
PENTATONIC_FREQUENCIES,
|
|
294
|
+
SEMITONE_RATIO,
|
|
295
|
+
};
|
|
296
|
+
//# sourceMappingURL=audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../../src/panels/observer/audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto.d.ts","sourceRoot":"","sources":["../../../src/panels/observer/auto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-initializing observer import
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import '@scenetest/vite-plugin/panels/observer'
|
|
6
|
+
*
|
|
7
|
+
* This will automatically initialize the observer panel when imported.
|
|
8
|
+
*/
|
|
9
|
+
import { initObserver } from './index.js';
|
|
10
|
+
initObserver();
|
|
11
|
+
//# sourceMappingURL=auto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto.js","sourceRoot":"","sources":["../../../src/panels/observer/auto.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem Viewer — Force-directed graph visualization
|
|
3
|
+
*
|
|
4
|
+
* Renders assertion locations as a force-directed graph where:
|
|
5
|
+
* - Each file with assertions becomes a node
|
|
6
|
+
* - Files in the same directory are connected by edges
|
|
7
|
+
* - Node size reflects assertion count
|
|
8
|
+
* - Node color reflects pass/fail status
|
|
9
|
+
* - Hover shows file details and assertion list
|
|
10
|
+
*/
|
|
11
|
+
import type { LocationGroup } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Mount the filesystem viewer into a container element.
|
|
14
|
+
* Takes location groups from panel state and renders an interactive
|
|
15
|
+
* force-directed graph of files containing assertions.
|
|
16
|
+
*
|
|
17
|
+
* Returns a cleanup function to stop the animation loop and remove listeners.
|
|
18
|
+
*/
|
|
19
|
+
export declare function mountFsViewer(container: HTMLElement, locations: LocationGroup[]): () => void;
|
|
20
|
+
//# sourceMappingURL=fs-viewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-viewer.d.ts","sourceRoot":"","sources":["../../../src/panels/observer/fs-viewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AA+b/C;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,CAiM5F"}
|