From 00730569f659c4846f669f2b7d21922e9d3b9587 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Thu, 15 Aug 2024 12:08:35 +0200
Subject: [PATCH 01/19] Improved Winamp Visualizer by @x2nie
This contains work started by @x2nie and continued by me.
There's a lot that's either broken and/or unfinished.
The main goal of this PR is to improve the visualizer of Webamp, bringing improvements to the Oscilloscope and Spectrum analyzer rendering.
Improving the Oscilloscope was achieved by taking the rendering code from the Equalizer and implanting it into the small visualizer box done by x2nie, improving the Spectrum Analyzer involved ditching the Web Audio API in favor of FFTNullsoft, providing a much more accurate representation of the audio.
The spectrum analyzer code (at least for the thicker bands) was redone that makes use of reverse engineered code from Winamp 2.65, more specifically how the bar chunking is achieved as well as how the peaks are calculated (this is broken).
---
packages/webamp/js/components/FFTNullsoft.ts | 243 +++++
.../webamp/js/components/MainWindow/index.tsx | 6 +-
packages/webamp/js/components/Vis.tsx | 209 +++++
packages/webamp/js/components/VisPainter.ts | 813 ++++++++++++++++
packages/webamp/package.json | 6 +
yarn.lock | 868 +++++++++++++++++-
6 files changed, 2139 insertions(+), 6 deletions(-)
create mode 100644 packages/webamp/js/components/FFTNullsoft.ts
create mode 100644 packages/webamp/js/components/Vis.tsx
create mode 100644 packages/webamp/js/components/VisPainter.ts
diff --git a/packages/webamp/js/components/FFTNullsoft.ts b/packages/webamp/js/components/FFTNullsoft.ts
new file mode 100644
index 0000000000..a9187ca0d5
--- /dev/null
+++ b/packages/webamp/js/components/FFTNullsoft.ts
@@ -0,0 +1,243 @@
+// The Web Audio API's FFT is bad, so this exists now!
+// Taken from https://github.com/WACUP/vis_classic/tree/master/FFTNullsoft
+
+export class FFT {
+ private m_samples_in: number;
+ private NFREQ: number;
+ private bitrevtable: number[] | null = null;
+ private envelope: Float32Array | null = null;
+ private equalize: Float32Array | null = null;
+ private temp1: Float32Array | null = null;
+ private temp2: Float32Array | null = null;
+ private cossintable: Float32Array[] | null = null;
+
+ constructor() {
+ this.m_samples_in = 0;
+ this.NFREQ = 0;
+ }
+
+ public init(samples_in: number, samples_out: number, bEqualize = 1, envelope_power = 1.0, mode = false): void {
+ this.cleanUp();
+
+ this.m_samples_in = samples_in;
+ this.NFREQ = samples_out * 2;
+
+ this.initBitRevTable();
+ this.initCosSinTable();
+
+ if (envelope_power > 0) {
+ this.initEnvelopeTable(envelope_power);
+ }
+
+ if (bEqualize) {
+ this.initEqualizeTable(mode);
+ }
+
+ this.temp1 = new Float32Array(this.NFREQ);
+ this.temp2 = new Float32Array(this.NFREQ);
+ }
+
+ public cleanUp(): void {
+ this.envelope = null;
+ this.equalize = null;
+ this.bitrevtable = null;
+ this.cossintable = null;
+ this.temp1 = null;
+ this.temp2 = null;
+ }
+
+ private initEqualizeTable(mode: boolean): void {
+ this.equalize = new Float32Array(this.NFREQ / 2);
+ let bias = 0.04;
+
+ for (let i = 0; i < this.NFREQ / 2; i++) {
+ const inv_half_nfreq = (9.0 - bias) / (this.NFREQ / 2);
+ this.equalize[i] = Math.log10(1.0 + bias + (i + 1) * inv_half_nfreq);
+
+ bias /= 1.0025;
+ }
+ }
+
+ private initEnvelopeTable(power: number): void {
+ const mult = (1.0 / this.m_samples_in) * 6.2831853;
+
+ this.envelope = new Float32Array(this.m_samples_in);
+
+ if (power == 1.0){
+ for (let i = 0; i < this.m_samples_in; i++) {
+ this.envelope[i] = 0.5 + 0.5*Math.sin(i*mult - 1.5707963268);
+ }
+ }
+ else {
+ for (let i = 0; i < this.m_samples_in; i++) {
+ this.envelope[i] = Math.pow(0.5 + 0.5 * Math.sin(i * mult - 1.5707963268), power);
+ }
+ }
+ }
+
+ private initBitRevTable(): void {
+ this.bitrevtable = new Array(this.NFREQ);
+
+ for (let i = 0; i < this.NFREQ; i++) {
+ this.bitrevtable[i] = i;
+ }
+
+ for (let i = 0, j = 0; i < this.NFREQ; i++) {
+ if (j > i) {
+ const temp = this.bitrevtable[i];
+ this.bitrevtable[i] = this.bitrevtable[j];
+ this.bitrevtable[j] = temp;
+ }
+
+ let m = this.NFREQ >> 1;
+ while (m >= 1 && j >= m) {
+ j -= m;
+ m >>= 1;
+ }
+
+ j += m;
+ }
+ }
+
+ private initCosSinTable(): void {
+ let dftsize = 2;
+ let tabsize = 0;
+ while (dftsize <= this.NFREQ) {
+ ++tabsize;
+ dftsize <<= 1;
+ }
+
+ this.cossintable = new Array(tabsize);
+ dftsize = 2;
+ let i = 0;
+
+ while (dftsize <= this.NFREQ) {
+ const theta = -2.0 * Math.PI / dftsize;
+ this.cossintable[i] = new Float32Array(2);
+ this.cossintable[i][0] = Math.cos(theta);
+ this.cossintable[i][1] = Math.sin(theta);
+ ++i;
+ dftsize <<= 1;
+ }
+ }
+
+ public timeToFrequencyDomain(in_wavedata: Float32Array, out_spectraldata: Float32Array): void {
+ if (!this.bitrevtable || !this.temp1 || !this.temp2 || !this.cossintable) return;
+ // Converts time-domain samples from in_wavedata[]
+ // into frequency-domain samples in out_spectraldata[].
+ // The array lengths are the two parameters to Init().
+
+ // The last sample of the output data will represent the frequency
+ // that is 1/4th of the input sampling rate. For example,
+ // if the input wave data is sampled at 44,100 Hz, then the last
+ // sample of the spectral data output will represent the frequency
+ // 11,025 Hz. The first sample will be 0 Hz; the frequencies of
+ // the rest of the samples vary linearly in between.
+ // Note that since human hearing is limited to the range 200 - 20,000
+ // Hz. 200 is a low bass hum; 20,000 is an ear-piercing high shriek.
+ // Each time the frequency doubles, that sounds like going up an octave.
+ // That means that the difference between 200 and 300 Hz is FAR more
+ // than the difference between 5000 and 5100, for example!
+ // So, when trying to analyze bass, you'll want to look at (probably)
+ // the 200-800 Hz range; whereas for treble, you'll want the 1,400 -
+ // 11,025 Hz range.
+ // If you want to get 3 bands, try it this way:
+ // a) 11,025 / 200 = 55.125
+ // b) to get the number of octaves between 200 and 11,025 Hz, solve for n:
+ // 2^n = 55.125
+ // n = log 55.125 / log 2
+ // n = 5.785
+ // c) so each band should represent 5.785/3 = 1.928 octaves; the ranges are:
+ // 1) 200 - 200*2^1.928 or 200 - 761 Hz
+ // 2) 200*2^1.928 - 200*2^(1.928*2) or 761 - 2897 Hz
+ // 3) 200*2^(1.928*2) - 200*2^(1.928*3) or 2897 - 11025 Hz
+
+ // A simple sine-wave-based envelope is convolved with the waveform
+ // data before doing the FFT, to emeliorate the bad frequency response
+ // of a square (i.e. nonexistent) filter.
+
+ // You might want to slightly damp (blur) the input if your signal isn't
+ // of a very high quality, to reduce high-frequency noise that would
+ // otherwise show up in the output.
+
+ // code should be smart enough to call Init before this function
+ //if (!bitrevtable) return;
+ //if (!temp1) return;
+ //if (!temp2) return;
+ //if (!cossintable) return;
+
+ // 1. set up input to the fft
+ if (this.envelope) {
+ for (let i = 0; i < this.NFREQ; i++) {
+ const idx = this.bitrevtable[i];
+ if (idx < this.m_samples_in){
+ this.temp1[i] = in_wavedata[idx] * this.envelope[idx];
+ }
+ else{
+ this.temp1[i] = 0;
+ }
+ }
+ } else {
+ for (let i = 0; i < this.NFREQ; i++) {
+ const idx = this.bitrevtable[i];
+ if (idx < this.m_samples_in){
+ this.temp1[i] = in_wavedata[idx];
+ }
+ else{
+ this.temp1[i] = 0;
+ }
+ }
+ }
+ this.temp2.fill(0);
+
+ // 2. perform FFT
+ let real = this.temp1;
+ let imag = this.temp2;
+ let dftsize = 2;
+ let t = 0;
+
+ while (dftsize <= this.NFREQ) {
+ const wpr = this.cossintable[t][0];
+ const wpi = this.cossintable[t][1];
+ let wr = 1.0;
+ let wi = 0.0;
+ const hdftsize = dftsize >> 1;
+
+ for (let m = 0; m < hdftsize; m += 1)
+ {
+ for (let i = m; i < this.NFREQ; i += dftsize)
+ {
+ const j = i + hdftsize;
+ const tempr = wr * real[j] - wi * imag[j];
+ const tempi = wr * imag[j] + wi * real[j];
+ real[j] = real[i] - tempr;
+ imag[j] = imag[i] - tempi;
+ real[i] += tempr;
+ imag[i] += tempi;
+ }
+
+ const wtemp = wr;
+ wr = wr * wpr - wi * wpi;
+ wi = wi * wpr + wtemp * wpi;
+ }
+
+ dftsize <<= 1;
+ ++t;
+ }
+
+ // 3. take the magnitude & equalize it (on a log10 scale) for output
+ if (this.equalize) {
+ for (let i = 0; i < this.NFREQ / 2; i++) {
+ out_spectraldata[i] = this.equalize[i] * Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
+ }
+ } else {
+ for (let i = 0; i < this.NFREQ / 2; i++) {
+ out_spectraldata[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
+ }
+ }
+ }
+
+ public getNumFreq(): number {
+ return this.NFREQ;
+ }
+}
diff --git a/packages/webamp/js/components/MainWindow/index.tsx b/packages/webamp/js/components/MainWindow/index.tsx
index 7324b3539b..059763061d 100644
--- a/packages/webamp/js/components/MainWindow/index.tsx
+++ b/packages/webamp/js/components/MainWindow/index.tsx
@@ -9,6 +9,7 @@ import MiniTime from "../MiniTime";
import ClickedDiv from "../ClickedDiv";
import ContextMenuTarget from "../ContextMenuTarget";
import Visualizer from "../Visualizer";
+import Vis from "../Vis";
import ActionButtons from "./ActionButtons";
import MainBalance from "./MainBalance";
import Close from "./Close";
@@ -106,10 +107,11 @@ const MainWindow = React.memo(({ analyser, filePickers }: Props) => {
/>
-
+ /> */}
+
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
new file mode 100644
index 0000000000..e94ae508ab
--- /dev/null
+++ b/packages/webamp/js/components/Vis.tsx
@@ -0,0 +1,209 @@
+import React, {
+ useMemo,
+ useCallback,
+ useState,
+ useLayoutEffect,
+ useEffect,
+} from "react";
+
+import * as Actions from "../actionCreators";
+import * as Selectors from "../selectors";
+import { FFT } from "./FFTNullsoft";
+import { useTypedSelector, useActionCreator } from "../hooks";
+// import { usePaintOscilloscopeFrame } from "./useOscilloscopeVisualizer";
+// import { usePaintBarFrame, usePaintBar } from "./useBarVisualizer";
+import { VISUALIZERS, MEDIA_STATUS } from "../constants";
+
+import {
+ Vis as IVis,
+ VisPaintHandler,
+ BarPaintHandler,
+ WavePaintHandler,
+ NoVisualizerHandler,
+ FakeBarPaintHandler,
+} from "./VisPainter";
+
+type Props = {
+ analyser: AnalyserNode;
+};
+
+const PIXEL_DENSITY = 1;
+
+const fft = new FFT();
+const samplesIn = 1024; // Example input size
+const samplesOut = 512; // Example output size
+fft.init(samplesIn, samplesOut, 1, 1.0, true);
+
+let in_wavedata = new Float32Array(samplesIn); // Fill this with your input data
+export let out_spectraldata = new Float32Array(samplesOut);
+
+// Pre-render the background grid
+function preRenderBg(
+ width: number,
+ height: number,
+ bgColor: string,
+ fgColor: string,
+ windowShade: boolean
+): HTMLCanvasElement {
+ // Off-screen canvas for pre-rendering the background
+ const bgCanvas = document.createElement("canvas");
+ bgCanvas.width = width;
+ bgCanvas.height = height;
+ const distance = 2 * PIXEL_DENSITY;
+
+ const bgCanvasCtx = bgCanvas.getContext("2d");
+ if (bgCanvasCtx == null) {
+ throw new Error("Could not construct canvas context");
+ }
+ bgCanvasCtx.fillStyle = bgColor;
+ bgCanvasCtx.fillRect(0, 0, width, height);
+ if (!windowShade) {
+ bgCanvasCtx.fillStyle = fgColor;
+ for (let x = 0; x < width; x += distance) {
+ for (let y = PIXEL_DENSITY; y < height; y += distance) {
+ bgCanvasCtx.fillRect(x, y, PIXEL_DENSITY, PIXEL_DENSITY);
+ }
+ }
+ }
+ return bgCanvas;
+}
+
+export default function Vis({ analyser }: Props) {
+ useLayoutEffect(() => {
+ analyser.fftSize = 1024;
+ }, [analyser, analyser.fftSize]);
+ const colors = useTypedSelector(Selectors.getSkinColors);
+ const mode = useTypedSelector(Selectors.getVisualizerStyle);
+ const audioStatus = useTypedSelector(Selectors.getMediaStatus);
+ const getWindowShade = useTypedSelector(Selectors.getWindowShade);
+ const dummyVizData = useTypedSelector(Selectors.getDummyVizData);
+
+ const dataArray = new Uint8Array(1024);
+ analyser.getByteTimeDomainData(dataArray);
+
+ in_wavedata = new Float32Array(dataArray.length);
+
+ const toggleVisualizerStyle = useActionCreator(Actions.toggleVisualizerStyle);
+ const windowShade = getWindowShade("main");
+ const renderWidth = windowShade ? 38 : 75;
+ const renderHeight = windowShade ? 5 : 16;
+
+ const width = renderWidth * PIXEL_DENSITY;
+ const height = renderHeight * PIXEL_DENSITY;
+
+ const bgCanvas = useMemo(() => {
+ return preRenderBg(
+ width,
+ height,
+ colors[0],
+ colors[1],
+ Boolean(windowShade)
+ );
+ }, [colors, height, width, windowShade]);
+
+ const [canvas, setCanvas] = useState(null);
+ // const vis: IVis = {
+ // canvas,
+ // analyser
+ // }
+
+ //? painter administration
+ const [painter, setPainter] = useState(null);
+ // const _vis: IVis = useMemo(() => {
+ // if (!canvas) return { colors, analyser };
+ // return { canvas, colors, analyser };
+ // }, [analyser, canvas, colors]);
+
+ useEffect(() => {
+ if (!canvas) return;
+ const _setPainter = (PainterType: typeof VisPaintHandler) => {
+ const _vis: IVis = {
+ canvas,
+ colors,
+ analyser,
+ oscStyle: "lines",
+ bandwidth: "wide",
+ coloring: "normal",
+ peaks: true,
+ };
+
+ // uninteruptable painting requires _painter to be always available
+ // const oldPainter = painter;
+ const newPainter = new PainterType(_vis);
+ newPainter.prepare();
+ setPainter(newPainter);
+
+ // this.audioStatusChanged(); // stop loop of old painter, preparing new painter.
+
+ // if (oldPainter) {
+ // oldPainter.dispose();
+ // }
+ };
+ // console.log(" vis mode:", mode);
+ switch (mode) {
+ case VISUALIZERS.OSCILLOSCOPE:
+ _setPainter(WavePaintHandler);
+ break;
+ case VISUALIZERS.BAR:
+ _setPainter(BarPaintHandler);
+ // _setPainter(BarPaintHandlerFake);
+ break;
+ case VISUALIZERS.NONE:
+ _setPainter(NoVisualizerHandler);
+ break;
+ default:
+ _setPainter(NoVisualizerHandler);
+ }
+ }, [analyser, canvas, mode, colors]);
+
+ useEffect(() => {
+ if (canvas == null || painter == null) {
+ return;
+ }
+
+ const canvasCtx = canvas.getContext("2d");
+ if (canvasCtx == null) {
+ return;
+ }
+ canvasCtx.imageSmoothingEnabled = false;
+
+ let animationRequest: number | null = null;
+
+ const loop = () => {
+ analyser.getByteTimeDomainData(dataArray);
+ for (let i = 0; i < dataArray.length; i++) {
+ in_wavedata[i] = dataArray[i] - 128;
+ }
+ fft.timeToFrequencyDomain(in_wavedata, out_spectraldata);
+ painter.paintFrame();
+ animationRequest = window.requestAnimationFrame(loop);
+ };
+
+ if (audioStatus === MEDIA_STATUS.PLAYING) {
+ loop();
+ } else if (animationRequest !== null) {
+ // Clean up the animation frame request if the status is not PLAYING
+ window.cancelAnimationFrame(animationRequest);
+ animationRequest = null;
+ }
+
+ return () => {
+ if (animationRequest !== null) {
+ window.cancelAnimationFrame(animationRequest);
+ }
+ };
+ }, [audioStatus, canvas, painter]);
+ // @ts-ignore
+
+ // @ts-ignore
+ return (
+
+ );
+}
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
new file mode 100644
index 0000000000..9a06cfea52
--- /dev/null
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -0,0 +1,813 @@
+export interface Vis {
+ canvas?: HTMLCanvasElement;
+ colors: string[];
+ analyser?: AnalyserNode;
+ audioContext?: AudioContext; //butterchurn need it
+ oscStyle?: "dots" | "solid" | "lines";
+ bandwidth?: "wide" | "thin";
+ coloring?: "fire" | "line" | "normal";
+ peaks?: boolean;
+}
+import { out_spectraldata } from "./Vis";
+
+type ColorTriplet = string;
+
+/**
+ * Base class of AVS (animation frame renderer engine)
+ */
+export class VisPaintHandler {
+ _vis: Vis;
+ _ctx: CanvasRenderingContext2D | null;
+
+ constructor(vis: Vis) {
+ this._vis = vis;
+ this._ctx = vis.canvas!.getContext("2d");
+ // this.prepare();
+ }
+
+ /**
+ * Attemp to build cached bitmaps for later use while render a frame.
+ * Purpose: fast rendering in animation loop
+ */
+ prepare() {}
+
+ /**
+ * Called once per frame rendiring
+ */
+ paintFrame() {}
+
+ /**
+ * Attemp to cleanup cached bitmaps
+ */
+ dispose() {}
+
+ /**
+ * called if it is an AVS.
+ * @param action vis_prev | vis_next | vis_f5 (fullscreen) |
+ */
+ doAction(action: string, param: string) {}
+}
+
+//? =============================== VIS.TEST PAINTER (fake) ===============================
+export class FakeBarPaintHandler extends VisPaintHandler {
+ prepare() {}
+
+ paintFrame() {
+ if (!this._ctx) return;
+ const ctx = this._ctx;
+ const width = ctx.canvas.width;
+ const height = ctx.canvas.height;
+ ctx.clearRect(0, 0, width, height);
+ ctx.lineWidth = 5;
+ for (let i = 0; i < 30; i += 1) {
+ const r = Math.floor(Math.random() * 255);
+ const g = Math.floor(Math.random() * 255);
+ const b = Math.floor(Math.random() * 255);
+
+ ctx.beginPath();
+ ctx.moveTo(Math.random() * width, Math.random() * height);
+ ctx.lineTo(Math.random() * width, Math.random() * height);
+ ctx.strokeStyle = `rgba(${r},${g},${b},1)`;
+ ctx.stroke();
+ }
+ }
+}
+export class FakeWavePaintHandler extends VisPaintHandler {
+ prepare() {}
+
+ paintFrame() {
+ if (!this._ctx) return;
+ const ctx = this._ctx;
+ const width = ctx.canvas.width;
+ const height = ctx.canvas.height;
+ ctx.clearRect(0, 0, width, height);
+ ctx.lineWidth = 1;
+ ctx.strokeStyle = "#fff";
+ for (let i = 0; i < 30; i += 1) {
+ ctx.beginPath();
+ ctx.moveTo(Math.random() * width, Math.random() * height);
+ ctx.lineTo(Math.random() * width, Math.random() * height);
+ ctx.stroke();
+ }
+ }
+}
+//? =============================== BAR PAINTER ===============================
+const NUM_BARS = 20;
+const PIXEL_DENSITY = 1;
+const BAR_PEAK_DROP_RATE = 0.01;
+type PaintFrameFunction = () => void;
+type PaintBarFunction = (
+ ctx: CanvasRenderingContext2D,
+ // barIndex: number,
+ x1: number,
+ x2: number,
+ barHeight: number,
+ peakHeight: number
+) => void;
+
+function octaveBucketsForBufferLength(
+ bufferLength: number,
+ barCount: number = NUM_BARS
+): number[] {
+ const octaveBuckets = new Array(barCount).fill(0);
+ const minHz = 80;
+ const maxHz = 22050;
+ const octaveStep = Math.pow(maxHz / minHz, 1 / barCount);
+
+ octaveBuckets[0] = 0;
+ octaveBuckets[1] = minHz;
+ for (let i = 2; i < barCount - 1; i++) {
+ octaveBuckets[i] = octaveBuckets[i - 1] * octaveStep;
+ }
+ octaveBuckets[barCount - 1] = maxHz;
+
+ for (let i = 0; i < barCount; i++) {
+ const octaveIdx = Math.floor((octaveBuckets[i] / maxHz) * bufferLength);
+ octaveBuckets[i] = octaveIdx;
+ }
+
+ return octaveBuckets;
+}
+
+export class BarPaintHandler extends VisPaintHandler {
+ _analyser: AnalyserNode;
+ _barWidth: number;
+ _color: string = "rgb(255,255,255)";
+ _colorPeak: string = "rgb(255,255,255)";
+ // Off-screen canvas for pre-rendering a single bar gradient
+ _bar: HTMLCanvasElement = document.createElement("canvas");
+ _peak: HTMLCanvasElement = document.createElement("canvas");
+ _16h: HTMLCanvasElement = document.createElement("canvas"); // non-stretched
+ _barPeaks: number[] = new Array(NUM_BARS).fill(0);
+ _barPeakFrames: number[] = new Array(NUM_BARS).fill(0);
+ _bufferLength: number;
+ _octaveBuckets: number[];
+ _dataArray: Uint8Array;
+ // _ctx: CanvasRenderingContext2D;
+ paintBar: PaintBarFunction;
+ paintFrame: PaintFrameFunction;
+
+ constructor(vis: Vis) {
+ super(vis);
+ this._analyser = this._vis.analyser!;
+ this._bufferLength = this._analyser.frequencyBinCount;
+ this._octaveBuckets = octaveBucketsForBufferLength(this._bufferLength);
+ this._dataArray = new Uint8Array(this._bufferLength);
+ this._barWidth = Math.ceil(vis.canvas!.width / NUM_BARS);
+
+ this._16h.width = 1;
+ this._16h.height = 16;
+ this._16h.setAttribute("width", "75");
+ this._16h.setAttribute("height", "16");
+ if (this._vis.bandwidth === "wide") {
+ this.paintFrame = this.paintFrameWide.bind(this);
+ this._octaveBuckets = octaveBucketsForBufferLength(this._bufferLength);
+ } else {
+ // thin
+ this.paintFrame = this.paintFrameThin.bind(this);
+ const w = this._vis.canvas!.width;
+ this._barPeaks = new Array(w).fill(0);
+ this._barPeakFrames = new Array(w).fill(0);
+ this._octaveBuckets = octaveBucketsForBufferLength(this._bufferLength, w);
+ }
+
+ if (this._vis.coloring === "fire") {
+ this.paintBar = this.paintBarFire.bind(this);
+ } else if (this._vis.coloring === "line") {
+ this.paintBar = this.paintBarLine.bind(this);
+ } else {
+ this.paintBar = this.paintBarNormal.bind(this);
+ }
+ }
+
+ prepare() {
+ const vis = this._vis;
+ if (!vis.canvas) return;
+ // const groupId = vis._gammagroup;
+ // const gammaGroup = this._vis._uiRoot._getGammaGroup(groupId);
+ // this._barWidth = Math.ceil(vis.canvas.width / NUM_BARS);
+
+ //? paint peak
+ this._peak.height = 1;
+ this._peak.width = 1;
+ let ctx = this._peak.getContext("2d")!;
+ // ctx.fillStyle = gammaGroup.transformColor(vis._colorBandPeak);
+ ctx.fillStyle = vis.colors[23];
+ ctx.fillRect(0, 0, 1, 1);
+
+ //? paint bar
+ this._bar.height = 16;
+ this._bar.width = 1;
+ this._bar.setAttribute("width", "1");
+ this._bar.setAttribute("height", "16");
+ ctx = this._bar.getContext("2d")!;
+ // const grd = ctx.createLinearGradient(0, 0, 0, vis.canvas.height);
+ // for (let i = 0; i < vis._colorBands.length; i++) {
+ // grd.addColorStop(
+ // (1 / (vis._colorBands.length - 1)) * i,
+ // gammaGroup.transformColor(vis._colorBands[i])
+ // );
+ // }
+ // ctx.strokeStyle = this._color;
+ // ctx.fillStyle = grd;
+ // ctx.fillRect(0, 0, 1, vis.canvas.height);
+ // ctx.imageSmoothingEnabled = false;
+ for (let y = 0; y < 16; y++) {
+ // ctx.fillStyle = gammaGroup.transformColor(vis._colorBands[15 - y]);
+ ctx.fillStyle = vis.colors[2 - -y];
+ ctx.fillRect(0, y, 1, y + 1);
+ }
+
+ // this._ctx = this._vis.canvas.getContext("2d");
+ }
+
+ /**
+ * ⬜⬜⬜ ⬜⬜⬜
+ * 🟧🟧🟧
+ * 🟫🟫🟫 🟧🟧🟧
+ * 🟫🟫🟫 🟫🟫🟫
+ * 🟫🟫🟫 🟫🟫🟫 ⬜⬜⬜
+ * 🟫🟫🟫 🟫🟫🟫 🟧🟧🟧
+ * 🟫🟫🟫 🟫🟫🟫 🟫🟫🟫
+ * 1 bar = multiple pixels
+ */
+ paintFrameWide() {
+ if (!this._ctx) return;
+ const ctx = this._ctx;
+ const w = ctx.canvas.width;
+ const h = ctx.canvas.height;
+ ctx.clearRect(0, 0, w, h);
+ ctx.fillStyle = this._color;
+
+ this._analyser.getByteFrequencyData(this._dataArray);
+ const heightMultiplier = h / 256;
+
+ let sapeaks = new Float32Array(76).fill(0);
+ let sadata2 = new Float32Array(76).fill(0);
+ let sadata = new Int8Array(76).fill(0);
+ let safalloff = new Float32Array(76).fill(0);
+ let sample = new Float32Array(76).fill(0);
+
+ let maxFreqIndex = 512;
+ let logMaxFreqIndex = Math.log10(maxFreqIndex);
+ let logMinFreqIndex = 0;
+
+ // This factor controls the scaling from linear to logarithmic.
+ // scale = 0.0 -> fully linear scaling
+ // scale = 1.0 -> fully logarithmic scaling
+ let scale = 0.95; // Adjust this value between 0.0 and 1.0
+
+ let targetSize = 75;
+
+ for (let x = 0; x < targetSize; x++) {
+ // Linear interpolation between linear and log scaling
+ let linearIndex = x / (targetSize - 1) * (maxFreqIndex - 1);
+ let logScaledIndex = logMinFreqIndex + (logMaxFreqIndex - logMinFreqIndex) * x / (targetSize - 1);
+ let logIndex = Math.pow(10, logScaledIndex);
+
+ // Interpolating between linear and logarithmic scaling
+ let scaledIndex = (1.0 - scale) * linearIndex + scale * logIndex;
+
+ let index1 = Math.floor(scaledIndex);
+ let index2 = Math.ceil(scaledIndex);
+
+ if (index1 >= maxFreqIndex) {
+ index1 = maxFreqIndex - 1;
+ }
+ if (index2 >= maxFreqIndex) {
+ index2 = maxFreqIndex - 1;
+ }
+
+ if (index1 == index2) {
+ sample[x] = out_spectraldata[index1];
+ } else {
+ let frac2 = scaledIndex - index1;
+ let frac1 = 1.0 - frac2;
+ sample[x] = (frac1 * out_spectraldata[index1] + frac2 * out_spectraldata[index2]);
+ }
+ }
+
+ for (let x = 0; x < 76; x++) {
+ let i: number;
+ let uVar12: number;
+
+ i = (i = x & 0xfffffffc);
+ uVar12 = (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 64;
+ sadata[x] = uVar12;
+
+ if (sadata[x] >= 15) {
+ sadata[x] = 15;
+ }
+ safalloff[i] -= 24 / 16.0;
+
+ if (safalloff[x] <= sadata[x]) {
+ safalloff[x] = sadata[x];
+ }
+
+ if (sapeaks[x] <= (safalloff[x] * 256)) {
+ sapeaks[x] = safalloff[x] * 256;
+ sadata2[i] = 3.0;
+ }
+
+ const barPeak = sapeaks[x] / 256;
+ sapeaks[x] -= sadata2[x];
+ sadata2[x] *= 1.05;
+ if (sapeaks[x] <= 0) {
+ sapeaks[x] = 0;
+ }
+
+ //console.log(safalloff[0]);
+
+ if (!(x == i + 3)) {
+ this.paintBar(
+ ctx,
+ x,
+ x,
+ safalloff[x],
+ barPeak
+ );
+ }
+ }
+ }
+
+ /**
+ * ⬜⬜
+ * 🟧
+ * 🟫🟧
+ * 🟫🟫⬜⬜
+ * 🟫🟫🟧
+ * 🟫🟫🟫🟧⬜
+ * 🟫🟫🟫🟫🟧
+ * drawing 1pixel width bars
+ */
+ paintFrameThin() {
+ if (!this._ctx) return;
+ const ctx = this._ctx;
+ const w = ctx.canvas.width;
+ const h = ctx.canvas.height;
+ ctx.clearRect(0, 0, w, h);
+ ctx.fillStyle = this._color;
+
+ this._analyser.getByteFrequencyData(this._dataArray);
+ const heightMultiplier = h / 256;
+ for (let j = 0; j < w - 1; j++) {
+ // const start = Math.round(j/w * this._dataArray.length);
+ // const end = Math.round((j+1)/w * this._dataArray.length );
+ const start = this._octaveBuckets[j];
+ const end = this._octaveBuckets[j + 1];
+ let amplitude = 0;
+ //let weightingnum = 0;
+ amplitude /= end - start;
+ for (let i = start; i < end; i++) {
+ //weightingnum += 6.6; //adds "weighting" to the analyzer
+ }
+ for (let k = start; k < end; k++) {
+ amplitude = Math.max(
+ amplitude,
+ this._dataArray[k]/* * 3.4 - 600 + weightingnum*/
+ ); //weightingnum used to try to correct the bias of the analyzer, but the last bar
+ //kept being shot up high
+ }
+
+ // The drop rate should probably be normalized to the rendering FPS, for now assume 60 FPS
+ let barPeak =
+ this._barPeaks[j] -
+ BAR_PEAK_DROP_RATE * Math.pow(this._barPeakFrames[j], 2);
+ if (barPeak < amplitude) {
+ barPeak = amplitude;
+ this._barPeakFrames[j] = 0;
+ } else {
+ this._barPeakFrames[j] += 1;
+ }
+ if (barPeak < 10) {
+ barPeak = 10;
+ this._barPeakFrames[j] = 0;
+ }
+ if (barPeak > 255) {
+ barPeak = 255;
+ this._barPeakFrames[j] += 1;
+ }
+ this._barPeaks[j] = barPeak;
+
+ // var x1 = Math.round(this._barWidth * j);
+ // var x2 = Math.round(this._barWidth * (j + 1)) - 2;
+
+ this.paintBar(
+ ctx,
+ // j /* * xOffset */,
+ j,
+ j,
+ Math.round(amplitude * heightMultiplier),
+ Math.round(barPeak * heightMultiplier)
+ );
+ }
+ }
+
+ /**
+ * 🟥
+ * 🟧🟧
+ * 🟨🟨🟨
+ * 🟩🟩🟩🟩
+ */
+ paintBarNormal(
+ ctx: CanvasRenderingContext2D,
+ // barIndex: number,
+ x: number,
+ x2: number,
+ barHeight: number,
+ peakHeight: number
+ ) {
+ // const w = ctx.canvas.width;
+ const h = ctx.canvas.height;
+ // var x = Math.round(this._barWidth * barIndex);
+ // var r = this._barWidth - 2;
+ // var x2 = Math.round(this._barWidth * (barIndex + 1)) - 2;
+ const y = h - barHeight;
+ // var y = barHeight;
+
+ // ctx.drawImage(this._bar, 0, y, 1, h - y, x, y, x2 - x + 1, h - y);
+ ctx.drawImage(this._bar, 0, y, 1, h - y, x, y, x2 - x + 1, h - y);
+
+ if (this._vis.peaks) {
+ const peakY = h - peakHeight;
+ ctx.drawImage(this._peak, 0, 0, 1, 1, x, peakY, x2 - x + 1, 1);
+ }
+ }
+
+ /**
+ * 🟥
+ * 🟧🟥
+ * 🟨🟧🟥
+ * 🟩🟨🟧🟥
+ */
+ paintBarFire(
+ ctx: CanvasRenderingContext2D,
+ // barIndex: number,
+ x: number,
+ x2: number,
+ barHeight: number,
+ peakHeight: number
+ ) {
+ // const w = ctx.canvas.width;
+ const h = ctx.canvas.height;
+ // var x = Math.round(this._barWidth * barIndex);
+ // var r = this._barWidth - 2;
+ // var x2 = Math.round(this._barWidth * (barIndex + 1)) - 2;
+ let y = h - barHeight;
+
+ // ctx.drawImage(this._bar, x, y, x2 - x + 1, h - y);
+ ctx.drawImage(
+ this._bar,
+ 0,
+ 0,
+ this._bar.width,
+ h - y,
+ x,
+ y,
+ x2 - x + 1,
+ h - y
+ );
+
+ if (this._vis.peaks) {
+ const peakY = h - peakHeight;
+ ctx.drawImage(this._peak, 0, 0, 1, 1, x, peakY, x2 - x + 1, 1);
+ }
+ }
+
+ /**
+ * 🟥
+ * 🟥🟧
+ * 🟥🟧🟨
+ * 🟥🟧🟨🟩
+ */
+ paintBarLine(
+ ctx: CanvasRenderingContext2D,
+ // barIndex: number,
+ x: number,
+ x2: number,
+ barHeight: number,
+ peakHeight: number
+ ) {
+ // const w = ctx.canvas.width;
+ const h = ctx.canvas.height;
+ // var x = Math.round(this._barWidth * barIndex);
+ // var r = this._barWidth - 2;
+ // var x2 = Math.round(this._barWidth * (barIndex + 1)) - 2;
+ let y = h - barHeight;
+
+ // ctx.drawImage(this._bar, x, y, x2 - x + 1, h - y);
+ ctx.drawImage(
+ this._bar,
+ 0, // sx
+ 0, // sy
+ this._bar.width, // sw
+ h - y, // sh
+ x,
+ y, // dx,dy
+ x2 - x + 1, //dw
+ h - y //dh
+ );
+
+ if (this._vis.peaks) {
+ const peakY = h - peakHeight;
+ ctx.drawImage(this._peak, 0, 0, 1, 1, x, peakY, x2 - x + 1, 1);
+ }
+ }
+}
+
+//? =============================== OSCILOSCOPE PAINTER ===============================
+
+type PaintWavFunction = (x: number, y: number, colorIndex: number) => void;
+// Return the average value in a slice of dataArray
+function sliceAverage(
+ dataArray: Uint8Array,
+ sliceWidth: number,
+ sliceNumber: number
+): number {
+ const start = sliceWidth * sliceNumber;
+ const end = start + sliceWidth;
+ let sum = 0;
+ for (let i = start; i < end; i++) {
+ sum += dataArray[i];
+ }
+ return sum / sliceWidth;
+}
+
+function slice1st(
+ dataArray: Uint8Array,
+ sliceWidth: number,
+ sliceNumber: number
+): number {
+ const start = sliceWidth * sliceNumber;
+ // const end = start + sliceWidth;
+ // let sum = 0;
+ // for (let i = start; i < end; i++) {
+ // sum += dataArray[i];
+ // }
+ return dataArray[start];
+}
+
+export class WavePaintHandler extends VisPaintHandler {
+ _analyser: AnalyserNode;
+ _bufferLength: number;
+ _lastX: number = 0;
+ _lastY: number = 0;
+ _dataArray: Uint8Array;
+ _pixelRatio: number; // 1 or 2
+ // Off-screen canvas for drawing perfect pixel (no blured lines)
+ _bar: HTMLCanvasElement = document.createElement("canvas");
+ _16h: HTMLCanvasElement = document.createElement("canvas"); // non-stretched
+ paintWav: PaintWavFunction;
+ _datafetched: boolean = false;
+ // _colors2: string[];
+
+ constructor(vis: Vis) {
+ super(vis);
+ this._analyser = this._vis.analyser!;
+ this._bufferLength = this._analyser.fftSize;
+ // this._octaveBuckets = octaveBucketsForBufferLength(this._bufferLength);
+ this._dataArray = new Uint8Array(this._bufferLength);
+
+ this._16h.width = 1;
+ this._16h.height = 16;
+ this._16h.setAttribute("width", "75");
+ this._16h.setAttribute("height", "16");
+
+ //* see https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio#monitoring_screen_resolution_or_zoom_level_changes
+ this._pixelRatio = window.devicePixelRatio || 1;
+
+ if (this._vis.oscStyle === "dots") {
+ this.paintWav = this.paintWavDot.bind(this);
+ } else if (this._vis.oscStyle === "solid") {
+ this.paintWav = this.paintWavSolid.bind(this);
+ } else {
+ this.paintWav = this.paintWavLine.bind(this);
+ }
+ }
+
+ prepare() {
+ if (!this._ctx) {
+ console.log("ctx not set!");
+ return;
+ }
+ const vis = this._vis;
+ // const groupId = vis._gammagroup;
+ // const gammaGroup = this._vis._uiRoot._getGammaGroup(groupId);
+
+ //? paint bar
+ this._bar.width = 1;
+ this._bar.height = 5;
+ this._bar.setAttribute("width", "1");
+ this._bar.setAttribute("height", "5");
+ const ctx = this._bar.getContext("2d");
+ if (ctx) {
+ for (let y = 0; y < 5; y++) {
+ // ctx.fillStyle = gammaGroup.transformColor(vis._colorOsc[y]);
+ ctx.fillStyle = vis.colors[18 + y];
+ ctx.fillRect(0, y, 1, y + 1);
+ }
+ }
+
+ // this._ctx = vis.canvas.getContext("2d");
+ this._ctx.imageSmoothingEnabled = false;
+ // @ts-ignore
+ this._ctx.mozImageSmoothingEnabled = false;
+ // @ts-ignore
+ this._ctx.webkitImageSmoothingEnabled = false;
+ // @ts-ignore
+ this._ctx.msImageSmoothingEnabled = false;
+
+ this._datafetched = false;
+ }
+
+ paintFrame() {
+ if (!this._ctx) return;
+ this._analyser.getByteTimeDomainData(this._dataArray);
+ // this._analyser.getFloatTimeDomainData(this._dataArray);
+ this._dataArray = this._dataArray.slice(0, 576);
+ const bandwidth = this._dataArray.length;
+
+ //* to save and see in excel (bar chart)
+ if (!this._datafetched) {
+ // console.log(JSON.stringify(Array.from(this._dataArray)))
+ this._datafetched = true;
+ }
+
+ const using16temporaryCanvas = this._vis.canvas!.height !== 16;
+
+ if (using16temporaryCanvas) {
+ this._ctx = this._16h.getContext("2d");
+ }
+ const width = this._ctx!.canvas.width;
+ const height = this._ctx!.canvas.height;
+ this._ctx!.clearRect(0, 0, width, height);
+
+ const sliceWidth = Math.floor(/* this._bufferLength */ bandwidth / width);
+
+ // Iterate over the width of the canvas in fixed 75 pixels.
+ for (let j = 0; j <= width; j++) {
+ // const amplitude = sliceAverage(this._dataArray, sliceWidth, j);
+ const amplitude = slice1st(this._dataArray, sliceWidth, j);
+ // -4 is set to off center the oscilloscope
+ // because completely centered looks a bit weird
+ const [y, colorIndex] = this.rangeByAmplitude(amplitude+4);
+ const x = j; /* * PIXEL_DENSITY */
+
+ this.paintWav(x, y, colorIndex);
+ }
+
+ if (using16temporaryCanvas) {
+ const canvas = this._vis.canvas!;
+ const visCtx = canvas.getContext("2d")!;
+ visCtx.clearRect(0, 0, canvas.width, canvas.height);
+ visCtx.drawImage(
+ this._16h,
+ 0,
+ 0, // sx,sy
+ 75,
+ 16, // sw,sh
+ 0,
+ 0, //dx,dy
+ canvas.width,
+ canvas.height //dw,dh
+ );
+ }
+ }
+
+ /**
+ *
+ * @param amplitude 0..255
+ * @returns xy.Y(top to bottom), colorOscIndex
+ */
+ rangeByAmplitude(amplitude: number): [number, number] {
+ //odjasdjflasjdf;lasjdf;asjd;fjasd;fsajdf
+ if (amplitude >= 184) {
+ return [0, 3];
+ }
+ if (amplitude >= 176) {
+ return [1, 3];
+ }
+ if (amplitude >= 168) {
+ return [2, 2];
+ }
+ if (amplitude >= 160) {
+ return [3, 2];
+ }
+ if (amplitude >= 152) {
+ return [4, 1];
+ }
+ if (amplitude >= 144) {
+ return [5, 1];
+ }
+ if (amplitude >= 136) {
+ return [6, 0];
+ }
+ if (amplitude >= 128) {
+ return [7, 0];
+ }
+ if (amplitude >= 120) {
+ return [8, 1];
+ }
+ if (amplitude >= 112) {
+ return [9, 1];
+ }
+ if (amplitude >= 104) {
+ return [10, 2];
+ }
+ if (amplitude >= 96) {
+ return [11, 2];
+ }
+ if (amplitude >= 88) {
+ return [12, 3];
+ }
+ if (amplitude >= 80) {
+ return [13, 3];
+ }
+ if (amplitude >= 72) {
+ return [14, 4];
+ }
+ // if(amplitude>=56){return [15, 4]}
+ return [15, 4];
+ }
+
+ paintWavLine(x: number, y: number, colorIndex: number) {
+ if (x === 0) this._lastY = y;
+
+ let top = y;
+ let bottom = this._lastY;
+ this._lastY = y;
+
+ if (bottom < top) {
+ [bottom, top] = [top, bottom];
+ top++; //top++, that emulates Winamp's/WACUP's OSC behavior correctly
+ }
+ // const h = bottom - top + 1;
+
+ for (y = top; y <= bottom; y++) {
+ this._ctx!.drawImage(
+ this._bar,
+ 0,
+ colorIndex, // sx,sy
+ 1,
+ 1, // sw,sh
+ x, y, //dx,dy, dy is upside down because Winamp3/Winamp5 does it, so we have to emulate it
+ //set to x, y, for Winamp Classic behavior
+ 1,
+ 1 //dw,dh
+ );
+ }
+ }
+
+ paintWavDot(x: number, y: number, colorIndex: number) {
+ this._ctx!.drawImage(
+ this._bar,
+ 0,
+ colorIndex, // sx,sy
+ 1,
+ 1, // sw,sh
+ x, y, //dx,dy, dy is upside down because Winamp3/Winamp5 does it, so we have to emulate it
+ //set to x, y, for Winamp Classic behavior
+ 1,
+ 1 //dw,dh
+ );
+ }
+
+ paintWavSolid(x: number, y: number, colorIndex: number) {
+ let top, bottom;
+ if (y >= 8) {
+ top = 8;
+ bottom = y;
+ } else {
+ top = y;
+ bottom = 7;
+ }
+ // const h = bottom - top + 1;
+ for (y = top; y <= bottom; y++) {
+ this._ctx!.drawImage(
+ this._bar,
+ 0,
+ colorIndex, // sx,sy
+ 1,
+ 1, // sw,sh
+ x, y, //dx,dy, dy is upside down because Winamp3/Winamp5 does it, so we have to emulate it
+ //set to x, y, for Winamp Classic behavior
+ 1,
+ 1 //dw,dh
+ );
+ }
+ }
+}
+
+export class NoVisualizerHandler extends VisPaintHandler {
+ cleared: boolean = false;
+ prepare() {
+ this.cleared = false;
+ }
+
+ paintFrame() {
+ if (!this._ctx) return;
+ const ctx = this._ctx;
+ ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
+ this.cleared = true;
+ }
+}
diff --git a/packages/webamp/package.json b/packages/webamp/package.json
index 846d8b1893..4f8ba0ad0f 100644
--- a/packages/webamp/package.json
+++ b/packages/webamp/package.json
@@ -106,6 +106,12 @@
},
"homepage": "https://github.com/captbaritone/webamp/",
"devDependencies": {
+ "@babel/core": "^7.0.0-0",
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
+ "@babel/plugin-proposal-optional-chaining": "^7.21.0",
+ "@babel/preset-env": "^7.25.3",
+ "@babel/preset-typescript": "^7.24.7",
"@parcel/reporter-bundle-analyzer": "^2.8.2",
"@types/classnames": "^2.2.6",
"@types/fscreen": "^1.0.1",
diff --git a/yarn.lock b/yarn.lock
index ef506dea4b..fdb49c5f32 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -177,11 +177,45 @@
"@babel/highlight" "^7.24.2"
picocolors "^1.0.0"
+"@babel/code-frame@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
+ integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
+ dependencies:
+ "@babel/highlight" "^7.24.7"
+ picocolors "^1.0.0"
+
"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
+"@babel/compat-data@^7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5"
+ integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==
+
+"@babel/core@^7.0.0-0":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77"
+ integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.25.0"
+ "@babel/helper-compilation-targets" "^7.25.2"
+ "@babel/helper-module-transforms" "^7.25.2"
+ "@babel/helpers" "^7.25.0"
+ "@babel/parser" "^7.25.0"
+ "@babel/template" "^7.25.0"
+ "@babel/traverse" "^7.25.2"
+ "@babel/types" "^7.25.2"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.11.4", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.17.10", "@babel/core@^7.18.6", "@babel/core@^7.20.0", "@babel/core@^7.20.7", "@babel/core@^7.23.9", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717"
@@ -222,6 +256,16 @@
"@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1"
+"@babel/generator@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e"
+ integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==
+ dependencies:
+ "@babel/types" "^7.25.0"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^2.5.1"
+
"@babel/helper-annotate-as-pure@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
@@ -229,6 +273,13 @@
dependencies:
"@babel/types" "^7.22.5"
+"@babel/helper-annotate-as-pure@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab"
+ integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956"
@@ -236,6 +287,14 @@
dependencies:
"@babel/types" "^7.22.15"
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3"
+ integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6":
version "7.23.6"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991"
@@ -247,6 +306,17 @@
lru-cache "^5.1.1"
semver "^6.3.1"
+"@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c"
+ integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==
+ dependencies:
+ "@babel/compat-data" "^7.25.2"
+ "@babel/helper-validator-option" "^7.24.8"
+ browserslist "^4.23.1"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3"
@@ -262,6 +332,19 @@
"@babel/helper-split-export-declaration" "^7.22.6"
semver "^6.3.1"
+"@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz#a109bf9c3d58dfed83aaf42e85633c89f43a6253"
+ integrity sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-member-expression-to-functions" "^7.24.8"
+ "@babel/helper-optimise-call-expression" "^7.24.7"
+ "@babel/helper-replace-supers" "^7.25.0"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/traverse" "^7.25.0"
+ semver "^6.3.1"
+
"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1"
@@ -271,6 +354,15 @@
regexpu-core "^5.3.1"
semver "^6.3.1"
+"@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9"
+ integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ regexpu-core "^5.3.1"
+ semver "^6.3.1"
+
"@babel/helper-define-polyfill-provider@^0.6.1":
version "0.6.1"
resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd"
@@ -309,6 +401,14 @@
dependencies:
"@babel/types" "^7.23.0"
+"@babel/helper-member-expression-to-functions@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6"
+ integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==
+ dependencies:
+ "@babel/traverse" "^7.24.8"
+ "@babel/types" "^7.24.8"
+
"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3":
version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
@@ -316,6 +416,14 @@
dependencies:
"@babel/types" "^7.24.0"
+"@babel/helper-module-imports@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
+ integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
"@babel/helper-module-transforms@^7.23.3":
version "7.23.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1"
@@ -327,6 +435,16 @@
"@babel/helper-split-export-declaration" "^7.22.6"
"@babel/helper-validator-identifier" "^7.22.20"
+"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6"
+ integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.24.7"
+ "@babel/helper-simple-access" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.24.7"
+ "@babel/traverse" "^7.25.2"
+
"@babel/helper-optimise-call-expression@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
@@ -334,11 +452,23 @@
dependencies:
"@babel/types" "^7.22.5"
+"@babel/helper-optimise-call-expression@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f"
+ integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==
+ dependencies:
+ "@babel/types" "^7.24.7"
+
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a"
integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==
+"@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878"
+ integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==
+
"@babel/helper-remap-async-to-generator@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0"
@@ -348,6 +478,15 @@
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-wrap-function" "^7.22.20"
+"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e"
+ integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-wrap-function" "^7.25.0"
+ "@babel/traverse" "^7.25.0"
+
"@babel/helper-replace-supers@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1"
@@ -357,6 +496,15 @@
"@babel/helper-member-expression-to-functions" "^7.23.0"
"@babel/helper-optimise-call-expression" "^7.22.5"
+"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9"
+ integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.24.8"
+ "@babel/helper-optimise-call-expression" "^7.24.7"
+ "@babel/traverse" "^7.25.0"
+
"@babel/helper-simple-access@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
@@ -364,6 +512,14 @@
dependencies:
"@babel/types" "^7.22.5"
+"@babel/helper-simple-access@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
+ integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
@@ -371,6 +527,14 @@
dependencies:
"@babel/types" "^7.22.5"
+"@babel/helper-skip-transparent-expression-wrappers@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9"
+ integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==
+ dependencies:
+ "@babel/traverse" "^7.24.7"
+ "@babel/types" "^7.24.7"
+
"@babel/helper-split-export-declaration@^7.22.6":
version "7.22.6"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
@@ -383,16 +547,31 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
+"@babel/helper-string-parser@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d"
+ integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
+
"@babel/helper-validator-identifier@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+"@babel/helper-validator-identifier@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
+ integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
+
"@babel/helper-validator-option@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
+"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d"
+ integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==
+
"@babel/helper-wrap-function@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569"
@@ -402,6 +581,15 @@
"@babel/template" "^7.22.15"
"@babel/types" "^7.22.19"
+"@babel/helper-wrap-function@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81"
+ integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==
+ dependencies:
+ "@babel/template" "^7.25.0"
+ "@babel/traverse" "^7.25.0"
+ "@babel/types" "^7.25.0"
+
"@babel/helpers@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6"
@@ -411,6 +599,14 @@
"@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0"
+"@babel/helpers@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a"
+ integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==
+ dependencies:
+ "@babel/template" "^7.25.0"
+ "@babel/types" "^7.25.0"
+
"@babel/highlight@^7.10.4", "@babel/highlight@^7.24.2":
version "7.24.2"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26"
@@ -421,11 +617,28 @@
js-tokens "^4.0.0"
picocolors "^1.0.0"
+"@babel/highlight@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
+ integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.24.7"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.7", "@babel/parser@^7.16.8", "@babel/parser@^7.18.6", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==
+"@babel/parser@^7.25.0", "@babel/parser@^7.25.3":
+ version "7.25.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065"
+ integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==
+ dependencies:
+ "@babel/types" "^7.25.2"
+
"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1"
@@ -434,6 +647,21 @@
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3":
+ version "7.25.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f"
+ integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/traverse" "^7.25.3"
+
+"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73"
+ integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf"
@@ -441,6 +669,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73"
+ integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3"
@@ -450,6 +685,15 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
"@babel/plugin-transform-optional-chaining" "^7.24.1"
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89"
+ integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/plugin-transform-optional-chaining" "^7.24.7"
+
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988"
@@ -458,7 +702,15 @@
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-proposal-class-properties@^7.16.0":
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb"
+ integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/traverse" "^7.25.0"
+
+"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
@@ -475,7 +727,7 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-decorators" "^7.24.1"
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0":
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
@@ -491,7 +743,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-proposal-optional-chaining@^7.16.0":
+"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.21.0":
version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea"
integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==
@@ -576,6 +828,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-syntax-import-assertions@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778"
+ integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-syntax-import-attributes@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093"
@@ -583,6 +842,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-syntax-import-attributes@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca"
+ integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
@@ -604,6 +870,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-syntax-jsx@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d"
+ integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
@@ -667,6 +940,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-syntax-typescript@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c"
+ integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
@@ -682,6 +962,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-arrow-functions@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514"
+ integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-async-generator-functions@^7.24.3":
version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89"
@@ -692,6 +979,16 @@
"@babel/helper-remap-async-to-generator" "^7.22.20"
"@babel/plugin-syntax-async-generators" "^7.8.4"
+"@babel/plugin-transform-async-generator-functions@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz#b785cf35d73437f6276b1e30439a57a50747bddf"
+ integrity sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-remap-async-to-generator" "^7.25.0"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/traverse" "^7.25.0"
+
"@babel/plugin-transform-async-to-generator@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4"
@@ -701,6 +998,15 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-remap-async-to-generator" "^7.22.20"
+"@babel/plugin-transform-async-to-generator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc"
+ integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==
+ dependencies:
+ "@babel/helper-module-imports" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-remap-async-to-generator" "^7.24.7"
+
"@babel/plugin-transform-block-scoped-functions@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380"
@@ -708,6 +1014,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-block-scoped-functions@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f"
+ integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-block-scoping@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012"
@@ -715,6 +1028,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-block-scoping@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac"
+ integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
"@babel/plugin-transform-class-properties@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29"
@@ -723,6 +1043,14 @@
"@babel/helper-create-class-features-plugin" "^7.24.1"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-class-properties@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834"
+ integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-class-static-block@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4"
@@ -732,6 +1060,15 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
+"@babel/plugin-transform-class-static-block@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d"
+ integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
"@babel/plugin-transform-classes@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1"
@@ -746,6 +1083,18 @@
"@babel/helper-split-export-declaration" "^7.22.6"
globals "^11.1.0"
+"@babel/plugin-transform-classes@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz#63122366527d88e0ef61b612554fe3f8c793991e"
+ integrity sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-compilation-targets" "^7.24.8"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-replace-supers" "^7.25.0"
+ "@babel/traverse" "^7.25.0"
+ globals "^11.1.0"
+
"@babel/plugin-transform-computed-properties@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7"
@@ -754,6 +1103,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/template" "^7.24.0"
+"@babel/plugin-transform-computed-properties@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707"
+ integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/template" "^7.24.7"
+
"@babel/plugin-transform-destructuring@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345"
@@ -761,6 +1118,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-destructuring@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550"
+ integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
"@babel/plugin-transform-dotall-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13"
@@ -769,6 +1133,14 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-dotall-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0"
+ integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-duplicate-keys@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88"
@@ -776,6 +1148,21 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-duplicate-keys@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee"
+ integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
+"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604"
+ integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.25.0"
+ "@babel/helper-plugin-utils" "^7.24.8"
+
"@babel/plugin-transform-dynamic-import@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd"
@@ -784,6 +1171,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
+"@babel/plugin-transform-dynamic-import@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4"
+ integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
"@babel/plugin-transform-exponentiation-operator@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4"
@@ -792,6 +1187,14 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-exponentiation-operator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d"
+ integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-export-namespace-from@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd"
@@ -800,6 +1203,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+"@babel/plugin-transform-export-namespace-from@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197"
+ integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
"@babel/plugin-transform-flow-strip-types@^7.16.0":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz#fa8d0a146506ea195da1671d38eed459242b2dcc"
@@ -816,6 +1227,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+"@babel/plugin-transform-for-of@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70"
+ integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+
"@babel/plugin-transform-function-name@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361"
@@ -825,6 +1244,15 @@
"@babel/helper-function-name" "^7.23.0"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-function-name@^7.25.1":
+ version "7.25.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37"
+ integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.24.8"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/traverse" "^7.25.1"
+
"@babel/plugin-transform-json-strings@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7"
@@ -833,6 +1261,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-json-strings" "^7.8.3"
+"@babel/plugin-transform-json-strings@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a"
+ integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
"@babel/plugin-transform-literals@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096"
@@ -840,6 +1276,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-literals@^7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3"
+ integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
"@babel/plugin-transform-logical-assignment-operators@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40"
@@ -848,6 +1291,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+"@babel/plugin-transform-logical-assignment-operators@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0"
+ integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
"@babel/plugin-transform-member-expression-literals@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489"
@@ -855,6 +1306,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-member-expression-literals@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df"
+ integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-modules-amd@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39"
@@ -863,6 +1321,14 @@
"@babel/helper-module-transforms" "^7.23.3"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-modules-amd@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7"
+ integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-modules-commonjs@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9"
@@ -872,6 +1338,15 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-simple-access" "^7.22.5"
+"@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c"
+ integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.24.8"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-simple-access" "^7.24.7"
+
"@babel/plugin-transform-modules-systemjs@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e"
@@ -882,6 +1357,16 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-validator-identifier" "^7.22.20"
+"@babel/plugin-transform-modules-systemjs@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33"
+ integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.25.0"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-validator-identifier" "^7.24.7"
+ "@babel/traverse" "^7.25.0"
+
"@babel/plugin-transform-modules-umd@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef"
@@ -890,6 +1375,14 @@
"@babel/helper-module-transforms" "^7.23.3"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-modules-umd@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8"
+ integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f"
@@ -898,6 +1391,14 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
+"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923"
+ integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-new-target@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34"
@@ -905,6 +1406,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-new-target@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00"
+ integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988"
@@ -913,6 +1421,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120"
+ integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
"@babel/plugin-transform-numeric-separator@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8"
@@ -921,6 +1437,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
+"@babel/plugin-transform-numeric-separator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63"
+ integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
"@babel/plugin-transform-object-rest-spread@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff"
@@ -931,6 +1455,16 @@
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-transform-parameters" "^7.24.1"
+"@babel/plugin-transform-object-rest-spread@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6"
+ integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.24.7"
+
"@babel/plugin-transform-object-super@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520"
@@ -939,6 +1473,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-replace-supers" "^7.24.1"
+"@babel/plugin-transform-object-super@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be"
+ integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-replace-supers" "^7.24.7"
+
"@babel/plugin-transform-optional-catch-binding@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da"
@@ -947,6 +1489,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+"@babel/plugin-transform-optional-catch-binding@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4"
+ integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
"@babel/plugin-transform-optional-chaining@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6"
@@ -956,6 +1506,15 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
+"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d"
+ integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
"@babel/plugin-transform-parameters@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510"
@@ -963,6 +1522,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-parameters@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68"
+ integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-private-methods@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a"
@@ -971,6 +1537,14 @@
"@babel/helper-create-class-features-plugin" "^7.24.1"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-private-methods@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e"
+ integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-private-property-in-object@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a"
@@ -981,6 +1555,16 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+"@babel/plugin-transform-private-property-in-object@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061"
+ integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-create-class-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
"@babel/plugin-transform-property-literals@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825"
@@ -988,6 +1572,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-property-literals@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc"
+ integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-react-constant-elements@^7.12.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz#d493a0918b9fdad7540f5afd9b5eb5c52500d18d"
@@ -1036,6 +1627,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
regenerator-transform "^0.15.2"
+"@babel/plugin-transform-regenerator@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8"
+ integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ regenerator-transform "^0.15.2"
+
"@babel/plugin-transform-reserved-words@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1"
@@ -1043,6 +1642,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-reserved-words@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4"
+ integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-runtime@^7.16.4":
version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f"
@@ -1062,6 +1668,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-shorthand-properties@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73"
+ integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-spread@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391"
@@ -1070,6 +1683,14 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+"@babel/plugin-transform-spread@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3"
+ integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+
"@babel/plugin-transform-sticky-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9"
@@ -1077,6 +1698,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-sticky-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb"
+ integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-template-literals@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7"
@@ -1084,6 +1712,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-template-literals@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8"
+ integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-typeof-symbol@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7"
@@ -1091,6 +1726,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-typeof-symbol@^7.24.8":
+ version "7.24.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c"
+ integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.8"
+
"@babel/plugin-transform-typescript@^7.24.1":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz#03e0492537a4b953e491f53f2bc88245574ebd15"
@@ -1101,6 +1743,17 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-typescript" "^7.24.1"
+"@babel/plugin-transform-typescript@^7.24.7":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add"
+ integrity sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.0"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/plugin-syntax-typescript" "^7.24.7"
+
"@babel/plugin-transform-unicode-escapes@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4"
@@ -1108,6 +1761,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-unicode-escapes@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e"
+ integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-unicode-property-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e"
@@ -1116,6 +1776,14 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-unicode-property-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd"
+ integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-unicode-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385"
@@ -1124,6 +1792,14 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-unicode-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f"
+ integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/plugin-transform-unicode-sets-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f"
@@ -1132,6 +1808,14 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
+"@babel/plugin-transform-unicode-sets-regex@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9"
+ integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.24.7"
+
"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.11.5", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.17.10", "@babel/preset-env@^7.18.6", "@babel/preset-env@^7.20.2":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b"
@@ -1219,6 +1903,95 @@
core-js-compat "^3.31.0"
semver "^6.3.1"
+"@babel/preset-env@^7.25.3":
+ version "7.25.3"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.3.tgz#0bf4769d84ac51d1073ab4a86f00f30a3a83c67c"
+ integrity sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==
+ dependencies:
+ "@babel/compat-data" "^7.25.2"
+ "@babel/helper-compilation-targets" "^7.25.2"
+ "@babel/helper-plugin-utils" "^7.24.8"
+ "@babel/helper-validator-option" "^7.24.8"
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3"
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0"
+ "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-import-assertions" "^7.24.7"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+ "@babel/plugin-transform-arrow-functions" "^7.24.7"
+ "@babel/plugin-transform-async-generator-functions" "^7.25.0"
+ "@babel/plugin-transform-async-to-generator" "^7.24.7"
+ "@babel/plugin-transform-block-scoped-functions" "^7.24.7"
+ "@babel/plugin-transform-block-scoping" "^7.25.0"
+ "@babel/plugin-transform-class-properties" "^7.24.7"
+ "@babel/plugin-transform-class-static-block" "^7.24.7"
+ "@babel/plugin-transform-classes" "^7.25.0"
+ "@babel/plugin-transform-computed-properties" "^7.24.7"
+ "@babel/plugin-transform-destructuring" "^7.24.8"
+ "@babel/plugin-transform-dotall-regex" "^7.24.7"
+ "@babel/plugin-transform-duplicate-keys" "^7.24.7"
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0"
+ "@babel/plugin-transform-dynamic-import" "^7.24.7"
+ "@babel/plugin-transform-exponentiation-operator" "^7.24.7"
+ "@babel/plugin-transform-export-namespace-from" "^7.24.7"
+ "@babel/plugin-transform-for-of" "^7.24.7"
+ "@babel/plugin-transform-function-name" "^7.25.1"
+ "@babel/plugin-transform-json-strings" "^7.24.7"
+ "@babel/plugin-transform-literals" "^7.25.2"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.24.7"
+ "@babel/plugin-transform-member-expression-literals" "^7.24.7"
+ "@babel/plugin-transform-modules-amd" "^7.24.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.8"
+ "@babel/plugin-transform-modules-systemjs" "^7.25.0"
+ "@babel/plugin-transform-modules-umd" "^7.24.7"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7"
+ "@babel/plugin-transform-new-target" "^7.24.7"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7"
+ "@babel/plugin-transform-numeric-separator" "^7.24.7"
+ "@babel/plugin-transform-object-rest-spread" "^7.24.7"
+ "@babel/plugin-transform-object-super" "^7.24.7"
+ "@babel/plugin-transform-optional-catch-binding" "^7.24.7"
+ "@babel/plugin-transform-optional-chaining" "^7.24.8"
+ "@babel/plugin-transform-parameters" "^7.24.7"
+ "@babel/plugin-transform-private-methods" "^7.24.7"
+ "@babel/plugin-transform-private-property-in-object" "^7.24.7"
+ "@babel/plugin-transform-property-literals" "^7.24.7"
+ "@babel/plugin-transform-regenerator" "^7.24.7"
+ "@babel/plugin-transform-reserved-words" "^7.24.7"
+ "@babel/plugin-transform-shorthand-properties" "^7.24.7"
+ "@babel/plugin-transform-spread" "^7.24.7"
+ "@babel/plugin-transform-sticky-regex" "^7.24.7"
+ "@babel/plugin-transform-template-literals" "^7.24.7"
+ "@babel/plugin-transform-typeof-symbol" "^7.24.8"
+ "@babel/plugin-transform-unicode-escapes" "^7.24.7"
+ "@babel/plugin-transform-unicode-property-regex" "^7.24.7"
+ "@babel/plugin-transform-unicode-regex" "^7.24.7"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.24.7"
+ "@babel/preset-modules" "0.1.6-no-external-plugins"
+ babel-plugin-polyfill-corejs2 "^0.4.10"
+ babel-plugin-polyfill-corejs3 "^0.10.4"
+ babel-plugin-polyfill-regenerator "^0.6.1"
+ core-js-compat "^3.37.1"
+ semver "^6.3.1"
+
"@babel/preset-modules@0.1.6-no-external-plugins":
version "0.1.6-no-external-plugins"
resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
@@ -1251,6 +2024,17 @@
"@babel/plugin-transform-modules-commonjs" "^7.24.1"
"@babel/plugin-transform-typescript" "^7.24.1"
+"@babel/preset-typescript@^7.24.7":
+ version "7.24.7"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1"
+ integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-validator-option" "^7.24.7"
+ "@babel/plugin-syntax-jsx" "^7.24.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.24.7"
+ "@babel/plugin-transform-typescript" "^7.24.7"
+
"@babel/regjsgen@^0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
@@ -1279,6 +2063,15 @@
"@babel/parser" "^7.24.0"
"@babel/types" "^7.24.0"
+"@babel/template@^7.24.7", "@babel/template@^7.25.0":
+ version "7.25.0"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a"
+ integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/parser" "^7.25.0"
+ "@babel/types" "^7.25.0"
+
"@babel/traverse@^7.1.6", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.6", "@babel/traverse@^7.24.1", "@babel/traverse@^7.7.2":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c"
@@ -1295,6 +2088,19 @@
debug "^4.3.1"
globals "^11.1.0"
+"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3":
+ version "7.25.3"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490"
+ integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==
+ dependencies:
+ "@babel/code-frame" "^7.24.7"
+ "@babel/generator" "^7.25.0"
+ "@babel/parser" "^7.25.3"
+ "@babel/template" "^7.25.0"
+ "@babel/types" "^7.25.2"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.16.8", "@babel/types@^7.2.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
@@ -1304,6 +2110,15 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
+"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2":
+ version "7.25.2"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125"
+ integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==
+ dependencies:
+ "@babel/helper-string-parser" "^7.24.8"
+ "@babel/helper-validator-identifier" "^7.24.7"
+ to-fast-properties "^2.0.0"
+
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@@ -8738,6 +9553,16 @@ browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^
node-releases "^2.0.14"
update-browserslist-db "^1.0.13"
+browserslist@^4.23.1, browserslist@^4.23.3:
+ version "4.23.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800"
+ integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==
+ dependencies:
+ caniuse-lite "^1.0.30001646"
+ electron-to-chromium "^1.5.4"
+ node-releases "^2.0.18"
+ update-browserslist-db "^1.1.0"
+
bs-logger@0.x:
version "0.2.6"
resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
@@ -9155,6 +9980,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001587, can
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz#ca12d7330dd8bcb784557eb9aa64f0037870d9d6"
integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==
+caniuse-lite@^1.0.30001646:
+ version "1.0.30001651"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138"
+ integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==
+
canvas-mock@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/canvas-mock/-/canvas-mock-0.0.0.tgz#9f10c378b82ecef5a20020cf9526891db7661912"
@@ -10156,6 +10986,13 @@ core-js-compat@^3.31.0, core-js-compat@^3.36.1:
dependencies:
browserslist "^4.23.0"
+core-js-compat@^3.37.1:
+ version "3.38.0"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.0.tgz#d93393b1aa346b6ee683377b0c31172ccfe607aa"
+ integrity sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==
+ dependencies:
+ browserslist "^4.23.3"
+
core-js-pure@^3.23.3:
version "3.36.1"
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.36.1.tgz#1461c89e76116528b54eba20a0aff30164087a94"
@@ -11686,6 +12523,11 @@ electron-to-chromium@^1.4.668:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.726.tgz#9ca95f19e9a0d63675e838b24681182203e40a30"
integrity sha512-xtjfBXn53RORwkbyKvDfTajtnTp0OJoPOIBzXvkNbb7+YYvCHJflba3L7Txyx/6Fov3ov2bGPr/n5MTixmPhdQ==
+electron-to-chromium@^1.5.4:
+ version "1.5.7"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.7.tgz#425d2a7f76ecfa564fdca1040d11fb1979851f3c"
+ integrity sha512-6FTNWIWMxMy/ZY6799nBlPtF1DFDQ6VQJ7yyDP27SJNt5lwtQ5ufqVvHylb3fdQefvRcgA3fKcFMJi9OLwBRNw==
+
elf-cam@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/elf-cam/-/elf-cam-0.1.1.tgz#46883b10835ed9e417860636a870d57490ce9eda"
@@ -12422,7 +13264,7 @@ esbuild@~0.9.0:
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.9.7.tgz#ea0d639cbe4b88ec25fbed4d6ff00c8d788ef70b"
integrity sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==
-escalade@^3.1.1:
+escalade@^3.1.1, escalade@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
@@ -20893,6 +21735,11 @@ node-releases@^2.0.14:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+node-releases@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
+ integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+
node-source-walk@^4.0.0, node-source-walk@^4.2.0, node-source-walk@^4.2.2:
version "4.3.0"
resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-4.3.0.tgz#8336b56cfed23ac5180fe98f1e3bb6b11fd5317c"
@@ -22205,6 +23052,11 @@ picocolors@^0.2.1:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
+picocolors@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
+ integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
+
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
@@ -27762,6 +28614,14 @@ update-browserslist-db@^1.0.13:
escalade "^3.1.1"
picocolors "^1.0.0"
+update-browserslist-db@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
+ integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
+ dependencies:
+ escalade "^3.1.2"
+ picocolors "^1.0.1"
+
update-notifier@^4.0.0, update-notifier@^4.1.0:
version "4.1.3"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3"
From 09fc22989ff5d628365483e4afdd17870ee837bb Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Fri, 16 Aug 2024 00:43:21 +0200
Subject: [PATCH 02/19] Fixed analyzer responding to data immediately Various
code comments explaining the purpose behind the new implementation Peaks are
no longer visible at the bottom
---
packages/webamp/js/components/Vis.tsx | 2 +-
packages/webamp/js/components/VisPainter.ts | 58 +++++++++++++--------
2 files changed, 38 insertions(+), 22 deletions(-)
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index e94ae508ab..0a851aecd6 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -172,7 +172,7 @@ export default function Vis({ analyser }: Props) {
const loop = () => {
analyser.getByteTimeDomainData(dataArray);
for (let i = 0; i < dataArray.length; i++) {
- in_wavedata[i] = dataArray[i] - 128;
+ in_wavedata[i] = (dataArray[i] - 128) / 2;
}
fft.timeToFrequencyDomain(in_wavedata, out_spectraldata);
painter.paintFrame();
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index 9a06cfea52..c5f0a15a95 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -10,6 +10,15 @@ export interface Vis {
}
import { out_spectraldata } from "./Vis";
+let sapeaks = new Int16Array(76).fill(0);
+let sadata2 = new Float32Array(76).fill(0);
+let sadata = new Int16Array(76).fill(0);
+let safalloff = new Float32Array(76).fill(0);
+let sample = new Float32Array(76).fill(0);
+let barPeak = new Int16Array(76).fill(0); // Needs to be specified as Int16 else the peaks don't behave as they should
+let i: number;
+let uVar12: number;
+
type ColorTriplet = string;
/**
@@ -239,15 +248,6 @@ export class BarPaintHandler extends VisPaintHandler {
ctx.clearRect(0, 0, w, h);
ctx.fillStyle = this._color;
- this._analyser.getByteFrequencyData(this._dataArray);
- const heightMultiplier = h / 256;
-
- let sapeaks = new Float32Array(76).fill(0);
- let sadata2 = new Float32Array(76).fill(0);
- let sadata = new Int8Array(76).fill(0);
- let safalloff = new Float32Array(76).fill(0);
- let sample = new Float32Array(76).fill(0);
-
let maxFreqIndex = 512;
let logMaxFreqIndex = Math.log10(maxFreqIndex);
let logMinFreqIndex = 0;
@@ -259,6 +259,9 @@ export class BarPaintHandler extends VisPaintHandler {
let targetSize = 75;
+ // This is to roughly emulate the Analyzer in more modern versions of Winamp
+ // 2.x and early 5.x versions had a completely linear(?) FFT, if so desired the
+ // scale variable can be set to 1.0
for (let x = 0; x < targetSize; x++) {
// Linear interpolation between linear and log scaling
let linearIndex = x / (targetSize - 1) * (maxFreqIndex - 1);
@@ -288,43 +291,56 @@ export class BarPaintHandler extends VisPaintHandler {
}
for (let x = 0; x < 76; x++) {
- let i: number;
- let uVar12: number;
+ // Based on research of looking at Winamp 5.666 and 2.63 executables
+ // Right now it's hard coded to assume we want thick bands
+ // so in the future, should we have a preferences style window
+ // we should be able to change the width of the bands here
i = (i = x & 0xfffffffc);
- uVar12 = (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 64;
+ uVar12 = (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 48;
sadata[x] = uVar12;
if (sadata[x] >= 15) {
sadata[x] = 15;
}
- safalloff[i] -= 24 / 16.0;
+ safalloff[x] -= 12 / 16.0;
+ // Possible bar fall off values are
+ // 3, 6, 12, 16, 32
+ // Should there ever be some form of config options,
+ // these should be used
+ // 12 is the default of a fresh new Winamp installation
if (safalloff[x] <= sadata[x]) {
safalloff[x] = sadata[x];
}
- if (sapeaks[x] <= (safalloff[x] * 256)) {
+ if (sapeaks[x] <= (Math.round(safalloff[x] * 256))) {
sapeaks[x] = safalloff[x] * 256;
- sadata2[i] = 3.0;
+ sadata2[x] = 3.0;
}
- const barPeak = sapeaks[x] / 256;
- sapeaks[x] -= sadata2[x];
- sadata2[x] *= 1.05;
+ barPeak[x] = sapeaks[x]/256;
+
+ sapeaks[x] -= Math.round(sadata2[x]);
+ sadata2[x] *= 1.1;
+ // Possible peak fall off values are
+ // 1.05f, 1.1f, 1.2f, 1.4f, 1.6f
+ // 1.1f is the default of a fresh new Winamp installation
if (sapeaks[x] <= 0) {
sapeaks[x] = 0;
}
- //console.log(safalloff[0]);
+ if (Math.round(barPeak[x]) < 1){
+ barPeak[x] = -3; // Push peaks outside the viewable area, this isn't a Modern Skin!
+ }
if (!(x == i + 3)) {
this.paintBar(
ctx,
x,
x,
- safalloff[x],
- barPeak
+ Math.round(safalloff[x]),
+ barPeak[x] + 1
);
}
}
From 9c80ef5d7cb8ab015b8478e5e82f7cef12ffea64 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Fri, 16 Aug 2024 08:38:22 +0200
Subject: [PATCH 03/19] Added support for windowshade mode (colors are broken)
Replaced old Visualizer in the Playlist Editor in favor of the new Visualizer
---
.../webamp/js/components/MainWindow/index.tsx | 1 -
.../js/components/PlaylistWindow/index.tsx | 7 +-
packages/webamp/js/components/Vis.tsx | 9 +-
packages/webamp/js/components/VisPainter.ts | 225 ++++++++++--------
4 files changed, 128 insertions(+), 114 deletions(-)
diff --git a/packages/webamp/js/components/MainWindow/index.tsx b/packages/webamp/js/components/MainWindow/index.tsx
index 059763061d..1b231da72a 100644
--- a/packages/webamp/js/components/MainWindow/index.tsx
+++ b/packages/webamp/js/components/MainWindow/index.tsx
@@ -8,7 +8,6 @@ import MiniTime from "../MiniTime";
import ClickedDiv from "../ClickedDiv";
import ContextMenuTarget from "../ContextMenuTarget";
-import Visualizer from "../Visualizer";
import Vis from "../Vis";
import ActionButtons from "./ActionButtons";
import MainBalance from "./MainBalance";
diff --git a/packages/webamp/js/components/PlaylistWindow/index.tsx b/packages/webamp/js/components/PlaylistWindow/index.tsx
index 3f51567436..a9fb43ed99 100644
--- a/packages/webamp/js/components/PlaylistWindow/index.tsx
+++ b/packages/webamp/js/components/PlaylistWindow/index.tsx
@@ -7,7 +7,7 @@ import * as Selectors from "../../selectors";
import { clamp } from "../../utils";
import DropTarget from "../DropTarget";
-import Visualizer from "../Visualizer";
+import Vis from "../Vis";
import PlaylistShade from "./PlaylistShade";
import AddMenu from "./AddMenu";
import RemoveMenu from "./RemoveMenu";
@@ -140,10 +140,7 @@ function PlaylistWindow({ analyser }: Props) {
{activateVisualizer && (
-
+
)}
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index 0a851aecd6..27b48ee253 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -32,6 +32,9 @@ const PIXEL_DENSITY = 1;
const fft = new FFT();
const samplesIn = 1024; // Example input size
const samplesOut = 512; // Example output size
+export let renderWidth: number;
+export let renderHeight: number;
+export let windowShade: boolean | undefined;
fft.init(samplesIn, samplesOut, 1, 1.0, true);
let in_wavedata = new Float32Array(samplesIn); // Fill this with your input data
@@ -84,9 +87,9 @@ export default function Vis({ analyser }: Props) {
in_wavedata = new Float32Array(dataArray.length);
const toggleVisualizerStyle = useActionCreator(Actions.toggleVisualizerStyle);
- const windowShade = getWindowShade("main");
- const renderWidth = windowShade ? 38 : 75;
- const renderHeight = windowShade ? 5 : 16;
+ windowShade = getWindowShade("main");
+ renderWidth = windowShade ? 38 : 75;
+ renderHeight = windowShade ? 5 : 16;
const width = renderWidth * PIXEL_DENSITY;
const height = renderHeight * PIXEL_DENSITY;
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index c5f0a15a95..8b74a73071 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -8,7 +8,7 @@ export interface Vis {
coloring?: "fire" | "line" | "normal";
peaks?: boolean;
}
-import { out_spectraldata } from "./Vis";
+import { out_spectraldata, renderHeight, renderWidth, windowShade } from "./Vis";
let sapeaks = new Int16Array(76).fill(0);
let sadata2 = new Float32Array(76).fill(0);
@@ -19,6 +19,8 @@ let barPeak = new Int16Array(76).fill(0); // Needs to be specified as Int16 else
let i: number;
let uVar12: number;
+let colorssmall: string[] = [];
+
type ColorTriplet = string;
/**
@@ -164,6 +166,8 @@ export class BarPaintHandler extends VisPaintHandler {
this._dataArray = new Uint8Array(this._bufferLength);
this._barWidth = Math.ceil(vis.canvas!.width / NUM_BARS);
+ colorssmall = [vis.colors[17], vis.colors[14], vis.colors[11], vis.colors[8], vis.colors[4]];
+
this._16h.width = 1;
this._16h.height = 16;
this._16h.setAttribute("width", "75");
@@ -221,9 +225,9 @@ export class BarPaintHandler extends VisPaintHandler {
// ctx.fillStyle = grd;
// ctx.fillRect(0, 0, 1, vis.canvas.height);
// ctx.imageSmoothingEnabled = false;
- for (let y = 0; y < 16; y++) {
+ for (let y = 0; y < renderHeight; y++) {
// ctx.fillStyle = gammaGroup.transformColor(vis._colorBands[15 - y]);
- ctx.fillStyle = vis.colors[2 - -y];
+ ctx.fillStyle = windowShade ? colorssmall[-y+4] : vis.colors[2 - -y];
ctx.fillRect(0, y, 1, y + 1);
}
@@ -257,7 +261,7 @@ export class BarPaintHandler extends VisPaintHandler {
// scale = 1.0 -> fully logarithmic scaling
let scale = 0.95; // Adjust this value between 0.0 and 1.0
- let targetSize = 75;
+ let targetSize = windowShade ? 40 : 75;
// This is to roughly emulate the Analyzer in more modern versions of Winamp
// 2.x and early 5.x versions had a completely linear(?) FFT, if so desired the
@@ -290,7 +294,7 @@ export class BarPaintHandler extends VisPaintHandler {
}
}
- for (let x = 0; x < 76; x++) {
+ for (let x = 0; x < 75; x++) {
// Based on research of looking at Winamp 5.666 and 2.63 executables
// Right now it's hard coded to assume we want thick bands
// so in the future, should we have a preferences style window
@@ -300,8 +304,8 @@ export class BarPaintHandler extends VisPaintHandler {
uVar12 = (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 48;
sadata[x] = uVar12;
- if (sadata[x] >= 15) {
- sadata[x] = 15;
+ if (sadata[x] >= renderHeight) {
+ sadata[x] = renderHeight;
}
safalloff[x] -= 12 / 16.0;
// Possible bar fall off values are
@@ -534,20 +538,6 @@ export class BarPaintHandler extends VisPaintHandler {
//? =============================== OSCILOSCOPE PAINTER ===============================
type PaintWavFunction = (x: number, y: number, colorIndex: number) => void;
-// Return the average value in a slice of dataArray
-function sliceAverage(
- dataArray: Uint8Array,
- sliceWidth: number,
- sliceNumber: number
-): number {
- const start = sliceWidth * sliceNumber;
- const end = start + sliceWidth;
- let sum = 0;
- for (let i = start; i < end; i++) {
- sum += dataArray[i];
- }
- return sum / sliceWidth;
-}
function slice1st(
dataArray: Uint8Array,
@@ -643,50 +633,20 @@ export class WavePaintHandler extends VisPaintHandler {
this._dataArray = this._dataArray.slice(0, 576);
const bandwidth = this._dataArray.length;
- //* to save and see in excel (bar chart)
- if (!this._datafetched) {
- // console.log(JSON.stringify(Array.from(this._dataArray)))
- this._datafetched = true;
- }
-
- const using16temporaryCanvas = this._vis.canvas!.height !== 16;
-
- if (using16temporaryCanvas) {
- this._ctx = this._16h.getContext("2d");
- }
const width = this._ctx!.canvas.width;
const height = this._ctx!.canvas.height;
this._ctx!.clearRect(0, 0, width, height);
- const sliceWidth = Math.floor(/* this._bufferLength */ bandwidth / width);
+ const sliceWidth = Math.floor(bandwidth / width);
// Iterate over the width of the canvas in fixed 75 pixels.
- for (let j = 0; j <= width; j++) {
- // const amplitude = sliceAverage(this._dataArray, sliceWidth, j);
+ for (let j = 0; j <= 75; j++) {
const amplitude = slice1st(this._dataArray, sliceWidth, j);
- // -4 is set to off center the oscilloscope
+ // +4 is set to off center the oscilloscope
// because completely centered looks a bit weird
- const [y, colorIndex] = this.rangeByAmplitude(amplitude+4);
- const x = j; /* * PIXEL_DENSITY */
+ const [y, colorIndex] = this.rangeByAmplitude(windowShade ? ((amplitude+4)/3)+90 : amplitude+4);
- this.paintWav(x, y, colorIndex);
- }
-
- if (using16temporaryCanvas) {
- const canvas = this._vis.canvas!;
- const visCtx = canvas.getContext("2d")!;
- visCtx.clearRect(0, 0, canvas.width, canvas.height);
- visCtx.drawImage(
- this._16h,
- 0,
- 0, // sx,sy
- 75,
- 16, // sw,sh
- 0,
- 0, //dx,dy
- canvas.width,
- canvas.height //dw,dh
- );
+ this.paintWav(j, y, colorIndex);
}
}
@@ -696,57 +656,109 @@ export class WavePaintHandler extends VisPaintHandler {
* @returns xy.Y(top to bottom), colorOscIndex
*/
rangeByAmplitude(amplitude: number): [number, number] {
- //odjasdjflasjdf;lasjdf;asjd;fjasd;fsajdf
- if (amplitude >= 184) {
- return [0, 3];
- }
- if (amplitude >= 176) {
- return [1, 3];
- }
- if (amplitude >= 168) {
- return [2, 2];
- }
- if (amplitude >= 160) {
- return [3, 2];
- }
- if (amplitude >= 152) {
- return [4, 1];
- }
- if (amplitude >= 144) {
- return [5, 1];
- }
- if (amplitude >= 136) {
- return [6, 0];
- }
- if (amplitude >= 128) {
- return [7, 0];
- }
- if (amplitude >= 120) {
- return [8, 1];
- }
- if (amplitude >= 112) {
- return [9, 1];
- }
- if (amplitude >= 104) {
- return [10, 2];
- }
- if (amplitude >= 96) {
- return [11, 2];
- }
- if (amplitude >= 88) {
- return [12, 3];
- }
- if (amplitude >= 80) {
- return [13, 3];
- }
- if (amplitude >= 72) {
- return [14, 4];
+ // sorry about this mess
+ if (windowShade){
+ if (amplitude >= 184) {
+ return [0, 0];
+ }
+ if (amplitude >= 176) {
+ return [1, 0];
+ }
+ if (amplitude >= 168) {
+ return [2, 0];
+ }
+ if (amplitude >= 160) {
+ return [3, 0];
+ }
+ if (amplitude >= 152) {
+ return [4, 0];
+ }
+ if (amplitude >= 144) {
+ return [5, 0];
+ }
+ if (amplitude >= 136) {
+ return [6, 0];
+ }
+ if (amplitude >= 128) {
+ return [7, 0];
+ }
+ if (amplitude >= 120) {
+ return [8, 0];
+ }
+ if (amplitude >= 112) {
+ return [9, 0];
+ }
+ if (amplitude >= 104) {
+ return [10, 0];
+ }
+ if (amplitude >= 96) {
+ return [11, 0];
+ }
+ if (amplitude >= 88) {
+ return [12, 0];
+ }
+ if (amplitude >= 80) {
+ return [13, 0];
+ }
+ if (amplitude >= 72) {
+ return [14, 0];
+ }
+ return [15, 0];
+ } else {
+ if (amplitude >= 184) {
+ return [0, 3];
+ }
+ if (amplitude >= 176) {
+ return [1, 3];
+ }
+ if (amplitude >= 168) {
+ return [2, 2];
+ }
+ if (amplitude >= 160) {
+ return [3, 2];
+ }
+ if (amplitude >= 152) {
+ return [4, 1];
+ }
+ if (amplitude >= 144) {
+ return [5, 1];
+ }
+ if (amplitude >= 136) {
+ return [6, 0];
+ }
+ if (amplitude >= 128) {
+ return [7, 0];
+ }
+ if (amplitude >= 120) {
+ return [8, 1];
+ }
+ if (amplitude >= 112) {
+ return [9, 1];
+ }
+ if (amplitude >= 104) {
+ return [10, 2];
+ }
+ if (amplitude >= 96) {
+ return [11, 2];
+ }
+ if (amplitude >= 88) {
+ return [12, 3];
+ }
+ if (amplitude >= 80) {
+ return [13, 3];
+ }
+ if (amplitude >= 72) {
+ return [14, 4];
+ }
+ return [15, 4];
}
- // if(amplitude>=56){return [15, 4]}
- return [15, 4];
}
paintWavLine(x: number, y: number, colorIndex: number) {
+
+ y = windowShade ? y - 5 : y;
+
+ y = y < 0 ? 0 : (y > renderHeight - 1 ? renderHeight - 1 : y);
if (x === 0) this._lastY = y;
let top = y;
@@ -755,9 +767,12 @@ export class WavePaintHandler extends VisPaintHandler {
if (bottom < top) {
[bottom, top] = [top, bottom];
- top++; //top++, that emulates Winamp's/WACUP's OSC behavior correctly
+ if (windowShade){
+ // SORRY NOTHING
+ } else {
+ top++; //top++, that emulates Winamp's/WACUP's OSC behavior correctly
+ }
}
- // const h = bottom - top + 1;
for (y = top; y <= bottom; y++) {
this._ctx!.drawImage(
From 7f3f1e1844975036a351f8af3f3efebb5c87d3f2 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Fri, 16 Aug 2024 08:42:47 +0200
Subject: [PATCH 04/19] Fixed analyzer exceeding bounds in unwindowshaded mode
---
packages/webamp/js/components/VisPainter.ts | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index 8b74a73071..690d197586 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -262,6 +262,7 @@ export class BarPaintHandler extends VisPaintHandler {
let scale = 0.95; // Adjust this value between 0.0 and 1.0
let targetSize = windowShade ? 40 : 75;
+ let maxHeight = windowShade ? 5 : 15;
// This is to roughly emulate the Analyzer in more modern versions of Winamp
// 2.x and early 5.x versions had a completely linear(?) FFT, if so desired the
@@ -304,8 +305,8 @@ export class BarPaintHandler extends VisPaintHandler {
uVar12 = (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 48;
sadata[x] = uVar12;
- if (sadata[x] >= renderHeight) {
- sadata[x] = renderHeight;
+ if (sadata[x] >= maxHeight) {
+ sadata[x] = maxHeight;
}
safalloff[x] -= 12 / 16.0;
// Possible bar fall off values are
From 85dd5f1dea10a3376b984aaa697f13cbc8d1ccc8 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Fri, 16 Aug 2024 10:15:22 +0200
Subject: [PATCH 05/19] Removed paintFrameThin() since it's now no longer
needed (processing happens in paintFrameWide()) Also removed paintWavSolid()
since that too is now processed in paintWavLine Removed variables no longer
in use Adjusted how the FFT data is first processed in Vis.tsx and how that
affects the thin and wide modes (they should now be consistent in volume)
---
packages/webamp/js/components/Vis.tsx | 2 +-
packages/webamp/js/components/VisPainter.ts | 182 ++++----------------
2 files changed, 35 insertions(+), 149 deletions(-)
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index 27b48ee253..e73f2bd78d 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -175,7 +175,7 @@ export default function Vis({ analyser }: Props) {
const loop = () => {
analyser.getByteTimeDomainData(dataArray);
for (let i = 0; i < dataArray.length; i++) {
- in_wavedata[i] = (dataArray[i] - 128) / 2;
+ in_wavedata[i] = (dataArray[i] - 128) / 32;
}
fft.timeToFrequencyDomain(in_wavedata, out_spectraldata);
painter.paintFrame();
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index 690d197586..cd63931041 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -21,8 +21,6 @@ let uVar12: number;
let colorssmall: string[] = [];
-type ColorTriplet = string;
-
/**
* Base class of AVS (animation frame renderer engine)
*/
@@ -103,9 +101,6 @@ export class FakeWavePaintHandler extends VisPaintHandler {
}
}
//? =============================== BAR PAINTER ===============================
-const NUM_BARS = 20;
-const PIXEL_DENSITY = 1;
-const BAR_PEAK_DROP_RATE = 0.01;
type PaintFrameFunction = () => void;
type PaintBarFunction = (
ctx: CanvasRenderingContext2D,
@@ -116,43 +111,15 @@ type PaintBarFunction = (
peakHeight: number
) => void;
-function octaveBucketsForBufferLength(
- bufferLength: number,
- barCount: number = NUM_BARS
-): number[] {
- const octaveBuckets = new Array(barCount).fill(0);
- const minHz = 80;
- const maxHz = 22050;
- const octaveStep = Math.pow(maxHz / minHz, 1 / barCount);
-
- octaveBuckets[0] = 0;
- octaveBuckets[1] = minHz;
- for (let i = 2; i < barCount - 1; i++) {
- octaveBuckets[i] = octaveBuckets[i - 1] * octaveStep;
- }
- octaveBuckets[barCount - 1] = maxHz;
-
- for (let i = 0; i < barCount; i++) {
- const octaveIdx = Math.floor((octaveBuckets[i] / maxHz) * bufferLength);
- octaveBuckets[i] = octaveIdx;
- }
-
- return octaveBuckets;
-}
-
export class BarPaintHandler extends VisPaintHandler {
_analyser: AnalyserNode;
- _barWidth: number;
_color: string = "rgb(255,255,255)";
_colorPeak: string = "rgb(255,255,255)";
// Off-screen canvas for pre-rendering a single bar gradient
_bar: HTMLCanvasElement = document.createElement("canvas");
_peak: HTMLCanvasElement = document.createElement("canvas");
_16h: HTMLCanvasElement = document.createElement("canvas"); // non-stretched
- _barPeaks: number[] = new Array(NUM_BARS).fill(0);
- _barPeakFrames: number[] = new Array(NUM_BARS).fill(0);
_bufferLength: number;
- _octaveBuckets: number[];
_dataArray: Uint8Array;
// _ctx: CanvasRenderingContext2D;
paintBar: PaintBarFunction;
@@ -162,9 +129,7 @@ export class BarPaintHandler extends VisPaintHandler {
super(vis);
this._analyser = this._vis.analyser!;
this._bufferLength = this._analyser.frequencyBinCount;
- this._octaveBuckets = octaveBucketsForBufferLength(this._bufferLength);
this._dataArray = new Uint8Array(this._bufferLength);
- this._barWidth = Math.ceil(vis.canvas!.width / NUM_BARS);
colorssmall = [vis.colors[17], vis.colors[14], vis.colors[11], vis.colors[8], vis.colors[4]];
@@ -174,14 +139,9 @@ export class BarPaintHandler extends VisPaintHandler {
this._16h.setAttribute("height", "16");
if (this._vis.bandwidth === "wide") {
this.paintFrame = this.paintFrameWide.bind(this);
- this._octaveBuckets = octaveBucketsForBufferLength(this._bufferLength);
} else {
// thin
- this.paintFrame = this.paintFrameThin.bind(this);
- const w = this._vis.canvas!.width;
- this._barPeaks = new Array(w).fill(0);
- this._barPeakFrames = new Array(w).fill(0);
- this._octaveBuckets = octaveBucketsForBufferLength(this._bufferLength, w);
+ this.paintFrame = this.paintFrameWide.bind(this);
}
if (this._vis.coloring === "fire") {
@@ -244,6 +204,16 @@ export class BarPaintHandler extends VisPaintHandler {
* 🟫🟫🟫 🟫🟫🟫 🟫🟫🟫
* 1 bar = multiple pixels
*/
+ /**
+ * ⬜⬜
+ * 🟧
+ * 🟫🟧
+ * 🟫🟫⬜⬜
+ * 🟫🟫🟧
+ * 🟫🟫🟫🟧⬜
+ * 🟫🟫🟫🟫🟧
+ * drawing 1pixel width bars
+ */
paintFrameWide() {
if (!this._ctx) return;
const ctx = this._ctx;
@@ -301,9 +271,13 @@ export class BarPaintHandler extends VisPaintHandler {
// so in the future, should we have a preferences style window
// we should be able to change the width of the bands here
- i = (i = x & 0xfffffffc);
- uVar12 = (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 48;
- sadata[x] = uVar12;
+ if (this._vis.bandwidth === "wide"){
+ i = (i = x & 0xfffffffc);
+ uVar12 = (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 4;
+ sadata[x] = uVar12;
+ } else {
+ sadata[x] = sample[x];
+ }
if (sadata[x] >= maxHeight) {
sadata[x] = maxHeight;
@@ -351,79 +325,6 @@ export class BarPaintHandler extends VisPaintHandler {
}
}
- /**
- * ⬜⬜
- * 🟧
- * 🟫🟧
- * 🟫🟫⬜⬜
- * 🟫🟫🟧
- * 🟫🟫🟫🟧⬜
- * 🟫🟫🟫🟫🟧
- * drawing 1pixel width bars
- */
- paintFrameThin() {
- if (!this._ctx) return;
- const ctx = this._ctx;
- const w = ctx.canvas.width;
- const h = ctx.canvas.height;
- ctx.clearRect(0, 0, w, h);
- ctx.fillStyle = this._color;
-
- this._analyser.getByteFrequencyData(this._dataArray);
- const heightMultiplier = h / 256;
- for (let j = 0; j < w - 1; j++) {
- // const start = Math.round(j/w * this._dataArray.length);
- // const end = Math.round((j+1)/w * this._dataArray.length );
- const start = this._octaveBuckets[j];
- const end = this._octaveBuckets[j + 1];
- let amplitude = 0;
- //let weightingnum = 0;
- amplitude /= end - start;
- for (let i = start; i < end; i++) {
- //weightingnum += 6.6; //adds "weighting" to the analyzer
- }
- for (let k = start; k < end; k++) {
- amplitude = Math.max(
- amplitude,
- this._dataArray[k]/* * 3.4 - 600 + weightingnum*/
- ); //weightingnum used to try to correct the bias of the analyzer, but the last bar
- //kept being shot up high
- }
-
- // The drop rate should probably be normalized to the rendering FPS, for now assume 60 FPS
- let barPeak =
- this._barPeaks[j] -
- BAR_PEAK_DROP_RATE * Math.pow(this._barPeakFrames[j], 2);
- if (barPeak < amplitude) {
- barPeak = amplitude;
- this._barPeakFrames[j] = 0;
- } else {
- this._barPeakFrames[j] += 1;
- }
- if (barPeak < 10) {
- barPeak = 10;
- this._barPeakFrames[j] = 0;
- }
- if (barPeak > 255) {
- barPeak = 255;
- this._barPeakFrames[j] += 1;
- }
- this._barPeaks[j] = barPeak;
-
- // var x1 = Math.round(this._barWidth * j);
- // var x2 = Math.round(this._barWidth * (j + 1)) - 2;
-
- this.paintBar(
- ctx,
- // j /* * xOffset */,
- j,
- j,
- Math.round(amplitude * heightMultiplier),
- Math.round(barPeak * heightMultiplier)
- );
- }
- }
-
/**
* 🟥
* 🟧🟧
@@ -572,7 +473,6 @@ export class WavePaintHandler extends VisPaintHandler {
super(vis);
this._analyser = this._vis.analyser!;
this._bufferLength = this._analyser.fftSize;
- // this._octaveBuckets = octaveBucketsForBufferLength(this._bufferLength);
this._dataArray = new Uint8Array(this._bufferLength);
this._16h.width = 1;
@@ -586,7 +486,7 @@ export class WavePaintHandler extends VisPaintHandler {
if (this._vis.oscStyle === "dots") {
this.paintWav = this.paintWavDot.bind(this);
} else if (this._vis.oscStyle === "solid") {
- this.paintWav = this.paintWavSolid.bind(this);
+ this.paintWav = this.paintWavLine.bind(this);
} else {
this.paintWav = this.paintWavLine.bind(this);
}
@@ -766,13 +666,23 @@ export class WavePaintHandler extends VisPaintHandler {
let bottom = this._lastY;
this._lastY = y;
- if (bottom < top) {
- [bottom, top] = [top, bottom];
- if (windowShade){
- // SORRY NOTHING
+ if (this._vis.oscStyle === "solid"){
+ if (y >= (windowShade ? 2 : 8)) {
+ top = windowShade ? 2 : 8;
+ bottom = y;
} else {
- top++; //top++, that emulates Winamp's/WACUP's OSC behavior correctly
+ top = y;
+ bottom = windowShade ? 2 : 7;
}
+ } else {
+ if (bottom < top) {
+ [bottom, top] = [top, bottom];
+ if (windowShade){
+ // SORRY NOTHING
+ } else {
+ top++; //top++, that emulates Winamp's/WACUP's OSC behavior correctly
+ }
+ }
}
for (y = top; y <= bottom; y++) {
@@ -804,30 +714,6 @@ export class WavePaintHandler extends VisPaintHandler {
);
}
- paintWavSolid(x: number, y: number, colorIndex: number) {
- let top, bottom;
- if (y >= 8) {
- top = 8;
- bottom = y;
- } else {
- top = y;
- bottom = 7;
- }
- // const h = bottom - top + 1;
- for (y = top; y <= bottom; y++) {
- this._ctx!.drawImage(
- this._bar,
- 0,
- colorIndex, // sx,sy
- 1,
- 1, // sw,sh
- x, y, //dx,dy, dy is upside down because Winamp3/Winamp5 does it, so we have to emulate it
- //set to x, y, for Winamp Classic behavior
- 1,
- 1 //dw,dh
- );
- }
- }
}
export class NoVisualizerHandler extends VisPaintHandler {
From f4424ce63da0d3a84a5484f371ed1b68e45ccb03 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Sat, 17 Aug 2024 04:27:46 +0200
Subject: [PATCH 06/19] Add proper windowshade mode visualizer support (adapts
correctly to doublesize too!) Proper color handling for the Spectrum Analyzer
if in windowshade and double size mode Removed comemnts/functions no longer
in use
---
packages/webamp/js/components/Vis.tsx | 12 +-
packages/webamp/js/components/VisPainter.ts | 234 ++++++++++----------
2 files changed, 124 insertions(+), 122 deletions(-)
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index e73f2bd78d..0074b5d9e1 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -20,14 +20,13 @@ import {
BarPaintHandler,
WavePaintHandler,
NoVisualizerHandler,
- FakeBarPaintHandler,
} from "./VisPainter";
type Props = {
analyser: AnalyserNode;
};
-const PIXEL_DENSITY = 1;
+export let PIXEL_DENSITY = 1;
const fft = new FFT();
const samplesIn = 1024; // Example input size
@@ -35,6 +34,7 @@ const samplesOut = 512; // Example output size
export let renderWidth: number;
export let renderHeight: number;
export let windowShade: boolean | undefined;
+export let doubled: boolean | undefined;
fft.init(samplesIn, samplesOut, 1, 1.0, true);
let in_wavedata = new Float32Array(samplesIn); // Fill this with your input data
@@ -79,6 +79,7 @@ export default function Vis({ analyser }: Props) {
const mode = useTypedSelector(Selectors.getVisualizerStyle);
const audioStatus = useTypedSelector(Selectors.getMediaStatus);
const getWindowShade = useTypedSelector(Selectors.getWindowShade);
+ const doubled = useTypedSelector(Selectors.getDoubled);
const dummyVizData = useTypedSelector(Selectors.getDummyVizData);
const dataArray = new Uint8Array(1024);
@@ -90,6 +91,7 @@ export default function Vis({ analyser }: Props) {
windowShade = getWindowShade("main");
renderWidth = windowShade ? 38 : 75;
renderHeight = windowShade ? 5 : 16;
+ PIXEL_DENSITY = (doubled && windowShade) ? 2 : 1;
const width = renderWidth * PIXEL_DENSITY;
const height = renderHeight * PIXEL_DENSITY;
@@ -133,7 +135,6 @@ export default function Vis({ analyser }: Props) {
// uninteruptable painting requires _painter to be always available
// const oldPainter = painter;
const newPainter = new PainterType(_vis);
- newPainter.prepare();
setPainter(newPainter);
// this.audioStatusChanged(); // stop loop of old painter, preparing new painter.
@@ -173,6 +174,7 @@ export default function Vis({ analyser }: Props) {
let animationRequest: number | null = null;
const loop = () => {
+ painter.prepare();
analyser.getByteTimeDomainData(dataArray);
for (let i = 0; i < dataArray.length; i++) {
in_wavedata[i] = (dataArray[i] - 128) / 32;
@@ -196,6 +198,10 @@ export default function Vis({ analyser }: Props) {
}
};
}, [audioStatus, canvas, painter]);
+
+ if (audioStatus === MEDIA_STATUS.STOPPED) {
+ return null;
+ }
// @ts-ignore
// @ts-ignore
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index cd63931041..7ae09795f8 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -8,7 +8,7 @@ export interface Vis {
coloring?: "fire" | "line" | "normal";
peaks?: boolean;
}
-import { out_spectraldata, renderHeight, renderWidth, windowShade } from "./Vis";
+import { out_spectraldata, renderHeight, renderWidth, windowShade, PIXEL_DENSITY } from "./Vis";
let sapeaks = new Int16Array(76).fill(0);
let sadata2 = new Float32Array(76).fill(0);
@@ -19,10 +19,13 @@ let barPeak = new Int16Array(76).fill(0); // Needs to be specified as Int16 else
let i: number;
let uVar12: number;
+let logged: boolean = false;
+
let colorssmall: string[] = [];
+let colorssmall2: string[] = [];
/**
- * Base class of AVS (animation frame renderer engine)
+ * Base class of Visualizer (animation frame renderer engine)
*/
export class VisPaintHandler {
_vis: Vis;
@@ -35,76 +38,26 @@ export class VisPaintHandler {
}
/**
- * Attemp to build cached bitmaps for later use while render a frame.
+ * Attempt to build cached bitmaps for later use while rendering a frame.
* Purpose: fast rendering in animation loop
*/
prepare() {}
/**
- * Called once per frame rendiring
+ * Called once per frame rendering
*/
paintFrame() {}
/**
- * Attemp to cleanup cached bitmaps
+ * Attempt to cleanup cached bitmaps
*/
dispose() {}
-
- /**
- * called if it is an AVS.
- * @param action vis_prev | vis_next | vis_f5 (fullscreen) |
- */
- doAction(action: string, param: string) {}
-}
-
-//? =============================== VIS.TEST PAINTER (fake) ===============================
-export class FakeBarPaintHandler extends VisPaintHandler {
- prepare() {}
-
- paintFrame() {
- if (!this._ctx) return;
- const ctx = this._ctx;
- const width = ctx.canvas.width;
- const height = ctx.canvas.height;
- ctx.clearRect(0, 0, width, height);
- ctx.lineWidth = 5;
- for (let i = 0; i < 30; i += 1) {
- const r = Math.floor(Math.random() * 255);
- const g = Math.floor(Math.random() * 255);
- const b = Math.floor(Math.random() * 255);
-
- ctx.beginPath();
- ctx.moveTo(Math.random() * width, Math.random() * height);
- ctx.lineTo(Math.random() * width, Math.random() * height);
- ctx.strokeStyle = `rgba(${r},${g},${b},1)`;
- ctx.stroke();
- }
- }
}
-export class FakeWavePaintHandler extends VisPaintHandler {
- prepare() {}
- paintFrame() {
- if (!this._ctx) return;
- const ctx = this._ctx;
- const width = ctx.canvas.width;
- const height = ctx.canvas.height;
- ctx.clearRect(0, 0, width, height);
- ctx.lineWidth = 1;
- ctx.strokeStyle = "#fff";
- for (let i = 0; i < 30; i += 1) {
- ctx.beginPath();
- ctx.moveTo(Math.random() * width, Math.random() * height);
- ctx.lineTo(Math.random() * width, Math.random() * height);
- ctx.stroke();
- }
- }
-}
//? =============================== BAR PAINTER ===============================
type PaintFrameFunction = () => void;
type PaintBarFunction = (
ctx: CanvasRenderingContext2D,
- // barIndex: number,
x1: number,
x2: number,
barHeight: number,
@@ -131,7 +84,21 @@ export class BarPaintHandler extends VisPaintHandler {
this._bufferLength = this._analyser.frequencyBinCount;
this._dataArray = new Uint8Array(this._bufferLength);
- colorssmall = [vis.colors[17], vis.colors[14], vis.colors[11], vis.colors[8], vis.colors[4]];
+ colorssmall = [vis.colors[17],
+ vis.colors[14],
+ vis.colors[11],
+ vis.colors[8],
+ vis.colors[4]];
+ colorssmall2 = [vis.colors[17],
+ vis.colors[16],
+ vis.colors[14],
+ vis.colors[13],
+ vis.colors[11],
+ vis.colors[10],
+ vis.colors[8],
+ vis.colors[7],
+ vis.colors[5],
+ vis.colors[4],];
this._16h.width = 1;
this._16h.height = 16;
@@ -141,6 +108,8 @@ export class BarPaintHandler extends VisPaintHandler {
this.paintFrame = this.paintFrameWide.bind(this);
} else {
// thin
+ // does call paintFrameWide but there is a check inside
+ // that changes the bandwidth accordingly
this.paintFrame = this.paintFrameWide.bind(this);
}
@@ -156,15 +125,11 @@ export class BarPaintHandler extends VisPaintHandler {
prepare() {
const vis = this._vis;
if (!vis.canvas) return;
- // const groupId = vis._gammagroup;
- // const gammaGroup = this._vis._uiRoot._getGammaGroup(groupId);
- // this._barWidth = Math.ceil(vis.canvas.width / NUM_BARS);
//? paint peak
this._peak.height = 1;
this._peak.width = 1;
let ctx = this._peak.getContext("2d")!;
- // ctx.fillStyle = gammaGroup.transformColor(vis._colorBandPeak);
ctx.fillStyle = vis.colors[23];
ctx.fillRect(0, 0, 1, 1);
@@ -174,20 +139,12 @@ export class BarPaintHandler extends VisPaintHandler {
this._bar.setAttribute("width", "1");
this._bar.setAttribute("height", "16");
ctx = this._bar.getContext("2d")!;
- // const grd = ctx.createLinearGradient(0, 0, 0, vis.canvas.height);
- // for (let i = 0; i < vis._colorBands.length; i++) {
- // grd.addColorStop(
- // (1 / (vis._colorBands.length - 1)) * i,
- // gammaGroup.transformColor(vis._colorBands[i])
- // );
- // }
- // ctx.strokeStyle = this._color;
- // ctx.fillStyle = grd;
- // ctx.fillRect(0, 0, 1, vis.canvas.height);
- // ctx.imageSmoothingEnabled = false;
- for (let y = 0; y < renderHeight; y++) {
- // ctx.fillStyle = gammaGroup.transformColor(vis._colorBands[15 - y]);
- ctx.fillStyle = windowShade ? colorssmall[-y+4] : vis.colors[2 - -y];
+ for (let y = 0; y < 16; y++) {
+ if (PIXEL_DENSITY === 2 && windowShade){
+ ctx.fillStyle = colorssmall2[-y+9]
+ } else {
+ ctx.fillStyle = windowShade ? colorssmall[-y+4] : vis.colors[2 - -y];
+ }
ctx.fillRect(0, y, 1, y + 1);
}
@@ -226,17 +183,36 @@ export class BarPaintHandler extends VisPaintHandler {
let logMaxFreqIndex = Math.log10(maxFreqIndex);
let logMinFreqIndex = 0;
- // This factor controls the scaling from linear to logarithmic.
- // scale = 0.0 -> fully linear scaling
- // scale = 1.0 -> fully logarithmic scaling
- let scale = 0.95; // Adjust this value between 0.0 and 1.0
+ let targetSize: number;
+ let maxHeight: number;
+ let maxWidth: number;
+ if (PIXEL_DENSITY === 2){
+ targetSize = 75;
+ maxHeight = 10;
+ } else {
+ targetSize = windowShade ? 40 : 75;
+ maxHeight = windowShade ? 5 : 15;
+ }
- let targetSize = windowShade ? 40 : 75;
- let maxHeight = windowShade ? 5 : 15;
+ if (windowShade){
+ if (PIXEL_DENSITY === 2){
+ maxWidth = 75; // this is not 37*2, but if this was 74, we'd be missing a pixel
+ // someone here at Nullsoft screwed up...? or thought 74 didn't look good, I don't know.
+ } else {
+ maxWidth = 37;
+ }
+ } else {
+ maxWidth = 75;
+ }
- // This is to roughly emulate the Analyzer in more modern versions of Winamp
+ // This is to roughly emulate the Analyzer in more modern versions of Winamp.
// 2.x and early 5.x versions had a completely linear(?) FFT, if so desired the
// scale variable can be set to 1.0
+
+ // This factor controls the scaling from linear to logarithmic.
+ // scale = 0.0 -> fully linear scaling
+ // scale = 1.0 -> fully logarithmic scaling
+ let scale = 0.95; // Adjust this value between 0.0 and 1.0
for (let x = 0; x < targetSize; x++) {
// Linear interpolation between linear and log scaling
let linearIndex = x / (targetSize - 1) * (maxFreqIndex - 1);
@@ -265,12 +241,11 @@ export class BarPaintHandler extends VisPaintHandler {
}
}
- for (let x = 0; x < 75; x++) {
+ for (let x = 0; x < maxWidth; x++) {
// Based on research of looking at Winamp 5.666 and 2.63 executables
- // Right now it's hard coded to assume we want thick bands
- // so in the future, should we have a preferences style window
- // we should be able to change the width of the bands here
+ // if our bandwidth is "wide", chunk every 5 instances of the bars,
+ // add them together and display them
if (this._vis.bandwidth === "wide"){
i = (i = x & 0xfffffffc);
uVar12 = (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 4;
@@ -309,10 +284,16 @@ export class BarPaintHandler extends VisPaintHandler {
sapeaks[x] = 0;
}
- if (Math.round(barPeak[x]) < 1){
+ if (windowShade){
+ // SORRY NOTHING
+ // ironically enough the peaks do appear at the bottom here
+ } else {
+ if (Math.round(barPeak[x]) < 1){
barPeak[x] = -3; // Push peaks outside the viewable area, this isn't a Modern Skin!
+ }
}
+ // skip rendering if x is 4
if (!(x == i + 3)) {
this.paintBar(
ctx,
@@ -339,15 +320,9 @@ export class BarPaintHandler extends VisPaintHandler {
barHeight: number,
peakHeight: number
) {
- // const w = ctx.canvas.width;
const h = ctx.canvas.height;
- // var x = Math.round(this._barWidth * barIndex);
- // var r = this._barWidth - 2;
- // var x2 = Math.round(this._barWidth * (barIndex + 1)) - 2;
const y = h - barHeight;
- // var y = barHeight;
- // ctx.drawImage(this._bar, 0, y, 1, h - y, x, y, x2 - x + 1, h - y);
ctx.drawImage(this._bar, 0, y, 1, h - y, x, y, x2 - x + 1, h - y);
if (this._vis.peaks) {
@@ -370,14 +345,9 @@ export class BarPaintHandler extends VisPaintHandler {
barHeight: number,
peakHeight: number
) {
- // const w = ctx.canvas.width;
const h = ctx.canvas.height;
- // var x = Math.round(this._barWidth * barIndex);
- // var r = this._barWidth - 2;
- // var x2 = Math.round(this._barWidth * (barIndex + 1)) - 2;
let y = h - barHeight;
- // ctx.drawImage(this._bar, x, y, x2 - x + 1, h - y);
ctx.drawImage(
this._bar,
0,
@@ -410,14 +380,14 @@ export class BarPaintHandler extends VisPaintHandler {
barHeight: number,
peakHeight: number
) {
- // const w = ctx.canvas.width;
const h = ctx.canvas.height;
- // var x = Math.round(this._barWidth * barIndex);
- // var r = this._barWidth - 2;
- // var x2 = Math.round(this._barWidth * (barIndex + 1)) - 2;
let y = h - barHeight;
- // ctx.drawImage(this._bar, x, y, x2 - x + 1, h - y);
+ if(!logged) {
+ console.log("FIXME: Line drawing is currently Fire mode!");
+ logged = true;
+ }
+
ctx.drawImage(
this._bar,
0, // sx
@@ -466,8 +436,6 @@ export class WavePaintHandler extends VisPaintHandler {
_bar: HTMLCanvasElement = document.createElement("canvas");
_16h: HTMLCanvasElement = document.createElement("canvas"); // non-stretched
paintWav: PaintWavFunction;
- _datafetched: boolean = false;
- // _colors2: string[];
constructor(vis: Vis) {
super(vis);
@@ -486,6 +454,8 @@ export class WavePaintHandler extends VisPaintHandler {
if (this._vis.oscStyle === "dots") {
this.paintWav = this.paintWavDot.bind(this);
} else if (this._vis.oscStyle === "solid") {
+ // does call paintWavLine but there is a check inside
+ // that changes the oscstyle accordingly
this.paintWav = this.paintWavLine.bind(this);
} else {
this.paintWav = this.paintWavLine.bind(this);
@@ -498,8 +468,6 @@ export class WavePaintHandler extends VisPaintHandler {
return;
}
const vis = this._vis;
- // const groupId = vis._gammagroup;
- // const gammaGroup = this._vis._uiRoot._getGammaGroup(groupId);
//? paint bar
this._bar.width = 1;
@@ -509,13 +477,11 @@ export class WavePaintHandler extends VisPaintHandler {
const ctx = this._bar.getContext("2d");
if (ctx) {
for (let y = 0; y < 5; y++) {
- // ctx.fillStyle = gammaGroup.transformColor(vis._colorOsc[y]);
ctx.fillStyle = vis.colors[18 + y];
ctx.fillRect(0, y, 1, y + 1);
}
}
- // this._ctx = vis.canvas.getContext("2d");
this._ctx.imageSmoothingEnabled = false;
// @ts-ignore
this._ctx.mozImageSmoothingEnabled = false;
@@ -523,14 +489,11 @@ export class WavePaintHandler extends VisPaintHandler {
this._ctx.webkitImageSmoothingEnabled = false;
// @ts-ignore
this._ctx.msImageSmoothingEnabled = false;
-
- this._datafetched = false;
}
paintFrame() {
if (!this._ctx) return;
this._analyser.getByteTimeDomainData(this._dataArray);
- // this._analyser.getFloatTimeDomainData(this._dataArray);
this._dataArray = this._dataArray.slice(0, 576);
const bandwidth = this._dataArray.length;
@@ -540,13 +503,18 @@ export class WavePaintHandler extends VisPaintHandler {
const sliceWidth = Math.floor(bandwidth / width);
+ let y: number;
+ let colorIndex: number;
// Iterate over the width of the canvas in fixed 75 pixels.
for (let j = 0; j <= 75; j++) {
const amplitude = slice1st(this._dataArray, sliceWidth, j);
// +4 is set to off center the oscilloscope
// because completely centered looks a bit weird
- const [y, colorIndex] = this.rangeByAmplitude(windowShade ? ((amplitude+4)/3)+90 : amplitude+4);
-
+ if (PIXEL_DENSITY === 2){
+ [y, colorIndex] = this.rangeByAmplitude(((amplitude+4)/2)+48);
+ } else {
+ [y, colorIndex] = this.rangeByAmplitude(windowShade ? ((amplitude+4)/3)+90 : amplitude+4);
+ }
this.paintWav(j, y, colorIndex);
}
}
@@ -659,7 +627,11 @@ export class WavePaintHandler extends VisPaintHandler {
y = windowShade ? y - 5 : y;
- y = y < 0 ? 0 : (y > renderHeight - 1 ? renderHeight - 1 : y);
+ if (windowShade && PIXEL_DENSITY === 2){
+ y = y < 0 ? 0 : (y > 10 - 1 ? 10 - 1 : y);
+ } else {
+ y = y < 0 ? 0 : (y > renderHeight - 1 ? renderHeight - 1 : y);
+ }
if (x === 0) this._lastY = y;
let top = y;
@@ -667,12 +639,22 @@ export class WavePaintHandler extends VisPaintHandler {
this._lastY = y;
if (this._vis.oscStyle === "solid"){
- if (y >= (windowShade ? 2 : 8)) {
- top = windowShade ? 2 : 8;
- bottom = y;
+ if (PIXEL_DENSITY === 2){
+ if (y >= (windowShade ? 5 : 8)) {
+ top = windowShade ? 5 : 8;
+ bottom = y;
+ } else {
+ top = y;
+ bottom = windowShade ? 5 : 7;
+ }
} else {
- top = y;
- bottom = windowShade ? 2 : 7;
+ if (y >= (windowShade ? 2 : 8)) {
+ top = windowShade ? 2 : 8;
+ bottom = y;
+ } else {
+ top = y;
+ bottom = windowShade ? 2 : 7;
+ }
}
} else {
if (bottom < top) {
@@ -701,6 +683,13 @@ export class WavePaintHandler extends VisPaintHandler {
}
paintWavDot(x: number, y: number, colorIndex: number) {
+ y = windowShade ? y - 5 : y;
+
+ if (windowShade && PIXEL_DENSITY === 2){
+ y = y < 0 ? 0 : (y > 10 - 1 ? 10 - 1 : y);
+ } else {
+ y = y < 0 ? 0 : (y > renderHeight - 1 ? renderHeight - 1 : y);
+ }
this._ctx!.drawImage(
this._bar,
0,
@@ -728,4 +717,11 @@ export class NoVisualizerHandler extends VisPaintHandler {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
this.cleared = true;
}
+
+ dispose() {
+ if (!this._ctx) return;
+ const ctx = this._ctx;
+ ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
+ this.cleared = true;
+ }
}
From aaf4702456d8a657dcf432459c97f5f94eb1d7d4 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Sat, 17 Aug 2024 11:58:17 +0200
Subject: [PATCH 07/19] Visualizer is now pushed down by 2 pixels if not in
double size mode Fixed "doubled" not being able to be used outside of Vis.tsx
Set up base for eventual additional parameters that can be passed to the
visualizer Consolidate paintWavDot into paintWavLine Remove dispose()
---
packages/webamp/js/components/Vis.tsx | 8 +-
packages/webamp/js/components/VisPainter.ts | 100 ++++++++++++--------
2 files changed, 68 insertions(+), 40 deletions(-)
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index 0074b5d9e1..3a9933c57d 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -79,7 +79,7 @@ export default function Vis({ analyser }: Props) {
const mode = useTypedSelector(Selectors.getVisualizerStyle);
const audioStatus = useTypedSelector(Selectors.getMediaStatus);
const getWindowShade = useTypedSelector(Selectors.getWindowShade);
- const doubled = useTypedSelector(Selectors.getDoubled);
+ doubled = useTypedSelector(Selectors.getDoubled);
const dummyVizData = useTypedSelector(Selectors.getDummyVizData);
const dataArray = new Uint8Array(1024);
@@ -89,6 +89,8 @@ export default function Vis({ analyser }: Props) {
const toggleVisualizerStyle = useActionCreator(Actions.toggleVisualizerStyle);
windowShade = getWindowShade("main");
+ // BUG: windowshade does not take into account if the main window is visible (small vis is in pledit)
+ // how can i know the state of individual windows?
renderWidth = windowShade ? 38 : 75;
renderHeight = windowShade ? 5 : 16;
PIXEL_DENSITY = (doubled && windowShade) ? 2 : 1;
@@ -126,10 +128,12 @@ export default function Vis({ analyser }: Props) {
canvas,
colors,
analyser,
- oscStyle: "lines",
+ oscStyle: "dots",
bandwidth: "wide",
coloring: "normal",
peaks: true,
+ safalloff: "moderate",
+ sa_peak_falloff: "slow",
};
// uninteruptable painting requires _painter to be always available
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index 7ae09795f8..eefc75d373 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -7,8 +7,10 @@ export interface Vis {
bandwidth?: "wide" | "thin";
coloring?: "fire" | "line" | "normal";
peaks?: boolean;
+ safalloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
+ sa_peak_falloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
}
-import { out_spectraldata, renderHeight, renderWidth, windowShade, PIXEL_DENSITY } from "./Vis";
+import { out_spectraldata, renderHeight, renderWidth, windowShade, PIXEL_DENSITY, doubled } from "./Vis";
let sapeaks = new Int16Array(76).fill(0);
let sadata2 = new Float32Array(76).fill(0);
@@ -18,6 +20,10 @@ let sample = new Float32Array(76).fill(0);
let barPeak = new Int16Array(76).fill(0); // Needs to be specified as Int16 else the peaks don't behave as they should
let i: number;
let uVar12: number;
+let falloff: number;
+let peakfalloff: number;
+
+let pushdown : number = 0;
let logged: boolean = false;
@@ -120,6 +126,30 @@ export class BarPaintHandler extends VisPaintHandler {
} else {
this.paintBar = this.paintBarNormal.bind(this);
}
+
+ if (this._vis.safalloff === "slower"){
+ falloff = 3;
+ } else if (this._vis.safalloff === "slow"){
+ falloff = 6;
+ } else if (this._vis.safalloff === "moderate"){
+ falloff = 12;
+ } else if (this._vis.safalloff === "fast"){
+ falloff = 16;
+ } else if (this._vis.safalloff === "faster"){
+ falloff = 32;
+ }
+
+ if (this._vis.sa_peak_falloff === "slower"){
+ peakfalloff = 1.05;
+ } else if (this._vis.sa_peak_falloff === "slow"){
+ peakfalloff = 1.1;
+ } else if (this._vis.sa_peak_falloff === "moderate"){
+ peakfalloff = 1.2;
+ } else if (this._vis.sa_peak_falloff === "fast"){
+ peakfalloff = 1.4;
+ } else if (this._vis.sa_peak_falloff === "faster"){
+ peakfalloff = 1.6;
+ }
}
prepare() {
@@ -133,6 +163,17 @@ export class BarPaintHandler extends VisPaintHandler {
ctx.fillStyle = vis.colors[23];
ctx.fillRect(0, 0, 1, 1);
+ // pushes vis down if not double size, winamp does this
+ // BUG: does not take into account if the main window is visible
+ // how can i know the state of individual windows?
+ if (doubled){
+ pushdown = 0;
+ } else if(windowShade){
+ pushdown = 0;
+ } else {
+ pushdown = 2;
+ }
+
//? paint bar
this._bar.height = 16;
this._bar.width = 1;
@@ -143,7 +184,7 @@ export class BarPaintHandler extends VisPaintHandler {
if (PIXEL_DENSITY === 2 && windowShade){
ctx.fillStyle = colorssmall2[-y+9]
} else {
- ctx.fillStyle = windowShade ? colorssmall[-y+4] : vis.colors[2 - -y];
+ ctx.fillStyle = windowShade ? colorssmall[-y+4] : vis.colors[2 - pushdown - -y];
}
ctx.fillRect(0, y, 1, y + 1);
}
@@ -257,7 +298,7 @@ export class BarPaintHandler extends VisPaintHandler {
if (sadata[x] >= maxHeight) {
sadata[x] = maxHeight;
}
- safalloff[x] -= 12 / 16.0;
+ safalloff[x] -= falloff / 16.0;
// Possible bar fall off values are
// 3, 6, 12, 16, 32
// Should there ever be some form of config options,
@@ -276,7 +317,7 @@ export class BarPaintHandler extends VisPaintHandler {
barPeak[x] = sapeaks[x]/256;
sapeaks[x] -= Math.round(sadata2[x]);
- sadata2[x] *= 1.1;
+ sadata2[x] *= peakfalloff;
// Possible peak fall off values are
// 1.05f, 1.1f, 1.2f, 1.4f, 1.6f
// 1.1f is the default of a fresh new Winamp installation
@@ -299,8 +340,8 @@ export class BarPaintHandler extends VisPaintHandler {
ctx,
x,
x,
- Math.round(safalloff[x]),
- barPeak[x] + 1
+ Math.round(safalloff[x]) - pushdown,
+ barPeak[x] + 1 - pushdown
);
}
}
@@ -452,7 +493,7 @@ export class WavePaintHandler extends VisPaintHandler {
this._pixelRatio = window.devicePixelRatio || 1;
if (this._vis.oscStyle === "dots") {
- this.paintWav = this.paintWavDot.bind(this);
+ this.paintWav = this.paintWavLine.bind(this);
} else if (this._vis.oscStyle === "solid") {
// does call paintWavLine but there is a check inside
// that changes the oscstyle accordingly
@@ -624,6 +665,15 @@ export class WavePaintHandler extends VisPaintHandler {
}
paintWavLine(x: number, y: number, colorIndex: number) {
+ // pushes vis down if not double size, winamp does this
+ // has to exist here for some reason else this doesn't work...
+ if (doubled){
+ pushdown = 0;
+ } else if(windowShade){
+ pushdown = 0;
+ } else {
+ pushdown = 2;
+ }
y = windowShade ? y - 5 : y;
@@ -656,6 +706,9 @@ export class WavePaintHandler extends VisPaintHandler {
bottom = windowShade ? 2 : 7;
}
}
+ } else if (this._vis.oscStyle === "dots") {
+ top = y;
+ bottom = y;
} else {
if (bottom < top) {
[bottom, top] = [top, bottom];
@@ -664,7 +717,7 @@ export class WavePaintHandler extends VisPaintHandler {
} else {
top++; //top++, that emulates Winamp's/WACUP's OSC behavior correctly
}
- }
+ }
}
for (y = top; y <= bottom; y++) {
@@ -674,35 +727,13 @@ export class WavePaintHandler extends VisPaintHandler {
colorIndex, // sx,sy
1,
1, // sw,sh
- x, y, //dx,dy, dy is upside down because Winamp3/Winamp5 does it, so we have to emulate it
+ x, y + pushdown, //dx,dy, dy is upside down because Winamp3/Winamp5 does it, so we have to emulate it
//set to x, y, for Winamp Classic behavior
1,
1 //dw,dh
);
}
}
-
- paintWavDot(x: number, y: number, colorIndex: number) {
- y = windowShade ? y - 5 : y;
-
- if (windowShade && PIXEL_DENSITY === 2){
- y = y < 0 ? 0 : (y > 10 - 1 ? 10 - 1 : y);
- } else {
- y = y < 0 ? 0 : (y > renderHeight - 1 ? renderHeight - 1 : y);
- }
- this._ctx!.drawImage(
- this._bar,
- 0,
- colorIndex, // sx,sy
- 1,
- 1, // sw,sh
- x, y, //dx,dy, dy is upside down because Winamp3/Winamp5 does it, so we have to emulate it
- //set to x, y, for Winamp Classic behavior
- 1,
- 1 //dw,dh
- );
- }
-
}
export class NoVisualizerHandler extends VisPaintHandler {
@@ -717,11 +748,4 @@ export class NoVisualizerHandler extends VisPaintHandler {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
this.cleared = true;
}
-
- dispose() {
- if (!this._ctx) return;
- const ctx = this._ctx;
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
- this.cleared = true;
- }
}
From b9e77c0b902f098e8aa2ec98914cfc6a610345d4 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Sat, 17 Aug 2024 12:03:42 +0200
Subject: [PATCH 08/19] Fixed accidentally setting oscStyle to "dots" for
testing (oops)
---
packages/webamp/js/components/Vis.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index 3a9933c57d..d513d46fde 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -128,7 +128,7 @@ export default function Vis({ analyser }: Props) {
canvas,
colors,
analyser,
- oscStyle: "dots",
+ oscStyle: "lines",
bandwidth: "wide",
coloring: "normal",
peaks: true,
From 7e3e565ea530d61eca40dd3bb8a49f3214830ff6 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Sun, 18 Aug 2024 00:49:23 +0200
Subject: [PATCH 09/19] New (non-working) parameter: "sa", dictates vis mode
Allowed "mode" to be modifiable Adjusted frequency scaling of the FFT
---
packages/webamp/js/components/Vis.tsx | 24 +++++++++++++++------
packages/webamp/js/components/VisPainter.ts | 5 +++--
2 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index d513d46fde..3a65a3108d 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -76,7 +76,7 @@ export default function Vis({ analyser }: Props) {
analyser.fftSize = 1024;
}, [analyser, analyser.fftSize]);
const colors = useTypedSelector(Selectors.getSkinColors);
- const mode = useTypedSelector(Selectors.getVisualizerStyle);
+ let mode = useTypedSelector(Selectors.getVisualizerStyle);
const audioStatus = useTypedSelector(Selectors.getMediaStatus);
const getWindowShade = useTypedSelector(Selectors.getWindowShade);
doubled = useTypedSelector(Selectors.getDoubled);
@@ -134,6 +134,7 @@ export default function Vis({ analyser }: Props) {
peaks: true,
safalloff: "moderate",
sa_peak_falloff: "slow",
+ sa: "analyzer",
};
// uninteruptable painting requires _painter to be always available
@@ -141,11 +142,22 @@ export default function Vis({ analyser }: Props) {
const newPainter = new PainterType(_vis);
setPainter(newPainter);
- // this.audioStatusChanged(); // stop loop of old painter, preparing new painter.
-
- // if (oldPainter) {
- // oldPainter.dispose();
- // }
+ // not sure it'll achieve the desired effect...
+ // i tried to set the vis mode here, but it didnt quite work out the way i imagined
+/* switch (_vis.sa) {
+ case "analyzer":
+ mode = VISUALIZERS.BAR;
+ break;
+ case "oscilloscope":
+ mode = VISUALIZERS.OSCILLOSCOPE;
+ // _setPainter(BarPaintHandlerFake);
+ break;
+ case "none":
+ mode = VISUALIZERS.NONE;
+ break;
+ default:
+ mode = VISUALIZERS.NONE;
+ } */
};
// console.log(" vis mode:", mode);
switch (mode) {
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index eefc75d373..9a4ebd8896 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -9,6 +9,7 @@ export interface Vis {
peaks?: boolean;
safalloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
sa_peak_falloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
+ sa?: "analyzer" | "oscilloscope" | "none";
}
import { out_spectraldata, renderHeight, renderWidth, windowShade, PIXEL_DENSITY, doubled } from "./Vis";
@@ -248,12 +249,12 @@ export class BarPaintHandler extends VisPaintHandler {
// This is to roughly emulate the Analyzer in more modern versions of Winamp.
// 2.x and early 5.x versions had a completely linear(?) FFT, if so desired the
- // scale variable can be set to 1.0
+ // scale variable can be set to 0.0
// This factor controls the scaling from linear to logarithmic.
// scale = 0.0 -> fully linear scaling
// scale = 1.0 -> fully logarithmic scaling
- let scale = 0.95; // Adjust this value between 0.0 and 1.0
+ let scale = 0.91; // Adjust this value between 0.0 and 1.0
for (let x = 0; x < targetSize; x++) {
// Linear interpolation between linear and log scaling
let linearIndex = x / (targetSize - 1) * (maxFreqIndex - 1);
From 4f8c37947a787a8a532448b99bcecca9302f2117 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Sun, 18 Aug 2024 02:30:31 +0200
Subject: [PATCH 10/19] Maybe fix deploy issues?
---
packages/webamp/package.json | 6 -
yarn.lock | 868 +----------------------------------
2 files changed, 4 insertions(+), 870 deletions(-)
diff --git a/packages/webamp/package.json b/packages/webamp/package.json
index 4f8ba0ad0f..846d8b1893 100644
--- a/packages/webamp/package.json
+++ b/packages/webamp/package.json
@@ -106,12 +106,6 @@
},
"homepage": "https://github.com/captbaritone/webamp/",
"devDependencies": {
- "@babel/core": "^7.0.0-0",
- "@babel/plugin-proposal-class-properties": "^7.18.6",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
- "@babel/plugin-proposal-optional-chaining": "^7.21.0",
- "@babel/preset-env": "^7.25.3",
- "@babel/preset-typescript": "^7.24.7",
"@parcel/reporter-bundle-analyzer": "^2.8.2",
"@types/classnames": "^2.2.6",
"@types/fscreen": "^1.0.1",
diff --git a/yarn.lock b/yarn.lock
index fdb49c5f32..ef506dea4b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -177,45 +177,11 @@
"@babel/highlight" "^7.24.2"
picocolors "^1.0.0"
-"@babel/code-frame@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
- integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
- dependencies:
- "@babel/highlight" "^7.24.7"
- picocolors "^1.0.0"
-
"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
-"@babel/compat-data@^7.25.2":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5"
- integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==
-
-"@babel/core@^7.0.0-0":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77"
- integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==
- dependencies:
- "@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.25.0"
- "@babel/helper-compilation-targets" "^7.25.2"
- "@babel/helper-module-transforms" "^7.25.2"
- "@babel/helpers" "^7.25.0"
- "@babel/parser" "^7.25.0"
- "@babel/template" "^7.25.0"
- "@babel/traverse" "^7.25.2"
- "@babel/types" "^7.25.2"
- convert-source-map "^2.0.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.2"
- json5 "^2.2.3"
- semver "^6.3.1"
-
"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.11.4", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.17.10", "@babel/core@^7.18.6", "@babel/core@^7.20.0", "@babel/core@^7.20.7", "@babel/core@^7.23.9", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717"
@@ -256,16 +222,6 @@
"@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1"
-"@babel/generator@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e"
- integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==
- dependencies:
- "@babel/types" "^7.25.0"
- "@jridgewell/gen-mapping" "^0.3.5"
- "@jridgewell/trace-mapping" "^0.3.25"
- jsesc "^2.5.1"
-
"@babel/helper-annotate-as-pure@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
@@ -273,13 +229,6 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-annotate-as-pure@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab"
- integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==
- dependencies:
- "@babel/types" "^7.24.7"
-
"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956"
@@ -287,14 +236,6 @@
dependencies:
"@babel/types" "^7.22.15"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3"
- integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6":
version "7.23.6"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991"
@@ -306,17 +247,6 @@
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8", "@babel/helper-compilation-targets@^7.25.2":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c"
- integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==
- dependencies:
- "@babel/compat-data" "^7.25.2"
- "@babel/helper-validator-option" "^7.24.8"
- browserslist "^4.23.1"
- lru-cache "^5.1.1"
- semver "^6.3.1"
-
"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3"
@@ -332,19 +262,6 @@
"@babel/helper-split-export-declaration" "^7.22.6"
semver "^6.3.1"
-"@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz#a109bf9c3d58dfed83aaf42e85633c89f43a6253"
- integrity sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-member-expression-to-functions" "^7.24.8"
- "@babel/helper-optimise-call-expression" "^7.24.7"
- "@babel/helper-replace-supers" "^7.25.0"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/traverse" "^7.25.0"
- semver "^6.3.1"
-
"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1"
@@ -354,15 +271,6 @@
regexpu-core "^5.3.1"
semver "^6.3.1"
-"@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9"
- integrity sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- regexpu-core "^5.3.1"
- semver "^6.3.1"
-
"@babel/helper-define-polyfill-provider@^0.6.1":
version "0.6.1"
resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd"
@@ -401,14 +309,6 @@
dependencies:
"@babel/types" "^7.23.0"
-"@babel/helper-member-expression-to-functions@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6"
- integrity sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==
- dependencies:
- "@babel/traverse" "^7.24.8"
- "@babel/types" "^7.24.8"
-
"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3":
version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
@@ -416,14 +316,6 @@
dependencies:
"@babel/types" "^7.24.0"
-"@babel/helper-module-imports@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
- integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
"@babel/helper-module-transforms@^7.23.3":
version "7.23.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1"
@@ -435,16 +327,6 @@
"@babel/helper-split-export-declaration" "^7.22.6"
"@babel/helper-validator-identifier" "^7.22.20"
-"@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6"
- integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==
- dependencies:
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-simple-access" "^7.24.7"
- "@babel/helper-validator-identifier" "^7.24.7"
- "@babel/traverse" "^7.25.2"
-
"@babel/helper-optimise-call-expression@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
@@ -452,23 +334,11 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-optimise-call-expression@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f"
- integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==
- dependencies:
- "@babel/types" "^7.24.7"
-
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a"
integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==
-"@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878"
- integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==
-
"@babel/helper-remap-async-to-generator@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0"
@@ -478,15 +348,6 @@
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-wrap-function" "^7.22.20"
-"@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e"
- integrity sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-wrap-function" "^7.25.0"
- "@babel/traverse" "^7.25.0"
-
"@babel/helper-replace-supers@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1"
@@ -496,15 +357,6 @@
"@babel/helper-member-expression-to-functions" "^7.23.0"
"@babel/helper-optimise-call-expression" "^7.22.5"
-"@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9"
- integrity sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==
- dependencies:
- "@babel/helper-member-expression-to-functions" "^7.24.8"
- "@babel/helper-optimise-call-expression" "^7.24.7"
- "@babel/traverse" "^7.25.0"
-
"@babel/helper-simple-access@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
@@ -512,14 +364,6 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-simple-access@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
- integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
@@ -527,14 +371,6 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-skip-transparent-expression-wrappers@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9"
- integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==
- dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
"@babel/helper-split-export-declaration@^7.22.6":
version "7.22.6"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
@@ -547,31 +383,16 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
-"@babel/helper-string-parser@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d"
- integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
-
"@babel/helper-validator-identifier@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
-"@babel/helper-validator-identifier@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
- integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
-
"@babel/helper-validator-option@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
-"@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d"
- integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==
-
"@babel/helper-wrap-function@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569"
@@ -581,15 +402,6 @@
"@babel/template" "^7.22.15"
"@babel/types" "^7.22.19"
-"@babel/helper-wrap-function@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81"
- integrity sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==
- dependencies:
- "@babel/template" "^7.25.0"
- "@babel/traverse" "^7.25.0"
- "@babel/types" "^7.25.0"
-
"@babel/helpers@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6"
@@ -599,14 +411,6 @@
"@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0"
-"@babel/helpers@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a"
- integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==
- dependencies:
- "@babel/template" "^7.25.0"
- "@babel/types" "^7.25.0"
-
"@babel/highlight@^7.10.4", "@babel/highlight@^7.24.2":
version "7.24.2"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26"
@@ -617,28 +421,11 @@
js-tokens "^4.0.0"
picocolors "^1.0.0"
-"@babel/highlight@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
- integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
- dependencies:
- "@babel/helper-validator-identifier" "^7.24.7"
- chalk "^2.4.2"
- js-tokens "^4.0.0"
- picocolors "^1.0.0"
-
"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.15.7", "@babel/parser@^7.16.8", "@babel/parser@^7.18.6", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==
-"@babel/parser@^7.25.0", "@babel/parser@^7.25.3":
- version "7.25.3"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.3.tgz#91fb126768d944966263f0657ab222a642b82065"
- integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==
- dependencies:
- "@babel/types" "^7.25.2"
-
"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1"
@@ -647,21 +434,6 @@
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3":
- version "7.25.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f"
- integrity sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/traverse" "^7.25.3"
-
-"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73"
- integrity sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
-
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf"
@@ -669,13 +441,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73"
- integrity sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
-
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3"
@@ -685,15 +450,6 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
"@babel/plugin-transform-optional-chaining" "^7.24.1"
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89"
- integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/plugin-transform-optional-chaining" "^7.24.7"
-
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988"
@@ -702,15 +458,7 @@
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb"
- integrity sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/traverse" "^7.25.0"
-
-"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6":
+"@babel/plugin-proposal-class-properties@^7.16.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
@@ -727,7 +475,7 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-decorators" "^7.24.1"
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
@@ -743,7 +491,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.21.0":
+"@babel/plugin-proposal-optional-chaining@^7.16.0":
version "7.21.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea"
integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==
@@ -828,13 +576,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-syntax-import-assertions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778"
- integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-syntax-import-attributes@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093"
@@ -842,13 +583,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-syntax-import-attributes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca"
- integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
@@ -870,13 +604,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-syntax-jsx@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d"
- integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
@@ -940,13 +667,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-syntax-typescript@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c"
- integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
@@ -962,13 +682,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-arrow-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514"
- integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-async-generator-functions@^7.24.3":
version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89"
@@ -979,16 +692,6 @@
"@babel/helper-remap-async-to-generator" "^7.22.20"
"@babel/plugin-syntax-async-generators" "^7.8.4"
-"@babel/plugin-transform-async-generator-functions@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz#b785cf35d73437f6276b1e30439a57a50747bddf"
- integrity sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/helper-remap-async-to-generator" "^7.25.0"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
- "@babel/traverse" "^7.25.0"
-
"@babel/plugin-transform-async-to-generator@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4"
@@ -998,15 +701,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-remap-async-to-generator" "^7.22.20"
-"@babel/plugin-transform-async-to-generator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc"
- integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==
- dependencies:
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-remap-async-to-generator" "^7.24.7"
-
"@babel/plugin-transform-block-scoped-functions@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380"
@@ -1014,13 +708,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-block-scoped-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f"
- integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-block-scoping@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012"
@@ -1028,13 +715,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-block-scoping@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac"
- integrity sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
-
"@babel/plugin-transform-class-properties@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29"
@@ -1043,14 +723,6 @@
"@babel/helper-create-class-features-plugin" "^7.24.1"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-class-properties@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834"
- integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-class-static-block@^7.24.4":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4"
@@ -1060,15 +732,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
-"@babel/plugin-transform-class-static-block@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d"
- integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
-
"@babel/plugin-transform-classes@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1"
@@ -1083,18 +746,6 @@
"@babel/helper-split-export-declaration" "^7.22.6"
globals "^11.1.0"
-"@babel/plugin-transform-classes@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz#63122366527d88e0ef61b612554fe3f8c793991e"
- integrity sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-compilation-targets" "^7.24.8"
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/helper-replace-supers" "^7.25.0"
- "@babel/traverse" "^7.25.0"
- globals "^11.1.0"
-
"@babel/plugin-transform-computed-properties@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7"
@@ -1103,14 +754,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/template" "^7.24.0"
-"@babel/plugin-transform-computed-properties@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707"
- integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/template" "^7.24.7"
-
"@babel/plugin-transform-destructuring@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345"
@@ -1118,13 +761,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-destructuring@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550"
- integrity sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
-
"@babel/plugin-transform-dotall-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13"
@@ -1133,14 +769,6 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-dotall-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0"
- integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-duplicate-keys@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88"
@@ -1148,21 +776,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-duplicate-keys@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee"
- integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604"
- integrity sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.25.0"
- "@babel/helper-plugin-utils" "^7.24.8"
-
"@babel/plugin-transform-dynamic-import@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd"
@@ -1171,14 +784,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
-"@babel/plugin-transform-dynamic-import@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4"
- integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
-
"@babel/plugin-transform-exponentiation-operator@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4"
@@ -1187,14 +792,6 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-exponentiation-operator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d"
- integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==
- dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-export-namespace-from@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd"
@@ -1203,14 +800,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-"@babel/plugin-transform-export-namespace-from@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197"
- integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-
"@babel/plugin-transform-flow-strip-types@^7.16.0":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.1.tgz#fa8d0a146506ea195da1671d38eed459242b2dcc"
@@ -1227,14 +816,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
-"@babel/plugin-transform-for-of@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70"
- integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
-
"@babel/plugin-transform-function-name@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361"
@@ -1244,15 +825,6 @@
"@babel/helper-function-name" "^7.23.0"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-function-name@^7.25.1":
- version "7.25.1"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37"
- integrity sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==
- dependencies:
- "@babel/helper-compilation-targets" "^7.24.8"
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/traverse" "^7.25.1"
-
"@babel/plugin-transform-json-strings@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7"
@@ -1261,14 +833,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-json-strings" "^7.8.3"
-"@babel/plugin-transform-json-strings@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a"
- integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
-
"@babel/plugin-transform-literals@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096"
@@ -1276,13 +840,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-literals@^7.25.2":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3"
- integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
-
"@babel/plugin-transform-logical-assignment-operators@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40"
@@ -1291,14 +848,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-"@babel/plugin-transform-logical-assignment-operators@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0"
- integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-
"@babel/plugin-transform-member-expression-literals@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489"
@@ -1306,13 +855,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-member-expression-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df"
- integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-modules-amd@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39"
@@ -1321,14 +863,6 @@
"@babel/helper-module-transforms" "^7.23.3"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-modules-amd@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7"
- integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==
- dependencies:
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-modules-commonjs@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9"
@@ -1338,15 +872,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-simple-access" "^7.22.5"
-"@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c"
- integrity sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==
- dependencies:
- "@babel/helper-module-transforms" "^7.24.8"
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/helper-simple-access" "^7.24.7"
-
"@babel/plugin-transform-modules-systemjs@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e"
@@ -1357,16 +882,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-validator-identifier" "^7.22.20"
-"@babel/plugin-transform-modules-systemjs@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33"
- integrity sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==
- dependencies:
- "@babel/helper-module-transforms" "^7.25.0"
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/helper-validator-identifier" "^7.24.7"
- "@babel/traverse" "^7.25.0"
-
"@babel/plugin-transform-modules-umd@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef"
@@ -1375,14 +890,6 @@
"@babel/helper-module-transforms" "^7.23.3"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-modules-umd@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8"
- integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==
- dependencies:
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f"
@@ -1391,14 +898,6 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923"
- integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-new-target@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34"
@@ -1406,13 +905,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-new-target@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00"
- integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988"
@@ -1421,14 +913,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120"
- integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-
"@babel/plugin-transform-numeric-separator@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8"
@@ -1437,14 +921,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-transform-numeric-separator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63"
- integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-
"@babel/plugin-transform-object-rest-spread@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff"
@@ -1455,16 +931,6 @@
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-transform-parameters" "^7.24.1"
-"@babel/plugin-transform-object-rest-spread@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6"
- integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==
- dependencies:
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.24.7"
-
"@babel/plugin-transform-object-super@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520"
@@ -1473,14 +939,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-replace-supers" "^7.24.1"
-"@babel/plugin-transform-object-super@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be"
- integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-replace-supers" "^7.24.7"
-
"@babel/plugin-transform-optional-catch-binding@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da"
@@ -1489,14 +947,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-"@babel/plugin-transform-optional-catch-binding@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4"
- integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-
"@babel/plugin-transform-optional-chaining@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6"
@@ -1506,15 +956,6 @@
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
-"@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d"
- integrity sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-
"@babel/plugin-transform-parameters@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510"
@@ -1522,13 +963,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-parameters@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68"
- integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-private-methods@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a"
@@ -1537,14 +971,6 @@
"@babel/helper-create-class-features-plugin" "^7.24.1"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-private-methods@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e"
- integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-private-property-in-object@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a"
@@ -1555,16 +981,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-"@babel/plugin-transform-private-property-in-object@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061"
- integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-
"@babel/plugin-transform-property-literals@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825"
@@ -1572,13 +988,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-property-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc"
- integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-react-constant-elements@^7.12.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz#d493a0918b9fdad7540f5afd9b5eb5c52500d18d"
@@ -1627,14 +1036,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
regenerator-transform "^0.15.2"
-"@babel/plugin-transform-regenerator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8"
- integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- regenerator-transform "^0.15.2"
-
"@babel/plugin-transform-reserved-words@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1"
@@ -1642,13 +1043,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-reserved-words@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4"
- integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-runtime@^7.16.4":
version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f"
@@ -1668,13 +1062,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-shorthand-properties@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73"
- integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-spread@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391"
@@ -1683,14 +1070,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
-"@babel/plugin-transform-spread@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3"
- integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
-
"@babel/plugin-transform-sticky-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9"
@@ -1698,13 +1077,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-sticky-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb"
- integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-template-literals@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7"
@@ -1712,13 +1084,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-template-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8"
- integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-typeof-symbol@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7"
@@ -1726,13 +1091,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-typeof-symbol@^7.24.8":
- version "7.24.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c"
- integrity sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.8"
-
"@babel/plugin-transform-typescript@^7.24.1":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz#03e0492537a4b953e491f53f2bc88245574ebd15"
@@ -1743,17 +1101,6 @@
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/plugin-syntax-typescript" "^7.24.1"
-"@babel/plugin-transform-typescript@^7.24.7":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add"
- integrity sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-create-class-features-plugin" "^7.25.0"
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/plugin-syntax-typescript" "^7.24.7"
-
"@babel/plugin-transform-unicode-escapes@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4"
@@ -1761,13 +1108,6 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-unicode-escapes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e"
- integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-unicode-property-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e"
@@ -1776,14 +1116,6 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-unicode-property-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd"
- integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-unicode-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385"
@@ -1792,14 +1124,6 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-unicode-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f"
- integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/plugin-transform-unicode-sets-regex@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f"
@@ -1808,14 +1132,6 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.24.0"
-"@babel/plugin-transform-unicode-sets-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9"
- integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
-
"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.11.5", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.17.10", "@babel/preset-env@^7.18.6", "@babel/preset-env@^7.20.2":
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b"
@@ -1903,95 +1219,6 @@
core-js-compat "^3.31.0"
semver "^6.3.1"
-"@babel/preset-env@^7.25.3":
- version "7.25.3"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.3.tgz#0bf4769d84ac51d1073ab4a86f00f30a3a83c67c"
- integrity sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==
- dependencies:
- "@babel/compat-data" "^7.25.2"
- "@babel/helper-compilation-targets" "^7.25.2"
- "@babel/helper-plugin-utils" "^7.24.8"
- "@babel/helper-validator-option" "^7.24.8"
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.3"
- "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.0"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.0"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7"
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.0"
- "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
- "@babel/plugin-syntax-class-properties" "^7.12.13"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
- "@babel/plugin-syntax-import-assertions" "^7.24.7"
- "@babel/plugin-syntax-import-attributes" "^7.24.7"
- "@babel/plugin-syntax-import-meta" "^7.10.4"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
- "@babel/plugin-syntax-top-level-await" "^7.14.5"
- "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
- "@babel/plugin-transform-arrow-functions" "^7.24.7"
- "@babel/plugin-transform-async-generator-functions" "^7.25.0"
- "@babel/plugin-transform-async-to-generator" "^7.24.7"
- "@babel/plugin-transform-block-scoped-functions" "^7.24.7"
- "@babel/plugin-transform-block-scoping" "^7.25.0"
- "@babel/plugin-transform-class-properties" "^7.24.7"
- "@babel/plugin-transform-class-static-block" "^7.24.7"
- "@babel/plugin-transform-classes" "^7.25.0"
- "@babel/plugin-transform-computed-properties" "^7.24.7"
- "@babel/plugin-transform-destructuring" "^7.24.8"
- "@babel/plugin-transform-dotall-regex" "^7.24.7"
- "@babel/plugin-transform-duplicate-keys" "^7.24.7"
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.0"
- "@babel/plugin-transform-dynamic-import" "^7.24.7"
- "@babel/plugin-transform-exponentiation-operator" "^7.24.7"
- "@babel/plugin-transform-export-namespace-from" "^7.24.7"
- "@babel/plugin-transform-for-of" "^7.24.7"
- "@babel/plugin-transform-function-name" "^7.25.1"
- "@babel/plugin-transform-json-strings" "^7.24.7"
- "@babel/plugin-transform-literals" "^7.25.2"
- "@babel/plugin-transform-logical-assignment-operators" "^7.24.7"
- "@babel/plugin-transform-member-expression-literals" "^7.24.7"
- "@babel/plugin-transform-modules-amd" "^7.24.7"
- "@babel/plugin-transform-modules-commonjs" "^7.24.8"
- "@babel/plugin-transform-modules-systemjs" "^7.25.0"
- "@babel/plugin-transform-modules-umd" "^7.24.7"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7"
- "@babel/plugin-transform-new-target" "^7.24.7"
- "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7"
- "@babel/plugin-transform-numeric-separator" "^7.24.7"
- "@babel/plugin-transform-object-rest-spread" "^7.24.7"
- "@babel/plugin-transform-object-super" "^7.24.7"
- "@babel/plugin-transform-optional-catch-binding" "^7.24.7"
- "@babel/plugin-transform-optional-chaining" "^7.24.8"
- "@babel/plugin-transform-parameters" "^7.24.7"
- "@babel/plugin-transform-private-methods" "^7.24.7"
- "@babel/plugin-transform-private-property-in-object" "^7.24.7"
- "@babel/plugin-transform-property-literals" "^7.24.7"
- "@babel/plugin-transform-regenerator" "^7.24.7"
- "@babel/plugin-transform-reserved-words" "^7.24.7"
- "@babel/plugin-transform-shorthand-properties" "^7.24.7"
- "@babel/plugin-transform-spread" "^7.24.7"
- "@babel/plugin-transform-sticky-regex" "^7.24.7"
- "@babel/plugin-transform-template-literals" "^7.24.7"
- "@babel/plugin-transform-typeof-symbol" "^7.24.8"
- "@babel/plugin-transform-unicode-escapes" "^7.24.7"
- "@babel/plugin-transform-unicode-property-regex" "^7.24.7"
- "@babel/plugin-transform-unicode-regex" "^7.24.7"
- "@babel/plugin-transform-unicode-sets-regex" "^7.24.7"
- "@babel/preset-modules" "0.1.6-no-external-plugins"
- babel-plugin-polyfill-corejs2 "^0.4.10"
- babel-plugin-polyfill-corejs3 "^0.10.4"
- babel-plugin-polyfill-regenerator "^0.6.1"
- core-js-compat "^3.37.1"
- semver "^6.3.1"
-
"@babel/preset-modules@0.1.6-no-external-plugins":
version "0.1.6-no-external-plugins"
resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
@@ -2024,17 +1251,6 @@
"@babel/plugin-transform-modules-commonjs" "^7.24.1"
"@babel/plugin-transform-typescript" "^7.24.1"
-"@babel/preset-typescript@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1"
- integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- "@babel/plugin-syntax-jsx" "^7.24.7"
- "@babel/plugin-transform-modules-commonjs" "^7.24.7"
- "@babel/plugin-transform-typescript" "^7.24.7"
-
"@babel/regjsgen@^0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
@@ -2063,15 +1279,6 @@
"@babel/parser" "^7.24.0"
"@babel/types" "^7.24.0"
-"@babel/template@^7.24.7", "@babel/template@^7.25.0":
- version "7.25.0"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a"
- integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==
- dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/parser" "^7.25.0"
- "@babel/types" "^7.25.0"
-
"@babel/traverse@^7.1.6", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.6", "@babel/traverse@^7.24.1", "@babel/traverse@^7.7.2":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c"
@@ -2088,19 +1295,6 @@
debug "^4.3.1"
globals "^11.1.0"
-"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3":
- version "7.25.3"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490"
- integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==
- dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.25.0"
- "@babel/parser" "^7.25.3"
- "@babel/template" "^7.25.0"
- "@babel/types" "^7.25.2"
- debug "^4.3.1"
- globals "^11.1.0"
-
"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.16.8", "@babel/types@^7.2.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
@@ -2110,15 +1304,6 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
-"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2":
- version "7.25.2"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125"
- integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==
- dependencies:
- "@babel/helper-string-parser" "^7.24.8"
- "@babel/helper-validator-identifier" "^7.24.7"
- to-fast-properties "^2.0.0"
-
"@bcoe/v8-coverage@^0.2.3":
version "0.2.3"
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@@ -9553,16 +8738,6 @@ browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^
node-releases "^2.0.14"
update-browserslist-db "^1.0.13"
-browserslist@^4.23.1, browserslist@^4.23.3:
- version "4.23.3"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800"
- integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==
- dependencies:
- caniuse-lite "^1.0.30001646"
- electron-to-chromium "^1.5.4"
- node-releases "^2.0.18"
- update-browserslist-db "^1.1.0"
-
bs-logger@0.x:
version "0.2.6"
resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
@@ -9980,11 +9155,6 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001587, can
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz#ca12d7330dd8bcb784557eb9aa64f0037870d9d6"
integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==
-caniuse-lite@^1.0.30001646:
- version "1.0.30001651"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138"
- integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==
-
canvas-mock@0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/canvas-mock/-/canvas-mock-0.0.0.tgz#9f10c378b82ecef5a20020cf9526891db7661912"
@@ -10986,13 +10156,6 @@ core-js-compat@^3.31.0, core-js-compat@^3.36.1:
dependencies:
browserslist "^4.23.0"
-core-js-compat@^3.37.1:
- version "3.38.0"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.0.tgz#d93393b1aa346b6ee683377b0c31172ccfe607aa"
- integrity sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==
- dependencies:
- browserslist "^4.23.3"
-
core-js-pure@^3.23.3:
version "3.36.1"
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.36.1.tgz#1461c89e76116528b54eba20a0aff30164087a94"
@@ -12523,11 +11686,6 @@ electron-to-chromium@^1.4.668:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.726.tgz#9ca95f19e9a0d63675e838b24681182203e40a30"
integrity sha512-xtjfBXn53RORwkbyKvDfTajtnTp0OJoPOIBzXvkNbb7+YYvCHJflba3L7Txyx/6Fov3ov2bGPr/n5MTixmPhdQ==
-electron-to-chromium@^1.5.4:
- version "1.5.7"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.7.tgz#425d2a7f76ecfa564fdca1040d11fb1979851f3c"
- integrity sha512-6FTNWIWMxMy/ZY6799nBlPtF1DFDQ6VQJ7yyDP27SJNt5lwtQ5ufqVvHylb3fdQefvRcgA3fKcFMJi9OLwBRNw==
-
elf-cam@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/elf-cam/-/elf-cam-0.1.1.tgz#46883b10835ed9e417860636a870d57490ce9eda"
@@ -13264,7 +12422,7 @@ esbuild@~0.9.0:
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.9.7.tgz#ea0d639cbe4b88ec25fbed4d6ff00c8d788ef70b"
integrity sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==
-escalade@^3.1.1, escalade@^3.1.2:
+escalade@^3.1.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
@@ -21735,11 +20893,6 @@ node-releases@^2.0.14:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
-node-releases@^2.0.18:
- version "2.0.18"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
- integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
-
node-source-walk@^4.0.0, node-source-walk@^4.2.0, node-source-walk@^4.2.2:
version "4.3.0"
resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-4.3.0.tgz#8336b56cfed23ac5180fe98f1e3bb6b11fd5317c"
@@ -23052,11 +22205,6 @@ picocolors@^0.2.1:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
-picocolors@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
- integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
-
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
@@ -28614,14 +27762,6 @@ update-browserslist-db@^1.0.13:
escalade "^3.1.1"
picocolors "^1.0.0"
-update-browserslist-db@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
- integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
- dependencies:
- escalade "^3.1.2"
- picocolors "^1.0.1"
-
update-notifier@^4.0.0, update-notifier@^4.1.0:
version "4.1.3"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3"
From 2d1457f4e17003e13fcf84da825481ab9032ca95 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Tue, 20 Aug 2024 19:15:07 +0200
Subject: [PATCH 11/19] Replace rangeByAmplitude with a colorIndex function
Attempt at addressing a few comments from the PR review
---
packages/webamp/js/components/FFTNullsoft.ts | 424 +++++++++---------
.../webamp/js/components/MainWindow/index.tsx | 4 -
packages/webamp/js/components/Vis.tsx | 54 +--
packages/webamp/js/components/VisPainter.ts | 354 ++++++---------
packages/webamp/js/components/Visualizer.tsx | 169 -------
.../webamp/js/components/useBarVisualizer.ts | 186 --------
.../components/useOscilloscopeVisualizer.ts | 83 ----
7 files changed, 366 insertions(+), 908 deletions(-)
delete mode 100644 packages/webamp/js/components/Visualizer.tsx
delete mode 100644 packages/webamp/js/components/useBarVisualizer.ts
delete mode 100644 packages/webamp/js/components/useOscilloscopeVisualizer.ts
diff --git a/packages/webamp/js/components/FFTNullsoft.ts b/packages/webamp/js/components/FFTNullsoft.ts
index a9187ca0d5..4c321ed6dc 100644
--- a/packages/webamp/js/components/FFTNullsoft.ts
+++ b/packages/webamp/js/components/FFTNullsoft.ts
@@ -2,242 +2,240 @@
// Taken from https://github.com/WACUP/vis_classic/tree/master/FFTNullsoft
export class FFT {
- private m_samples_in: number;
- private NFREQ: number;
- private bitrevtable: number[] | null = null;
- private envelope: Float32Array | null = null;
- private equalize: Float32Array | null = null;
- private temp1: Float32Array | null = null;
- private temp2: Float32Array | null = null;
- private cossintable: Float32Array[] | null = null;
-
- constructor() {
- this.m_samples_in = 0;
- this.NFREQ = 0;
+ private mSamplesIn: number;
+ private NFREQ: number;
+ private bitrevtable: number[] | null = null;
+ private envelope: Float32Array | null = null;
+ private equalize: Float32Array | null = null;
+ private temp1: Float32Array | null = null;
+ private temp2: Float32Array | null = null;
+ private cossintable: Float32Array[] | null = null;
+
+ constructor() {
+ this.mSamplesIn = 0;
+ this.NFREQ = 0;
+ }
+
+ public init(
+ samples_in: number,
+ samples_out: number,
+ bEqualize = 1,
+ envelopePower = 1.0,
+ mode = false
+ ): void {
+ this.mSamplesIn = samples_in;
+ this.NFREQ = samples_out * 2;
+
+ this.initBitRevTable();
+ this.initCosSinTable();
+
+ if (envelopePower > 0) {
+ this.initEnvelopeTable(envelopePower);
}
- public init(samples_in: number, samples_out: number, bEqualize = 1, envelope_power = 1.0, mode = false): void {
- this.cleanUp();
-
- this.m_samples_in = samples_in;
- this.NFREQ = samples_out * 2;
+ if (bEqualize) {
+ this.initEqualizeTable(mode);
+ }
- this.initBitRevTable();
- this.initCosSinTable();
+ this.temp1 = new Float32Array(this.NFREQ);
+ this.temp2 = new Float32Array(this.NFREQ);
+ }
- if (envelope_power > 0) {
- this.initEnvelopeTable(envelope_power);
- }
+ private initEqualizeTable(mode: boolean): void {
+ this.equalize = new Float32Array(this.NFREQ / 2);
+ let bias = 0.04;
- if (bEqualize) {
- this.initEqualizeTable(mode);
- }
+ for (let i = 0; i < this.NFREQ / 2; i++) {
+ const inv_half_nfreq = (9.0 - bias) / (this.NFREQ / 2);
+ this.equalize[i] = Math.log10(1.0 + bias + (i + 1) * inv_half_nfreq);
- this.temp1 = new Float32Array(this.NFREQ);
- this.temp2 = new Float32Array(this.NFREQ);
+ bias /= 1.0025;
}
-
- public cleanUp(): void {
- this.envelope = null;
- this.equalize = null;
- this.bitrevtable = null;
- this.cossintable = null;
- this.temp1 = null;
- this.temp2 = null;
+ }
+
+ private initEnvelopeTable(power: number): void {
+ const mult = (1.0 / this.mSamplesIn) * 6.2831853;
+
+ this.envelope = new Float32Array(this.mSamplesIn);
+
+ if (power == 1.0) {
+ for (let i = 0; i < this.mSamplesIn; i++) {
+ this.envelope[i] = 0.5 + 0.5 * Math.sin(i * mult - 1.5707963268);
+ }
+ } else {
+ for (let i = 0; i < this.mSamplesIn; i++) {
+ this.envelope[i] = Math.pow(
+ 0.5 + 0.5 * Math.sin(i * mult - 1.5707963268),
+ power
+ );
+ }
}
+ }
- private initEqualizeTable(mode: boolean): void {
- this.equalize = new Float32Array(this.NFREQ / 2);
- let bias = 0.04;
-
- for (let i = 0; i < this.NFREQ / 2; i++) {
- const inv_half_nfreq = (9.0 - bias) / (this.NFREQ / 2);
- this.equalize[i] = Math.log10(1.0 + bias + (i + 1) * inv_half_nfreq);
+ private initBitRevTable(): void {
+ this.bitrevtable = new Array(this.NFREQ);
- bias /= 1.0025;
- }
+ for (let i = 0; i < this.NFREQ; i++) {
+ this.bitrevtable[i] = i;
}
- private initEnvelopeTable(power: number): void {
- const mult = (1.0 / this.m_samples_in) * 6.2831853;
+ for (let i = 0, j = 0; i < this.NFREQ; i++) {
+ if (j > i) {
+ const temp = this.bitrevtable[i];
+ this.bitrevtable[i] = this.bitrevtable[j];
+ this.bitrevtable[j] = temp;
+ }
- this.envelope = new Float32Array(this.m_samples_in);
+ let m = this.NFREQ >> 1;
+ while (m >= 1 && j >= m) {
+ j -= m;
+ m >>= 1;
+ }
- if (power == 1.0){
- for (let i = 0; i < this.m_samples_in; i++) {
- this.envelope[i] = 0.5 + 0.5*Math.sin(i*mult - 1.5707963268);
- }
- }
- else {
- for (let i = 0; i < this.m_samples_in; i++) {
- this.envelope[i] = Math.pow(0.5 + 0.5 * Math.sin(i * mult - 1.5707963268), power);
- }
- }
+ j += m;
}
-
- private initBitRevTable(): void {
- this.bitrevtable = new Array(this.NFREQ);
-
- for (let i = 0; i < this.NFREQ; i++) {
- this.bitrevtable[i] = i;
- }
-
- for (let i = 0, j = 0; i < this.NFREQ; i++) {
- if (j > i) {
- const temp = this.bitrevtable[i];
- this.bitrevtable[i] = this.bitrevtable[j];
- this.bitrevtable[j] = temp;
- }
-
- let m = this.NFREQ >> 1;
- while (m >= 1 && j >= m) {
- j -= m;
- m >>= 1;
- }
-
- j += m;
- }
+ }
+
+ private initCosSinTable(): void {
+ let dftsize = 2;
+ let tabsize = 0;
+ while (dftsize <= this.NFREQ) {
+ ++tabsize;
+ dftsize <<= 1;
}
- private initCosSinTable(): void {
- let dftsize = 2;
- let tabsize = 0;
- while (dftsize <= this.NFREQ) {
- ++tabsize;
- dftsize <<= 1;
- }
-
- this.cossintable = new Array(tabsize);
- dftsize = 2;
- let i = 0;
-
- while (dftsize <= this.NFREQ) {
- const theta = -2.0 * Math.PI / dftsize;
- this.cossintable[i] = new Float32Array(2);
- this.cossintable[i][0] = Math.cos(theta);
- this.cossintable[i][1] = Math.sin(theta);
- ++i;
- dftsize <<= 1;
- }
+ this.cossintable = new Array(tabsize);
+ dftsize = 2;
+ let i = 0;
+
+ while (dftsize <= this.NFREQ) {
+ const theta = (-2.0 * Math.PI) / dftsize;
+ this.cossintable[i] = new Float32Array(2);
+ this.cossintable[i][0] = Math.cos(theta);
+ this.cossintable[i][1] = Math.sin(theta);
+ ++i;
+ dftsize <<= 1;
}
-
- public timeToFrequencyDomain(in_wavedata: Float32Array, out_spectraldata: Float32Array): void {
- if (!this.bitrevtable || !this.temp1 || !this.temp2 || !this.cossintable) return;
- // Converts time-domain samples from in_wavedata[]
- // into frequency-domain samples in out_spectraldata[].
- // The array lengths are the two parameters to Init().
-
- // The last sample of the output data will represent the frequency
- // that is 1/4th of the input sampling rate. For example,
- // if the input wave data is sampled at 44,100 Hz, then the last
- // sample of the spectral data output will represent the frequency
- // 11,025 Hz. The first sample will be 0 Hz; the frequencies of
- // the rest of the samples vary linearly in between.
- // Note that since human hearing is limited to the range 200 - 20,000
- // Hz. 200 is a low bass hum; 20,000 is an ear-piercing high shriek.
- // Each time the frequency doubles, that sounds like going up an octave.
- // That means that the difference between 200 and 300 Hz is FAR more
- // than the difference between 5000 and 5100, for example!
- // So, when trying to analyze bass, you'll want to look at (probably)
- // the 200-800 Hz range; whereas for treble, you'll want the 1,400 -
- // 11,025 Hz range.
- // If you want to get 3 bands, try it this way:
- // a) 11,025 / 200 = 55.125
- // b) to get the number of octaves between 200 and 11,025 Hz, solve for n:
- // 2^n = 55.125
- // n = log 55.125 / log 2
- // n = 5.785
- // c) so each band should represent 5.785/3 = 1.928 octaves; the ranges are:
- // 1) 200 - 200*2^1.928 or 200 - 761 Hz
- // 2) 200*2^1.928 - 200*2^(1.928*2) or 761 - 2897 Hz
- // 3) 200*2^(1.928*2) - 200*2^(1.928*3) or 2897 - 11025 Hz
-
- // A simple sine-wave-based envelope is convolved with the waveform
- // data before doing the FFT, to emeliorate the bad frequency response
- // of a square (i.e. nonexistent) filter.
-
- // You might want to slightly damp (blur) the input if your signal isn't
- // of a very high quality, to reduce high-frequency noise that would
- // otherwise show up in the output.
-
- // code should be smart enough to call Init before this function
- //if (!bitrevtable) return;
- //if (!temp1) return;
- //if (!temp2) return;
- //if (!cossintable) return;
-
- // 1. set up input to the fft
- if (this.envelope) {
- for (let i = 0; i < this.NFREQ; i++) {
- const idx = this.bitrevtable[i];
- if (idx < this.m_samples_in){
- this.temp1[i] = in_wavedata[idx] * this.envelope[idx];
- }
- else{
- this.temp1[i] = 0;
- }
- }
+ }
+
+ public timeToFrequencyDomain(
+ in_wavedata: Float32Array,
+ out_spectraldata: Float32Array
+ ): void {
+ if (!this.bitrevtable || !this.temp1 || !this.temp2 || !this.cossintable)
+ return;
+ // Converts time-domain samples from in_wavedata[]
+ // into frequency-domain samples in out_spectraldata[].
+ // The array lengths are the two parameters to Init().
+
+ // The last sample of the output data will represent the frequency
+ // that is 1/4th of the input sampling rate. For example,
+ // if the input wave data is sampled at 44,100 Hz, then the last
+ // sample of the spectral data output will represent the frequency
+ // 11,025 Hz. The first sample will be 0 Hz; the frequencies of
+ // the rest of the samples vary linearly in between.
+ // Note that since human hearing is limited to the range 200 - 20,000
+ // Hz. 200 is a low bass hum; 20,000 is an ear-piercing high shriek.
+ // Each time the frequency doubles, that sounds like going up an octave.
+ // That means that the difference between 200 and 300 Hz is FAR more
+ // than the difference between 5000 and 5100, for example!
+ // So, when trying to analyze bass, you'll want to look at (probably)
+ // the 200-800 Hz range; whereas for treble, you'll want the 1,400 -
+ // 11,025 Hz range.
+ // If you want to get 3 bands, try it this way:
+ // a) 11,025 / 200 = 55.125
+ // b) to get the number of octaves between 200 and 11,025 Hz, solve for n:
+ // 2^n = 55.125
+ // n = log 55.125 / log 2
+ // n = 5.785
+ // c) so each band should represent 5.785/3 = 1.928 octaves; the ranges are:
+ // 1) 200 - 200*2^1.928 or 200 - 761 Hz
+ // 2) 200*2^1.928 - 200*2^(1.928*2) or 761 - 2897 Hz
+ // 3) 200*2^(1.928*2) - 200*2^(1.928*3) or 2897 - 11025 Hz
+
+ // A simple sine-wave-based envelope is convolved with the waveform
+ // data before doing the FFT, to emeliorate the bad frequency response
+ // of a square (i.e. nonexistent) filter.
+
+ // You might want to slightly damp (blur) the input if your signal isn't
+ // of a very high quality, to reduce high-frequency noise that would
+ // otherwise show up in the output.
+
+ // code should be smart enough to call Init before this function
+ //if (!bitrevtable) return;
+ //if (!temp1) return;
+ //if (!temp2) return;
+ //if (!cossintable) return;
+
+ // 1. set up input to the fft
+ if (this.envelope) {
+ for (let i = 0; i < this.NFREQ; i++) {
+ const idx = this.bitrevtable[i];
+ if (idx < this.mSamplesIn) {
+ this.temp1[i] = in_wavedata[idx] * this.envelope[idx];
} else {
- for (let i = 0; i < this.NFREQ; i++) {
- const idx = this.bitrevtable[i];
- if (idx < this.m_samples_in){
- this.temp1[i] = in_wavedata[idx];
- }
- else{
- this.temp1[i] = 0;
- }
- }
- }
- this.temp2.fill(0);
-
- // 2. perform FFT
- let real = this.temp1;
- let imag = this.temp2;
- let dftsize = 2;
- let t = 0;
-
- while (dftsize <= this.NFREQ) {
- const wpr = this.cossintable[t][0];
- const wpi = this.cossintable[t][1];
- let wr = 1.0;
- let wi = 0.0;
- const hdftsize = dftsize >> 1;
-
- for (let m = 0; m < hdftsize; m += 1)
- {
- for (let i = m; i < this.NFREQ; i += dftsize)
- {
- const j = i + hdftsize;
- const tempr = wr * real[j] - wi * imag[j];
- const tempi = wr * imag[j] + wi * real[j];
- real[j] = real[i] - tempr;
- imag[j] = imag[i] - tempi;
- real[i] += tempr;
- imag[i] += tempi;
- }
-
- const wtemp = wr;
- wr = wr * wpr - wi * wpi;
- wi = wi * wpr + wtemp * wpi;
- }
-
- dftsize <<= 1;
- ++t;
+ this.temp1[i] = 0;
}
-
- // 3. take the magnitude & equalize it (on a log10 scale) for output
- if (this.equalize) {
- for (let i = 0; i < this.NFREQ / 2; i++) {
- out_spectraldata[i] = this.equalize[i] * Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
- }
+ }
+ } else {
+ for (let i = 0; i < this.NFREQ; i++) {
+ const idx = this.bitrevtable[i];
+ if (idx < this.mSamplesIn) {
+ this.temp1[i] = in_wavedata[idx];
} else {
- for (let i = 0; i < this.NFREQ / 2; i++) {
- out_spectraldata[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
- }
+ this.temp1[i] = 0;
+ }
+ }
+ }
+ this.temp2.fill(0);
+
+ // 2. perform FFT
+ let real = this.temp1;
+ let imag = this.temp2;
+ let dftsize = 2;
+ let t = 0;
+
+ while (dftsize <= this.NFREQ) {
+ const wpr = this.cossintable[t][0];
+ const wpi = this.cossintable[t][1];
+ let wr = 1.0;
+ let wi = 0.0;
+ const hdftsize = dftsize >> 1;
+
+ for (let m = 0; m < hdftsize; m += 1) {
+ for (let i = m; i < this.NFREQ; i += dftsize) {
+ const j = i + hdftsize;
+ const tempr = wr * real[j] - wi * imag[j];
+ const tempi = wr * imag[j] + wi * real[j];
+ real[j] = real[i] - tempr;
+ imag[j] = imag[i] - tempi;
+ real[i] += tempr;
+ imag[i] += tempi;
}
+
+ const wtemp = wr;
+ wr = wr * wpr - wi * wpi;
+ wi = wi * wpr + wtemp * wpi;
+ }
+
+ dftsize <<= 1;
+ ++t;
}
- public getNumFreq(): number {
- return this.NFREQ;
+ // 3. take the magnitude & equalize it (on a log10 scale) for output
+ if (this.equalize) {
+ for (let i = 0; i < this.NFREQ / 2; i++) {
+ out_spectraldata[i] =
+ this.equalize[i] * Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
+ }
+ } else {
+ for (let i = 0; i < this.NFREQ / 2; i++) {
+ out_spectraldata[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
+ }
}
+ }
+
+ public getNumFreq(): number {
+ return this.NFREQ;
+ }
}
diff --git a/packages/webamp/js/components/MainWindow/index.tsx b/packages/webamp/js/components/MainWindow/index.tsx
index 1b231da72a..0a401725e0 100644
--- a/packages/webamp/js/components/MainWindow/index.tsx
+++ b/packages/webamp/js/components/MainWindow/index.tsx
@@ -106,10 +106,6 @@ const MainWindow = React.memo(({ analyser, filePickers }: Props) => {
/>
- {/* */}
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index 3a65a3108d..dfac3e64e3 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -29,16 +29,16 @@ type Props = {
export let PIXEL_DENSITY = 1;
const fft = new FFT();
-const samplesIn = 1024; // Example input size
-const samplesOut = 512; // Example output size
+const SAMPLESIN = 1024; // Example input size
+const SAMPLESOUT = 512; // Example output size
export let renderWidth: number;
export let renderHeight: number;
export let windowShade: boolean | undefined;
export let doubled: boolean | undefined;
-fft.init(samplesIn, samplesOut, 1, 1.0, true);
+fft.init(SAMPLESIN, SAMPLESOUT, 1, 1.0, true);
-let in_wavedata = new Float32Array(samplesIn); // Fill this with your input data
-export let out_spectraldata = new Float32Array(samplesOut);
+let in_wavedata = new Float32Array(SAMPLESIN); // Fill this with your input data
+export let out_spectraldata = new Float32Array(SAMPLESOUT);
// Pre-render the background grid
function preRenderBg(
@@ -76,7 +76,7 @@ export default function Vis({ analyser }: Props) {
analyser.fftSize = 1024;
}, [analyser, analyser.fftSize]);
const colors = useTypedSelector(Selectors.getSkinColors);
- let mode = useTypedSelector(Selectors.getVisualizerStyle);
+ const mode = useTypedSelector(Selectors.getVisualizerStyle);
const audioStatus = useTypedSelector(Selectors.getMediaStatus);
const getWindowShade = useTypedSelector(Selectors.getWindowShade);
doubled = useTypedSelector(Selectors.getDoubled);
@@ -93,7 +93,7 @@ export default function Vis({ analyser }: Props) {
// how can i know the state of individual windows?
renderWidth = windowShade ? 38 : 75;
renderHeight = windowShade ? 5 : 16;
- PIXEL_DENSITY = (doubled && windowShade) ? 2 : 1;
+ PIXEL_DENSITY = doubled && windowShade ? 2 : 1;
const width = renderWidth * PIXEL_DENSITY;
const height = renderHeight * PIXEL_DENSITY;
@@ -109,17 +109,9 @@ export default function Vis({ analyser }: Props) {
}, [colors, height, width, windowShade]);
const [canvas, setCanvas] = useState(null);
- // const vis: IVis = {
- // canvas,
- // analyser
- // }
//? painter administration
const [painter, setPainter] = useState(null);
- // const _vis: IVis = useMemo(() => {
- // if (!canvas) return { colors, analyser };
- // return { canvas, colors, analyser };
- // }, [analyser, canvas, colors]);
useEffect(() => {
if (!canvas) return;
@@ -136,37 +128,15 @@ export default function Vis({ analyser }: Props) {
sa_peak_falloff: "slow",
sa: "analyzer",
};
-
- // uninteruptable painting requires _painter to be always available
- // const oldPainter = painter;
const newPainter = new PainterType(_vis);
setPainter(newPainter);
-
- // not sure it'll achieve the desired effect...
- // i tried to set the vis mode here, but it didnt quite work out the way i imagined
-/* switch (_vis.sa) {
- case "analyzer":
- mode = VISUALIZERS.BAR;
- break;
- case "oscilloscope":
- mode = VISUALIZERS.OSCILLOSCOPE;
- // _setPainter(BarPaintHandlerFake);
- break;
- case "none":
- mode = VISUALIZERS.NONE;
- break;
- default:
- mode = VISUALIZERS.NONE;
- } */
};
- // console.log(" vis mode:", mode);
switch (mode) {
case VISUALIZERS.OSCILLOSCOPE:
_setPainter(WavePaintHandler);
break;
case VISUALIZERS.BAR:
_setPainter(BarPaintHandler);
- // _setPainter(BarPaintHandlerFake);
break;
case VISUALIZERS.NONE:
_setPainter(NoVisualizerHandler);
@@ -180,15 +150,15 @@ export default function Vis({ analyser }: Props) {
if (canvas == null || painter == null) {
return;
}
-
+
const canvasCtx = canvas.getContext("2d");
if (canvasCtx == null) {
return;
}
canvasCtx.imageSmoothingEnabled = false;
-
+
let animationRequest: number | null = null;
-
+
const loop = () => {
painter.prepare();
analyser.getByteTimeDomainData(dataArray);
@@ -199,7 +169,7 @@ export default function Vis({ analyser }: Props) {
painter.paintFrame();
animationRequest = window.requestAnimationFrame(loop);
};
-
+
if (audioStatus === MEDIA_STATUS.PLAYING) {
loop();
} else if (animationRequest !== null) {
@@ -207,7 +177,7 @@ export default function Vis({ analyser }: Props) {
window.cancelAnimationFrame(animationRequest);
animationRequest = null;
}
-
+
return () => {
if (animationRequest !== null) {
window.cancelAnimationFrame(animationRequest);
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index 9a4ebd8896..f1b8b4bdc8 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -11,25 +11,28 @@ export interface Vis {
sa_peak_falloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
sa?: "analyzer" | "oscilloscope" | "none";
}
-import { out_spectraldata, renderHeight, renderWidth, windowShade, PIXEL_DENSITY, doubled } from "./Vis";
+import { range } from "lodash";
+import {
+ out_spectraldata,
+ renderHeight,
+ renderWidth,
+ windowShade,
+ PIXEL_DENSITY,
+ doubled,
+} from "./Vis";
let sapeaks = new Int16Array(76).fill(0);
let sadata2 = new Float32Array(76).fill(0);
let sadata = new Int16Array(76).fill(0);
-let safalloff = new Float32Array(76).fill(0);
+let safalloff = new Float32Array(76).fill(0);
let sample = new Float32Array(76).fill(0);
let barPeak = new Int16Array(76).fill(0); // Needs to be specified as Int16 else the peaks don't behave as they should
let i: number;
let uVar12: number;
-let falloff: number;
+let falloff: number;
let peakfalloff: number;
-let pushdown : number = 0;
-
-let logged: boolean = false;
-
-let colorssmall: string[] = [];
-let colorssmall2: string[] = [];
+let pushdown: number = 0;
/**
* Base class of Visualizer (animation frame renderer engine)
@@ -41,7 +44,6 @@ export class VisPaintHandler {
constructor(vis: Vis) {
this._vis = vis;
this._ctx = vis.canvas!.getContext("2d");
- // this.prepare();
}
/**
@@ -81,7 +83,9 @@ export class BarPaintHandler extends VisPaintHandler {
_16h: HTMLCanvasElement = document.createElement("canvas"); // non-stretched
_bufferLength: number;
_dataArray: Uint8Array;
- // _ctx: CanvasRenderingContext2D;
+ logged: boolean = false;
+ colorssmall: string[];
+ colorssmall2: string[];
paintBar: PaintBarFunction;
paintFrame: PaintFrameFunction;
@@ -91,21 +95,27 @@ export class BarPaintHandler extends VisPaintHandler {
this._bufferLength = this._analyser.frequencyBinCount;
this._dataArray = new Uint8Array(this._bufferLength);
- colorssmall = [vis.colors[17],
- vis.colors[14],
- vis.colors[11],
- vis.colors[8],
- vis.colors[4]];
- colorssmall2 = [vis.colors[17],
- vis.colors[16],
- vis.colors[14],
- vis.colors[13],
- vis.colors[11],
- vis.colors[10],
- vis.colors[8],
- vis.colors[7],
- vis.colors[5],
- vis.colors[4],];
+ this.colorssmall = [
+ vis.colors[17],
+ vis.colors[14],
+ vis.colors[11],
+ vis.colors[8],
+ vis.colors[4],
+ ];
+ this.colorssmall2 = [
+ vis.colors[17],
+ vis.colors[16],
+ vis.colors[14],
+ vis.colors[13],
+ vis.colors[11],
+ vis.colors[10],
+ vis.colors[8],
+ vis.colors[7],
+ vis.colors[5],
+ vis.colors[4],
+ ];
+
+ this.logged;
this._16h.width = 1;
this._16h.height = 16;
@@ -128,27 +138,27 @@ export class BarPaintHandler extends VisPaintHandler {
this.paintBar = this.paintBarNormal.bind(this);
}
- if (this._vis.safalloff === "slower"){
+ if (this._vis.safalloff === "slower") {
falloff = 3;
- } else if (this._vis.safalloff === "slow"){
+ } else if (this._vis.safalloff === "slow") {
falloff = 6;
- } else if (this._vis.safalloff === "moderate"){
+ } else if (this._vis.safalloff === "moderate") {
falloff = 12;
- } else if (this._vis.safalloff === "fast"){
+ } else if (this._vis.safalloff === "fast") {
falloff = 16;
- } else if (this._vis.safalloff === "faster"){
+ } else if (this._vis.safalloff === "faster") {
falloff = 32;
}
- if (this._vis.sa_peak_falloff === "slower"){
+ if (this._vis.sa_peak_falloff === "slower") {
peakfalloff = 1.05;
- } else if (this._vis.sa_peak_falloff === "slow"){
+ } else if (this._vis.sa_peak_falloff === "slow") {
peakfalloff = 1.1;
- } else if (this._vis.sa_peak_falloff === "moderate"){
+ } else if (this._vis.sa_peak_falloff === "moderate") {
peakfalloff = 1.2;
- } else if (this._vis.sa_peak_falloff === "fast"){
+ } else if (this._vis.sa_peak_falloff === "fast") {
peakfalloff = 1.4;
- } else if (this._vis.sa_peak_falloff === "faster"){
+ } else if (this._vis.sa_peak_falloff === "faster") {
peakfalloff = 1.6;
}
}
@@ -167,9 +177,9 @@ export class BarPaintHandler extends VisPaintHandler {
// pushes vis down if not double size, winamp does this
// BUG: does not take into account if the main window is visible
// how can i know the state of individual windows?
- if (doubled){
+ if (doubled) {
pushdown = 0;
- } else if(windowShade){
+ } else if (windowShade) {
pushdown = 0;
} else {
pushdown = 2;
@@ -182,15 +192,15 @@ export class BarPaintHandler extends VisPaintHandler {
this._bar.setAttribute("height", "16");
ctx = this._bar.getContext("2d")!;
for (let y = 0; y < 16; y++) {
- if (PIXEL_DENSITY === 2 && windowShade){
- ctx.fillStyle = colorssmall2[-y+9]
+ if (PIXEL_DENSITY === 2 && windowShade) {
+ ctx.fillStyle = this.colorssmall2[-y + 9];
} else {
- ctx.fillStyle = windowShade ? colorssmall[-y+4] : vis.colors[2 - pushdown - -y];
+ ctx.fillStyle = windowShade
+ ? this.colorssmall[-y + 4]
+ : vis.colors[2 - pushdown - -y];
}
ctx.fillRect(0, y, 1, y + 1);
}
-
- // this._ctx = this._vis.canvas.getContext("2d");
}
/**
@@ -228,16 +238,16 @@ export class BarPaintHandler extends VisPaintHandler {
let targetSize: number;
let maxHeight: number;
let maxWidth: number;
- if (PIXEL_DENSITY === 2){
+ if (PIXEL_DENSITY === 2) {
targetSize = 75;
maxHeight = 10;
} else {
- targetSize = windowShade ? 40 : 75;
- maxHeight = windowShade ? 5 : 15;
+ targetSize = windowShade ? 40 : 75;
+ maxHeight = windowShade ? 5 : 15;
}
- if (windowShade){
- if (PIXEL_DENSITY === 2){
+ if (windowShade) {
+ if (PIXEL_DENSITY === 2) {
maxWidth = 75; // this is not 37*2, but if this was 74, we'd be missing a pixel
// someone here at Nullsoft screwed up...? or thought 74 didn't look good, I don't know.
} else {
@@ -254,33 +264,36 @@ export class BarPaintHandler extends VisPaintHandler {
// This factor controls the scaling from linear to logarithmic.
// scale = 0.0 -> fully linear scaling
// scale = 1.0 -> fully logarithmic scaling
- let scale = 0.91; // Adjust this value between 0.0 and 1.0
+ let scale = 0.91; // Adjust this value between 0.0 and 1.0
for (let x = 0; x < targetSize; x++) {
- // Linear interpolation between linear and log scaling
- let linearIndex = x / (targetSize - 1) * (maxFreqIndex - 1);
- let logScaledIndex = logMinFreqIndex + (logMaxFreqIndex - logMinFreqIndex) * x / (targetSize - 1);
- let logIndex = Math.pow(10, logScaledIndex);
-
- // Interpolating between linear and logarithmic scaling
- let scaledIndex = (1.0 - scale) * linearIndex + scale * logIndex;
-
- let index1 = Math.floor(scaledIndex);
- let index2 = Math.ceil(scaledIndex);
-
- if (index1 >= maxFreqIndex) {
- index1 = maxFreqIndex - 1;
- }
- if (index2 >= maxFreqIndex) {
- index2 = maxFreqIndex - 1;
- }
+ // Linear interpolation between linear and log scaling
+ let linearIndex = (x / (targetSize - 1)) * (maxFreqIndex - 1);
+ let logScaledIndex =
+ logMinFreqIndex +
+ ((logMaxFreqIndex - logMinFreqIndex) * x) / (targetSize - 1);
+ let logIndex = Math.pow(10, logScaledIndex);
- if (index1 == index2) {
- sample[x] = out_spectraldata[index1];
- } else {
- let frac2 = scaledIndex - index1;
- let frac1 = 1.0 - frac2;
- sample[x] = (frac1 * out_spectraldata[index1] + frac2 * out_spectraldata[index2]);
- }
+ // Interpolating between linear and logarithmic scaling
+ let scaledIndex = (1.0 - scale) * linearIndex + scale * logIndex;
+
+ let index1 = Math.floor(scaledIndex);
+ let index2 = Math.ceil(scaledIndex);
+
+ if (index1 >= maxFreqIndex) {
+ index1 = maxFreqIndex - 1;
+ }
+ if (index2 >= maxFreqIndex) {
+ index2 = maxFreqIndex - 1;
+ }
+
+ if (index1 == index2) {
+ sample[x] = out_spectraldata[index1];
+ } else {
+ let frac2 = scaledIndex - index1;
+ let frac1 = 1.0 - frac2;
+ sample[x] =
+ frac1 * out_spectraldata[index1] + frac2 * out_spectraldata[index2];
+ }
}
for (let x = 0; x < maxWidth; x++) {
@@ -288,9 +301,10 @@ export class BarPaintHandler extends VisPaintHandler {
// if our bandwidth is "wide", chunk every 5 instances of the bars,
// add them together and display them
- if (this._vis.bandwidth === "wide"){
- i = (i = x & 0xfffffffc);
- uVar12 = (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 4;
+ if (this._vis.bandwidth === "wide") {
+ i = i = x & 0xfffffffc;
+ uVar12 =
+ (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 4;
sadata[x] = uVar12;
} else {
sadata[x] = sample[x];
@@ -310,12 +324,12 @@ export class BarPaintHandler extends VisPaintHandler {
safalloff[x] = sadata[x];
}
- if (sapeaks[x] <= (Math.round(safalloff[x] * 256))) {
+ if (sapeaks[x] <= Math.round(safalloff[x] * 256)) {
sapeaks[x] = safalloff[x] * 256;
sadata2[x] = 3.0;
}
- barPeak[x] = sapeaks[x]/256;
+ barPeak[x] = sapeaks[x] / 256;
sapeaks[x] -= Math.round(sadata2[x]);
sadata2[x] *= peakfalloff;
@@ -323,14 +337,14 @@ export class BarPaintHandler extends VisPaintHandler {
// 1.05f, 1.1f, 1.2f, 1.4f, 1.6f
// 1.1f is the default of a fresh new Winamp installation
if (sapeaks[x] <= 0) {
- sapeaks[x] = 0;
+ sapeaks[x] = 0;
}
- if (windowShade){
+ if (windowShade) {
// SORRY NOTHING
// ironically enough the peaks do appear at the bottom here
} else {
- if (Math.round(barPeak[x]) < 1){
+ if (Math.round(barPeak[x]) < 1) {
barPeak[x] = -3; // Push peaks outside the viewable area, this isn't a Modern Skin!
}
}
@@ -356,7 +370,6 @@ export class BarPaintHandler extends VisPaintHandler {
*/
paintBarNormal(
ctx: CanvasRenderingContext2D,
- // barIndex: number,
x: number,
x2: number,
barHeight: number,
@@ -381,7 +394,6 @@ export class BarPaintHandler extends VisPaintHandler {
*/
paintBarFire(
ctx: CanvasRenderingContext2D,
- // barIndex: number,
x: number,
x2: number,
barHeight: number,
@@ -416,7 +428,6 @@ export class BarPaintHandler extends VisPaintHandler {
*/
paintBarLine(
ctx: CanvasRenderingContext2D,
- // barIndex: number,
x: number,
x2: number,
barHeight: number,
@@ -425,9 +436,9 @@ export class BarPaintHandler extends VisPaintHandler {
const h = ctx.canvas.height;
let y = h - barHeight;
- if(!logged) {
+ if (!this.logged) {
console.log("FIXME: Line drawing is currently Fire mode!");
- logged = true;
+ this.logged = true;
}
ctx.drawImage(
@@ -451,7 +462,7 @@ export class BarPaintHandler extends VisPaintHandler {
//? =============================== OSCILOSCOPE PAINTER ===============================
-type PaintWavFunction = (x: number, y: number, colorIndex: number) => void;
+type PaintWavFunction = (x: number, y: number) => void;
function slice1st(
dataArray: Uint8Array,
@@ -459,11 +470,6 @@ function slice1st(
sliceNumber: number
): number {
const start = sliceWidth * sliceNumber;
- // const end = start + sliceWidth;
- // let sum = 0;
- // for (let i = start; i < end; i++) {
- // sum += dataArray[i];
- // }
return dataArray[start];
}
@@ -550,147 +556,72 @@ export class WavePaintHandler extends VisPaintHandler {
// Iterate over the width of the canvas in fixed 75 pixels.
for (let j = 0; j <= 75; j++) {
const amplitude = slice1st(this._dataArray, sliceWidth, j);
- // +4 is set to off center the oscilloscope
- // because completely centered looks a bit weird
- if (PIXEL_DENSITY === 2){
- [y, colorIndex] = this.rangeByAmplitude(((amplitude+4)/2)+48);
- } else {
- [y, colorIndex] = this.rangeByAmplitude(windowShade ? ((amplitude+4)/3)+90 : amplitude+4);
- }
- this.paintWav(j, y, colorIndex);
+ this.paintWav(j, amplitude);
}
}
/**
*
- * @param amplitude 0..255
- * @returns xy.Y(top to bottom), colorOscIndex
+ * @param y 0..5
+ * @returns value in use for coloring stuff in
*/
- rangeByAmplitude(amplitude: number): [number, number] {
- // sorry about this mess
- if (windowShade){
- if (amplitude >= 184) {
- return [0, 0];
- }
- if (amplitude >= 176) {
- return [1, 0];
- }
- if (amplitude >= 168) {
- return [2, 0];
- }
- if (amplitude >= 160) {
- return [3, 0];
- }
- if (amplitude >= 152) {
- return [4, 0];
- }
- if (amplitude >= 144) {
- return [5, 0];
- }
- if (amplitude >= 136) {
- return [6, 0];
- }
- if (amplitude >= 128) {
- return [7, 0];
- }
- if (amplitude >= 120) {
- return [8, 0];
- }
- if (amplitude >= 112) {
- return [9, 0];
- }
- if (amplitude >= 104) {
- return [10, 0];
- }
- if (amplitude >= 96) {
- return [11, 0];
- }
- if (amplitude >= 88) {
- return [12, 0];
- }
- if (amplitude >= 80) {
- return [13, 0];
- }
- if (amplitude >= 72) {
- return [14, 0];
- }
- return [15, 0];
+ colorIndex(y: number): number {
+ if (windowShade) {
+ return 0;
} else {
- if (amplitude >= 184) {
- return [0, 3];
- }
- if (amplitude >= 176) {
- return [1, 3];
- }
- if (amplitude >= 168) {
- return [2, 2];
- }
- if (amplitude >= 160) {
- return [3, 2];
- }
- if (amplitude >= 152) {
- return [4, 1];
- }
- if (amplitude >= 144) {
- return [5, 1];
- }
- if (amplitude >= 136) {
- return [6, 0];
- }
- if (amplitude >= 128) {
- return [7, 0];
- }
- if (amplitude >= 120) {
- return [8, 1];
- }
- if (amplitude >= 112) {
- return [9, 1];
- }
- if (amplitude >= 104) {
- return [10, 2];
- }
- if (amplitude >= 96) {
- return [11, 2];
- }
- if (amplitude >= 88) {
- return [12, 3];
- }
- if (amplitude >= 80) {
- return [13, 3];
- }
- if (amplitude >= 72) {
- return [14, 4];
- }
- return [15, 4];
+ if (y >= 14) return 4;
+ if (y >= 12) return 3;
+ if (y >= 10) return 2;
+ if (y >= 8) return 1;
+ if (y >= 6) return 0;
+ if (y >= 4) return 1;
+ if (y >= 2) return 2;
+ if (y >= 0) return 3;
+ return 3;
}
}
- paintWavLine(x: number, y: number, colorIndex: number) {
+ paintWavLine(x: number, y: number) {
// pushes vis down if not double size, winamp does this
// has to exist here for some reason else this doesn't work...
- if (doubled){
+ if (doubled) {
pushdown = 0;
- } else if(windowShade){
+ } else if (windowShade) {
pushdown = 0;
} else {
pushdown = 2;
}
- y = windowShade ? y - 5 : y;
-
- if (windowShade && PIXEL_DENSITY === 2){
- y = y < 0 ? 0 : (y > 10 - 1 ? 10 - 1 : y);
+ // rounds y down to the nearest int
+ // before that even happens, y is scaled down and then doubled again (could've done * 8
+ // but i feel this makes more sense to me)
+ // y is then adjusted downward to be in the center of the scope
+ y = Math.round((y / 16) * 2) - 9;
+
+ // adjusts the center point of y if we are in windowshade mode, and if PIXEL_DENSITY is 2
+ // where it's adjusted further to give you the fullest view possible in that small window
+ // else we leave y as is
+ let yadjust: number;
+ if (PIXEL_DENSITY == 2) yadjust = 3;
+ else yadjust = 5;
+ y = windowShade ? y - yadjust : y;
+
+ // limits y to be within a certain range, here it would be 0..10 if both windowshade and PIXEL_DENSITY apply
+ // else we limit y to 0..15 or 0..3, depending on renderHeight
+ if (windowShade && PIXEL_DENSITY === 2) {
+ y = y < 0 ? 0 : y > 10 - 1 ? 10 - 1 : y;
} else {
- y = y < 0 ? 0 : (y > renderHeight - 1 ? renderHeight - 1 : y);
+ y = y < 0 ? 0 : y > renderHeight - 1 ? renderHeight - 1 : y;
}
+ let v = y;
if (x === 0) this._lastY = y;
let top = y;
let bottom = this._lastY;
this._lastY = y;
- if (this._vis.oscStyle === "solid"){
- if (PIXEL_DENSITY === 2){
+ if (this._vis.oscStyle === "solid") {
+ if (PIXEL_DENSITY === 2) {
if (y >= (windowShade ? 5 : 8)) {
top = windowShade ? 5 : 8;
bottom = y;
@@ -713,8 +644,9 @@ export class WavePaintHandler extends VisPaintHandler {
} else {
if (bottom < top) {
[bottom, top] = [top, bottom];
- if (windowShade){
+ if (windowShade) {
// SORRY NOTHING
+ // really just removes the smoother line descending thing that's present in the Main Window
} else {
top++; //top++, that emulates Winamp's/WACUP's OSC behavior correctly
}
@@ -725,11 +657,11 @@ export class WavePaintHandler extends VisPaintHandler {
this._ctx!.drawImage(
this._bar,
0,
- colorIndex, // sx,sy
+ this.colorIndex(v), // sx,sy
1,
1, // sw,sh
- x, y + pushdown, //dx,dy, dy is upside down because Winamp3/Winamp5 does it, so we have to emulate it
- //set to x, y, for Winamp Classic behavior
+ x,
+ y + pushdown,
1,
1 //dw,dh
);
diff --git a/packages/webamp/js/components/Visualizer.tsx b/packages/webamp/js/components/Visualizer.tsx
deleted file mode 100644
index cb376845a8..0000000000
--- a/packages/webamp/js/components/Visualizer.tsx
+++ /dev/null
@@ -1,169 +0,0 @@
-import { useMemo, useCallback, useState, useLayoutEffect } from "react";
-
-import * as Actions from "../actionCreators";
-import * as Selectors from "../selectors";
-import { useTypedSelector, useActionCreator } from "../hooks";
-import { usePaintOscilloscopeFrame } from "./useOscilloscopeVisualizer";
-import { usePaintBarFrame, usePaintBar } from "./useBarVisualizer";
-import { VISUALIZERS, MEDIA_STATUS } from "../constants";
-
-const PIXEL_DENSITY = 2;
-
-type Props = {
- analyser: AnalyserNode;
-};
-
-// Pre-render the background grid
-function preRenderBg(
- width: number,
- height: number,
- bgColor: string,
- fgColor: string,
- windowShade: boolean
-): HTMLCanvasElement {
- // Off-screen canvas for pre-rendering the background
- const bgCanvas = document.createElement("canvas");
- bgCanvas.width = width;
- bgCanvas.height = height;
- const distance = 2 * PIXEL_DENSITY;
-
- const bgCanvasCtx = bgCanvas.getContext("2d");
- if (bgCanvasCtx == null) {
- throw new Error("Could not construct canvas context");
- }
- bgCanvasCtx.fillStyle = bgColor;
- bgCanvasCtx.fillRect(0, 0, width, height);
- if (!windowShade) {
- bgCanvasCtx.fillStyle = fgColor;
- for (let x = 0; x < width; x += distance) {
- for (let y = PIXEL_DENSITY; y < height; y += distance) {
- bgCanvasCtx.fillRect(x, y, PIXEL_DENSITY, PIXEL_DENSITY);
- }
- }
- }
- return bgCanvas;
-}
-
-function Visualizer({ analyser }: Props) {
- useLayoutEffect(() => {
- analyser.fftSize = 2048;
- }, [analyser, analyser.fftSize]);
- const colors = useTypedSelector(Selectors.getSkinColors);
- const style = useTypedSelector(Selectors.getVisualizerStyle);
- const status = useTypedSelector(Selectors.getMediaStatus);
- const getWindowShade = useTypedSelector(Selectors.getWindowShade);
- const dummyVizData = useTypedSelector(Selectors.getDummyVizData);
-
- const toggleVisualizerStyle = useActionCreator(Actions.toggleVisualizerStyle);
- const windowShade = getWindowShade("main");
- const renderWidth = windowShade ? 38 : 76;
- const renderHeight = windowShade ? 5 : 16;
-
- const width = renderWidth * PIXEL_DENSITY;
- const height = renderHeight * PIXEL_DENSITY;
-
- const bgCanvas = useMemo(() => {
- return preRenderBg(
- width,
- height,
- colors[0],
- colors[1],
- Boolean(windowShade)
- );
- }, [colors, height, width, windowShade]);
-
- const paintOscilloscopeFrame = usePaintOscilloscopeFrame({
- analyser,
- height,
- width,
- renderWidth,
- });
- const paintBarFrame = usePaintBarFrame({
- analyser,
- height,
- renderHeight,
- });
- const paintBar = usePaintBar({ height, renderHeight });
-
- const paintFrame = useCallback(
- (canvasCtx: CanvasRenderingContext2D) => {
- if (status !== MEDIA_STATUS.PLAYING) {
- return;
- }
- if (dummyVizData) {
- canvasCtx.drawImage(bgCanvas, 0, 0);
- Object.entries(dummyVizData).forEach(([i, value]) => {
- paintBar(canvasCtx, Number(i), value, -1);
- });
- return;
- }
- switch (style) {
- case VISUALIZERS.OSCILLOSCOPE:
- canvasCtx.drawImage(bgCanvas, 0, 0);
- paintOscilloscopeFrame(canvasCtx);
- break;
- case VISUALIZERS.BAR:
- canvasCtx.drawImage(bgCanvas, 0, 0);
- paintBarFrame(canvasCtx);
- break;
- default:
- canvasCtx.clearRect(0, 0, width, height);
- }
- },
- [
- bgCanvas,
- dummyVizData,
- height,
- paintBar,
- paintBarFrame,
- paintOscilloscopeFrame,
- status,
- style,
- width,
- ]
- );
-
- const [canvas, setCanvas] = useState(null);
-
- useLayoutEffect(() => {
- if (canvas == null) {
- return;
- }
- const canvasCtx = canvas.getContext("2d");
- if (canvasCtx == null) {
- return;
- }
- canvasCtx.imageSmoothingEnabled = false;
-
- let animationRequest: number | null = null;
- // Kick off the animation loop
- const loop = () => {
- paintFrame(canvasCtx);
- animationRequest = window.requestAnimationFrame(loop);
- };
- loop();
-
- return () => {
- if (animationRequest != null) {
- window.cancelAnimationFrame(animationRequest);
- }
- };
- }, [canvas, paintFrame]);
-
- if (status === MEDIA_STATUS.STOPPED) {
- return null;
- }
-
- return (
-
- );
-}
-
-export default Visualizer;
diff --git a/packages/webamp/js/components/useBarVisualizer.ts b/packages/webamp/js/components/useBarVisualizer.ts
deleted file mode 100644
index df340171c8..0000000000
--- a/packages/webamp/js/components/useBarVisualizer.ts
+++ /dev/null
@@ -1,186 +0,0 @@
-import { useMemo, useCallback, useState } from "react";
-
-import * as Selectors from "../selectors";
-import { useTypedSelector } from "../hooks";
-
-const PIXEL_DENSITY = 2;
-const BAR_WIDTH = 3 * PIXEL_DENSITY;
-const GRADIENT_COLOR_COUNT = 16;
-const PEAK_COLOR_INDEX = 23;
-const BAR_PEAK_DROP_RATE = 0.01;
-const NUM_BARS = 20;
-
-function octaveBucketsForBufferLength(bufferLength: number): number[] {
- const octaveBuckets = new Array(NUM_BARS).fill(0);
- const minHz = 200;
- const maxHz = 22050;
- const octaveStep = Math.pow(maxHz / minHz, 1 / NUM_BARS);
-
- octaveBuckets[0] = 0;
- octaveBuckets[1] = minHz;
- for (let i = 2; i < NUM_BARS - 1; i++) {
- octaveBuckets[i] = octaveBuckets[i - 1] * octaveStep;
- }
- octaveBuckets[NUM_BARS - 1] = maxHz;
-
- for (let i = 0; i < NUM_BARS; i++) {
- const octaveIdx = Math.floor((octaveBuckets[i] / maxHz) * bufferLength);
- octaveBuckets[i] = octaveIdx;
- }
-
- return octaveBuckets;
-}
-
-function preRenderBar(
- height: number,
- colors: string[],
- renderHeight: number
-): HTMLCanvasElement {
- /**
- * The order of the colours is commented in the file: the fist two colours
- * define the background and dots (check it to see what are the dots), the
- * next 16 colours are the analyzer's colours from top to bottom, the next
- * 5 colours are the oscilloscope's ones, from center to top/bottom, the
- * last colour is for the analyzer's peak markers.
- */
-
- // Off-screen canvas for pre-rendering a single bar gradient
- const barCanvas = document.createElement("canvas");
- barCanvas.width = BAR_WIDTH;
- barCanvas.height = height;
-
- const offset = 2; // The first two colors are for the background;
- const gradientColors = colors.slice(offset, offset + GRADIENT_COLOR_COUNT);
-
- const barCanvasCtx = barCanvas.getContext("2d");
- if (barCanvasCtx == null) {
- throw new Error("Could not construct canvas context");
- }
- const multiplier = GRADIENT_COLOR_COUNT / renderHeight;
- // In shade mode, the five colors are, from top to bottom:
- // 214, 102, 0 -- 3
- // 222, 165, 24 -- 6
- // 148, 222, 33 -- 9
- // 57, 181, 16 -- 12
- // 24, 132, 8 -- 15
- // TODO: This could probably be improved by iterating backwards
- for (let i = 0; i < renderHeight; i++) {
- const colorIndex = GRADIENT_COLOR_COUNT - 1 - Math.floor(i * multiplier);
- barCanvasCtx.fillStyle = gradientColors[colorIndex];
- const y = height - i * PIXEL_DENSITY;
- barCanvasCtx.fillRect(0, y, BAR_WIDTH, PIXEL_DENSITY);
- }
- return barCanvas;
-}
-
-export function usePaintBar({
- renderHeight,
- height,
-}: {
- renderHeight: number;
- height: number;
-}) {
- const colors = useTypedSelector(Selectors.getSkinColors);
- const getWindowShade = useTypedSelector(Selectors.getWindowShade);
- const windowShade = getWindowShade("main");
-
- const barCanvas = useMemo(() => {
- return preRenderBar(height, colors, renderHeight);
- }, [colors, height, renderHeight]);
-
- return useCallback(
- (
- ctx: CanvasRenderingContext2D,
- x: number,
- barHeight: number,
- peakHeight: number
- ) => {
- barHeight = Math.ceil(barHeight) * PIXEL_DENSITY;
- peakHeight = Math.ceil(peakHeight) * PIXEL_DENSITY;
- if (barHeight > 0 || peakHeight > 0) {
- const y = height - barHeight;
- // Draw the gradient
- const b = BAR_WIDTH;
- if (height > 0) {
- ctx.drawImage(barCanvas, 0, y, b, height, x, y, b, height);
- }
-
- // Draw the gray peak line
- if (!windowShade) {
- const peakY = height - peakHeight;
- ctx.fillStyle = colors[PEAK_COLOR_INDEX];
- ctx.fillRect(x, peakY, b, PIXEL_DENSITY);
- }
- }
- },
- [barCanvas, colors, height, windowShade]
- );
-}
-
-export function usePaintBarFrame({
- renderHeight,
- height,
- analyser,
-}: {
- renderHeight: number;
- height: number;
- analyser: AnalyserNode;
-}) {
- const [barPeaks] = useState(() => new Array(NUM_BARS).fill(0));
- const [barPeakFrames] = useState(() => new Array(NUM_BARS).fill(0));
- const bufferLength = analyser.frequencyBinCount;
-
- const octaveBuckets = useMemo(() => {
- return octaveBucketsForBufferLength(bufferLength);
- }, [bufferLength]);
-
- const dataArray = useMemo(() => {
- return new Uint8Array(bufferLength);
- }, [bufferLength]);
-
- const paintBar = usePaintBar({ height, renderHeight });
-
- return useCallback(
- (canvasCtx: CanvasRenderingContext2D) => {
- analyser.getByteFrequencyData(dataArray);
- const heightMultiplier = renderHeight / 256;
- const xOffset = BAR_WIDTH + PIXEL_DENSITY; // Bar width, plus a pixel of spacing to the right.
- for (let j = 0; j < NUM_BARS - 1; j++) {
- const start = octaveBuckets[j];
- const end = octaveBuckets[j + 1];
- let amplitude = 0;
- for (let k = start; k < end; k++) {
- amplitude += dataArray[k];
- }
- amplitude /= end - start;
-
- // The drop rate should probably be normalized to the rendering FPS, for now assume 60 FPS
- let barPeak =
- barPeaks[j] - BAR_PEAK_DROP_RATE * Math.pow(barPeakFrames[j], 2);
- if (barPeak < amplitude) {
- barPeak = amplitude;
- barPeakFrames[j] = 0;
- } else {
- barPeakFrames[j] += 1;
- }
- barPeaks[j] = barPeak;
-
- paintBar(
- canvasCtx,
- j * xOffset,
- amplitude * heightMultiplier,
- barPeak * heightMultiplier
- );
- }
- },
- [
- analyser,
- barPeakFrames,
- barPeaks,
- dataArray,
- octaveBuckets,
- paintBar,
- renderHeight,
- ]
- );
-}
diff --git a/packages/webamp/js/components/useOscilloscopeVisualizer.ts b/packages/webamp/js/components/useOscilloscopeVisualizer.ts
deleted file mode 100644
index 4b8870c504..0000000000
--- a/packages/webamp/js/components/useOscilloscopeVisualizer.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import { useMemo, useCallback } from "react";
-
-import * as Selectors from "../selectors";
-import { useTypedSelector } from "../hooks";
-
-const PIXEL_DENSITY = 2;
-
-// Return the average value in a slice of dataArray
-function sliceAverage(
- dataArray: Uint8Array,
- sliceWidth: number,
- sliceNumber: number
-): number {
- const start = sliceWidth * sliceNumber;
- const end = start + sliceWidth;
- let sum = 0;
- for (let i = start; i < end; i++) {
- sum += dataArray[i];
- }
- return sum / sliceWidth;
-}
-
-export function usePaintOscilloscopeFrame({
- analyser,
- height,
- width,
- renderWidth,
-}: {
- analyser: AnalyserNode;
- height: number;
- width: number;
- renderWidth: number;
-}) {
- const colors = useTypedSelector(Selectors.getSkinColors);
-
- const bufferLength = analyser.fftSize;
-
- const dataArray = useMemo(() => {
- return new Uint8Array(bufferLength);
- }, [bufferLength]);
-
- return useCallback(
- (canvasCtx: CanvasRenderingContext2D) => {
- analyser.getByteTimeDomainData(dataArray);
-
- canvasCtx.lineWidth = PIXEL_DENSITY;
-
- // Just use one of the viscolors for now
- canvasCtx.strokeStyle = colors[18];
-
- // Since dataArray has more values than we have pixels to display, we
- // have to average several dataArray values per pixel. We call these
- // groups slices.
- //
- // We use the 2x scale here since we only want to plot values for
- // "real" pixels.
- const sliceWidth = Math.floor(bufferLength / width) * PIXEL_DENSITY;
-
- const h = height;
-
- canvasCtx.beginPath();
-
- // Iterate over the width of the canvas in "real" pixels.
- for (let j = 0; j <= renderWidth; j++) {
- const amplitude = sliceAverage(dataArray, sliceWidth, j);
- const percentAmplitude = amplitude / 255; // dataArray gives us bytes
- const y = (1 - percentAmplitude) * h; // flip y
- const x = j * PIXEL_DENSITY;
-
- // Canvas coordinates are in the middle of the pixel by default.
- // When we want to draw pixel perfect lines, we will need to
- // account for that here
- if (x === 0) {
- canvasCtx.moveTo(x, y);
- } else {
- canvasCtx.lineTo(x, y);
- }
- }
- canvasCtx.stroke();
- },
- [analyser, bufferLength, colors, dataArray, height, renderWidth, width]
- );
-}
From dc59c28a58f78955ec328da97f860147312c9b04 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Sat, 24 Aug 2024 02:53:10 +0200
Subject: [PATCH 12/19] Missed a few variables that weren't in camelCase
Finetuned the data going into timeToFrequencyDomain
---
packages/webamp/js/components/FFTNullsoft.ts | 24 ++++++++++----------
packages/webamp/js/components/Vis.tsx | 14 ++++++------
packages/webamp/js/components/VisPainter.ts | 6 ++---
3 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/packages/webamp/js/components/FFTNullsoft.ts b/packages/webamp/js/components/FFTNullsoft.ts
index 4c321ed6dc..b70e9dc2d2 100644
--- a/packages/webamp/js/components/FFTNullsoft.ts
+++ b/packages/webamp/js/components/FFTNullsoft.ts
@@ -17,14 +17,14 @@ export class FFT {
}
public init(
- samples_in: number,
- samples_out: number,
+ samplesIn: number,
+ samplesOut: number,
bEqualize = 1,
envelopePower = 1.0,
mode = false
): void {
- this.mSamplesIn = samples_in;
- this.NFREQ = samples_out * 2;
+ this.mSamplesIn = samplesIn;
+ this.NFREQ = samplesOut * 2;
this.initBitRevTable();
this.initCosSinTable();
@@ -119,13 +119,13 @@ export class FFT {
}
public timeToFrequencyDomain(
- in_wavedata: Float32Array,
- out_spectraldata: Float32Array
+ inWavedata: Float32Array,
+ outSpectraldata: Float32Array
): void {
if (!this.bitrevtable || !this.temp1 || !this.temp2 || !this.cossintable)
return;
- // Converts time-domain samples from in_wavedata[]
- // into frequency-domain samples in out_spectraldata[].
+ // Converts time-domain samples from inWavedata[]
+ // into frequency-domain samples in outSpectraldata[].
// The array lengths are the two parameters to Init().
// The last sample of the output data will represent the frequency
@@ -172,7 +172,7 @@ export class FFT {
for (let i = 0; i < this.NFREQ; i++) {
const idx = this.bitrevtable[i];
if (idx < this.mSamplesIn) {
- this.temp1[i] = in_wavedata[idx] * this.envelope[idx];
+ this.temp1[i] = inWavedata[idx] * this.envelope[idx];
} else {
this.temp1[i] = 0;
}
@@ -181,7 +181,7 @@ export class FFT {
for (let i = 0; i < this.NFREQ; i++) {
const idx = this.bitrevtable[i];
if (idx < this.mSamplesIn) {
- this.temp1[i] = in_wavedata[idx];
+ this.temp1[i] = inWavedata[idx];
} else {
this.temp1[i] = 0;
}
@@ -225,12 +225,12 @@ export class FFT {
// 3. take the magnitude & equalize it (on a log10 scale) for output
if (this.equalize) {
for (let i = 0; i < this.NFREQ / 2; i++) {
- out_spectraldata[i] =
+ outSpectraldata[i] =
this.equalize[i] * Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
}
} else {
for (let i = 0; i < this.NFREQ / 2; i++) {
- out_spectraldata[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
+ outSpectraldata[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
}
}
}
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index dfac3e64e3..644a9a4fa0 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -29,16 +29,16 @@ type Props = {
export let PIXEL_DENSITY = 1;
const fft = new FFT();
-const SAMPLESIN = 1024; // Example input size
-const SAMPLESOUT = 512; // Example output size
+const SAMPLESIN = 1024;
+const SAMPLESOUT = 512;
export let renderWidth: number;
export let renderHeight: number;
export let windowShade: boolean | undefined;
export let doubled: boolean | undefined;
fft.init(SAMPLESIN, SAMPLESOUT, 1, 1.0, true);
-let in_wavedata = new Float32Array(SAMPLESIN); // Fill this with your input data
-export let out_spectraldata = new Float32Array(SAMPLESOUT);
+let inWavedata = new Float32Array(SAMPLESIN);
+export let outSpectraldata = new Float32Array(SAMPLESOUT);
// Pre-render the background grid
function preRenderBg(
@@ -85,7 +85,7 @@ export default function Vis({ analyser }: Props) {
const dataArray = new Uint8Array(1024);
analyser.getByteTimeDomainData(dataArray);
- in_wavedata = new Float32Array(dataArray.length);
+ inWavedata = new Float32Array(dataArray.length);
const toggleVisualizerStyle = useActionCreator(Actions.toggleVisualizerStyle);
windowShade = getWindowShade("main");
@@ -163,9 +163,9 @@ export default function Vis({ analyser }: Props) {
painter.prepare();
analyser.getByteTimeDomainData(dataArray);
for (let i = 0; i < dataArray.length; i++) {
- in_wavedata[i] = (dataArray[i] - 128) / 32;
+ inWavedata[i] = (dataArray[i] - 128) / 28;
}
- fft.timeToFrequencyDomain(in_wavedata, out_spectraldata);
+ fft.timeToFrequencyDomain(inWavedata, outSpectraldata);
painter.paintFrame();
animationRequest = window.requestAnimationFrame(loop);
};
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index f1b8b4bdc8..452b14633b 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -13,7 +13,7 @@ export interface Vis {
}
import { range } from "lodash";
import {
- out_spectraldata,
+ outSpectraldata,
renderHeight,
renderWidth,
windowShade,
@@ -287,12 +287,12 @@ export class BarPaintHandler extends VisPaintHandler {
}
if (index1 == index2) {
- sample[x] = out_spectraldata[index1];
+ sample[x] = outSpectraldata[index1];
} else {
let frac2 = scaledIndex - index1;
let frac1 = 1.0 - frac2;
sample[x] =
- frac1 * out_spectraldata[index1] + frac2 * out_spectraldata[index2];
+ frac1 * outSpectraldata[index1] + frac2 * outSpectraldata[index2];
}
}
From 792831b55c5de8e2e5c18819101b1544dd04c2f0 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Sat, 24 Aug 2024 07:54:00 +0200
Subject: [PATCH 13/19] Move FFT stuff into VisPainter.ts Attempt at addressing
more of the PR review
---
packages/webamp/js/components/FFTNullsoft.ts | 189 +++++++------------
packages/webamp/js/components/Vis.tsx | 21 +--
packages/webamp/js/components/VisPainter.ts | 29 ++-
3 files changed, 97 insertions(+), 142 deletions(-)
diff --git a/packages/webamp/js/components/FFTNullsoft.ts b/packages/webamp/js/components/FFTNullsoft.ts
index b70e9dc2d2..4112ebcce0 100644
--- a/packages/webamp/js/components/FFTNullsoft.ts
+++ b/packages/webamp/js/components/FFTNullsoft.ts
@@ -2,91 +2,77 @@
// Taken from https://github.com/WACUP/vis_classic/tree/master/FFTNullsoft
export class FFT {
- private mSamplesIn: number;
- private NFREQ: number;
- private bitrevtable: number[] | null = null;
- private envelope: Float32Array | null = null;
- private equalize: Float32Array | null = null;
- private temp1: Float32Array | null = null;
- private temp2: Float32Array | null = null;
- private cossintable: Float32Array[] | null = null;
+ private bitrevtable: number[];
+ private envelope: Float32Array | null;
+ private equalize: Float32Array | null;
+ private temp1: Float32Array;
+ private temp2: Float32Array;
+ private cossintable: Float32Array[];
+
+ // Constants
+ private static readonly TWO_PI = 6.2831853; // 2 * Math.PI
+ private static readonly HALF_PI = 1.5707963268; // Math.PI / 2
constructor() {
- this.mSamplesIn = 0;
- this.NFREQ = 0;
- }
+ // Assuming these are your hardcoded values:
+ const samplesIn = 1024; // hardcoded value
+ const samplesOut = 512; // hardcoded value
+ const bEqualize = true; // hardcoded value
+ const envelopePower = 1.0; // hardcoded value
+ const mode = false; // hardcoded value
- public init(
- samplesIn: number,
- samplesOut: number,
- bEqualize = 1,
- envelopePower = 1.0,
- mode = false
- ): void {
- this.mSamplesIn = samplesIn;
- this.NFREQ = samplesOut * 2;
-
- this.initBitRevTable();
- this.initCosSinTable();
-
- if (envelopePower > 0) {
- this.initEnvelopeTable(envelopePower);
- }
+ const NFREQ = samplesOut * 2;
- if (bEqualize) {
- this.initEqualizeTable(mode);
- }
+ // Initialize the tables and arrays with hardcoded values
+ this.bitrevtable = this.initBitRevTable(NFREQ);
+ this.cossintable = this.initCosSinTable(NFREQ);
- this.temp1 = new Float32Array(this.NFREQ);
- this.temp2 = new Float32Array(this.NFREQ);
- }
+ this.envelope = envelopePower > 0 ? this.initEnvelopeTable(samplesIn, envelopePower) : null;
+ this.equalize = bEqualize ? this.initEqualizeTable(NFREQ, mode) : null;
- private initEqualizeTable(mode: boolean): void {
- this.equalize = new Float32Array(this.NFREQ / 2);
- let bias = 0.04;
+ this.temp1 = new Float32Array(NFREQ);
+ this.temp2 = new Float32Array(NFREQ);
+ }
- for (let i = 0; i < this.NFREQ / 2; i++) {
- const inv_half_nfreq = (9.0 - bias) / (this.NFREQ / 2);
- this.equalize[i] = Math.log10(1.0 + bias + (i + 1) * inv_half_nfreq);
+ private initEqualizeTable(NFREQ: number, mode: boolean): Float32Array {
+ const equalize = new Float32Array(NFREQ / 2);
+ let bias = 0.04; // FFT.INITIAL_BIAS
- bias /= 1.0025;
+ for (let i = 0; i < NFREQ / 2; i++) {
+ const inv_half_nfreq = (9.0 - bias) / (NFREQ / 2);
+ equalize[i] = Math.log10(1.0 + bias + (i + 1) * inv_half_nfreq);
+ bias /= 1.0025; // FFT.BIAS_DECAY_RATE
}
- }
- private initEnvelopeTable(power: number): void {
- const mult = (1.0 / this.mSamplesIn) * 6.2831853;
+ return equalize;
+ }
- this.envelope = new Float32Array(this.mSamplesIn);
+ private initEnvelopeTable(samplesIn: number, power: number): Float32Array {
+ const mult = (1.0 / samplesIn) * FFT.TWO_PI;
+ const envelope = new Float32Array(samplesIn);
- if (power == 1.0) {
- for (let i = 0; i < this.mSamplesIn; i++) {
- this.envelope[i] = 0.5 + 0.5 * Math.sin(i * mult - 1.5707963268);
- }
- } else {
- for (let i = 0; i < this.mSamplesIn; i++) {
- this.envelope[i] = Math.pow(
- 0.5 + 0.5 * Math.sin(i * mult - 1.5707963268),
- power
- );
- }
+ for (let i = 0; i < samplesIn; i++) {
+ envelope[i] = Math.pow(0.5 + 0.5 * Math.sin(i * mult - FFT.HALF_PI), power);
}
+
+ return envelope;
}
- private initBitRevTable(): void {
- this.bitrevtable = new Array(this.NFREQ);
+ private initBitRevTable(NFREQ: number): number[] {
+ const bitrevtable = new Array(NFREQ);
- for (let i = 0; i < this.NFREQ; i++) {
- this.bitrevtable[i] = i;
+ for (let i = 0; i < NFREQ; i++) {
+ bitrevtable[i] = i;
}
- for (let i = 0, j = 0; i < this.NFREQ; i++) {
+ for (let i = 0, j = 0; i < NFREQ; i++) {
if (j > i) {
- const temp = this.bitrevtable[i];
- this.bitrevtable[i] = this.bitrevtable[j];
- this.bitrevtable[j] = temp;
+ const temp = bitrevtable[i];
+ bitrevtable[i] = bitrevtable[j];
+ bitrevtable[j] = temp;
}
- let m = this.NFREQ >> 1;
+ let m = NFREQ >> 1;
while (m >= 1 && j >= m) {
j -= m;
m >>= 1;
@@ -94,36 +80,25 @@ export class FFT {
j += m;
}
+
+ return bitrevtable;
}
- private initCosSinTable(): void {
+ private initCosSinTable(NFREQ: number): Float32Array[] {
+ const cossintable: Float32Array[] = [];
let dftsize = 2;
- let tabsize = 0;
- while (dftsize <= this.NFREQ) {
- ++tabsize;
- dftsize <<= 1;
- }
-
- this.cossintable = new Array(tabsize);
- dftsize = 2;
- let i = 0;
- while (dftsize <= this.NFREQ) {
+ while (dftsize <= NFREQ) {
const theta = (-2.0 * Math.PI) / dftsize;
- this.cossintable[i] = new Float32Array(2);
- this.cossintable[i][0] = Math.cos(theta);
- this.cossintable[i][1] = Math.sin(theta);
- ++i;
+ cossintable.push(new Float32Array([Math.cos(theta), Math.sin(theta)]));
dftsize <<= 1;
}
+
+ return cossintable;
}
- public timeToFrequencyDomain(
- inWavedata: Float32Array,
- outSpectraldata: Float32Array
- ): void {
- if (!this.bitrevtable || !this.temp1 || !this.temp2 || !this.cossintable)
- return;
+ public timeToFrequencyDomain(inWavedata: Float32Array, outSpectraldata: Float32Array): void {
+ if (!this.temp1 || !this.temp2 || !this.cossintable) return;
// Converts time-domain samples from inWavedata[]
// into frequency-domain samples in outSpectraldata[].
// The array lengths are the two parameters to Init().
@@ -168,34 +143,23 @@ export class FFT {
//if (!cossintable) return;
// 1. set up input to the fft
- if (this.envelope) {
- for (let i = 0; i < this.NFREQ; i++) {
- const idx = this.bitrevtable[i];
- if (idx < this.mSamplesIn) {
- this.temp1[i] = inWavedata[idx] * this.envelope[idx];
- } else {
- this.temp1[i] = 0;
- }
- }
- } else {
- for (let i = 0; i < this.NFREQ; i++) {
- const idx = this.bitrevtable[i];
- if (idx < this.mSamplesIn) {
- this.temp1[i] = inWavedata[idx];
- } else {
- this.temp1[i] = 0;
- }
+ for (let i = 0; i < this.temp1.length; i++) {
+ const idx = this.bitrevtable[i];
+ if (idx < inWavedata.length) {
+ this.temp1[i] = inWavedata[idx] * (this.envelope ? this.envelope[idx] : 1);
+ } else {
+ this.temp1[i] = 0;
}
}
this.temp2.fill(0);
- // 2. perform FFT
+ // 2. Perform FFT
let real = this.temp1;
let imag = this.temp2;
let dftsize = 2;
let t = 0;
- while (dftsize <= this.NFREQ) {
+ while (dftsize <= this.temp1.length) {
const wpr = this.cossintable[t][0];
const wpi = this.cossintable[t][1];
let wr = 1.0;
@@ -203,7 +167,7 @@ export class FFT {
const hdftsize = dftsize >> 1;
for (let m = 0; m < hdftsize; m += 1) {
- for (let i = m; i < this.NFREQ; i += dftsize) {
+ for (let i = m; i < this.temp1.length; i += dftsize) {
const j = i + hdftsize;
const tempr = wr * real[j] - wi * imag[j];
const tempi = wr * imag[j] + wi * real[j];
@@ -223,19 +187,8 @@ export class FFT {
}
// 3. take the magnitude & equalize it (on a log10 scale) for output
- if (this.equalize) {
- for (let i = 0; i < this.NFREQ / 2; i++) {
- outSpectraldata[i] =
- this.equalize[i] * Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
- }
- } else {
- for (let i = 0; i < this.NFREQ / 2; i++) {
- outSpectraldata[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i]);
- }
+ for (let i = 0; i < outSpectraldata.length; i++) {
+ outSpectraldata[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i]) * (this.equalize ? this.equalize[i] : 1);
}
}
-
- public getNumFreq(): number {
- return this.NFREQ;
- }
}
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index 644a9a4fa0..ab07aa6517 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -8,7 +8,6 @@ import React, {
import * as Actions from "../actionCreators";
import * as Selectors from "../selectors";
-import { FFT } from "./FFTNullsoft";
import { useTypedSelector, useActionCreator } from "../hooks";
// import { usePaintOscilloscopeFrame } from "./useOscilloscopeVisualizer";
// import { usePaintBarFrame, usePaintBar } from "./useBarVisualizer";
@@ -20,6 +19,7 @@ import {
BarPaintHandler,
WavePaintHandler,
NoVisualizerHandler,
+ processFFT,
} from "./VisPainter";
type Props = {
@@ -27,18 +27,9 @@ type Props = {
};
export let PIXEL_DENSITY = 1;
-
-const fft = new FFT();
-const SAMPLESIN = 1024;
-const SAMPLESOUT = 512;
-export let renderWidth: number;
export let renderHeight: number;
export let windowShade: boolean | undefined;
export let doubled: boolean | undefined;
-fft.init(SAMPLESIN, SAMPLESOUT, 1, 1.0, true);
-
-let inWavedata = new Float32Array(SAMPLESIN);
-export let outSpectraldata = new Float32Array(SAMPLESOUT);
// Pre-render the background grid
function preRenderBg(
@@ -85,13 +76,11 @@ export default function Vis({ analyser }: Props) {
const dataArray = new Uint8Array(1024);
analyser.getByteTimeDomainData(dataArray);
- inWavedata = new Float32Array(dataArray.length);
-
const toggleVisualizerStyle = useActionCreator(Actions.toggleVisualizerStyle);
windowShade = getWindowShade("main");
// BUG: windowshade does not take into account if the main window is visible (small vis is in pledit)
// how can i know the state of individual windows?
- renderWidth = windowShade ? 38 : 75;
+ const renderWidth = windowShade ? 38 : 75;
renderHeight = windowShade ? 5 : 16;
PIXEL_DENSITY = doubled && windowShade ? 2 : 1;
@@ -161,11 +150,7 @@ export default function Vis({ analyser }: Props) {
const loop = () => {
painter.prepare();
- analyser.getByteTimeDomainData(dataArray);
- for (let i = 0; i < dataArray.length; i++) {
- inWavedata[i] = (dataArray[i] - 128) / 28;
- }
- fft.timeToFrequencyDomain(inWavedata, outSpectraldata);
+ processFFT(analyser);
painter.paintFrame();
animationRequest = window.requestAnimationFrame(loop);
};
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index 452b14633b..f5de8f4b50 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -2,7 +2,6 @@ export interface Vis {
canvas?: HTMLCanvasElement;
colors: string[];
analyser?: AnalyserNode;
- audioContext?: AudioContext; //butterchurn need it
oscStyle?: "dots" | "solid" | "lines";
bandwidth?: "wide" | "thin";
coloring?: "fire" | "line" | "normal";
@@ -11,11 +10,9 @@ export interface Vis {
sa_peak_falloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
sa?: "analyzer" | "oscilloscope" | "none";
}
-import { range } from "lodash";
+import { FFT } from "./FFTNullsoft";
import {
- outSpectraldata,
renderHeight,
- renderWidth,
windowShade,
PIXEL_DENSITY,
doubled,
@@ -63,6 +60,26 @@ export class VisPaintHandler {
dispose() {}
}
+const SAMPLESIN = 1024;
+const SAMPLESOUT = 512;
+const fft = new FFT();
+let inWaveData = new Float32Array(SAMPLESIN);
+let outSpectralData = new Float32Array(SAMPLESOUT);
+
+/**
+ * Feeds audio data to the FFT.
+ * @param analyser The AnalyserNode used to get the audio data.
+ */
+export function processFFT(analyser: AnalyserNode): void {
+ const dataArray = new Uint8Array(SAMPLESIN);
+
+ analyser.getByteTimeDomainData(dataArray);
+ for (let i = 0; i < dataArray.length; i++) {
+ inWaveData[i] = (dataArray[i] - 128) / 28;
+ }
+ fft.timeToFrequencyDomain(inWaveData, outSpectralData);
+}
+
//? =============================== BAR PAINTER ===============================
type PaintFrameFunction = () => void;
type PaintBarFunction = (
@@ -287,12 +304,12 @@ export class BarPaintHandler extends VisPaintHandler {
}
if (index1 == index2) {
- sample[x] = outSpectraldata[index1];
+ sample[x] = outSpectralData[index1];
} else {
let frac2 = scaledIndex - index1;
let frac1 = 1.0 - frac2;
sample[x] =
- frac1 * outSpectraldata[index1] + frac2 * outSpectraldata[index2];
+ frac1 * outSpectralData[index1] + frac2 * outSpectralData[index2];
}
}
From 99c4b215222bd07099f9daabb0105ef94205c8ae Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Tue, 27 Aug 2024 01:17:26 +0200
Subject: [PATCH 14/19] Moved the FFT to be part of BarPaintHandler, instead of
being global Added checking for the state of the Main Window so that the
Playlist Editor visualizer no longer bugs out like it did (incorrectly
showing the small visualizer, or showing the full capacity of it) Changed the
global variable `i` to be `chunk` to avoid potential issues Ensure `y` is
scaled down (in the y axis) correctly when in windowshade mode Skip rendering
of the Oscilloscope in the windowshade mode to avoid it drawing out of bounds
Missed a few variables that werent in camelCase (again)
---
packages/webamp/js/components/FFTNullsoft.ts | 22 +-
packages/webamp/js/components/Vis.tsx | 29 ++-
packages/webamp/js/components/VisPainter.ts | 212 +++++++++++--------
3 files changed, 152 insertions(+), 111 deletions(-)
diff --git a/packages/webamp/js/components/FFTNullsoft.ts b/packages/webamp/js/components/FFTNullsoft.ts
index 4112ebcce0..2aa36a7b73 100644
--- a/packages/webamp/js/components/FFTNullsoft.ts
+++ b/packages/webamp/js/components/FFTNullsoft.ts
@@ -27,7 +27,10 @@ export class FFT {
this.bitrevtable = this.initBitRevTable(NFREQ);
this.cossintable = this.initCosSinTable(NFREQ);
- this.envelope = envelopePower > 0 ? this.initEnvelopeTable(samplesIn, envelopePower) : null;
+ this.envelope =
+ envelopePower > 0
+ ? this.initEnvelopeTable(samplesIn, envelopePower)
+ : null;
this.equalize = bEqualize ? this.initEqualizeTable(NFREQ, mode) : null;
this.temp1 = new Float32Array(NFREQ);
@@ -52,7 +55,10 @@ export class FFT {
const envelope = new Float32Array(samplesIn);
for (let i = 0; i < samplesIn; i++) {
- envelope[i] = Math.pow(0.5 + 0.5 * Math.sin(i * mult - FFT.HALF_PI), power);
+ envelope[i] = Math.pow(
+ 0.5 + 0.5 * Math.sin(i * mult - FFT.HALF_PI),
+ power
+ );
}
return envelope;
@@ -97,7 +103,10 @@ export class FFT {
return cossintable;
}
- public timeToFrequencyDomain(inWavedata: Float32Array, outSpectraldata: Float32Array): void {
+ public timeToFrequencyDomain(
+ inWavedata: Float32Array,
+ outSpectraldata: Float32Array
+ ): void {
if (!this.temp1 || !this.temp2 || !this.cossintable) return;
// Converts time-domain samples from inWavedata[]
// into frequency-domain samples in outSpectraldata[].
@@ -146,7 +155,8 @@ export class FFT {
for (let i = 0; i < this.temp1.length; i++) {
const idx = this.bitrevtable[i];
if (idx < inWavedata.length) {
- this.temp1[i] = inWavedata[idx] * (this.envelope ? this.envelope[idx] : 1);
+ this.temp1[i] =
+ inWavedata[idx] * (this.envelope ? this.envelope[idx] : 1);
} else {
this.temp1[i] = 0;
}
@@ -188,7 +198,9 @@ export class FFT {
// 3. take the magnitude & equalize it (on a log10 scale) for output
for (let i = 0; i < outSpectraldata.length; i++) {
- outSpectraldata[i] = Math.sqrt(real[i] * real[i] + imag[i] * imag[i]) * (this.equalize ? this.equalize[i] : 1);
+ outSpectraldata[i] =
+ Math.sqrt(real[i] * real[i] + imag[i] * imag[i]) *
+ (this.equalize ? this.equalize[i] : 1);
}
}
}
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index ab07aa6517..0e8e391fbd 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -9,8 +9,6 @@ import React, {
import * as Actions from "../actionCreators";
import * as Selectors from "../selectors";
import { useTypedSelector, useActionCreator } from "../hooks";
-// import { usePaintOscilloscopeFrame } from "./useOscilloscopeVisualizer";
-// import { usePaintBarFrame, usePaintBar } from "./useBarVisualizer";
import { VISUALIZERS, MEDIA_STATUS } from "../constants";
import {
@@ -19,7 +17,6 @@ import {
BarPaintHandler,
WavePaintHandler,
NoVisualizerHandler,
- processFFT,
} from "./VisPainter";
type Props = {
@@ -28,8 +25,9 @@ type Props = {
export let PIXEL_DENSITY = 1;
export let renderHeight: number;
-export let windowShade: boolean | undefined;
export let doubled: boolean | undefined;
+export let smallVis: boolean | undefined;
+export let isMWOpen: boolean | undefined;
// Pre-render the background grid
function preRenderBg(
@@ -70,19 +68,17 @@ export default function Vis({ analyser }: Props) {
const mode = useTypedSelector(Selectors.getVisualizerStyle);
const audioStatus = useTypedSelector(Selectors.getMediaStatus);
const getWindowShade = useTypedSelector(Selectors.getWindowShade);
+ const getWindowOpen = useTypedSelector(Selectors.getWindowOpen);
+ isMWOpen = getWindowOpen("main");
doubled = useTypedSelector(Selectors.getDoubled);
const dummyVizData = useTypedSelector(Selectors.getDummyVizData);
-
- const dataArray = new Uint8Array(1024);
- analyser.getByteTimeDomainData(dataArray);
-
const toggleVisualizerStyle = useActionCreator(Actions.toggleVisualizerStyle);
- windowShade = getWindowShade("main");
- // BUG: windowshade does not take into account if the main window is visible (small vis is in pledit)
- // how can i know the state of individual windows?
- const renderWidth = windowShade ? 38 : 75;
- renderHeight = windowShade ? 5 : 16;
- PIXEL_DENSITY = doubled && windowShade ? 2 : 1;
+ const windowShade = getWindowShade("main");
+
+ smallVis = windowShade && isMWOpen;
+ const renderWidth = 75;
+ renderHeight = smallVis ? 5 : 16;
+ PIXEL_DENSITY = doubled && smallVis ? 2 : 1;
const width = renderWidth * PIXEL_DENSITY;
const height = renderHeight * PIXEL_DENSITY;
@@ -113,8 +109,8 @@ export default function Vis({ analyser }: Props) {
bandwidth: "wide",
coloring: "normal",
peaks: true,
- safalloff: "moderate",
- sa_peak_falloff: "slow",
+ saFalloff: "moderate",
+ saPeakFalloff: "slow",
sa: "analyzer",
};
const newPainter = new PainterType(_vis);
@@ -150,7 +146,6 @@ export default function Vis({ analyser }: Props) {
const loop = () => {
painter.prepare();
- processFFT(analyser);
painter.paintFrame();
animationRequest = window.requestAnimationFrame(loop);
};
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index f5de8f4b50..747e84bf02 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -6,30 +6,31 @@ export interface Vis {
bandwidth?: "wide" | "thin";
coloring?: "fire" | "line" | "normal";
peaks?: boolean;
- safalloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
- sa_peak_falloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
+ saFalloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
+ saPeakFalloff?: "slower" | "slow" | "moderate" | "fast" | "faster";
sa?: "analyzer" | "oscilloscope" | "none";
}
import { FFT } from "./FFTNullsoft";
import {
renderHeight,
- windowShade,
+ smallVis,
PIXEL_DENSITY,
doubled,
+ isMWOpen,
} from "./Vis";
-let sapeaks = new Int16Array(76).fill(0);
-let sadata2 = new Float32Array(76).fill(0);
-let sadata = new Int16Array(76).fill(0);
-let safalloff = new Float32Array(76).fill(0);
+let saPeaks = new Int16Array(76).fill(0);
+let saData2 = new Float32Array(76).fill(0);
+let saData = new Int16Array(76).fill(0);
+let saFalloff = new Float32Array(76).fill(0);
let sample = new Float32Array(76).fill(0);
let barPeak = new Int16Array(76).fill(0); // Needs to be specified as Int16 else the peaks don't behave as they should
-let i: number;
+let chunk: number;
let uVar12: number;
let falloff: number;
-let peakfalloff: number;
+let peakFalloff: number;
-let pushdown: number = 0;
+let pushDown: number = 0;
/**
* Base class of Visualizer (animation frame renderer engine)
@@ -62,17 +63,17 @@ export class VisPaintHandler {
const SAMPLESIN = 1024;
const SAMPLESOUT = 512;
-const fft = new FFT();
-let inWaveData = new Float32Array(SAMPLESIN);
-let outSpectralData = new Float32Array(SAMPLESOUT);
+const inWaveData = new Float32Array(SAMPLESIN);
+const outSpectralData = new Float32Array(SAMPLESOUT);
/**
* Feeds audio data to the FFT.
* @param analyser The AnalyserNode used to get the audio data.
+ * @param fft The FFTNullsoft instance from the PaintHandler.
*/
-export function processFFT(analyser: AnalyserNode): void {
+function processFFT(analyser: AnalyserNode, fft: FFT): void {
const dataArray = new Uint8Array(SAMPLESIN);
-
+
analyser.getByteTimeDomainData(dataArray);
for (let i = 0; i < dataArray.length; i++) {
inWaveData[i] = (dataArray[i] - 128) / 28;
@@ -92,6 +93,7 @@ type PaintBarFunction = (
export class BarPaintHandler extends VisPaintHandler {
_analyser: AnalyserNode;
+ _fft: FFT;
_color: string = "rgb(255,255,255)";
_colorPeak: string = "rgb(255,255,255)";
// Off-screen canvas for pre-rendering a single bar gradient
@@ -109,6 +111,7 @@ export class BarPaintHandler extends VisPaintHandler {
constructor(vis: Vis) {
super(vis);
this._analyser = this._vis.analyser!;
+ this._fft = new FFT();
this._bufferLength = this._analyser.frequencyBinCount;
this._dataArray = new Uint8Array(this._bufferLength);
@@ -155,34 +158,35 @@ export class BarPaintHandler extends VisPaintHandler {
this.paintBar = this.paintBarNormal.bind(this);
}
- if (this._vis.safalloff === "slower") {
+ if (this._vis.saFalloff === "slower") {
falloff = 3;
- } else if (this._vis.safalloff === "slow") {
+ } else if (this._vis.saFalloff === "slow") {
falloff = 6;
- } else if (this._vis.safalloff === "moderate") {
+ } else if (this._vis.saFalloff === "moderate") {
falloff = 12;
- } else if (this._vis.safalloff === "fast") {
+ } else if (this._vis.saFalloff === "fast") {
falloff = 16;
- } else if (this._vis.safalloff === "faster") {
+ } else if (this._vis.saFalloff === "faster") {
falloff = 32;
}
- if (this._vis.sa_peak_falloff === "slower") {
- peakfalloff = 1.05;
- } else if (this._vis.sa_peak_falloff === "slow") {
- peakfalloff = 1.1;
- } else if (this._vis.sa_peak_falloff === "moderate") {
- peakfalloff = 1.2;
- } else if (this._vis.sa_peak_falloff === "fast") {
- peakfalloff = 1.4;
- } else if (this._vis.sa_peak_falloff === "faster") {
- peakfalloff = 1.6;
+ if (this._vis.saPeakFalloff === "slower") {
+ peakFalloff = 1.05;
+ } else if (this._vis.saPeakFalloff === "slow") {
+ peakFalloff = 1.1;
+ } else if (this._vis.saPeakFalloff === "moderate") {
+ peakFalloff = 1.2;
+ } else if (this._vis.saPeakFalloff === "fast") {
+ peakFalloff = 1.4;
+ } else if (this._vis.saPeakFalloff === "faster") {
+ peakFalloff = 1.6;
}
}
prepare() {
const vis = this._vis;
if (!vis.canvas) return;
+ processFFT(this._analyser, this._fft);
//? paint peak
this._peak.height = 1;
@@ -191,15 +195,14 @@ export class BarPaintHandler extends VisPaintHandler {
ctx.fillStyle = vis.colors[23];
ctx.fillRect(0, 0, 1, 1);
- // pushes vis down if not double size, winamp does this
- // BUG: does not take into account if the main window is visible
- // how can i know the state of individual windows?
- if (doubled) {
- pushdown = 0;
- } else if (windowShade) {
- pushdown = 0;
+ if (smallVis) {
+ pushDown = 0;
+ } else if (doubled && !isMWOpen) {
+ pushDown = 2;
+ } else if (doubled) {
+ pushDown = 0;
} else {
- pushdown = 2;
+ pushDown = 2;
}
//? paint bar
@@ -209,12 +212,12 @@ export class BarPaintHandler extends VisPaintHandler {
this._bar.setAttribute("height", "16");
ctx = this._bar.getContext("2d")!;
for (let y = 0; y < 16; y++) {
- if (PIXEL_DENSITY === 2 && windowShade) {
+ if (PIXEL_DENSITY === 2 && smallVis) {
ctx.fillStyle = this.colorssmall2[-y + 9];
} else {
- ctx.fillStyle = windowShade
+ ctx.fillStyle = smallVis
? this.colorssmall[-y + 4]
- : vis.colors[2 - pushdown - -y];
+ : vis.colors[2 - pushDown - -y];
}
ctx.fillRect(0, y, 1, y + 1);
}
@@ -259,11 +262,11 @@ export class BarPaintHandler extends VisPaintHandler {
targetSize = 75;
maxHeight = 10;
} else {
- targetSize = windowShade ? 40 : 75;
- maxHeight = windowShade ? 5 : 15;
+ targetSize = smallVis ? 40 : 75;
+ maxHeight = smallVis ? 5 : 15;
}
- if (windowShade) {
+ if (smallVis) {
if (PIXEL_DENSITY === 2) {
maxWidth = 75; // this is not 37*2, but if this was 74, we'd be missing a pixel
// someone here at Nullsoft screwed up...? or thought 74 didn't look good, I don't know.
@@ -319,45 +322,49 @@ export class BarPaintHandler extends VisPaintHandler {
// if our bandwidth is "wide", chunk every 5 instances of the bars,
// add them together and display them
if (this._vis.bandwidth === "wide") {
- i = i = x & 0xfffffffc;
+ chunk = chunk = x & 0xfffffffc;
uVar12 =
- (sample[i + 3] + sample[i + 2] + sample[i + 1] + sample[i]) / 4;
- sadata[x] = uVar12;
+ (sample[chunk + 3] +
+ sample[chunk + 2] +
+ sample[chunk + 1] +
+ sample[chunk]) /
+ 4;
+ saData[x] = uVar12;
} else {
- sadata[x] = sample[x];
+ saData[x] = sample[x];
}
- if (sadata[x] >= maxHeight) {
- sadata[x] = maxHeight;
+ if (saData[x] >= maxHeight) {
+ saData[x] = maxHeight;
}
- safalloff[x] -= falloff / 16.0;
+ saFalloff[x] -= falloff / 16.0;
// Possible bar fall off values are
// 3, 6, 12, 16, 32
// Should there ever be some form of config options,
// these should be used
// 12 is the default of a fresh new Winamp installation
- if (safalloff[x] <= sadata[x]) {
- safalloff[x] = sadata[x];
+ if (saFalloff[x] <= saData[x]) {
+ saFalloff[x] = saData[x];
}
- if (sapeaks[x] <= Math.round(safalloff[x] * 256)) {
- sapeaks[x] = safalloff[x] * 256;
- sadata2[x] = 3.0;
+ if (saPeaks[x] <= Math.round(saFalloff[x] * 256)) {
+ saPeaks[x] = saFalloff[x] * 256;
+ saData2[x] = 3.0;
}
- barPeak[x] = sapeaks[x] / 256;
+ barPeak[x] = saPeaks[x] / 256;
- sapeaks[x] -= Math.round(sadata2[x]);
- sadata2[x] *= peakfalloff;
+ saPeaks[x] -= Math.round(saData2[x]);
+ saData2[x] *= peakFalloff;
// Possible peak fall off values are
// 1.05f, 1.1f, 1.2f, 1.4f, 1.6f
// 1.1f is the default of a fresh new Winamp installation
- if (sapeaks[x] <= 0) {
- sapeaks[x] = 0;
+ if (saPeaks[x] <= 0) {
+ saPeaks[x] = 0;
}
- if (windowShade) {
+ if (smallVis) {
// SORRY NOTHING
// ironically enough the peaks do appear at the bottom here
} else {
@@ -367,13 +374,13 @@ export class BarPaintHandler extends VisPaintHandler {
}
// skip rendering if x is 4
- if (!(x == i + 3)) {
+ if (!(x == chunk + 3)) {
this.paintBar(
ctx,
x,
x,
- Math.round(safalloff[x]) - pushdown,
- barPeak[x] + 1 - pushdown
+ Math.round(saFalloff[x]) - pushDown,
+ barPeak[x] + 1 - pushDown
);
}
}
@@ -477,7 +484,7 @@ export class BarPaintHandler extends VisPaintHandler {
}
}
-//? =============================== OSCILOSCOPE PAINTER ===============================
+//? =============================== OSCILLOSCOPE PAINTER ===============================
type PaintWavFunction = (x: number, y: number) => void;
@@ -497,7 +504,7 @@ export class WavePaintHandler extends VisPaintHandler {
_lastY: number = 0;
_dataArray: Uint8Array;
_pixelRatio: number; // 1 or 2
- // Off-screen canvas for drawing perfect pixel (no blured lines)
+ // Off-screen canvas for drawing perfect pixel (no blurred lines)
_bar: HTMLCanvasElement = document.createElement("canvas");
_16h: HTMLCanvasElement = document.createElement("canvas"); // non-stretched
paintWav: PaintWavFunction;
@@ -566,10 +573,11 @@ export class WavePaintHandler extends VisPaintHandler {
const height = this._ctx!.canvas.height;
this._ctx!.clearRect(0, 0, width, height);
- const sliceWidth = Math.floor(bandwidth / width);
+ // width would technically be correct, but if the main window is
+ // in windowshade mode, it is set to 150, making sliceWidth look
+ // wrong in that mode, concerning the oscilloscope
+ const sliceWidth = Math.floor(bandwidth / 75);
- let y: number;
- let colorIndex: number;
// Iterate over the width of the canvas in fixed 75 pixels.
for (let j = 0; j <= 75; j++) {
const amplitude = slice1st(this._dataArray, sliceWidth, j);
@@ -583,7 +591,7 @@ export class WavePaintHandler extends VisPaintHandler {
* @returns value in use for coloring stuff in
*/
colorIndex(y: number): number {
- if (windowShade) {
+ if (smallVis) {
return 0;
} else {
if (y >= 14) return 4;
@@ -599,18 +607,35 @@ export class WavePaintHandler extends VisPaintHandler {
}
paintWavLine(x: number, y: number) {
+ // we skip rendering of the oscilloscope if we are in windowshade mode
+ // previously the renderWidth variable in Vis.tsx scaled down the width
+ // of the canvas, but i didn't really like the idea since we squished
+ // down the result of y to fit within 35/75 pixels, winamp doesn't
+ // squish it's audio data down in the x axis, resulting in only
+ // getting a small portion of what we hear, they did it, so do we
+ if (smallVis && doubled) {
+ if (x >= 75) {
+ // SORRY NOTHING
+ return;
+ }
+ } else if (x >= (smallVis ? 38 : 75)) {
+ // SORRY NOTHING
+ return;
+ }
// pushes vis down if not double size, winamp does this
// has to exist here for some reason else this doesn't work...
- if (doubled) {
- pushdown = 0;
- } else if (windowShade) {
- pushdown = 0;
+ if (smallVis) {
+ pushDown = 0;
+ } else if (doubled && !isMWOpen) {
+ pushDown = 2;
+ } else if (doubled) {
+ pushDown = 0;
} else {
- pushdown = 2;
+ pushDown = 2;
}
// rounds y down to the nearest int
- // before that even happens, y is scaled down and then doubled again (could've done * 8
+ // before that even happens, y is scaled down and then doubled again (could've done * 8
// but i feel this makes more sense to me)
// y is then adjusted downward to be in the center of the scope
y = Math.round((y / 16) * 2) - 9;
@@ -621,11 +646,20 @@ export class WavePaintHandler extends VisPaintHandler {
let yadjust: number;
if (PIXEL_DENSITY == 2) yadjust = 3;
else yadjust = 5;
- y = windowShade ? y - yadjust : y;
+ y = smallVis ? y - yadjust : y;
+
+ // scales down the already scaled down result of y to 0..10 or 0..5, depending on
+ // if PIXEL_DENSITY returns 2, this serves the purpose of avoiding full sending
+ // y to that really tiny space we have there
+ if (smallVis && PIXEL_DENSITY === 2) {
+ y = Math.round(((y + 11) / 16) * 10) - 5;
+ } else if (smallVis) {
+ y = Math.round(((y + 11) / 16) * 5) - 2;
+ }
- // limits y to be within a certain range, here it would be 0..10 if both windowshade and PIXEL_DENSITY apply
- // else we limit y to 0..15 or 0..3, depending on renderHeight
- if (windowShade && PIXEL_DENSITY === 2) {
+ // clamp y to be within a certain range, here it would be 0..10 if both windowshade and PIXEL_DENSITY apply
+ // else we clamp y to 0..15 or 0..3, depending on renderHeight
+ if (smallVis && PIXEL_DENSITY === 2) {
y = y < 0 ? 0 : y > 10 - 1 ? 10 - 1 : y;
} else {
y = y < 0 ? 0 : y > renderHeight - 1 ? renderHeight - 1 : y;
@@ -639,20 +673,20 @@ export class WavePaintHandler extends VisPaintHandler {
if (this._vis.oscStyle === "solid") {
if (PIXEL_DENSITY === 2) {
- if (y >= (windowShade ? 5 : 8)) {
- top = windowShade ? 5 : 8;
+ if (y >= (smallVis ? 5 : 8)) {
+ top = smallVis ? 5 : 8;
bottom = y;
} else {
top = y;
- bottom = windowShade ? 5 : 7;
+ bottom = smallVis ? 5 : 7;
}
} else {
- if (y >= (windowShade ? 2 : 8)) {
- top = windowShade ? 2 : 8;
+ if (y >= (smallVis ? 2 : 8)) {
+ top = smallVis ? 2 : 8;
bottom = y;
} else {
top = y;
- bottom = windowShade ? 2 : 7;
+ bottom = smallVis ? 2 : 7;
}
}
} else if (this._vis.oscStyle === "dots") {
@@ -661,7 +695,7 @@ export class WavePaintHandler extends VisPaintHandler {
} else {
if (bottom < top) {
[bottom, top] = [top, bottom];
- if (windowShade) {
+ if (smallVis) {
// SORRY NOTHING
// really just removes the smoother line descending thing that's present in the Main Window
} else {
@@ -678,7 +712,7 @@ export class WavePaintHandler extends VisPaintHandler {
1,
1, // sw,sh
x,
- y + pushdown,
+ y + pushDown,
1,
1 //dw,dh
);
From 63e14b22b6750b621f31bacf48e30228b230d488 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Tue, 27 Aug 2024 17:41:43 +0200
Subject: [PATCH 15/19] Missed implementing the solid mode drawing a pixel
instead of a filled line if x is 0 and if visualizer is small
---
packages/webamp/js/components/VisPainter.ts | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index 747e84bf02..4805365fa3 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -680,6 +680,11 @@ export class WavePaintHandler extends VisPaintHandler {
top = y;
bottom = smallVis ? 5 : 7;
}
+ if (x === 0 && smallVis) {
+ // why? i dont know!!
+ top = y;
+ bottom = y;
+ }
} else {
if (y >= (smallVis ? 2 : 8)) {
top = smallVis ? 2 : 8;
@@ -688,6 +693,11 @@ export class WavePaintHandler extends VisPaintHandler {
top = y;
bottom = smallVis ? 2 : 7;
}
+ if (x === 0 && smallVis) {
+ // why? i dont know!!
+ top = y;
+ bottom = y;
+ }
}
} else if (this._vis.oscStyle === "dots") {
top = y;
From 45487bb2baf9e87ecbdab81a72318a09da786d4e Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Tue, 27 Aug 2024 20:18:42 +0200
Subject: [PATCH 16/19] Readded drawing the visualizer background Prevent
saPeaks from going "out of bounds" when the main window is in windowshade
mode
---
packages/webamp/js/components/Vis.tsx | 16 +++++++++++++---
packages/webamp/js/components/VisPainter.ts | 9 ++++++---
2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index 0e8e391fbd..c42430b56b 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -76,7 +76,12 @@ export default function Vis({ analyser }: Props) {
const windowShade = getWindowShade("main");
smallVis = windowShade && isMWOpen;
- const renderWidth = 75;
+ const renderWidth = 76;
+ const renderWidthBG = doubled
+ ? renderWidth
+ : windowShade
+ ? 38
+ : renderWidth * PIXEL_DENSITY;
renderHeight = smallVis ? 5 : 16;
PIXEL_DENSITY = doubled && smallVis ? 2 : 1;
@@ -85,7 +90,7 @@ export default function Vis({ analyser }: Props) {
const bgCanvas = useMemo(() => {
return preRenderBg(
- width,
+ renderWidthBG,
height,
colors[0],
colors[1],
@@ -145,6 +150,11 @@ export default function Vis({ analyser }: Props) {
let animationRequest: number | null = null;
const loop = () => {
+ if (mode === VISUALIZERS.NONE) {
+ canvasCtx.clearRect(0, 0, renderWidthBG, height);
+ } else {
+ canvasCtx.drawImage(bgCanvas, 0, 0);
+ }
painter.prepare();
painter.paintFrame();
animationRequest = window.requestAnimationFrame(loop);
@@ -163,7 +173,7 @@ export default function Vis({ analyser }: Props) {
window.cancelAnimationFrame(animationRequest);
}
};
- }, [audioStatus, canvas, painter]);
+ }, [audioStatus, canvas, painter, bgCanvas]);
if (audioStatus === MEDIA_STATUS.STOPPED) {
return null;
diff --git a/packages/webamp/js/components/VisPainter.ts b/packages/webamp/js/components/VisPainter.ts
index 4805365fa3..67c362e9d9 100644
--- a/packages/webamp/js/components/VisPainter.ts
+++ b/packages/webamp/js/components/VisPainter.ts
@@ -248,7 +248,6 @@ export class BarPaintHandler extends VisPaintHandler {
const ctx = this._ctx;
const w = ctx.canvas.width;
const h = ctx.canvas.height;
- ctx.clearRect(0, 0, w, h);
ctx.fillStyle = this._color;
let maxFreqIndex = 512;
@@ -337,6 +336,12 @@ export class BarPaintHandler extends VisPaintHandler {
if (saData[x] >= maxHeight) {
saData[x] = maxHeight;
}
+
+ // prevents saPeaks going out of bounds when switching to windowshade mode
+ if (saPeaks[x] >= maxHeight * 256) {
+ saPeaks[x] = maxHeight * 256;
+ }
+
saFalloff[x] -= falloff / 16.0;
// Possible bar fall off values are
// 3, 6, 12, 16, 32
@@ -571,7 +576,6 @@ export class WavePaintHandler extends VisPaintHandler {
const width = this._ctx!.canvas.width;
const height = this._ctx!.canvas.height;
- this._ctx!.clearRect(0, 0, width, height);
// width would technically be correct, but if the main window is
// in windowshade mode, it is set to 150, making sliceWidth look
@@ -739,7 +743,6 @@ export class NoVisualizerHandler extends VisPaintHandler {
paintFrame() {
if (!this._ctx) return;
const ctx = this._ctx;
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
this.cleared = true;
}
}
From 4356be85d2f237f0dea64de5941c391272fc2890 Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Thu, 29 Aug 2024 00:22:55 +0200
Subject: [PATCH 17/19] Missed accounting for the Playlist Editor Visualizer
w.r.t to the background if Main Window was not visible, in windowshade mode
and not in double size
---
packages/webamp/js/components/Vis.tsx | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index c42430b56b..047d154fde 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -77,11 +77,12 @@ export default function Vis({ analyser }: Props) {
smallVis = windowShade && isMWOpen;
const renderWidth = 76;
- const renderWidthBG = doubled
- ? renderWidth
- : windowShade
- ? 38
+ const renderWidthBG = !isMWOpen
+ ? renderWidth
+ : windowShade
+ ? (doubled ? renderWidth : 38)
: renderWidth * PIXEL_DENSITY;
+
renderHeight = smallVis ? 5 : 16;
PIXEL_DENSITY = doubled && smallVis ? 2 : 1;
From 8f91c87d46dc2b1ae260488256380a1202f3fd0f Mon Sep 17 00:00:00 2001
From: Eris Lund <38136789+0x5066@users.noreply.github.com>
Date: Thu, 29 Aug 2024 18:00:36 +0200
Subject: [PATCH 18/19] Addressing comments of the recent review Fixes FFT
being corrupted when multiple instances of Webamp exist and are playing at
the same time Fixes multiple Webamp instances fighting over what the current
state of the Main Window really is Moved a lot of global mutable variables to
instead be owned by BarPaintHandler and PaintWavHandler Renamed visualizer
functions since they now handle a lot of things
---
packages/webamp/js/components/Vis.tsx | 153 +++++----
packages/webamp/js/components/VisPainter.ts | 354 +++++++++++---------
2 files changed, 280 insertions(+), 227 deletions(-)
diff --git a/packages/webamp/js/components/Vis.tsx b/packages/webamp/js/components/Vis.tsx
index 047d154fde..13fc0bff81 100644
--- a/packages/webamp/js/components/Vis.tsx
+++ b/packages/webamp/js/components/Vis.tsx
@@ -1,10 +1,4 @@
-import React, {
- useMemo,
- useCallback,
- useState,
- useLayoutEffect,
- useEffect,
-} from "react";
+import React, { useMemo, useState, useLayoutEffect, useEffect } from "react";
import * as Actions from "../actionCreators";
import * as Selectors from "../selectors";
@@ -23,25 +17,20 @@ type Props = {
analyser: AnalyserNode;
};
-export let PIXEL_DENSITY = 1;
-export let renderHeight: number;
-export let doubled: boolean | undefined;
-export let smallVis: boolean | undefined;
-export let isMWOpen: boolean | undefined;
-
// Pre-render the background grid
function preRenderBg(
width: number,
height: number,
bgColor: string,
fgColor: string,
- windowShade: boolean
+ windowShade: boolean,
+ pixelDensity: number
): HTMLCanvasElement {
// Off-screen canvas for pre-rendering the background
const bgCanvas = document.createElement("canvas");
bgCanvas.width = width;
bgCanvas.height = height;
- const distance = 2 * PIXEL_DENSITY;
+ const distance = 2 * pixelDensity;
const bgCanvasCtx = bgCanvas.getContext("2d");
if (bgCanvasCtx == null) {
@@ -52,8 +41,8 @@ function preRenderBg(
if (!windowShade) {
bgCanvasCtx.fillStyle = fgColor;
for (let x = 0; x < width; x += distance) {
- for (let y = PIXEL_DENSITY; y < height; y += distance) {
- bgCanvasCtx.fillRect(x, y, PIXEL_DENSITY, PIXEL_DENSITY);
+ for (let y = pixelDensity; y < height; y += distance) {
+ bgCanvasCtx.fillRect(x, y, pixelDensity, pixelDensity);
}
}
}
@@ -64,30 +53,31 @@ export default function Vis({ analyser }: Props) {
useLayoutEffect(() => {
analyser.fftSize = 1024;
}, [analyser, analyser.fftSize]);
+
const colors = useTypedSelector(Selectors.getSkinColors);
const mode = useTypedSelector(Selectors.getVisualizerStyle);
const audioStatus = useTypedSelector(Selectors.getMediaStatus);
const getWindowShade = useTypedSelector(Selectors.getWindowShade);
const getWindowOpen = useTypedSelector(Selectors.getWindowOpen);
- isMWOpen = getWindowOpen("main");
- doubled = useTypedSelector(Selectors.getDoubled);
- const dummyVizData = useTypedSelector(Selectors.getDummyVizData);
+ const isMWOpen = getWindowOpen("main");
+ const doubled = useTypedSelector(Selectors.getDoubled);
const toggleVisualizerStyle = useActionCreator(Actions.toggleVisualizerStyle);
const windowShade = getWindowShade("main");
- smallVis = windowShade && isMWOpen;
+ const smallVis = windowShade && isMWOpen;
+ const renderHeight = smallVis ? 5 : 16;
const renderWidth = 76;
- const renderWidthBG = !isMWOpen
- ? renderWidth
- : windowShade
- ? (doubled ? renderWidth : 38)
- : renderWidth * PIXEL_DENSITY;
-
- renderHeight = smallVis ? 5 : 16;
- PIXEL_DENSITY = doubled && smallVis ? 2 : 1;
-
- const width = renderWidth * PIXEL_DENSITY;
- const height = renderHeight * PIXEL_DENSITY;
+ const pixelDensity = doubled && smallVis ? 2 : 1;
+ const renderWidthBG = !isMWOpen
+ ? renderWidth
+ : windowShade
+ ? doubled
+ ? renderWidth
+ : 38
+ : renderWidth * pixelDensity;
+
+ const width = renderWidth * pixelDensity;
+ const height = renderHeight * pixelDensity;
const bgCanvas = useMemo(() => {
return preRenderBg(
@@ -95,47 +85,68 @@ export default function Vis({ analyser }: Props) {
height,
colors[0],
colors[1],
- Boolean(windowShade)
+ Boolean(windowShade),
+ pixelDensity
);
- }, [colors, height, width, windowShade]);
+ }, [colors, height, renderWidthBG, windowShade, pixelDensity]);
const [canvas, setCanvas] = useState(null);
//? painter administration
- const [painter, setPainter] = useState(null);
-
- useEffect(() => {
- if (!canvas) return;
- const _setPainter = (PainterType: typeof VisPaintHandler) => {
- const _vis: IVis = {
- canvas,
- colors,
- analyser,
- oscStyle: "lines",
- bandwidth: "wide",
- coloring: "normal",
- peaks: true,
- saFalloff: "moderate",
- saPeakFalloff: "slow",
- sa: "analyzer",
- };
- const newPainter = new PainterType(_vis);
- setPainter(newPainter);
+ const painter = useMemo(() => {
+ if (!canvas) return null;
+
+ const vis: IVis = {
+ canvas,
+ colors,
+ analyser,
+ oscStyle: "lines",
+ bandwidth: "wide",
+ coloring: "normal",
+ peaks: true,
+ saFalloff: "moderate",
+ saPeakFalloff: "slow",
+ sa: "analyzer",
+ renderHeight,
+ smallVis,
+ pixelDensity,
+ doubled,
+ isMWOpen,
};
+
switch (mode) {
case VISUALIZERS.OSCILLOSCOPE:
- _setPainter(WavePaintHandler);
- break;
+ return new WavePaintHandler(vis);
case VISUALIZERS.BAR:
- _setPainter(BarPaintHandler);
- break;
+ return new BarPaintHandler(vis);
case VISUALIZERS.NONE:
- _setPainter(NoVisualizerHandler);
- break;
+ return new NoVisualizerHandler(vis);
default:
- _setPainter(NoVisualizerHandler);
+ return new NoVisualizerHandler(vis);
}
- }, [analyser, canvas, mode, colors]);
+ }, [
+ analyser,
+ canvas,
+ mode,
+ colors,
+ renderHeight,
+ smallVis,
+ pixelDensity,
+ doubled,
+ isMWOpen,
+ ]);
+
+ useEffect(() => {
+ if (canvas && painter) {
+ const canvasCtx = canvas.getContext("2d");
+ if (canvasCtx) {
+ // wipes the canvas clean if playback is paused and doubled is changing
+ if (audioStatus === MEDIA_STATUS.PAUSED) {
+ canvasCtx.clearRect(0, 0, canvas.width, canvas.height);
+ }
+ }
+ }
+ }, [doubled, canvas, painter]);
useEffect(() => {
if (canvas == null || painter == null) {
@@ -151,22 +162,18 @@ export default function Vis({ analyser }: Props) {
let animationRequest: number | null = null;
const loop = () => {
- if (mode === VISUALIZERS.NONE) {
- canvasCtx.clearRect(0, 0, renderWidthBG, height);
- } else {
- canvasCtx.drawImage(bgCanvas, 0, 0);
- }
+ canvasCtx.drawImage(bgCanvas, 0, 0);
painter.prepare();
painter.paintFrame();
animationRequest = window.requestAnimationFrame(loop);
};
if (audioStatus === MEDIA_STATUS.PLAYING) {
- loop();
- } else if (animationRequest !== null) {
- // Clean up the animation frame request if the status is not PLAYING
- window.cancelAnimationFrame(animationRequest);
- animationRequest = null;
+ if (mode === VISUALIZERS.NONE) {
+ canvasCtx.clearRect(0, 0, renderWidthBG, height);
+ } else {
+ loop();
+ }
}
return () => {
@@ -174,14 +181,12 @@ export default function Vis({ analyser }: Props) {
window.cancelAnimationFrame(animationRequest);
}
};
- }, [audioStatus, canvas, painter, bgCanvas]);
+ }, [audioStatus, canvas, painter, bgCanvas, renderWidthBG, height, mode]);
if (audioStatus === MEDIA_STATUS.STOPPED) {
return null;
}
- // @ts-ignore
- // @ts-ignore
return (