From 8077c482809b95a2220e89b13ebf4fd7061d7569 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Sat, 7 Oct 2023 01:27:31 +0200 Subject: [PATCH 01/42] WIP file selector, file loading, cab sim --- compiler/js2eel.d.ts | 21 ++++ .../src/js2eel/compiler/Js2EelCompiler.ts | 27 +++- compiler/src/js2eel/constants.ts | 1 + .../callExpression/callExpression.ts | 5 + .../js2EelLib/fileSelector.spec.ts | 115 ++++++++++++++++++ .../callExpression/js2EelLib/fileSelector.ts | 91 ++++++++++++++ .../js2EelLib/selectBox.spec.ts | 2 +- .../test/examplePlugins/08_cab_sim.spec.ts | 35 ++++++ compiler/src/js2eel/types.ts | 9 ++ compiler/src/popupDocs.ts | 8 ++ docs/api-documentation.md | 23 ++++ examples/08_cab_sim.js | 5 + gui/src/docs/rendered-docs.json | 2 +- 13 files changed, 339 insertions(+), 5 deletions(-) create mode 100644 compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts create mode 100644 compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.ts create mode 100644 compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts create mode 100644 examples/08_cab_sim.js diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index f0ee49b..bf752be 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -61,6 +61,27 @@ declare function selectBox( label: string ): void; +/** + * Registers a file selector to be displayed in the plugin. + * + * The path is relative to /data. + * + * @example ```javascript + * fileSelector( + * 5, + * 'amp_models', + * 'none', + * 'Impulse Response' + * ); + * ``` + */ +declare function fileSelector( + sliderNumber: number, + path: string, + defaultValue: string, + label: string +): void; + // DEBUGGING /** diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index 4cbe52b..09cd1ce 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -19,6 +19,8 @@ import type { EelGeneratorWarning, JSFXStage, Slider, + SelectBox, + FileSelector, DeclaredSymbol, Environment, CompileResult, @@ -26,10 +28,9 @@ import type { EachChannelParamMap, ErrorType, ScopedEnvironment, - SelectBox, + InlineData, WarningType, - ReturnSrc, - InlineData + ReturnSrc } from '../types.js'; export class Js2EelCompiler { @@ -72,6 +73,7 @@ export class Js2EelCompiler { sliderNumbers: new Set(), sliders: {}, selectBoxes: {}, + fileSelectors: {}, eelBuffers: {}, eelArrays: {}, environment: { @@ -150,6 +152,7 @@ export class Js2EelCompiler { sliderNumbers: new Set(), sliders: {}, selectBoxes: {}, + fileSelectors: {}, eelBuffers: {}, eelArrays: {}, environment: { @@ -230,6 +233,16 @@ export class Js2EelCompiler { this.src.eelSrcFinal += '\n'; } + // FILE SELECTORS + + if (Object.keys(this.pluginData.fileSelectors).length) { + for (const [_id, fileSelector] of Object.entries(this.pluginData.fileSelectors)) { + this.src.eelSrcFinal += `slider${fileSelector.sliderNumber}:/${fileSelector.path}:${fileSelector.defaultValue}:${fileSelector.label}\n`; + } + + this.src.eelSrcFinal += '\n'; + } + // IN_PIN & OUT_PIN for (let i = 0; i < this.pluginData.inChannels; i++) { @@ -400,6 +413,14 @@ export class Js2EelCompiler { return this.pluginData.selectBoxes[selectBoxName]; } + addFileSelector(fileSelector: FileSelector): void { + this.pluginData.fileSelectors[fileSelector.id] = fileSelector; + } + + getFileSelector(fileSelectorId: string): FileSelector | undefined { + return this.pluginData.fileSelectors[fileSelectorId]; + } + setOnInitSrc(src: string): void { this.src.onInitSrc = src; } diff --git a/compiler/src/js2eel/constants.ts b/compiler/src/js2eel/constants.ts index 0eca9ee..d0baea9 100644 --- a/compiler/src/js2eel/constants.ts +++ b/compiler/src/js2eel/constants.ts @@ -18,6 +18,7 @@ export const JS2EEL_LIBRARY_FUNCTION_NAMES = new Set([ 'config', 'slider', 'selectBox', + 'fileSelector', 'onInit', 'onSlider', 'onSample', diff --git a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts index 6b85f48..f356de3 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts @@ -1,5 +1,6 @@ import { config } from './js2EelLib/config.js'; import { slider } from './js2EelLib/slider.js'; +import { fileSelector } from './js2EelLib/fileSelector.js'; import { selectBox } from './js2EelLib/selectBox.js'; import { onInit } from './js2EelLib/onInit.js'; import { onSlider } from './js2EelLib/onSlider.js'; @@ -41,6 +42,10 @@ export const callExpression = ( selectBox(callExpression, instance); break; } + case 'fileSelector': { + fileSelector(callExpression, instance); + break; + } case 'onInit': { instance.setOnInitSrc(onInit(callExpression, instance)); break; diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts new file mode 100644 index 0000000..601a604 --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts @@ -0,0 +1,115 @@ +import { expect } from 'chai'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; +import { testEelSrc } from '../../../test/helpers'; + +describe('fileSelector()', () => { + it('Error if called in non-root scope', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'fileSelector', inChannels: 2, outChannels: 2 }); + +onSample(() => { + fileSelector(1, 'ampModelsSelector', 'amp_models', 'none', 'Impulse Response'); +}); +`); + expect(result.success).to.equal(false); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ + +desc:fileSelector + +in_pin:In 0 +in_pin:In 1 +out_pin:In 0 +out_pin:In 1 + + +`) + ); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('ScopeError'); + }); + + it('Error if slider number already used', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); + +fileSelector(1, 'ampModelsSelector', 'amp_models', 'none', 'Impulse Response'); +fileSelector(1, 'ampModelsSelector2', 'amp_models', 'none', 'Impulse Response'); +`); + expect(result.success).to.equal(false); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ + +desc:sd_amp_sim + +slider1:/amp_models:none:Impulse Response + +in_pin:In 0 +in_pin:In 1 +out_pin:In 0 +out_pin:In 1 + + +`) + ); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('EelConventionError'); + }); + + it('Error if file id already used', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); + +fileSelector(1, "ampModelsSelector", 'amp_models', 'none', 'Impulse Response'); +fileSelector(2, "ampModelsSelector", 'amp_models', 'none', 'Impulse Response'); +`); + expect(result.success).to.equal(false); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ + +desc:sd_amp_sim + +slider1:/amp_models:none:Impulse Response + +in_pin:In 0 +in_pin:In 1 +out_pin:In 0 +out_pin:In 1 + + +`) + ); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('EelConventionError'); + }); + + it('Error if argument invalid', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); + +fileSelector(1, 1337, 'amp_models', 'none', 'Impulse Response'); + +onSample(() => {}); +`); + expect(result.success).to.equal(false); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ + +desc:sd_amp_sim + +in_pin:In 0 +in_pin:In 1 +out_pin:In 0 +out_pin:In 1 + + +`) + ); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('ValidationError'); + }); +}); diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.ts new file mode 100644 index 0000000..38e6412 --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.ts @@ -0,0 +1,91 @@ +import Joi from 'joi'; + +import { evaluateLibraryFunctionCall } from '../utils/evaluateLibraryFunctionCall.js'; + +import type { CallExpression } from 'estree'; +import type { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import type { FileSelector } from '../../../types.js'; + +export const fileSelector = (callExpression: CallExpression, instance: Js2EelCompiler): void => { + if (instance.getCurrentScopePath() !== 'root') { + instance.error( + 'ScopeError', + 'fileSelector() can only be called in the root scope', + callExpression + ); + + return; + } + + const { args, errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'sliderNumber', + required: true, + allowedValues: [ + { nodeType: 'Literal', validationSchema: Joi.number().min(1).max(64) } + ] + }, + { + name: 'id', + required: true, + allowedValues: [{ nodeType: 'Literal', validationSchema: Joi.string().max(64) }] + }, + { + name: 'path', + required: true, + allowedValues: [{ nodeType: 'Literal', validationSchema: Joi.string().max(64) }] + }, + { + name: 'defaultValue', + required: true, + allowedValues: [{ nodeType: 'Literal', validationSchema: Joi.string().max(64) }] + }, + { + name: 'label', + required: true, + allowedValues: [{ nodeType: 'Literal', validationSchema: Joi.string().max(64) }] + } + ], + instance + ); + + if (errors) { + instance.multipleErrors(errors); + + return; + } + + if (instance.sliderNumberIsUsed(args.sliderNumber.value)) { + instance.error( + 'EelConventionError', + `Error at file selector registration: This slider number is already used: ${args.sliderNumber.value}`, + args.sliderNumber.node + ); + + return; + } + + if (instance.getFileSelector(args.id.value)) { + instance.error( + 'EelConventionError', + `Error at file selector registration: A file selector with this ID is already registered: ${args.id.value}`, + args.id.node + ); + + return; + } + + instance.setSliderNumber(args.sliderNumber.value); + + const fileSelector: FileSelector = { + sliderNumber: args.sliderNumber.value, + id: args.id.value, + path: args.path.value, + defaultValue: args.defaultValue.value, + label: args.label.value + }; + + instance.addFileSelector(fileSelector); +}; diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts index 28cac63..348830c 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts @@ -94,7 +94,7 @@ out_pin:In 1 expect(result.errors[0].type).to.equal('EelConventionError'); }); - it('Error if slider number invalid', () => { + it('Error if argument invalid', () => { const compiler = new Js2EelCompiler(); const result = compiler.compile(`config({ description: 'selectBox', inChannels: 2, outChannels: 2 }); diff --git a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts new file mode 100644 index 0000000..2bdc366 --- /dev/null +++ b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts @@ -0,0 +1,35 @@ +import fs from 'fs'; +import path from 'path'; +import { expect } from 'chai'; + +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../helpers.js'; + +const JS_CAB_SIM_SRC = fs.readFileSync(path.resolve('../examples/08_cab_sim.js'), 'utf-8'); + +const EEL_CAB_SIM_SRC_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ + +desc:sd_amp_sim + +slider1:/amp_models:none:Impulse Response + +in_pin:In 0 +in_pin:In 1 +out_pin:In 0 +out_pin:In 1 + + +`; + +const js2EelCompiler = new Js2EelCompiler(); + +describe('Example Test: Cab Sim', () => { + it('Compiles cab sim', () => { + const result = js2EelCompiler.compile(JS_CAB_SIM_SRC); + + expect(result.success).to.equal(true); + expect(testEelSrc(result.src)).to.equal(testEelSrc(EEL_CAB_SIM_SRC_EXPECTED)); + expect(result.errors.length).to.equal(0); + expect(result.warnings.length).to.equal(0); + }); +}); diff --git a/compiler/src/js2eel/types.ts b/compiler/src/js2eel/types.ts index 6b94a0d..4161dcb 100644 --- a/compiler/src/js2eel/types.ts +++ b/compiler/src/js2eel/types.ts @@ -75,6 +75,7 @@ export type PluginData = { sliderNumbers: Set; sliders: { [name in string]: Slider }; selectBoxes: { [name in string]: SelectBox }; + fileSelectors: { [id in string]: FileSelector }; eelBuffers: { [name in string]?: EelBuffer }; eelArrays: { [name in string]?: EelArray }; environment: Environment; @@ -186,6 +187,14 @@ export type SelectBox = { values: { name: string; label: string }[]; }; +export type FileSelector = { + sliderNumber: number; + id: string; + path: string; + defaultValue: string; + label: string; +}; + export type EelBuffer = { name: string; dimensions: number; diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index 9f9c538..9967390 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -34,6 +34,14 @@ selectBox: { "signature": "selectBox(\n sliderNumber: number,\n variable: string,\n initialValue: string,\n values: { name: string; label: string }[],\n label: string\n): void;", "autoCompleteTemplate": "selectBox(${sliderNumber}, ${variable}, ${initialValue}, [${}], ${label});" }, +fileSelector: { + "name": "fileSelector", + "type": "function", + "text": "Registers a file selector to be displayed in the plugin.\n\nThe path is relative to /data.", + "example": "```javascript\nfileSelector(\n 5,\n 'amp_models',\n 'none',\n 'Impulse Response'\n);\n```", + "signature": "fileSelector(\n sliderNumber: number,\n path: string,\n defaultValue: string,\n label: string\n): void;", + "autoCompleteTemplate": "fileSelector(${sliderNumber}, ${path}, ${defaultValue}, ${label});" +}, console: { "name": "console", "type": "constant", diff --git a/docs/api-documentation.md b/docs/api-documentation.md index 4585581..e6ac2e4 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -77,6 +77,29 @@ selectBox( 'Algorithm' ); ``` +### fileSelector() +Registers a file selector to be displayed in the plugin. + +The path is relative to /data. + +```typescript +fileSelector( + sliderNumber: number, + path: string, + defaultValue: string, + label: string +): void; +``` + +Example: +```javascript +fileSelector( + 5, + 'amp_models', + 'none', + 'Impulse Response' +); +``` ## Debugging diff --git a/examples/08_cab_sim.js b/examples/08_cab_sim.js new file mode 100644 index 0000000..6ac7e32 --- /dev/null +++ b/examples/08_cab_sim.js @@ -0,0 +1,5 @@ +config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); + +fileSelector(1, 'ampModelsSelector', 'amp_models', 'none', 'Impulse Response'); + +onSample(() => {}); diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index b5fe257..ad080b8 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,5 +1,5 @@ { - "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n", + "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n", "changelog": "

Changelog

\n
    \n
  • v0.9.1:
      \n
    • New example: 4-Band RBJ EQ
    \n
  • v0.7.0:
      \n
    • Allow simple plain objects
    • Allow function declaration in block statement
    • Allow member expression returns
    \n
  • v0.5.0:
      \n
    • MacOS App is signed now ๐Ÿ–‹๏ธ
    • More documentation
    \n
  • v0.3.0: Initial release
\n", "development": "

Development

\n

Requirements

\n
    \n
  • Node.js 18 and higher
  • Terminal emulator
      \n
    • Linux, MacOS: bash or zsh
    • Windows: git bash (comes with git)
    \n
  • Reaper DAW, obviously
\n

Setup

\n
    \n
  • Install dependencies for all packages:
      \n
    • cd scripts
    • ./install.sh
    \n
  • Open a different terminal session for each of the following steps
      \n
    • Go to compiler and do npm run dev
    • Go to gui and do npm run dev
    • Go to desktop and do npm run dev. Now, the electron build should open.
    \n
\n

Guidelines

\n
    \n
  • We aim for 100% test coverage for the compiler package
\n

Architecture

\n

TODO

\n

Recommended VSCode Extensions

\n

TODO

\n", "feature-comparison": "

Feature Comparison with JSFX

\n

JSFX Reference: https://www.reaper.fm/sdk/js/js.php

\n

Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

\n

โœ…: Implemented

\n

๐Ÿ•’: Should be implemented

\n

โŒ: Won't be implemented

\n

โ”: Unknown if feasible, useful, or working properly

\n

Description Lines and Utility Features

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…descImplemented as part of config()
๐Ÿ•’tags
๐Ÿ•’options
๐Ÿ•’JSFX comments
\n

Code Sections

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…@initonInit()
โœ…@slideronSlider()
๐Ÿ•’@block
โœ…@sampleonSample()
๐Ÿ•’@serialize
๐Ÿ•’@gfxDeclarative with React-like syntax?
\n

File Handling

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’import
๐Ÿ•’filename
๐Ÿ•’file_open(index | slider)
๐Ÿ•’file_close(handle)
๐Ÿ•’file_rewind(handle)
๐Ÿ•’file_var(handle, variable)
๐Ÿ•’file_mem(handle, offset, length)
๐Ÿ•’file_avail(handle)
๐Ÿ•’file_riff(handle, nch, samplerate)
๐Ÿ•’file_text(handle, istext)
๐Ÿ•’file_string(handle,str)
\n

Routing and Input

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…in_pin, out_pinImplemented as part of config()
\n

UI

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Slider: Normalslider()
โœ…Slider: SelectselectBox()
๐Ÿ•’Slider: File
๐Ÿ•’Hidden sliders
๐Ÿ•’Slider: shapes
โŒslider(index)Might not be necessary as every slider is bound to a variable
๐Ÿ•’slider_next_chg(sliderindex,nextval)
\n

Sample Access

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…spl0 - spl63
โœ…spl(index)
\n

Audio and Transport State Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…srate
โœ…num_ch
โœ…samplesblock
โœ…tempo
โœ…play_state
โœ…play_position
โœ…beat_position
โœ…ts_num
โœ…ts_denom
\n

Data Structures and Encodings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Local variableslet & const
โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
โ”Local address space 8m word restriction
๐Ÿ•’Global address space (gmem[])
๐Ÿ•’Named global address space
โ”Global named variables (_global. prefix)
๐Ÿ•’Hex numbers
๐Ÿ•’ASCII chars
๐Ÿ•’Bitmasks
โ”StringsAlready fully implemented?
\n

Control Structures

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…FunctionsUser definable functions are inlined in compiled code
โœ…Conditionals
โœ…Conditional Branching
๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
๐Ÿ•’while(actions..., condition)
๐Ÿ•’while(condition) (actions...)
\n

Operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…!value
โœ…-value
โœ…+value
โœ…base ^ exponentMath.pow(base, exponent) or **
โœ…numerator % denominator
โœ…value / divisor
โœ…value * another_value
โœ…value - another_value
โœ…value + another_value
โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 === value2
โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 !== value2
โœ…value1 < value2
โœ…value1 > value2
โœ…value1 <= value2
โœ…value1 >= value2
โœ…y || z
โœ…y && z
โœ…y ? z
โœ…y ? z : x
โœ…y = z
โœ…y *= z
โœ…y /= divisor
โœ…y %= divisor
๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
โœ…y += z
โœ…y -= z
\n

Bitwise operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’value << shift_amt
๐Ÿ•’value >> shift_amt
๐Ÿ•’a | b
๐Ÿ•’a & b
๐Ÿ•’a ~ b
๐Ÿ•’y | = z
๐Ÿ•’y &= z
๐Ÿ•’y ~= z
\n

Math Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…sin(angle)
โœ…cos(angle)
โœ…tan(angle)
โœ…asin(x)
โœ…acos(x)
โœ…atan(x)
โœ…atan2(x, y)
โœ…sqr(x)
โœ…sqrt(x)
โœ…pow(x, y)
โœ…exp(x)
โœ…log(x)
โœ…log10(x)
โœ…abs(x)
โœ…min(x, y)
โœ…max(x, y)
โœ…sign(x)
โœ…rand(x)
โœ…floor(x)
โœ…ceil(x)
โœ…invsqrt(x)
\n

Time Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’time([v])
๐Ÿ•’time_precise([v])
\n

Midi Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’midisend(offset, msg1, msg2)
๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
๐Ÿ•’midisend(offset, msg1, msg2, msg3)
๐Ÿ•’midisend_buf(offset, buf, len)
๐Ÿ•’midisend_str(offset, string)
๐Ÿ•’midirecv(offset, msg1, msg23)
๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
๐Ÿ•’midirecv_buf(offset, buf, maxlen)
๐Ÿ•’midirecv_str(offset, string)
๐Ÿ•’midisyx(offset, msgptr, len)
\n

Memory/FFT/MDCT Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’mdct(start_index, size)
๐Ÿ•’imdct(start_index, size)
๐Ÿ•’fft(start_index, size)
๐Ÿ•’ifft(start_index, size)
๐Ÿ•’fft_real(start_index, size)
๐Ÿ•’ifft_real(start_index, size)
๐Ÿ•’fft_permute(index, size)
๐Ÿ•’fft_ipermute(index, size)
๐Ÿ•’convolve_c(dest, src, size)
๐Ÿ•’freembuf(top)
๐Ÿ•’memcpy(dest, source, length)
๐Ÿ•’memset(dest, value, length)
๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
๐Ÿ•’mem_insert_shuffle(buf, len, value)
๐Ÿ•’__memtop()
๐Ÿ•’stack_push(value)
๐Ÿ•’stack_pop(value)
๐Ÿ•’stack_peek(index)
๐Ÿ•’stack_exch(value)
๐Ÿ•’atomic_setifequal(dest, value, newvalue)
๐Ÿ•’atomic_exch(val1, val2)
๐Ÿ•’atomic_add(dest_val1, val2)
๐Ÿ•’atomic_set(dest_val1, val2)
๐Ÿ•’atomic_get(val)
\n

Host Interaction Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’sliderchange(mask | sliderX)
๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
๐Ÿ•’slider_show(mask or sliderX[, value])
๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
๐Ÿ•’get_host_numchan()
๐Ÿ•’set_host_numchan(numchan)
๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
๐Ÿ•’get_pinmapper_flags(no parameters)
๐Ÿ•’set_pinmapper_flags(flags)
๐Ÿ•’get_host_placement([chain_pos, flags])
\n

String Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’strlen(str)
๐Ÿ•’strcpy(str, srcstr)
๐Ÿ•’strcat(str, srcstr)
๐Ÿ•’strcmp(str, str2)
๐Ÿ•’stricmp(str, str2)
๐Ÿ•’strncmp(str, str2, maxlen)
๐Ÿ•’strnicmp(str, str2, maxlen)
๐Ÿ•’strncpy(str, srcstr, maxlen)
๐Ÿ•’strncat(str, srcstr, maxlen)
๐Ÿ•’strcpy_from(str, srcstr, offset)
๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
๐Ÿ•’str_getchar(str, offset[, type])
๐Ÿ•’str_setchar(str, offset, value[, type])
๐Ÿ•’strcpy_fromslider(str, slider)
๐Ÿ•’sprintf(str, format, ...)
๐Ÿ•’match(needle, haystack, ...)
๐Ÿ•’matchi(needle, haystack, ...)
\n

GFX Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
๐Ÿ•’gfx_lineto(x, y, aa)
๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
๐Ÿ•’gfx_rectto(x, y)
๐Ÿ•’gfx_rect(x, y, w, h)
๐Ÿ•’gfx_setpixel(r, g, b)
๐Ÿ•’gfx_getpixel(r, g, b)
๐Ÿ•’gfx_drawnumber(n, ndigits)
๐Ÿ•’gfx_drawchar($'c')
๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
๐Ÿ•’gfx_measurestr(str, w, h)
๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
๐Ÿ•’gfx_getfont()
๐Ÿ•’gfx_printf(str, ...)
๐Ÿ•’gfx_blurto(x,y)
๐Ÿ•’gfx_blit(source, scale, rotation)
๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
๐Ÿ•’gfx_getimgdim(image, w, h)
๐Ÿ•’gfx_setimgdim(image, w,h)
๐Ÿ•’gfx_loadimg(image, filename)
๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
๐Ÿ•’gfx_getchar([char, unicodechar])
๐Ÿ•’gfx_showmenu("str")
๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
\n

GFX Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
๐Ÿ•’gfx_w, gfx_h
๐Ÿ•’gfx_x, gfx_y
๐Ÿ•’gfx_mode
๐Ÿ•’gfx_clear
๐Ÿ•’gfx_dest
๐Ÿ•’gfx_texth
๐Ÿ•’gfx_ext_retina
๐Ÿ•’gfx_ext_flags
๐Ÿ•’mouse_x, mouse_y
๐Ÿ•’mouse_cap
๐Ÿ•’mouse_wheel, mouse_hwheel
\n

Special Vars and Extended Functionality

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’trigger
๐Ÿ•’ext_noinit
๐Ÿ•’ext_nodenorm
๐Ÿ•’ext_tail_size
๐Ÿ•’reg00-reg99
๐Ÿ•’_global.*
\n

Delay Compensation Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’pdc_delay
๐Ÿ•’pdc_bot_ch
๐Ÿ•’pdc_top_ch
๐Ÿ•’pdc_midi
\n", From 1c6d2a259882bbbd320d02d7b08752059ba99131 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Sun, 15 Oct 2023 16:36:43 +0200 Subject: [PATCH 02/42] WIP: ext_tail_size; rework init stage --- compiler/js2eel.d.ts | 7 +++ .../src/js2eel/compiler/Js2EelCompiler.ts | 11 ++++ .../callExpression/callExpression.ts | 9 +++- .../eelLib/eelLibraryFunctionCall.ts | 9 +++- .../callExpression/js2EelLib/extTailSize.ts | 53 +++++++++++++++++++ compiler/src/popupDocs.ts | 8 +++ docs/api-documentation.md | 6 +++ gui/src/codemirror/getPopupContent.ts | 1 + gui/src/docs/rendered-docs.json | 2 +- 9 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/extTailSize.ts diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index bf752be..5cd8e82 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -422,3 +422,10 @@ declare function ceil(x: number): number; * Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter. */ declare function invsqrt(x: number): number; + +// SPECIAL VARIABLES + +/** + * Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state. + */ +declare function extTailSize(samples: number): void; diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index 09cd1ce..b9e1269 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -316,6 +316,13 @@ export class Js2EelCompiler { this.src.eelSrcFinal += '\n\n'; } + const initSrcText = this.getOnInitSrc(); + + if (initSrcText) { + this.src.eelSrcFinal += initSrcText; + this.src.eelSrcFinal += '\n\n'; + } + // @SLIDER const sliderStageHeader = '@slider\n\n'; @@ -425,6 +432,10 @@ export class Js2EelCompiler { this.src.onInitSrc = src; } + getOnInitSrc(): string { + return this.src.onInitSrc; + } + setOnSliderSrc(src: string): void { this.src.onSliderSrc = src; } diff --git a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts index f356de3..575dee7 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts @@ -6,6 +6,7 @@ import { onInit } from './js2EelLib/onInit.js'; import { onSlider } from './js2EelLib/onSlider.js'; import { onSample } from './js2EelLib/onSample.js'; import { eachChannel } from './js2EelLib/eachChannel.js'; +import { extTailSize } from './js2EelLib/extTailSize.js'; import { eelLibraryFunctionCall } from './eelLib/eelLibraryFunctionCall.js'; import { memberExpressionCall } from '../memberExpression/memberExpressionCall.js'; @@ -29,7 +30,7 @@ export const callExpression = ( if ('name' in callee) { switch (callee.name) { - // Library functions + // JS2EEL Library functions case 'config': { config(callExpression, instance); break; @@ -62,9 +63,13 @@ export const callExpression = ( callExpressionSrc += eachChannel(callExpression, instance); break; } + case 'extTailSize': { + callExpressionSrc += extTailSize(callExpression, instance); + break; + } default: { - // Library functions + // EEL Library functions if (EEL_LIBRARY_FUNCTION_NAMES.has(callee.name.toLowerCase())) { // We can lowercase here because there's only lowercase symbols in EEL callExpressionSrc += eelLibraryFunctionCall(callExpression, instance); diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index 38cef07..4048d31 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -7,6 +7,7 @@ import { binaryExpression } from '../../binaryExpression/binaryExpression.js'; import { callExpression as compileCallExpression } from '../callExpression.js'; import { memberExpression } from '../../memberExpression/memberExpression.js'; import { evaluateLibraryFunctionCall } from '../utils/evaluateLibraryFunctionCall.js'; +import { JSFX_DENY_COMPILATION } from '../../../constants.js'; import type { CallExpression } from 'estree'; import type { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; @@ -144,7 +145,13 @@ export const eelLibraryFunctionCall = ( } default: { - // + instance.error( + 'UnknownSymbolError', + `EEL library function not yet implemented: ${callee.name}`, + callee + ); + + return JSFX_DENY_COMPILATION; } } diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/extTailSize.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/extTailSize.ts new file mode 100644 index 0000000..7e40381 --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/extTailSize.ts @@ -0,0 +1,53 @@ +import Joi from 'joi'; + +import { evaluateLibraryFunctionCall } from '../utils/evaluateLibraryFunctionCall.js'; +import { JSFX_DENY_COMPILATION } from '../../../constants.js'; + +import type { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import type { CallExpression } from 'estree'; + +export const extTailSize = (callExpression: CallExpression, instance: Js2EelCompiler): string => { + let extTailSizeSrc = ''; + const scopePath = instance.getCurrentScopePath(); + const scopedEnvironment = instance.getScopeEntry(scopePath); + + if ( + !scopedEnvironment || + (scopedEnvironment.scopeId !== 'onInit' && scopedEnvironment.scopeId !== 'onSlider') + ) { + instance.error( + 'ScopeError', + 'extTailSize() can only be called in onInit() and onSlider()', + callExpression + ); + + return JSFX_DENY_COMPILATION; + } + + const { args, errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'value', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + } + ] + } + ], + instance + ); + + if (errors) { + instance.multipleErrors(errors); + + return JSFX_DENY_COMPILATION; + } + + extTailSizeSrc += `ext_tail_size = ${args.value.value};\n`; + + return extTailSizeSrc; +}; diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index 9967390..c7b00f8 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -857,5 +857,13 @@ invsqrt: { "example": null, "signature": "invsqrt(x: number): number;", "autoCompleteTemplate": "invsqrt(${x});" +}, +extTailSize: { + "name": "extTailSize", + "type": "function", + "text": "Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.", + "example": null, + "signature": "extTailSize(samples: number): void;", + "autoCompleteTemplate": "extTailSize(${samples});" } }; diff --git a/docs/api-documentation.md b/docs/api-documentation.md index e6ac2e4..7bcd5e1 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -393,3 +393,9 @@ Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter. ```typescript invsqrt(x: number): number; ``` +### extTailSize() +Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state. + +```typescript +extTailSize(samples: number): void; +``` diff --git a/gui/src/codemirror/getPopupContent.ts b/gui/src/codemirror/getPopupContent.ts index 464b29b..c2a55b5 100644 --- a/gui/src/codemirror/getPopupContent.ts +++ b/gui/src/codemirror/getPopupContent.ts @@ -4,6 +4,7 @@ export const getPopupContent = ( example: string | null ): { dom: HTMLElement } => { const info = { dom: document.createElement('div') }; + info.dom.style.maxWidth = '640px'; info.dom.style.padding = '6px'; const signatureEl = document.createElement('pre'); signatureEl.style.whiteSpace = 'pre-wrap'; diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index ad080b8..ffa3eec 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,5 +1,5 @@ { - "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n", + "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", "changelog": "

Changelog

\n
    \n
  • v0.9.1:
      \n
    • New example: 4-Band RBJ EQ
    \n
  • v0.7.0:
      \n
    • Allow simple plain objects
    • Allow function declaration in block statement
    • Allow member expression returns
    \n
  • v0.5.0:
      \n
    • MacOS App is signed now ๐Ÿ–‹๏ธ
    • More documentation
    \n
  • v0.3.0: Initial release
\n", "development": "

Development

\n

Requirements

\n
    \n
  • Node.js 18 and higher
  • Terminal emulator
      \n
    • Linux, MacOS: bash or zsh
    • Windows: git bash (comes with git)
    \n
  • Reaper DAW, obviously
\n

Setup

\n
    \n
  • Install dependencies for all packages:
      \n
    • cd scripts
    • ./install.sh
    \n
  • Open a different terminal session for each of the following steps
      \n
    • Go to compiler and do npm run dev
    • Go to gui and do npm run dev
    • Go to desktop and do npm run dev. Now, the electron build should open.
    \n
\n

Guidelines

\n
    \n
  • We aim for 100% test coverage for the compiler package
\n

Architecture

\n

TODO

\n

Recommended VSCode Extensions

\n

TODO

\n", "feature-comparison": "

Feature Comparison with JSFX

\n

JSFX Reference: https://www.reaper.fm/sdk/js/js.php

\n

Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

\n

โœ…: Implemented

\n

๐Ÿ•’: Should be implemented

\n

โŒ: Won't be implemented

\n

โ”: Unknown if feasible, useful, or working properly

\n

Description Lines and Utility Features

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…descImplemented as part of config()
๐Ÿ•’tags
๐Ÿ•’options
๐Ÿ•’JSFX comments
\n

Code Sections

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…@initonInit()
โœ…@slideronSlider()
๐Ÿ•’@block
โœ…@sampleonSample()
๐Ÿ•’@serialize
๐Ÿ•’@gfxDeclarative with React-like syntax?
\n

File Handling

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’import
๐Ÿ•’filename
๐Ÿ•’file_open(index | slider)
๐Ÿ•’file_close(handle)
๐Ÿ•’file_rewind(handle)
๐Ÿ•’file_var(handle, variable)
๐Ÿ•’file_mem(handle, offset, length)
๐Ÿ•’file_avail(handle)
๐Ÿ•’file_riff(handle, nch, samplerate)
๐Ÿ•’file_text(handle, istext)
๐Ÿ•’file_string(handle,str)
\n

Routing and Input

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…in_pin, out_pinImplemented as part of config()
\n

UI

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Slider: Normalslider()
โœ…Slider: SelectselectBox()
๐Ÿ•’Slider: File
๐Ÿ•’Hidden sliders
๐Ÿ•’Slider: shapes
โŒslider(index)Might not be necessary as every slider is bound to a variable
๐Ÿ•’slider_next_chg(sliderindex,nextval)
\n

Sample Access

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…spl0 - spl63
โœ…spl(index)
\n

Audio and Transport State Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…srate
โœ…num_ch
โœ…samplesblock
โœ…tempo
โœ…play_state
โœ…play_position
โœ…beat_position
โœ…ts_num
โœ…ts_denom
\n

Data Structures and Encodings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Local variableslet & const
โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
โ”Local address space 8m word restriction
๐Ÿ•’Global address space (gmem[])
๐Ÿ•’Named global address space
โ”Global named variables (_global. prefix)
๐Ÿ•’Hex numbers
๐Ÿ•’ASCII chars
๐Ÿ•’Bitmasks
โ”StringsAlready fully implemented?
\n

Control Structures

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…FunctionsUser definable functions are inlined in compiled code
โœ…Conditionals
โœ…Conditional Branching
๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
๐Ÿ•’while(actions..., condition)
๐Ÿ•’while(condition) (actions...)
\n

Operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…!value
โœ…-value
โœ…+value
โœ…base ^ exponentMath.pow(base, exponent) or **
โœ…numerator % denominator
โœ…value / divisor
โœ…value * another_value
โœ…value - another_value
โœ…value + another_value
โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 === value2
โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 !== value2
โœ…value1 < value2
โœ…value1 > value2
โœ…value1 <= value2
โœ…value1 >= value2
โœ…y || z
โœ…y && z
โœ…y ? z
โœ…y ? z : x
โœ…y = z
โœ…y *= z
โœ…y /= divisor
โœ…y %= divisor
๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
โœ…y += z
โœ…y -= z
\n

Bitwise operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’value << shift_amt
๐Ÿ•’value >> shift_amt
๐Ÿ•’a | b
๐Ÿ•’a & b
๐Ÿ•’a ~ b
๐Ÿ•’y | = z
๐Ÿ•’y &= z
๐Ÿ•’y ~= z
\n

Math Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…sin(angle)
โœ…cos(angle)
โœ…tan(angle)
โœ…asin(x)
โœ…acos(x)
โœ…atan(x)
โœ…atan2(x, y)
โœ…sqr(x)
โœ…sqrt(x)
โœ…pow(x, y)
โœ…exp(x)
โœ…log(x)
โœ…log10(x)
โœ…abs(x)
โœ…min(x, y)
โœ…max(x, y)
โœ…sign(x)
โœ…rand(x)
โœ…floor(x)
โœ…ceil(x)
โœ…invsqrt(x)
\n

Time Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’time([v])
๐Ÿ•’time_precise([v])
\n

Midi Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’midisend(offset, msg1, msg2)
๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
๐Ÿ•’midisend(offset, msg1, msg2, msg3)
๐Ÿ•’midisend_buf(offset, buf, len)
๐Ÿ•’midisend_str(offset, string)
๐Ÿ•’midirecv(offset, msg1, msg23)
๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
๐Ÿ•’midirecv_buf(offset, buf, maxlen)
๐Ÿ•’midirecv_str(offset, string)
๐Ÿ•’midisyx(offset, msgptr, len)
\n

Memory/FFT/MDCT Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’mdct(start_index, size)
๐Ÿ•’imdct(start_index, size)
๐Ÿ•’fft(start_index, size)
๐Ÿ•’ifft(start_index, size)
๐Ÿ•’fft_real(start_index, size)
๐Ÿ•’ifft_real(start_index, size)
๐Ÿ•’fft_permute(index, size)
๐Ÿ•’fft_ipermute(index, size)
๐Ÿ•’convolve_c(dest, src, size)
๐Ÿ•’freembuf(top)
๐Ÿ•’memcpy(dest, source, length)
๐Ÿ•’memset(dest, value, length)
๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
๐Ÿ•’mem_insert_shuffle(buf, len, value)
๐Ÿ•’__memtop()
๐Ÿ•’stack_push(value)
๐Ÿ•’stack_pop(value)
๐Ÿ•’stack_peek(index)
๐Ÿ•’stack_exch(value)
๐Ÿ•’atomic_setifequal(dest, value, newvalue)
๐Ÿ•’atomic_exch(val1, val2)
๐Ÿ•’atomic_add(dest_val1, val2)
๐Ÿ•’atomic_set(dest_val1, val2)
๐Ÿ•’atomic_get(val)
\n

Host Interaction Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’sliderchange(mask | sliderX)
๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
๐Ÿ•’slider_show(mask or sliderX[, value])
๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
๐Ÿ•’get_host_numchan()
๐Ÿ•’set_host_numchan(numchan)
๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
๐Ÿ•’get_pinmapper_flags(no parameters)
๐Ÿ•’set_pinmapper_flags(flags)
๐Ÿ•’get_host_placement([chain_pos, flags])
\n

String Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’strlen(str)
๐Ÿ•’strcpy(str, srcstr)
๐Ÿ•’strcat(str, srcstr)
๐Ÿ•’strcmp(str, str2)
๐Ÿ•’stricmp(str, str2)
๐Ÿ•’strncmp(str, str2, maxlen)
๐Ÿ•’strnicmp(str, str2, maxlen)
๐Ÿ•’strncpy(str, srcstr, maxlen)
๐Ÿ•’strncat(str, srcstr, maxlen)
๐Ÿ•’strcpy_from(str, srcstr, offset)
๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
๐Ÿ•’str_getchar(str, offset[, type])
๐Ÿ•’str_setchar(str, offset, value[, type])
๐Ÿ•’strcpy_fromslider(str, slider)
๐Ÿ•’sprintf(str, format, ...)
๐Ÿ•’match(needle, haystack, ...)
๐Ÿ•’matchi(needle, haystack, ...)
\n

GFX Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
๐Ÿ•’gfx_lineto(x, y, aa)
๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
๐Ÿ•’gfx_rectto(x, y)
๐Ÿ•’gfx_rect(x, y, w, h)
๐Ÿ•’gfx_setpixel(r, g, b)
๐Ÿ•’gfx_getpixel(r, g, b)
๐Ÿ•’gfx_drawnumber(n, ndigits)
๐Ÿ•’gfx_drawchar($'c')
๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
๐Ÿ•’gfx_measurestr(str, w, h)
๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
๐Ÿ•’gfx_getfont()
๐Ÿ•’gfx_printf(str, ...)
๐Ÿ•’gfx_blurto(x,y)
๐Ÿ•’gfx_blit(source, scale, rotation)
๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
๐Ÿ•’gfx_getimgdim(image, w, h)
๐Ÿ•’gfx_setimgdim(image, w,h)
๐Ÿ•’gfx_loadimg(image, filename)
๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
๐Ÿ•’gfx_getchar([char, unicodechar])
๐Ÿ•’gfx_showmenu("str")
๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
\n

GFX Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
๐Ÿ•’gfx_w, gfx_h
๐Ÿ•’gfx_x, gfx_y
๐Ÿ•’gfx_mode
๐Ÿ•’gfx_clear
๐Ÿ•’gfx_dest
๐Ÿ•’gfx_texth
๐Ÿ•’gfx_ext_retina
๐Ÿ•’gfx_ext_flags
๐Ÿ•’mouse_x, mouse_y
๐Ÿ•’mouse_cap
๐Ÿ•’mouse_wheel, mouse_hwheel
\n

Special Vars and Extended Functionality

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’trigger
๐Ÿ•’ext_noinit
๐Ÿ•’ext_nodenorm
๐Ÿ•’ext_tail_size
๐Ÿ•’reg00-reg99
๐Ÿ•’_global.*
\n

Delay Compensation Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’pdc_delay
๐Ÿ•’pdc_bot_ch
๐Ÿ•’pdc_top_ch
๐Ÿ•’pdc_midi
\n", From 224e9e526d3b495a7a9ff246c32e56c51499fd44 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Sun, 15 Oct 2023 17:31:22 +0200 Subject: [PATCH 03/42] Bind file selector to variable --- compiler/js2eel.d.ts | 13 ++++++- compiler/scripts/parseTypeDocs.mjs | 2 ++ .../src/js2eel/compiler/Js2EelCompiler.ts | 6 ++-- .../eelLib/eelLibraryFunctionCall.ts | 34 +++++++++++++++++++ .../js2EelLib/fileSelector.spec.ts | 31 ++++++++++++----- .../callExpression/js2EelLib/fileSelector.ts | 23 +++++++------ .../callExpression/js2EelLib/selectBox.ts | 5 +-- .../callExpression/js2EelLib/slider.ts | 4 +-- compiler/src/js2eel/types.ts | 3 +- compiler/src/popupDocs.ts | 14 ++++++-- docs/api-documentation.md | 15 ++++++++ examples/08_cab_sim.js | 4 ++- gui/src/docs/rendered-docs.json | 2 +- 13 files changed, 123 insertions(+), 33 deletions(-) diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index 5cd8e82..f0c9974 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -69,6 +69,7 @@ declare function selectBox( * @example ```javascript * fileSelector( * 5, + * ampModel, * 'amp_models', * 'none', * 'Impulse Response' @@ -77,6 +78,7 @@ declare function selectBox( */ declare function fileSelector( sliderNumber: number, + variable: string, path: string, defaultValue: string, label: string @@ -423,7 +425,16 @@ declare function ceil(x: number): number; */ declare function invsqrt(x: number): number; -// SPECIAL VARIABLES +// FILE FUNCTIONS + +/** + *Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory. + * + * @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types + */ +declare function file_open(fileSelector: any): any; + +// SPECIAL FUNCTIONS AND VARIABLES /** * Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state. diff --git a/compiler/scripts/parseTypeDocs.mjs b/compiler/scripts/parseTypeDocs.mjs index 1b138e7..f7a2609 100644 --- a/compiler/scripts/parseTypeDocs.mjs +++ b/compiler/scripts/parseTypeDocs.mjs @@ -241,6 +241,8 @@ parts.forEach((part) => { addMarkdownHeading('Math Constants'); } else if (part.name.startsWith('srate')) { addMarkdownHeading('Audio Constants'); + } else if (part.name.startsWith('extTailSize')) { + addMarkdownHeading('Special Functions & Variables'); } else if (part.name.match(/^spl\d/)) { if (parseInt(part.name.slice(3, 4)) === 0) { partHeading = `### spl<1-64> diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index b9e1269..b6ffbb2 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -421,11 +421,11 @@ export class Js2EelCompiler { } addFileSelector(fileSelector: FileSelector): void { - this.pluginData.fileSelectors[fileSelector.id] = fileSelector; + this.pluginData.fileSelectors[fileSelector.variable] = fileSelector; } - getFileSelector(fileSelectorId: string): FileSelector | undefined { - return this.pluginData.fileSelectors[fileSelectorId]; + getFileSelector(fileSelectorName: string): FileSelector | undefined { + return this.pluginData.fileSelectors[fileSelectorName]; } setOnInitSrc(src: string): void { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index 4048d31..3ecf974 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -143,6 +143,40 @@ export const eelLibraryFunctionCall = ( break; } + // File functions + case 'file_open': { + const { args, errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'fileSelectorVariable', + required: true, + allowedValues: [{ nodeType: 'Identifier' }] + } + ], + instance + ); + + if (errors) { + instance.multipleErrors(errors); + + return JSFX_DENY_COMPILATION; + } + + const fileSelector = instance.getFileSelector(args.fileSelectorVariable.value); + + if (!fileSelector) { + instance.error( + 'BindingError', + `file_open can only be called with a variable that is bound to a file selector`, + callExpression + ); + + return JSFX_DENY_COMPILATION; + } + + return `file_open(slider${fileSelector.sliderNumber})`; + } default: { instance.error( diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts index 601a604..9ebcecd 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts @@ -8,8 +8,16 @@ describe('fileSelector()', () => { const result = compiler.compile(`config({ description: 'fileSelector', inChannels: 2, outChannels: 2 }); +let ampModelsSelector; + onSample(() => { - fileSelector(1, 'ampModelsSelector', 'amp_models', 'none', 'Impulse Response'); + fileSelector( + 1, + ampModelsSelector, + 'amp_models', + 'none', + 'Impulse Response' + ); }); `); expect(result.success).to.equal(false); @@ -35,8 +43,11 @@ out_pin:In 1 const result = compiler.compile(`config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); -fileSelector(1, 'ampModelsSelector', 'amp_models', 'none', 'Impulse Response'); -fileSelector(1, 'ampModelsSelector2', 'amp_models', 'none', 'Impulse Response'); +let ampModelsSelector; +let ampModelsSelector2; + +fileSelector(1, ampModelsSelector, 'amp_models', 'none', 'Impulse Response'); +fileSelector(1, ampModelsSelector2, 'amp_models', 'none', 'Impulse Response'); `); expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( @@ -58,13 +69,15 @@ out_pin:In 1 expect(result.errors[0].type).to.equal('EelConventionError'); }); - it('Error if file id already used', () => { + it('Error if file selector variable already used', () => { const compiler = new Js2EelCompiler(); const result = compiler.compile(`config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); -fileSelector(1, "ampModelsSelector", 'amp_models', 'none', 'Impulse Response'); -fileSelector(2, "ampModelsSelector", 'amp_models', 'none', 'Impulse Response'); +let ampModelsSelector; + +fileSelector(1, ampModelsSelector, 'amp_models', 'none', 'Impulse Response'); +fileSelector(2, ampModelsSelector, 'amp_models', 'none', 'Impulse Response'); `); expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( @@ -83,7 +96,7 @@ out_pin:In 1 `) ); expect(result.errors.length).to.equal(1); - expect(result.errors[0].type).to.equal('EelConventionError'); + expect(result.errors[0].type).to.equal('BindingError'); }); it('Error if argument invalid', () => { @@ -91,9 +104,9 @@ out_pin:In 1 const result = compiler.compile(`config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); -fileSelector(1, 1337, 'amp_models', 'none', 'Impulse Response'); +let amp; -onSample(() => {}); +fileSelector(1, amp, 1337, 'none', 'Impulse Response'); `); expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.ts index 38e6412..ffca754 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.ts @@ -27,11 +27,7 @@ export const fileSelector = (callExpression: CallExpression, instance: Js2EelCom { nodeType: 'Literal', validationSchema: Joi.number().min(1).max(64) } ] }, - { - name: 'id', - required: true, - allowedValues: [{ nodeType: 'Literal', validationSchema: Joi.string().max(64) }] - }, + { name: 'variable', required: true, allowedValues: [{ nodeType: 'Identifier' }] }, { name: 'path', required: true, @@ -67,11 +63,17 @@ export const fileSelector = (callExpression: CallExpression, instance: Js2EelCom return; } - if (instance.getFileSelector(args.id.value)) { + const fileSelectorBoundVariable = args.variable.name; + + if ( + instance.getSlider(fileSelectorBoundVariable) || + instance.getSelectBox(fileSelectorBoundVariable) || + instance.getFileSelector(fileSelectorBoundVariable) + ) { instance.error( - 'EelConventionError', - `Error at file selector registration: A file selector with this ID is already registered: ${args.id.value}`, - args.id.node + 'BindingError', + `Error at file selector registration: This variable is already bound to a slider, select box or file selector: ${fileSelectorBoundVariable}`, + args.variable.node ); return; @@ -81,7 +83,8 @@ export const fileSelector = (callExpression: CallExpression, instance: Js2EelCom const fileSelector: FileSelector = { sliderNumber: args.sliderNumber.value, - id: args.id.value, + variable: fileSelectorBoundVariable, + rawSliderName: 'slider' + args.sliderNumber.value, path: args.path.value, defaultValue: args.defaultValue.value, label: args.label.value diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.ts index 4b31a19..3f57aac 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.ts @@ -77,11 +77,12 @@ export const selectBox = (callExpression: CallExpression, instance: Js2EelCompil if ( instance.getSlider(selectBoxBoundVariable) || - instance.getSelectBox(selectBoxBoundVariable) + instance.getSelectBox(selectBoxBoundVariable) || + instance.getFileSelector(selectBoxBoundVariable) ) { instance.error( 'BindingError', - `Error at select box registration: This variable is already bound to a slider or select box: ${selectBoxBoundVariable}`, + `Error at select box registration: This variable is already bound to a slider, select box or file selector: ${selectBoxBoundVariable}`, args.variable.node ); diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.ts index fbb7029..5511f60 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.ts @@ -87,10 +87,10 @@ export const slider = (callExpression: CallExpression, instance: Js2EelCompiler) const sliderBoundVariable = args.variable.name; - if (instance.getSlider(sliderBoundVariable) || instance.getSelectBox(sliderBoundVariable)) { + if (instance.getSlider(sliderBoundVariable) || instance.getSelectBox(sliderBoundVariable) || instance.getFileSelector(sliderBoundVariable)) { instance.error( 'BindingError', - `Error at slider registration: This variable is already bound to a slider or select box: ${sliderBoundVariable}`, + `Error at slider registration: This variable is already bound to a slider, select box or file selector: ${sliderBoundVariable}`, args.variable.node ); diff --git a/compiler/src/js2eel/types.ts b/compiler/src/js2eel/types.ts index 4161dcb..8c53292 100644 --- a/compiler/src/js2eel/types.ts +++ b/compiler/src/js2eel/types.ts @@ -189,7 +189,8 @@ export type SelectBox = { export type FileSelector = { sliderNumber: number; - id: string; + variable: string; + rawSliderName: string; path: string; defaultValue: string; label: string; diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index c7b00f8..3b35c18 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -38,9 +38,9 @@ fileSelector: { "name": "fileSelector", "type": "function", "text": "Registers a file selector to be displayed in the plugin.\n\nThe path is relative to /data.", - "example": "```javascript\nfileSelector(\n 5,\n 'amp_models',\n 'none',\n 'Impulse Response'\n);\n```", - "signature": "fileSelector(\n sliderNumber: number,\n path: string,\n defaultValue: string,\n label: string\n): void;", - "autoCompleteTemplate": "fileSelector(${sliderNumber}, ${path}, ${defaultValue}, ${label});" + "example": "```javascript\nfileSelector(\n 5,\n ampModel,\n 'amp_models',\n 'none',\n 'Impulse Response'\n);\n```", + "signature": "fileSelector(\n sliderNumber: number,\n variable: string,\n path: string,\n defaultValue: string,\n label: string\n): void;", + "autoCompleteTemplate": "fileSelector(${sliderNumber}, ${variable}, ${path}, ${defaultValue}, ${label});" }, console: { "name": "console", @@ -858,6 +858,14 @@ invsqrt: { "signature": "invsqrt(x: number): number;", "autoCompleteTemplate": "invsqrt(${x});" }, +file_open: { + "name": "file_open", + "type": "function", + "text": "Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.\n\n@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types", + "example": null, + "signature": "file_open(fileSelector: any): any;", + "autoCompleteTemplate": "file_open();" +}, extTailSize: { "name": "extTailSize", "type": "function", diff --git a/docs/api-documentation.md b/docs/api-documentation.md index 7bcd5e1..4673279 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -7,6 +7,7 @@ - [Audio Constants](#audio-constants) - [Math Constants](#math-constants) - [Math Functions](#math-functions) +- [Special Functions & Variables](#special-functions-&-variables) @@ -85,6 +86,7 @@ The path is relative to /data. ```typescript fileSelector( sliderNumber: number, + variable: string, path: string, defaultValue: string, label: string @@ -95,6 +97,7 @@ Example: ```javascript fileSelector( 5, + ampModel, 'amp_models', 'none', 'Impulse Response' @@ -393,6 +396,18 @@ Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter. ```typescript invsqrt(x: number): number; ``` +### file_open() +Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory. + +@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types + +```typescript +file_open(fileSelector: any): any; +``` + + +## Special Functions & Variables + ### extTailSize() Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state. diff --git a/examples/08_cab_sim.js b/examples/08_cab_sim.js index 6ac7e32..7f197cf 100644 --- a/examples/08_cab_sim.js +++ b/examples/08_cab_sim.js @@ -1,5 +1,7 @@ config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); -fileSelector(1, 'ampModelsSelector', 'amp_models', 'none', 'Impulse Response'); +let ampModel; + +fileSelector(1, ampModel, 'amp_models', 'none', 'Impulse Response'); onSample(() => {}); diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index ffa3eec..dd31b09 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,5 +1,5 @@ { - "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", + "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

file_open()

\n

Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

\n

@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

\n
file_open(fileSelector: any): any;\n
\n

Special Functions & Variables

\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", "changelog": "

Changelog

\n
    \n
  • v0.9.1:
      \n
    • New example: 4-Band RBJ EQ
    \n
  • v0.7.0:
      \n
    • Allow simple plain objects
    • Allow function declaration in block statement
    • Allow member expression returns
    \n
  • v0.5.0:
      \n
    • MacOS App is signed now ๐Ÿ–‹๏ธ
    • More documentation
    \n
  • v0.3.0: Initial release
\n", "development": "

Development

\n

Requirements

\n
    \n
  • Node.js 18 and higher
  • Terminal emulator
      \n
    • Linux, MacOS: bash or zsh
    • Windows: git bash (comes with git)
    \n
  • Reaper DAW, obviously
\n

Setup

\n
    \n
  • Install dependencies for all packages:
      \n
    • cd scripts
    • ./install.sh
    \n
  • Open a different terminal session for each of the following steps
      \n
    • Go to compiler and do npm run dev
    • Go to gui and do npm run dev
    • Go to desktop and do npm run dev. Now, the electron build should open.
    \n
\n

Guidelines

\n
    \n
  • We aim for 100% test coverage for the compiler package
\n

Architecture

\n

TODO

\n

Recommended VSCode Extensions

\n

TODO

\n", "feature-comparison": "

Feature Comparison with JSFX

\n

JSFX Reference: https://www.reaper.fm/sdk/js/js.php

\n

Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

\n

โœ…: Implemented

\n

๐Ÿ•’: Should be implemented

\n

โŒ: Won't be implemented

\n

โ”: Unknown if feasible, useful, or working properly

\n

Description Lines and Utility Features

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…descImplemented as part of config()
๐Ÿ•’tags
๐Ÿ•’options
๐Ÿ•’JSFX comments
\n

Code Sections

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…@initonInit()
โœ…@slideronSlider()
๐Ÿ•’@block
โœ…@sampleonSample()
๐Ÿ•’@serialize
๐Ÿ•’@gfxDeclarative with React-like syntax?
\n

File Handling

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’import
๐Ÿ•’filename
๐Ÿ•’file_open(index | slider)
๐Ÿ•’file_close(handle)
๐Ÿ•’file_rewind(handle)
๐Ÿ•’file_var(handle, variable)
๐Ÿ•’file_mem(handle, offset, length)
๐Ÿ•’file_avail(handle)
๐Ÿ•’file_riff(handle, nch, samplerate)
๐Ÿ•’file_text(handle, istext)
๐Ÿ•’file_string(handle,str)
\n

Routing and Input

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…in_pin, out_pinImplemented as part of config()
\n

UI

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Slider: Normalslider()
โœ…Slider: SelectselectBox()
๐Ÿ•’Slider: File
๐Ÿ•’Hidden sliders
๐Ÿ•’Slider: shapes
โŒslider(index)Might not be necessary as every slider is bound to a variable
๐Ÿ•’slider_next_chg(sliderindex,nextval)
\n

Sample Access

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…spl0 - spl63
โœ…spl(index)
\n

Audio and Transport State Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…srate
โœ…num_ch
โœ…samplesblock
โœ…tempo
โœ…play_state
โœ…play_position
โœ…beat_position
โœ…ts_num
โœ…ts_denom
\n

Data Structures and Encodings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Local variableslet & const
โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
โ”Local address space 8m word restriction
๐Ÿ•’Global address space (gmem[])
๐Ÿ•’Named global address space
โ”Global named variables (_global. prefix)
๐Ÿ•’Hex numbers
๐Ÿ•’ASCII chars
๐Ÿ•’Bitmasks
โ”StringsAlready fully implemented?
\n

Control Structures

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…FunctionsUser definable functions are inlined in compiled code
โœ…Conditionals
โœ…Conditional Branching
๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
๐Ÿ•’while(actions..., condition)
๐Ÿ•’while(condition) (actions...)
\n

Operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…!value
โœ…-value
โœ…+value
โœ…base ^ exponentMath.pow(base, exponent) or **
โœ…numerator % denominator
โœ…value / divisor
โœ…value * another_value
โœ…value - another_value
โœ…value + another_value
โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 === value2
โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 !== value2
โœ…value1 < value2
โœ…value1 > value2
โœ…value1 <= value2
โœ…value1 >= value2
โœ…y || z
โœ…y && z
โœ…y ? z
โœ…y ? z : x
โœ…y = z
โœ…y *= z
โœ…y /= divisor
โœ…y %= divisor
๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
โœ…y += z
โœ…y -= z
\n

Bitwise operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’value << shift_amt
๐Ÿ•’value >> shift_amt
๐Ÿ•’a | b
๐Ÿ•’a & b
๐Ÿ•’a ~ b
๐Ÿ•’y | = z
๐Ÿ•’y &= z
๐Ÿ•’y ~= z
\n

Math Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…sin(angle)
โœ…cos(angle)
โœ…tan(angle)
โœ…asin(x)
โœ…acos(x)
โœ…atan(x)
โœ…atan2(x, y)
โœ…sqr(x)
โœ…sqrt(x)
โœ…pow(x, y)
โœ…exp(x)
โœ…log(x)
โœ…log10(x)
โœ…abs(x)
โœ…min(x, y)
โœ…max(x, y)
โœ…sign(x)
โœ…rand(x)
โœ…floor(x)
โœ…ceil(x)
โœ…invsqrt(x)
\n

Time Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’time([v])
๐Ÿ•’time_precise([v])
\n

Midi Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’midisend(offset, msg1, msg2)
๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
๐Ÿ•’midisend(offset, msg1, msg2, msg3)
๐Ÿ•’midisend_buf(offset, buf, len)
๐Ÿ•’midisend_str(offset, string)
๐Ÿ•’midirecv(offset, msg1, msg23)
๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
๐Ÿ•’midirecv_buf(offset, buf, maxlen)
๐Ÿ•’midirecv_str(offset, string)
๐Ÿ•’midisyx(offset, msgptr, len)
\n

Memory/FFT/MDCT Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’mdct(start_index, size)
๐Ÿ•’imdct(start_index, size)
๐Ÿ•’fft(start_index, size)
๐Ÿ•’ifft(start_index, size)
๐Ÿ•’fft_real(start_index, size)
๐Ÿ•’ifft_real(start_index, size)
๐Ÿ•’fft_permute(index, size)
๐Ÿ•’fft_ipermute(index, size)
๐Ÿ•’convolve_c(dest, src, size)
๐Ÿ•’freembuf(top)
๐Ÿ•’memcpy(dest, source, length)
๐Ÿ•’memset(dest, value, length)
๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
๐Ÿ•’mem_insert_shuffle(buf, len, value)
๐Ÿ•’__memtop()
๐Ÿ•’stack_push(value)
๐Ÿ•’stack_pop(value)
๐Ÿ•’stack_peek(index)
๐Ÿ•’stack_exch(value)
๐Ÿ•’atomic_setifequal(dest, value, newvalue)
๐Ÿ•’atomic_exch(val1, val2)
๐Ÿ•’atomic_add(dest_val1, val2)
๐Ÿ•’atomic_set(dest_val1, val2)
๐Ÿ•’atomic_get(val)
\n

Host Interaction Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’sliderchange(mask | sliderX)
๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
๐Ÿ•’slider_show(mask or sliderX[, value])
๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
๐Ÿ•’get_host_numchan()
๐Ÿ•’set_host_numchan(numchan)
๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
๐Ÿ•’get_pinmapper_flags(no parameters)
๐Ÿ•’set_pinmapper_flags(flags)
๐Ÿ•’get_host_placement([chain_pos, flags])
\n

String Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’strlen(str)
๐Ÿ•’strcpy(str, srcstr)
๐Ÿ•’strcat(str, srcstr)
๐Ÿ•’strcmp(str, str2)
๐Ÿ•’stricmp(str, str2)
๐Ÿ•’strncmp(str, str2, maxlen)
๐Ÿ•’strnicmp(str, str2, maxlen)
๐Ÿ•’strncpy(str, srcstr, maxlen)
๐Ÿ•’strncat(str, srcstr, maxlen)
๐Ÿ•’strcpy_from(str, srcstr, offset)
๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
๐Ÿ•’str_getchar(str, offset[, type])
๐Ÿ•’str_setchar(str, offset, value[, type])
๐Ÿ•’strcpy_fromslider(str, slider)
๐Ÿ•’sprintf(str, format, ...)
๐Ÿ•’match(needle, haystack, ...)
๐Ÿ•’matchi(needle, haystack, ...)
\n

GFX Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
๐Ÿ•’gfx_lineto(x, y, aa)
๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
๐Ÿ•’gfx_rectto(x, y)
๐Ÿ•’gfx_rect(x, y, w, h)
๐Ÿ•’gfx_setpixel(r, g, b)
๐Ÿ•’gfx_getpixel(r, g, b)
๐Ÿ•’gfx_drawnumber(n, ndigits)
๐Ÿ•’gfx_drawchar($'c')
๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
๐Ÿ•’gfx_measurestr(str, w, h)
๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
๐Ÿ•’gfx_getfont()
๐Ÿ•’gfx_printf(str, ...)
๐Ÿ•’gfx_blurto(x,y)
๐Ÿ•’gfx_blit(source, scale, rotation)
๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
๐Ÿ•’gfx_getimgdim(image, w, h)
๐Ÿ•’gfx_setimgdim(image, w,h)
๐Ÿ•’gfx_loadimg(image, filename)
๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
๐Ÿ•’gfx_getchar([char, unicodechar])
๐Ÿ•’gfx_showmenu("str")
๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
\n

GFX Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
๐Ÿ•’gfx_w, gfx_h
๐Ÿ•’gfx_x, gfx_y
๐Ÿ•’gfx_mode
๐Ÿ•’gfx_clear
๐Ÿ•’gfx_dest
๐Ÿ•’gfx_texth
๐Ÿ•’gfx_ext_retina
๐Ÿ•’gfx_ext_flags
๐Ÿ•’mouse_x, mouse_y
๐Ÿ•’mouse_cap
๐Ÿ•’mouse_wheel, mouse_hwheel
\n

Special Vars and Extended Functionality

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’trigger
๐Ÿ•’ext_noinit
๐Ÿ•’ext_nodenorm
๐Ÿ•’ext_tail_size
๐Ÿ•’reg00-reg99
๐Ÿ•’_global.*
\n

Delay Compensation Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’pdc_delay
๐Ÿ•’pdc_bot_ch
๐Ÿ•’pdc_top_ch
๐Ÿ•’pdc_midi
\n", From e2d525071368e10de1f418a87eb813576d768a0c Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 14:08:44 +0200 Subject: [PATCH 04/42] Add semicolon to expression if child of block --- .../generatorNodes/blockStatement/blockStatement.ts | 2 +- .../expressionStatement/expressionStatement.ts | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.ts b/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.ts index 7d39a87..3d26172 100644 --- a/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.ts +++ b/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.ts @@ -28,7 +28,7 @@ export const blockStatement = ( break; } case 'ExpressionStatement': { - blockSrc += expressionStatement(blockBody, instance); + blockSrc += expressionStatement(blockStatement, blockBody, instance); break; } case 'VariableDeclaration': { diff --git a/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.ts b/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.ts index 31ad136..0d6f99d 100644 --- a/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.ts +++ b/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.ts @@ -1,11 +1,13 @@ import { binaryExpression } from '../binaryExpression/binaryExpression.js'; import { assignmentExpression } from '../assignmentExpression/assignmentExpression.js'; import { callExpression } from '../callExpression/callExpression.js'; +import { addSemicolonIfNone } from '../../suffixersAndPrefixers/addSemicolonIfNone.js'; -import type { ExpressionStatement } from 'estree'; +import type { ExpressionStatement, Node } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; export const expressionStatement = ( + parentNode: Node, expressionStatement: ExpressionStatement, instance: Js2EelCompiler ): string => { @@ -38,7 +40,11 @@ export const expressionStatement = ( const inlineData = instance.consumeCurrentInlineData(); if (inlineData) { - expressionSrc = (inlineData.srcs.join('')) + expressionSrc; + expressionSrc = inlineData.srcs.join('') + expressionSrc; + } + + if (parentNode.type === 'BlockStatement') { + expressionSrc = addSemicolonIfNone(expressionSrc); } return expressionSrc; From 4b13a0f144ee483a3b5c2ae88360a0f688737157 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 14:24:50 +0200 Subject: [PATCH 05/42] Allow identifier as if statement test --- .../src/js2eel/generatorNodes/ifStatement/ifStatement.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.ts b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.ts index 6036b55..ed1f640 100644 --- a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.ts +++ b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.ts @@ -1,12 +1,13 @@ import { blockStatement } from '../blockStatement/blockStatement.js'; import { unaryExpression } from '../unaryExpression/unaryExpression.js'; import { binaryExpression } from '../binaryExpression/binaryExpression.js'; +import { logicalExpression } from '../logicalExpression/logicalExpression.js'; +import { identifier } from '../identifier/identifier.js'; import { addSemicolonIfNone } from '../../suffixersAndPrefixers/addSemicolonIfNone.js'; import type { IfStatement } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; -import { logicalExpression } from '../logicalExpression/logicalExpression.js'; export const ifStatement = (ifStatementNode: IfStatement, instance: Js2EelCompiler): string => { let ifSrc = ``; @@ -28,6 +29,10 @@ export const ifStatement = (ifStatementNode: IfStatement, instance: Js2EelCompil testSrc += logicalExpression(ifStatementNode.test, instance); break; } + case 'Identifier': { + testSrc += identifier(ifStatementNode.test, instance); + break; + } default: { instance.error( 'TypeError', From ead1f03c045318381c7f05efc3e5bf8e30f58ee4 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 14:52:34 +0200 Subject: [PATCH 06/42] Add more file functions needed for IR import --- compiler/js2eel.d.ts | 22 ++++ compiler/scripts/parseTypeDocs.mjs | 2 + .../eelLib/eelLibraryFunctionCall.ts | 103 ++++++++++++++++++ .../utils/evaluateLibraryFunctionCall.ts | 2 +- compiler/src/popupDocs.ts | 32 ++++++ docs/api-documentation.md | 31 ++++++ docs/feature-comparison.md | 30 ++--- gui/src/docs/rendered-docs.json | 4 +- 8 files changed, 208 insertions(+), 18 deletions(-) diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index f0c9974..99c9ce0 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -434,6 +434,28 @@ declare function invsqrt(x: number): number; */ declare function file_open(fileSelector: any): any; +/** + * Closes a file opened with file_open(). + */ +declare function file_close(fileHandle: any): void; + +/** + * Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF. + */ +declare function file_avail(fileSelector: any): number; + +/** + * If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate. + +REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail()) + */ +declare function file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void; + +/** + * Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written). + */ +declare function file_mem(fileHandle: any, offset: number, length: number): number; + // SPECIAL FUNCTIONS AND VARIABLES /** diff --git a/compiler/scripts/parseTypeDocs.mjs b/compiler/scripts/parseTypeDocs.mjs index f7a2609..d4314ee 100644 --- a/compiler/scripts/parseTypeDocs.mjs +++ b/compiler/scripts/parseTypeDocs.mjs @@ -243,6 +243,8 @@ parts.forEach((part) => { addMarkdownHeading('Audio Constants'); } else if (part.name.startsWith('extTailSize')) { addMarkdownHeading('Special Functions & Variables'); + } else if (part.name.startsWith('file_open')) { + addMarkdownHeading('File Functions'); } else if (part.name.match(/^spl\d/)) { if (parseInt(part.name.slice(3, 4)) === 0) { partHeading = `### spl<1-64> diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index 3ecf974..b59b4b1 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -177,6 +177,109 @@ export const eelLibraryFunctionCall = ( return `file_open(slider${fileSelector.sliderNumber})`; } + case 'file_close': { + const { errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'fileHandle', + required: true, + allowedValues: [{ nodeType: 'Identifier' }] + } + ], + instance + ); + + evaluationErrors = errors; + + break; + } + case 'file_riff': { + const { errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'fileHandle', + required: true, + allowedValues: [{ nodeType: 'Identifier' }] + }, + { + name: 'numberOfCh', + required: true, + allowedValues: [{ nodeType: 'Identifier' }] + }, + { + name: 'sampleRate', + required: true, + allowedValues: [{ nodeType: 'Identifier' }] + } + ], + instance + ); + + evaluationErrors = errors; + + break; + } + + case 'file_avail': { + const { errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'fileHandle', + required: true, + allowedValues: [{ nodeType: 'Identifier' }] + } + ], + instance + ); + + evaluationErrors = errors; + + break; + } + case 'file_mem': { + const { errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'fileHandle', + required: true, + allowedValues: [{ nodeType: 'Identifier' }] + }, + { + name: 'offset', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' } + ] + }, + { + name: 'length', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' } + ] + } + ], + instance + ); + + evaluationErrors = errors; + + break; + } default: { instance.error( diff --git a/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateLibraryFunctionCall.ts index f67a697..9e312db 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateLibraryFunctionCall.ts @@ -114,7 +114,7 @@ export const evaluateLibraryFunctionCall = ( if (!allowedValue) { errors.push({ type: 'TypeError', - msg: `${callee.name}: Argument type ${ + msg: `${callee.name}: Argument ${i + 1} (${definedArg.name}): Argument type ${ givenArg.type } not allowed. Allowed: ${definedArg.allowedValues .map((allowedValue) => allowedValue.nodeType) diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index 3b35c18..f4f88f4 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -866,6 +866,38 @@ file_open: { "signature": "file_open(fileSelector: any): any;", "autoCompleteTemplate": "file_open();" }, +file_close: { + "name": "file_close", + "type": "function", + "text": "Closes a file opened with file_open().", + "example": null, + "signature": "file_close(fileHandle: any): void;", + "autoCompleteTemplate": "file_close();" +}, +file_avail: { + "name": "file_avail", + "type": "function", + "text": "Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.", + "example": null, + "signature": "file_avail(fileSelector: any): number;", + "autoCompleteTemplate": "file_avail();" +}, +file_riff: { + "name": "file_riff", + "type": "function", + "text": "If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.\n\nREAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())", + "example": null, + "signature": "file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;", + "autoCompleteTemplate": "file_riff(${numberOfCh}, ${sampleRate});" +}, +file_mem: { + "name": "file_mem", + "type": "function", + "text": "Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).", + "example": null, + "signature": "file_mem(fileHandle: any, offset: number, length: number): number;", + "autoCompleteTemplate": "file_mem(${offset}, ${length});" +}, extTailSize: { "name": "extTailSize", "type": "function", diff --git a/docs/api-documentation.md b/docs/api-documentation.md index 4673279..6f70517 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -7,6 +7,7 @@ - [Audio Constants](#audio-constants) - [Math Constants](#math-constants) - [Math Functions](#math-functions) +- [File Functions](#file-functions) - [Special Functions & Variables](#special-functions-&-variables) @@ -396,6 +397,10 @@ Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter. ```typescript invsqrt(x: number): number; ``` + + +## File Functions + ### file_open() Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory. @@ -404,6 +409,32 @@ Opens a file from a file slider. Once open, you may use all of the file function ```typescript file_open(fileSelector: any): any; ``` +### file_close() +Closes a file opened with file_open(). + +```typescript +file_close(fileHandle: any): void; +``` +### file_avail() +Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF. + +```typescript +file_avail(fileSelector: any): number; +``` +### file_riff() +If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate. + +REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail()) + +```typescript +file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void; +``` +### file_mem() +Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written). + +```typescript +file_mem(fileHandle: any, offset: number, length: number): number; +``` ## Special Functions & Variables diff --git a/docs/feature-comparison.md b/docs/feature-comparison.md index 84f9c83..1bc11ca 100644 --- a/docs/feature-comparison.md +++ b/docs/feature-comparison.md @@ -34,19 +34,19 @@ Find the JS2EEL type declarations [here](https://github.com/steeelydan/js2eel/bl ## File Handling -| Status | Feature | Comment | -| ------ | ------------------------------------ | ------- | -| ๐Ÿ•’ | `import` | | -| ๐Ÿ•’ | `filename` | | -| ๐Ÿ•’ | `file_open(index \| slider)` | | -| ๐Ÿ•’ | `file_close(handle)` | | -| ๐Ÿ•’ | `file_rewind(handle)` | | -| ๐Ÿ•’ | `file_var(handle, variable)` | | -| ๐Ÿ•’ | `file_mem(handle, offset, length)` | | -| ๐Ÿ•’ | `file_avail(handle)` | | -| ๐Ÿ•’ | `file_riff(handle, nch, samplerate)` | | -| ๐Ÿ•’ | `file_text(handle, istext)` | | -| ๐Ÿ•’ | `file_string(handle,str)` | | +| Status | Feature | Comment | +| ------ | ------------------------------------ | -------------------------- | +| ๐Ÿ•’ | `import` | | +| ๐Ÿ•’ | `filename` | | +| โœ… | `file_open(index \| slider)` | Slider variant implemented | +| โœ… | `file_close(handle)` | | +| ๐Ÿ•’ | `file_rewind(handle)` | | +| ๐Ÿ•’ | `file_var(handle, variable)` | | +| โœ… | `file_mem(handle, offset, length)` | | +| โœ… | `file_avail(handle)` | | +| โœ… | `file_riff(handle, nch, samplerate)` | | +| ๐Ÿ•’ | `file_text(handle, istext)` | | +| ๐Ÿ•’ | `file_string(handle,str)` | | ## Routing and Input @@ -60,7 +60,7 @@ Find the JS2EEL type declarations [here](https://github.com/steeelydan/js2eel/bl | ------ | -------------------------------------- | ------------------------------------------------------------- | | โœ… | Slider: Normal | `slider()` | | โœ… | Slider: Select | `selectBox()` | -| ๐Ÿ•’ | Slider: File | | +| โœ… | Slider: File | | | ๐Ÿ•’ | Hidden sliders | | | ๐Ÿ•’ | Slider: shapes | | | โŒ | `slider(index)` | Might not be necessary as every slider is bound to a variable | @@ -335,7 +335,7 @@ Find the JS2EEL type declarations [here](https://github.com/steeelydan/js2eel/bl | ๐Ÿ•’ | `trigger` | | | ๐Ÿ•’ | `ext_noinit` | | | ๐Ÿ•’ | `ext_nodenorm` | | -| ๐Ÿ•’ | `ext_tail_size` | | +| โœ… | `ext_tail_size` | | | ๐Ÿ•’ | `reg00-reg99` | | | ๐Ÿ•’ | `_global.*` | | diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index dd31b09..f4d63c6 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,8 +1,8 @@ { - "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

file_open()

\n

Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

\n

@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

\n
file_open(fileSelector: any): any;\n
\n

Special Functions & Variables

\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", + "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

File Functions

\n

file_open()

\n

Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

\n

@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

\n
file_open(fileSelector: any): any;\n
\n

file_close()

\n

Closes a file opened with file_open().

\n
file_close(fileHandle: any): void;\n
\n

file_avail()

\n

Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

\n
file_avail(fileSelector: any): number;\n
\n

file_riff()

\n

If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

\n

REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

\n
file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
\n

file_mem()

\n

Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

\n
file_mem(fileHandle: any, offset: number, length: number): number;\n
\n

Special Functions & Variables

\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", "changelog": "

Changelog

\n
    \n
  • v0.9.1:
      \n
    • New example: 4-Band RBJ EQ
    \n
  • v0.7.0:
      \n
    • Allow simple plain objects
    • Allow function declaration in block statement
    • Allow member expression returns
    \n
  • v0.5.0:
      \n
    • MacOS App is signed now ๐Ÿ–‹๏ธ
    • More documentation
    \n
  • v0.3.0: Initial release
\n", "development": "

Development

\n

Requirements

\n
    \n
  • Node.js 18 and higher
  • Terminal emulator
      \n
    • Linux, MacOS: bash or zsh
    • Windows: git bash (comes with git)
    \n
  • Reaper DAW, obviously
\n

Setup

\n
    \n
  • Install dependencies for all packages:
      \n
    • cd scripts
    • ./install.sh
    \n
  • Open a different terminal session for each of the following steps
      \n
    • Go to compiler and do npm run dev
    • Go to gui and do npm run dev
    • Go to desktop and do npm run dev. Now, the electron build should open.
    \n
\n

Guidelines

\n
    \n
  • We aim for 100% test coverage for the compiler package
\n

Architecture

\n

TODO

\n

Recommended VSCode Extensions

\n

TODO

\n", - "feature-comparison": "

Feature Comparison with JSFX

\n

JSFX Reference: https://www.reaper.fm/sdk/js/js.php

\n

Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

\n

โœ…: Implemented

\n

๐Ÿ•’: Should be implemented

\n

โŒ: Won't be implemented

\n

โ”: Unknown if feasible, useful, or working properly

\n

Description Lines and Utility Features

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…descImplemented as part of config()
๐Ÿ•’tags
๐Ÿ•’options
๐Ÿ•’JSFX comments
\n

Code Sections

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…@initonInit()
โœ…@slideronSlider()
๐Ÿ•’@block
โœ…@sampleonSample()
๐Ÿ•’@serialize
๐Ÿ•’@gfxDeclarative with React-like syntax?
\n

File Handling

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’import
๐Ÿ•’filename
๐Ÿ•’file_open(index | slider)
๐Ÿ•’file_close(handle)
๐Ÿ•’file_rewind(handle)
๐Ÿ•’file_var(handle, variable)
๐Ÿ•’file_mem(handle, offset, length)
๐Ÿ•’file_avail(handle)
๐Ÿ•’file_riff(handle, nch, samplerate)
๐Ÿ•’file_text(handle, istext)
๐Ÿ•’file_string(handle,str)
\n

Routing and Input

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…in_pin, out_pinImplemented as part of config()
\n

UI

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Slider: Normalslider()
โœ…Slider: SelectselectBox()
๐Ÿ•’Slider: File
๐Ÿ•’Hidden sliders
๐Ÿ•’Slider: shapes
โŒslider(index)Might not be necessary as every slider is bound to a variable
๐Ÿ•’slider_next_chg(sliderindex,nextval)
\n

Sample Access

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…spl0 - spl63
โœ…spl(index)
\n

Audio and Transport State Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…srate
โœ…num_ch
โœ…samplesblock
โœ…tempo
โœ…play_state
โœ…play_position
โœ…beat_position
โœ…ts_num
โœ…ts_denom
\n

Data Structures and Encodings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Local variableslet & const
โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
โ”Local address space 8m word restriction
๐Ÿ•’Global address space (gmem[])
๐Ÿ•’Named global address space
โ”Global named variables (_global. prefix)
๐Ÿ•’Hex numbers
๐Ÿ•’ASCII chars
๐Ÿ•’Bitmasks
โ”StringsAlready fully implemented?
\n

Control Structures

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…FunctionsUser definable functions are inlined in compiled code
โœ…Conditionals
โœ…Conditional Branching
๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
๐Ÿ•’while(actions..., condition)
๐Ÿ•’while(condition) (actions...)
\n

Operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…!value
โœ…-value
โœ…+value
โœ…base ^ exponentMath.pow(base, exponent) or **
โœ…numerator % denominator
โœ…value / divisor
โœ…value * another_value
โœ…value - another_value
โœ…value + another_value
โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 === value2
โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 !== value2
โœ…value1 < value2
โœ…value1 > value2
โœ…value1 <= value2
โœ…value1 >= value2
โœ…y || z
โœ…y && z
โœ…y ? z
โœ…y ? z : x
โœ…y = z
โœ…y *= z
โœ…y /= divisor
โœ…y %= divisor
๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
โœ…y += z
โœ…y -= z
\n

Bitwise operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’value << shift_amt
๐Ÿ•’value >> shift_amt
๐Ÿ•’a | b
๐Ÿ•’a & b
๐Ÿ•’a ~ b
๐Ÿ•’y | = z
๐Ÿ•’y &= z
๐Ÿ•’y ~= z
\n

Math Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…sin(angle)
โœ…cos(angle)
โœ…tan(angle)
โœ…asin(x)
โœ…acos(x)
โœ…atan(x)
โœ…atan2(x, y)
โœ…sqr(x)
โœ…sqrt(x)
โœ…pow(x, y)
โœ…exp(x)
โœ…log(x)
โœ…log10(x)
โœ…abs(x)
โœ…min(x, y)
โœ…max(x, y)
โœ…sign(x)
โœ…rand(x)
โœ…floor(x)
โœ…ceil(x)
โœ…invsqrt(x)
\n

Time Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’time([v])
๐Ÿ•’time_precise([v])
\n

Midi Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’midisend(offset, msg1, msg2)
๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
๐Ÿ•’midisend(offset, msg1, msg2, msg3)
๐Ÿ•’midisend_buf(offset, buf, len)
๐Ÿ•’midisend_str(offset, string)
๐Ÿ•’midirecv(offset, msg1, msg23)
๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
๐Ÿ•’midirecv_buf(offset, buf, maxlen)
๐Ÿ•’midirecv_str(offset, string)
๐Ÿ•’midisyx(offset, msgptr, len)
\n

Memory/FFT/MDCT Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’mdct(start_index, size)
๐Ÿ•’imdct(start_index, size)
๐Ÿ•’fft(start_index, size)
๐Ÿ•’ifft(start_index, size)
๐Ÿ•’fft_real(start_index, size)
๐Ÿ•’ifft_real(start_index, size)
๐Ÿ•’fft_permute(index, size)
๐Ÿ•’fft_ipermute(index, size)
๐Ÿ•’convolve_c(dest, src, size)
๐Ÿ•’freembuf(top)
๐Ÿ•’memcpy(dest, source, length)
๐Ÿ•’memset(dest, value, length)
๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
๐Ÿ•’mem_insert_shuffle(buf, len, value)
๐Ÿ•’__memtop()
๐Ÿ•’stack_push(value)
๐Ÿ•’stack_pop(value)
๐Ÿ•’stack_peek(index)
๐Ÿ•’stack_exch(value)
๐Ÿ•’atomic_setifequal(dest, value, newvalue)
๐Ÿ•’atomic_exch(val1, val2)
๐Ÿ•’atomic_add(dest_val1, val2)
๐Ÿ•’atomic_set(dest_val1, val2)
๐Ÿ•’atomic_get(val)
\n

Host Interaction Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’sliderchange(mask | sliderX)
๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
๐Ÿ•’slider_show(mask or sliderX[, value])
๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
๐Ÿ•’get_host_numchan()
๐Ÿ•’set_host_numchan(numchan)
๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
๐Ÿ•’get_pinmapper_flags(no parameters)
๐Ÿ•’set_pinmapper_flags(flags)
๐Ÿ•’get_host_placement([chain_pos, flags])
\n

String Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’strlen(str)
๐Ÿ•’strcpy(str, srcstr)
๐Ÿ•’strcat(str, srcstr)
๐Ÿ•’strcmp(str, str2)
๐Ÿ•’stricmp(str, str2)
๐Ÿ•’strncmp(str, str2, maxlen)
๐Ÿ•’strnicmp(str, str2, maxlen)
๐Ÿ•’strncpy(str, srcstr, maxlen)
๐Ÿ•’strncat(str, srcstr, maxlen)
๐Ÿ•’strcpy_from(str, srcstr, offset)
๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
๐Ÿ•’str_getchar(str, offset[, type])
๐Ÿ•’str_setchar(str, offset, value[, type])
๐Ÿ•’strcpy_fromslider(str, slider)
๐Ÿ•’sprintf(str, format, ...)
๐Ÿ•’match(needle, haystack, ...)
๐Ÿ•’matchi(needle, haystack, ...)
\n

GFX Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
๐Ÿ•’gfx_lineto(x, y, aa)
๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
๐Ÿ•’gfx_rectto(x, y)
๐Ÿ•’gfx_rect(x, y, w, h)
๐Ÿ•’gfx_setpixel(r, g, b)
๐Ÿ•’gfx_getpixel(r, g, b)
๐Ÿ•’gfx_drawnumber(n, ndigits)
๐Ÿ•’gfx_drawchar($'c')
๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
๐Ÿ•’gfx_measurestr(str, w, h)
๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
๐Ÿ•’gfx_getfont()
๐Ÿ•’gfx_printf(str, ...)
๐Ÿ•’gfx_blurto(x,y)
๐Ÿ•’gfx_blit(source, scale, rotation)
๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
๐Ÿ•’gfx_getimgdim(image, w, h)
๐Ÿ•’gfx_setimgdim(image, w,h)
๐Ÿ•’gfx_loadimg(image, filename)
๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
๐Ÿ•’gfx_getchar([char, unicodechar])
๐Ÿ•’gfx_showmenu("str")
๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
\n

GFX Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
๐Ÿ•’gfx_w, gfx_h
๐Ÿ•’gfx_x, gfx_y
๐Ÿ•’gfx_mode
๐Ÿ•’gfx_clear
๐Ÿ•’gfx_dest
๐Ÿ•’gfx_texth
๐Ÿ•’gfx_ext_retina
๐Ÿ•’gfx_ext_flags
๐Ÿ•’mouse_x, mouse_y
๐Ÿ•’mouse_cap
๐Ÿ•’mouse_wheel, mouse_hwheel
\n

Special Vars and Extended Functionality

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’trigger
๐Ÿ•’ext_noinit
๐Ÿ•’ext_nodenorm
๐Ÿ•’ext_tail_size
๐Ÿ•’reg00-reg99
๐Ÿ•’_global.*
\n

Delay Compensation Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’pdc_delay
๐Ÿ•’pdc_bot_ch
๐Ÿ•’pdc_top_ch
๐Ÿ•’pdc_midi
\n", + "feature-comparison": "

Feature Comparison with JSFX

\n

JSFX Reference: https://www.reaper.fm/sdk/js/js.php

\n

Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

\n

โœ…: Implemented

\n

๐Ÿ•’: Should be implemented

\n

โŒ: Won't be implemented

\n

โ”: Unknown if feasible, useful, or working properly

\n

Description Lines and Utility Features

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…descImplemented as part of config()
๐Ÿ•’tags
๐Ÿ•’options
๐Ÿ•’JSFX comments
\n

Code Sections

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…@initonInit()
โœ…@slideronSlider()
๐Ÿ•’@block
โœ…@sampleonSample()
๐Ÿ•’@serialize
๐Ÿ•’@gfxDeclarative with React-like syntax?
\n

File Handling

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’import
๐Ÿ•’filename
โœ…file_open(index | slider)Slider variant implemented
โœ…file_close(handle)
๐Ÿ•’file_rewind(handle)
๐Ÿ•’file_var(handle, variable)
โœ…file_mem(handle, offset, length)
โœ…file_avail(handle)
โœ…file_riff(handle, nch, samplerate)
๐Ÿ•’file_text(handle, istext)
๐Ÿ•’file_string(handle,str)
\n

Routing and Input

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…in_pin, out_pinImplemented as part of config()
\n

UI

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Slider: Normalslider()
โœ…Slider: SelectselectBox()
โœ…Slider: File
๐Ÿ•’Hidden sliders
๐Ÿ•’Slider: shapes
โŒslider(index)Might not be necessary as every slider is bound to a variable
๐Ÿ•’slider_next_chg(sliderindex,nextval)
\n

Sample Access

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…spl0 - spl63
โœ…spl(index)
\n

Audio and Transport State Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…srate
โœ…num_ch
โœ…samplesblock
โœ…tempo
โœ…play_state
โœ…play_position
โœ…beat_position
โœ…ts_num
โœ…ts_denom
\n

Data Structures and Encodings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Local variableslet & const
โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
โ”Local address space 8m word restriction
๐Ÿ•’Global address space (gmem[])
๐Ÿ•’Named global address space
โ”Global named variables (_global. prefix)
๐Ÿ•’Hex numbers
๐Ÿ•’ASCII chars
๐Ÿ•’Bitmasks
โ”StringsAlready fully implemented?
\n

Control Structures

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…FunctionsUser definable functions are inlined in compiled code
โœ…Conditionals
โœ…Conditional Branching
๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
๐Ÿ•’while(actions..., condition)
๐Ÿ•’while(condition) (actions...)
\n

Operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…!value
โœ…-value
โœ…+value
โœ…base ^ exponentMath.pow(base, exponent) or **
โœ…numerator % denominator
โœ…value / divisor
โœ…value * another_value
โœ…value - another_value
โœ…value + another_value
โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 === value2
โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 !== value2
โœ…value1 < value2
โœ…value1 > value2
โœ…value1 <= value2
โœ…value1 >= value2
โœ…y || z
โœ…y && z
โœ…y ? z
โœ…y ? z : x
โœ…y = z
โœ…y *= z
โœ…y /= divisor
โœ…y %= divisor
๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
โœ…y += z
โœ…y -= z
\n

Bitwise operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’value << shift_amt
๐Ÿ•’value >> shift_amt
๐Ÿ•’a | b
๐Ÿ•’a & b
๐Ÿ•’a ~ b
๐Ÿ•’y | = z
๐Ÿ•’y &= z
๐Ÿ•’y ~= z
\n

Math Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…sin(angle)
โœ…cos(angle)
โœ…tan(angle)
โœ…asin(x)
โœ…acos(x)
โœ…atan(x)
โœ…atan2(x, y)
โœ…sqr(x)
โœ…sqrt(x)
โœ…pow(x, y)
โœ…exp(x)
โœ…log(x)
โœ…log10(x)
โœ…abs(x)
โœ…min(x, y)
โœ…max(x, y)
โœ…sign(x)
โœ…rand(x)
โœ…floor(x)
โœ…ceil(x)
โœ…invsqrt(x)
\n

Time Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’time([v])
๐Ÿ•’time_precise([v])
\n

Midi Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’midisend(offset, msg1, msg2)
๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
๐Ÿ•’midisend(offset, msg1, msg2, msg3)
๐Ÿ•’midisend_buf(offset, buf, len)
๐Ÿ•’midisend_str(offset, string)
๐Ÿ•’midirecv(offset, msg1, msg23)
๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
๐Ÿ•’midirecv_buf(offset, buf, maxlen)
๐Ÿ•’midirecv_str(offset, string)
๐Ÿ•’midisyx(offset, msgptr, len)
\n

Memory/FFT/MDCT Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’mdct(start_index, size)
๐Ÿ•’imdct(start_index, size)
๐Ÿ•’fft(start_index, size)
๐Ÿ•’ifft(start_index, size)
๐Ÿ•’fft_real(start_index, size)
๐Ÿ•’ifft_real(start_index, size)
๐Ÿ•’fft_permute(index, size)
๐Ÿ•’fft_ipermute(index, size)
๐Ÿ•’convolve_c(dest, src, size)
๐Ÿ•’freembuf(top)
๐Ÿ•’memcpy(dest, source, length)
๐Ÿ•’memset(dest, value, length)
๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
๐Ÿ•’mem_insert_shuffle(buf, len, value)
๐Ÿ•’__memtop()
๐Ÿ•’stack_push(value)
๐Ÿ•’stack_pop(value)
๐Ÿ•’stack_peek(index)
๐Ÿ•’stack_exch(value)
๐Ÿ•’atomic_setifequal(dest, value, newvalue)
๐Ÿ•’atomic_exch(val1, val2)
๐Ÿ•’atomic_add(dest_val1, val2)
๐Ÿ•’atomic_set(dest_val1, val2)
๐Ÿ•’atomic_get(val)
\n

Host Interaction Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’sliderchange(mask | sliderX)
๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
๐Ÿ•’slider_show(mask or sliderX[, value])
๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
๐Ÿ•’get_host_numchan()
๐Ÿ•’set_host_numchan(numchan)
๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
๐Ÿ•’get_pinmapper_flags(no parameters)
๐Ÿ•’set_pinmapper_flags(flags)
๐Ÿ•’get_host_placement([chain_pos, flags])
\n

String Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’strlen(str)
๐Ÿ•’strcpy(str, srcstr)
๐Ÿ•’strcat(str, srcstr)
๐Ÿ•’strcmp(str, str2)
๐Ÿ•’stricmp(str, str2)
๐Ÿ•’strncmp(str, str2, maxlen)
๐Ÿ•’strnicmp(str, str2, maxlen)
๐Ÿ•’strncpy(str, srcstr, maxlen)
๐Ÿ•’strncat(str, srcstr, maxlen)
๐Ÿ•’strcpy_from(str, srcstr, offset)
๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
๐Ÿ•’str_getchar(str, offset[, type])
๐Ÿ•’str_setchar(str, offset, value[, type])
๐Ÿ•’strcpy_fromslider(str, slider)
๐Ÿ•’sprintf(str, format, ...)
๐Ÿ•’match(needle, haystack, ...)
๐Ÿ•’matchi(needle, haystack, ...)
\n

GFX Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
๐Ÿ•’gfx_lineto(x, y, aa)
๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
๐Ÿ•’gfx_rectto(x, y)
๐Ÿ•’gfx_rect(x, y, w, h)
๐Ÿ•’gfx_setpixel(r, g, b)
๐Ÿ•’gfx_getpixel(r, g, b)
๐Ÿ•’gfx_drawnumber(n, ndigits)
๐Ÿ•’gfx_drawchar($'c')
๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
๐Ÿ•’gfx_measurestr(str, w, h)
๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
๐Ÿ•’gfx_getfont()
๐Ÿ•’gfx_printf(str, ...)
๐Ÿ•’gfx_blurto(x,y)
๐Ÿ•’gfx_blit(source, scale, rotation)
๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
๐Ÿ•’gfx_getimgdim(image, w, h)
๐Ÿ•’gfx_setimgdim(image, w,h)
๐Ÿ•’gfx_loadimg(image, filename)
๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
๐Ÿ•’gfx_getchar([char, unicodechar])
๐Ÿ•’gfx_showmenu("str")
๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
\n

GFX Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
๐Ÿ•’gfx_w, gfx_h
๐Ÿ•’gfx_x, gfx_y
๐Ÿ•’gfx_mode
๐Ÿ•’gfx_clear
๐Ÿ•’gfx_dest
๐Ÿ•’gfx_texth
๐Ÿ•’gfx_ext_retina
๐Ÿ•’gfx_ext_flags
๐Ÿ•’mouse_x, mouse_y
๐Ÿ•’mouse_cap
๐Ÿ•’mouse_wheel, mouse_hwheel
\n

Special Vars and Extended Functionality

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’trigger
๐Ÿ•’ext_noinit
๐Ÿ•’ext_nodenorm
โœ…ext_tail_size
๐Ÿ•’reg00-reg99
๐Ÿ•’_global.*
\n

Delay Compensation Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’pdc_delay
๐Ÿ•’pdc_bot_ch
๐Ÿ•’pdc_top_ch
๐Ÿ•’pdc_midi
\n", "getting-started": "

Getting Started: Your First JS2EEL Plugin

\n

Let's create our first JS2EEL plugin. We'll write it in JavaScript. JS2EEL will compile it into a REAPER JSFX plugin that you can use instantly.

\n

Our plugin will take an input audio signal and modify its volume. If you'd like to see the finished plugin, feel free to load the example plugin volume.js.

\n

Step 1: Create a New File

\n

Click on the "New File" button in the upper left half of the window.

\n

A modal will appear where you have to enter a filename for the JavaScript code and a description that will be used to reference the JSFX plugin in REAPER. Let's start with the same value for both: volume.

\n

As you create the new file, the JS code tab will be pre-populated with a minimal template. There will be a call to the config() function, where the name and the channel configuration of the plugin is defined:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

Take a look at the resulting JSFX code on the right. If you're familiar with JSFX, you'll meet some old friends here: desc: and the in_pin and out_pin configuration for your plugin's channel routing.

\n

Additionally, a template for the onSample() function call is provided. This is a JS2EEL library function that iterates through every sample of the audio block and allows you to modify it. This corresponds to the @sample part in JSFX.

\n

Step 2: Declare Volume Adjustment Holder Variables

\n

Next, we will create variables to hold the current volume level and the target volume level. Between config() and onSample(), add the following code:

\n
let volume = 0;\nlet target = 0;\n
\n

volume represents the volume in dB, and target represents the target volume in linear scale.

\n

Step 3: Create a Slider for User Input

\n

To allow the user to adjust the volume, we'll use a slider. We'll bind that slider to the volume variable created above. After the variable declarations, add the following code to your file:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

As you might know, slider numbering is important in EEL. It starts at 1, and so our slider takes 1 as the first argument.

\n

The second argument is the variable to bind to: volume.

\n

The third argument is the default value: 0.

\n

The fourth and fifth arguments are the minimum and maximum values: -150 and 18 dB, respectively.

\n

The sixth argument is the step size: 0.1.

\n

The last argument is the label for the slider which will be displayed in the GUI: Volume [dB].

\n

Step 4: Handle Slider Value Changes

\n

Now, we need to update the target variable whenever the user adjusts the slider. We'll use the onSlider() library function to handle slider value changes. This corresponds to EEL's @slider. After the slider definition via slider(), add the following code to your file:

\n
onSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n
\n

Here we assign a linear target level to the target variable, which will be used later to adjust our sample amplitude. If the slider is at its lower boundary, we set the target to 0 to mute the audio.

\n

Step 5: Process Audio Samples

\n

The final step is to process audio samples based on the calculated target volume. We'll use the onSample() function to perform audio processing. This corresponds to EEL's @sample. In the callback arrow function parameter of onSample(), add the following code:

\n
eachChannel((sample, _ch) => {\n    sample *= target;\n});\n
\n

eachChannel() is another JS2EEL library function that makes it easy to manipulate samples per channel. It can only be called in onSample. It has no equivalent in EEL. We just multiply every sample in each of the two channels by the target volume to adjust its amplitude respectively.

\n

Finished Plugin

\n

Here is the complete code:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n\nlet volume = 0;\nlet target = 0;\n\nslider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n\nonSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n\nonSample(() => {\n    eachChannel((sample, _ch) => {\n        sample *= target;\n    });\n});\n
\n

Conclusion

\n

That's it! You've successfully created a simple volume plugin using JS2EEL. If you're using the web app version of JS2EEL, copy the JSFX code into a new JSFX in REAPER to hear it in action. If you're using the desktop app and have configured the output path correctly, your volume JSFX should appear in the JS subdirectory of the FX selector.

\n

Feel free to take a look at the other examples. You'll be inspired to write your own JS2EEL plugin in no time!

\n", "limitations": "

Limitations

\n
    \n
  • Right now still not very expressive
\n

Accessing Arrays

\n
    \n
  • Iteration only possible with variable known at compile time
      \n
    • Alternative: loops (TBI), but slower
    \n
\n

TODO

\n", "shortcuts": "

Keyboard Shortcuts

\n

Editor

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Linux & WindowsMacDescription
Ctrl + SCmd + SSave
Ctrl + ICmd + IAutoformat
Ctrl + /Cmd + /Toggle line comment(s)
Alt + Up/DownAlt + Up/DownMove line(s) up/down
Ctrl + DCmd + DSelect next symbol occurence
Ctrl + FCmd + FOpen search panel
\n", From 1706077febc5035cccd96fc25863102e84918be6 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 15:36:44 +0200 Subject: [PATCH 07/42] WIP: onBlock & refactor --- compiler/js2eel.d.ts | 5 ++ .../src/js2eel/compiler/Js2EelCompiler.ts | 18 ------- .../callExpression/callExpression.ts | 7 ++- .../callExpression/js2EelLib/onBlock.ts | 54 +++++++++++++++++++ .../callExpression/js2EelLib/onSample.ts | 4 ++ .../functionExpression/functionExpression.ts | 19 ++++++- compiler/src/popupDocs.ts | 8 +++ docs/api-documentation.md | 6 +++ gui/src/docs/rendered-docs.json | 2 +- 9 files changed, 102 insertions(+), 21 deletions(-) create mode 100644 compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onBlock.ts diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index 99c9ce0..cef8990 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -111,6 +111,11 @@ declare function onInit(callback: () => void): void; */ declare function onSlider(callback: () => void): void; +/** + * Called for every audio block. + */ +declare function onBlock(callback: () => void): void; + /** * Called for every single sample. */ diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index b6ffbb2..21f109b 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -333,16 +333,6 @@ export class Js2EelCompiler { this.src.eelSrcFinal += '\n\n'; } - // @SAMPLE - - const sampleStageHeader = '@sample\n\n'; - const sampleText = this.getOnSampleSrc(); - if (sampleText) { - this.src.eelSrcFinal += sampleStageHeader; - this.src.eelSrcFinal += sampleText; - this.src.eelSrcFinal += '\n\n'; - } - this.src.eelSrcFinal += this.src.eelSrcTemp; for (const [_scopePath, scopedEnvironment] of Object.entries(this.pluginData.environment)) { @@ -444,14 +434,6 @@ export class Js2EelCompiler { return this.src.onSliderSrc; } - setOnSampleSrc(src: string): void { - this.src.onSampleSrc = src; - } - - getOnSampleSrc(): { [channel in number]: string } { - return this.src.onSampleSrc; - } - setDeclaredSymbol(symbolName: string, symbol: DeclaredSymbol): void { const currentScope = this.getCurrentScopePath(); diff --git a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts index 575dee7..56950ea 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts @@ -19,6 +19,7 @@ import { EEL_LIBRARY_FUNCTION_NAMES } from '../../constants.js'; import type { CallExpression } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { onBlock } from './js2EelLib/onBlock.js'; export const callExpression = ( callExpression: CallExpression, @@ -55,8 +56,12 @@ export const callExpression = ( instance.setOnSliderSrc(onSlider(callExpression, instance)); break; } + case 'onBlock': { + callExpressionSrc += onBlock(callExpression, instance); + break; + } case 'onSample': { - instance.setOnSampleSrc(onSample(callExpression, instance)); + callExpressionSrc += onSample(callExpression, instance); break; } case 'eachChannel': { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onBlock.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onBlock.ts new file mode 100644 index 0000000..8ccbea3 --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onBlock.ts @@ -0,0 +1,54 @@ +import { functionExpression } from '../../functionExpression/functionExpression.js'; +import { evaluateLibraryFunctionCall } from '../utils/evaluateLibraryFunctionCall.js'; + +import type { ArrowFunctionExpression, CallExpression, FunctionExpression } from 'estree'; +import type { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; + +export const onBlock = (callExpression: CallExpression, instance: Js2EelCompiler): string => { + let onBlockSrc = ''; + + if (instance.getCurrentScopePath() !== 'root') { + instance.error( + 'ScopeError', + 'onBlock() can only be called in the root scope', + callExpression + ); + + return ''; + } + + if (instance.getUsedStage('onBlock')) { + instance.error('StageError', 'onBlock() can only be called once', callExpression); + + return ''; + } + + const { args: _args, errors: onBlockErrors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'callback', + required: true, + allowedValues: [ + { nodeType: 'FunctionExpression' }, + { nodeType: 'ArrowFunctionExpression' } + ] + } + ], + instance + ); + + if (onBlockErrors) { + instance.multipleErrors(onBlockErrors); + + return ''; + } + + const callback = callExpression.arguments[0] as ArrowFunctionExpression | FunctionExpression; + + onBlockSrc += functionExpression(callback, [], 'onBlock', instance); + + instance.setUsedStage('onBlock'); + + return onBlockSrc; +}; diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSample.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSample.ts index da836aa..99c58ac 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSample.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSample.ts @@ -47,6 +47,10 @@ export const onSample = (callExpression: CallExpression, instance: Js2EelCompile const callback = callExpression.arguments[0] as ArrowFunctionExpression | FunctionExpression; onSampleSrc += functionExpression(callback, [], 'onSample', instance); + if (onSampleSrc) { + onSampleSrc = '@sample\n\n' + onSampleSrc; + onSampleSrc += '\n\n'; + } instance.setUsedStage('onSample'); diff --git a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts index d5ce83e..c22343e 100644 --- a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts +++ b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts @@ -177,7 +177,7 @@ ${prefixChannel(i)} = ${i}; case 'onInit': { switch (body.type) { case 'BlockStatement': { - functionExpressionSrc += blockStatement(body, 'onInit', instance); + blockStatement(body, 'onInit', instance); break; } default: { @@ -190,6 +190,23 @@ ${prefixChannel(i)} = ${i}; } break; } + case 'onBlock': { + switch (body.type) { + case 'BlockStatement': { + functionExpressionSrc += '@block\n\n'; + functionExpressionSrc += blockStatement(body, 'onBlock', instance); + break; + } + default: { + instance.error( + 'TypeError', + `onBlock() callback body type ${body.type} not allowed`, + body + ); + } + } + break; + } /* Should be caught further up */ /* c8 ignore start */ default: { diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index f4f88f4..28cd6e5 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -66,6 +66,14 @@ onSlider: { "signature": "onSlider(callback: () => void): void;", "autoCompleteTemplate": "onSlider(() => {\n ${}\n});" }, +onBlock: { + "name": "onBlock", + "type": "function", + "text": "Called for every audio block.", + "example": null, + "signature": "onBlock(callback: () => void): void;", + "autoCompleteTemplate": "onBlock(() => {\n ${}\n});" +}, onSample: { "name": "onSample", "type": "function", diff --git a/docs/api-documentation.md b/docs/api-documentation.md index 6f70517..6a77fb0 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -141,6 +141,12 @@ What happens when a slider is moved. ```typescript onSlider(callback: () => void): void; ``` +### onBlock() +Called for every audio block. + +```typescript +onBlock(callback: () => void): void; +``` ### onSample() Called for every single sample. diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index f4d63c6..5321379 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,5 +1,5 @@ { - "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

File Functions

\n

file_open()

\n

Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

\n

@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

\n
file_open(fileSelector: any): any;\n
\n

file_close()

\n

Closes a file opened with file_open().

\n
file_close(fileHandle: any): void;\n
\n

file_avail()

\n

Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

\n
file_avail(fileSelector: any): number;\n
\n

file_riff()

\n

If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

\n

REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

\n
file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
\n

file_mem()

\n

Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

\n
file_mem(fileHandle: any, offset: number, length: number): number;\n
\n

Special Functions & Variables

\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", + "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onBlock()

\n

Called for every audio block.

\n
onBlock(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

File Functions

\n

file_open()

\n

Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

\n

@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

\n
file_open(fileSelector: any): any;\n
\n

file_close()

\n

Closes a file opened with file_open().

\n
file_close(fileHandle: any): void;\n
\n

file_avail()

\n

Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

\n
file_avail(fileSelector: any): number;\n
\n

file_riff()

\n

If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

\n

REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

\n
file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
\n

file_mem()

\n

Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

\n
file_mem(fileHandle: any, offset: number, length: number): number;\n
\n

Special Functions & Variables

\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", "changelog": "

Changelog

\n
    \n
  • v0.9.1:
      \n
    • New example: 4-Band RBJ EQ
    \n
  • v0.7.0:
      \n
    • Allow simple plain objects
    • Allow function declaration in block statement
    • Allow member expression returns
    \n
  • v0.5.0:
      \n
    • MacOS App is signed now ๐Ÿ–‹๏ธ
    • More documentation
    \n
  • v0.3.0: Initial release
\n", "development": "

Development

\n

Requirements

\n
    \n
  • Node.js 18 and higher
  • Terminal emulator
      \n
    • Linux, MacOS: bash or zsh
    • Windows: git bash (comes with git)
    \n
  • Reaper DAW, obviously
\n

Setup

\n
    \n
  • Install dependencies for all packages:
      \n
    • cd scripts
    • ./install.sh
    \n
  • Open a different terminal session for each of the following steps
      \n
    • Go to compiler and do npm run dev
    • Go to gui and do npm run dev
    • Go to desktop and do npm run dev. Now, the electron build should open.
    \n
\n

Guidelines

\n
    \n
  • We aim for 100% test coverage for the compiler package
\n

Architecture

\n

TODO

\n

Recommended VSCode Extensions

\n

TODO

\n", "feature-comparison": "

Feature Comparison with JSFX

\n

JSFX Reference: https://www.reaper.fm/sdk/js/js.php

\n

Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

\n

โœ…: Implemented

\n

๐Ÿ•’: Should be implemented

\n

โŒ: Won't be implemented

\n

โ”: Unknown if feasible, useful, or working properly

\n

Description Lines and Utility Features

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…descImplemented as part of config()
๐Ÿ•’tags
๐Ÿ•’options
๐Ÿ•’JSFX comments
\n

Code Sections

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…@initonInit()
โœ…@slideronSlider()
๐Ÿ•’@block
โœ…@sampleonSample()
๐Ÿ•’@serialize
๐Ÿ•’@gfxDeclarative with React-like syntax?
\n

File Handling

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’import
๐Ÿ•’filename
โœ…file_open(index | slider)Slider variant implemented
โœ…file_close(handle)
๐Ÿ•’file_rewind(handle)
๐Ÿ•’file_var(handle, variable)
โœ…file_mem(handle, offset, length)
โœ…file_avail(handle)
โœ…file_riff(handle, nch, samplerate)
๐Ÿ•’file_text(handle, istext)
๐Ÿ•’file_string(handle,str)
\n

Routing and Input

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…in_pin, out_pinImplemented as part of config()
\n

UI

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Slider: Normalslider()
โœ…Slider: SelectselectBox()
โœ…Slider: File
๐Ÿ•’Hidden sliders
๐Ÿ•’Slider: shapes
โŒslider(index)Might not be necessary as every slider is bound to a variable
๐Ÿ•’slider_next_chg(sliderindex,nextval)
\n

Sample Access

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…spl0 - spl63
โœ…spl(index)
\n

Audio and Transport State Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…srate
โœ…num_ch
โœ…samplesblock
โœ…tempo
โœ…play_state
โœ…play_position
โœ…beat_position
โœ…ts_num
โœ…ts_denom
\n

Data Structures and Encodings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Local variableslet & const
โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
โ”Local address space 8m word restriction
๐Ÿ•’Global address space (gmem[])
๐Ÿ•’Named global address space
โ”Global named variables (_global. prefix)
๐Ÿ•’Hex numbers
๐Ÿ•’ASCII chars
๐Ÿ•’Bitmasks
โ”StringsAlready fully implemented?
\n

Control Structures

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…FunctionsUser definable functions are inlined in compiled code
โœ…Conditionals
โœ…Conditional Branching
๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
๐Ÿ•’while(actions..., condition)
๐Ÿ•’while(condition) (actions...)
\n

Operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…!value
โœ…-value
โœ…+value
โœ…base ^ exponentMath.pow(base, exponent) or **
โœ…numerator % denominator
โœ…value / divisor
โœ…value * another_value
โœ…value - another_value
โœ…value + another_value
โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 === value2
โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 !== value2
โœ…value1 < value2
โœ…value1 > value2
โœ…value1 <= value2
โœ…value1 >= value2
โœ…y || z
โœ…y && z
โœ…y ? z
โœ…y ? z : x
โœ…y = z
โœ…y *= z
โœ…y /= divisor
โœ…y %= divisor
๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
โœ…y += z
โœ…y -= z
\n

Bitwise operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’value << shift_amt
๐Ÿ•’value >> shift_amt
๐Ÿ•’a | b
๐Ÿ•’a & b
๐Ÿ•’a ~ b
๐Ÿ•’y | = z
๐Ÿ•’y &= z
๐Ÿ•’y ~= z
\n

Math Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…sin(angle)
โœ…cos(angle)
โœ…tan(angle)
โœ…asin(x)
โœ…acos(x)
โœ…atan(x)
โœ…atan2(x, y)
โœ…sqr(x)
โœ…sqrt(x)
โœ…pow(x, y)
โœ…exp(x)
โœ…log(x)
โœ…log10(x)
โœ…abs(x)
โœ…min(x, y)
โœ…max(x, y)
โœ…sign(x)
โœ…rand(x)
โœ…floor(x)
โœ…ceil(x)
โœ…invsqrt(x)
\n

Time Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’time([v])
๐Ÿ•’time_precise([v])
\n

Midi Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’midisend(offset, msg1, msg2)
๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
๐Ÿ•’midisend(offset, msg1, msg2, msg3)
๐Ÿ•’midisend_buf(offset, buf, len)
๐Ÿ•’midisend_str(offset, string)
๐Ÿ•’midirecv(offset, msg1, msg23)
๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
๐Ÿ•’midirecv_buf(offset, buf, maxlen)
๐Ÿ•’midirecv_str(offset, string)
๐Ÿ•’midisyx(offset, msgptr, len)
\n

Memory/FFT/MDCT Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’mdct(start_index, size)
๐Ÿ•’imdct(start_index, size)
๐Ÿ•’fft(start_index, size)
๐Ÿ•’ifft(start_index, size)
๐Ÿ•’fft_real(start_index, size)
๐Ÿ•’ifft_real(start_index, size)
๐Ÿ•’fft_permute(index, size)
๐Ÿ•’fft_ipermute(index, size)
๐Ÿ•’convolve_c(dest, src, size)
๐Ÿ•’freembuf(top)
๐Ÿ•’memcpy(dest, source, length)
๐Ÿ•’memset(dest, value, length)
๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
๐Ÿ•’mem_insert_shuffle(buf, len, value)
๐Ÿ•’__memtop()
๐Ÿ•’stack_push(value)
๐Ÿ•’stack_pop(value)
๐Ÿ•’stack_peek(index)
๐Ÿ•’stack_exch(value)
๐Ÿ•’atomic_setifequal(dest, value, newvalue)
๐Ÿ•’atomic_exch(val1, val2)
๐Ÿ•’atomic_add(dest_val1, val2)
๐Ÿ•’atomic_set(dest_val1, val2)
๐Ÿ•’atomic_get(val)
\n

Host Interaction Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’sliderchange(mask | sliderX)
๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
๐Ÿ•’slider_show(mask or sliderX[, value])
๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
๐Ÿ•’get_host_numchan()
๐Ÿ•’set_host_numchan(numchan)
๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
๐Ÿ•’get_pinmapper_flags(no parameters)
๐Ÿ•’set_pinmapper_flags(flags)
๐Ÿ•’get_host_placement([chain_pos, flags])
\n

String Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’strlen(str)
๐Ÿ•’strcpy(str, srcstr)
๐Ÿ•’strcat(str, srcstr)
๐Ÿ•’strcmp(str, str2)
๐Ÿ•’stricmp(str, str2)
๐Ÿ•’strncmp(str, str2, maxlen)
๐Ÿ•’strnicmp(str, str2, maxlen)
๐Ÿ•’strncpy(str, srcstr, maxlen)
๐Ÿ•’strncat(str, srcstr, maxlen)
๐Ÿ•’strcpy_from(str, srcstr, offset)
๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
๐Ÿ•’str_getchar(str, offset[, type])
๐Ÿ•’str_setchar(str, offset, value[, type])
๐Ÿ•’strcpy_fromslider(str, slider)
๐Ÿ•’sprintf(str, format, ...)
๐Ÿ•’match(needle, haystack, ...)
๐Ÿ•’matchi(needle, haystack, ...)
\n

GFX Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
๐Ÿ•’gfx_lineto(x, y, aa)
๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
๐Ÿ•’gfx_rectto(x, y)
๐Ÿ•’gfx_rect(x, y, w, h)
๐Ÿ•’gfx_setpixel(r, g, b)
๐Ÿ•’gfx_getpixel(r, g, b)
๐Ÿ•’gfx_drawnumber(n, ndigits)
๐Ÿ•’gfx_drawchar($'c')
๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
๐Ÿ•’gfx_measurestr(str, w, h)
๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
๐Ÿ•’gfx_getfont()
๐Ÿ•’gfx_printf(str, ...)
๐Ÿ•’gfx_blurto(x,y)
๐Ÿ•’gfx_blit(source, scale, rotation)
๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
๐Ÿ•’gfx_getimgdim(image, w, h)
๐Ÿ•’gfx_setimgdim(image, w,h)
๐Ÿ•’gfx_loadimg(image, filename)
๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
๐Ÿ•’gfx_getchar([char, unicodechar])
๐Ÿ•’gfx_showmenu("str")
๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
\n

GFX Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
๐Ÿ•’gfx_w, gfx_h
๐Ÿ•’gfx_x, gfx_y
๐Ÿ•’gfx_mode
๐Ÿ•’gfx_clear
๐Ÿ•’gfx_dest
๐Ÿ•’gfx_texth
๐Ÿ•’gfx_ext_retina
๐Ÿ•’gfx_ext_flags
๐Ÿ•’mouse_x, mouse_y
๐Ÿ•’mouse_cap
๐Ÿ•’mouse_wheel, mouse_hwheel
\n

Special Vars and Extended Functionality

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’trigger
๐Ÿ•’ext_noinit
๐Ÿ•’ext_nodenorm
โœ…ext_tail_size
๐Ÿ•’reg00-reg99
๐Ÿ•’_global.*
\n

Delay Compensation Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’pdc_delay
๐Ÿ•’pdc_bot_ch
๐Ÿ•’pdc_top_ch
๐Ÿ•’pdc_midi
\n", From 353ede44f23d135a830c4ba52bbde69f919003d6 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 15:47:01 +0200 Subject: [PATCH 08/42] Continue refactoring --- .../src/js2eel/compiler/Js2EelCompiler.ts | 34 ------------------- .../callExpression/callExpression.ts | 2 +- .../callExpression/js2EelLib/onSlider.ts | 12 +++++-- 3 files changed, 10 insertions(+), 38 deletions(-) diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index 21f109b..d317230 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -294,22 +294,6 @@ export class Js2EelCompiler { } } - // Arrays - - // for (const [_eelArrayName, eelArray] of Object.entries(this.pluginData.eelArrays)) { - // if (eelArray) { - // for (let i = 0; i < eelArray.dimensions; i++) { - // for (let j = 0; j < eelArray.size; j++) { - // initStageText += `${suffixEelArray( - // eelArray.name, - // i.toString(), - // j.toString() - // )};\n`; - // } - // } - // } - // } - if (initStageText) { initStageText = initStageHeader + initStageText; this.src.eelSrcFinal += initStageText; @@ -323,16 +307,6 @@ export class Js2EelCompiler { this.src.eelSrcFinal += '\n\n'; } - // @SLIDER - - const sliderStageHeader = '@slider\n\n'; - const sliderText = this.getOnSliderSrc(); - if (sliderText) { - this.src.eelSrcFinal += sliderStageHeader; - this.src.eelSrcFinal += sliderText; - this.src.eelSrcFinal += '\n\n'; - } - this.src.eelSrcFinal += this.src.eelSrcTemp; for (const [_scopePath, scopedEnvironment] of Object.entries(this.pluginData.environment)) { @@ -426,14 +400,6 @@ export class Js2EelCompiler { return this.src.onInitSrc; } - setOnSliderSrc(src: string): void { - this.src.onSliderSrc = src; - } - - getOnSliderSrc(): string { - return this.src.onSliderSrc; - } - setDeclaredSymbol(symbolName: string, symbol: DeclaredSymbol): void { const currentScope = this.getCurrentScopePath(); diff --git a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts index 56950ea..8192c94 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts @@ -53,7 +53,7 @@ export const callExpression = ( break; } case 'onSlider': { - instance.setOnSliderSrc(onSlider(callExpression, instance)); + callExpressionSrc += onSlider(callExpression, instance); break; } case 'onBlock': { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.ts index 02ca7fd..b7a75ff 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.ts @@ -43,11 +43,17 @@ export const onSlider = (callExpression: CallExpression, instance: Js2EelCompile return ''; } - let onSlidersSrc = ``; - const callback = callExpression.arguments[0] as FunctionExpression | ArrowFunctionExpression; - onSlidersSrc += functionExpression(callback, [], 'onSlider', instance); + const onSlidersCallbackSrc = functionExpression(callback, [], 'onSlider', instance); + + let onSlidersSrc = ``; + + if (onSlidersCallbackSrc) { + onSlidersSrc += '@slider\n\n'; + onSlidersSrc += onSlidersCallbackSrc; + onSlidersSrc += '\n\n'; + } instance.setUsedStage('onSlider'); From b8ae20ec44d0ff2969b4982002af3768adcbcdd5 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 20:15:17 +0200 Subject: [PATCH 09/42] Implement while statement --- .../blockStatement/blockStatement.ts | 9 ++- .../whileStatement/whileStatement.ts | 56 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts diff --git a/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.ts b/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.ts index 3d26172..e88264f 100644 --- a/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.ts +++ b/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.ts @@ -3,6 +3,7 @@ import { functionDeclaration } from '../functionDeclaration/functionDeclaration. import { expressionStatement } from '../expressionStatement/expressionStatement.js'; import { returnStatement } from '../returnStatement/returnStatement.js'; import { ifStatement } from '../ifStatement/ifStatement.js'; +import { whileStatement } from '../whileStatement/whileStatement.js'; import type { BlockStatement } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; @@ -35,6 +36,10 @@ export const blockStatement = ( blockSrc += variableDeclaration(blockBody, instance); break; } + case 'WhileStatement': { + blockSrc += whileStatement(blockBody, instance); + break; + } case 'ReturnStatement': { returnStatement(blockBody, parentScope, instance); break; @@ -48,13 +53,13 @@ export const blockStatement = ( instance.error( 'TypeError', `Body type ${blockBody.type} not allowed. Did you insert a superfluous semicolon?`, - blockStatement + blockBody ); } else { instance.error( 'TypeError', `Body type ${blockBody.type} not allowed`, - blockStatement + blockBody ); } } diff --git a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts new file mode 100644 index 0000000..f9d93e3 --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts @@ -0,0 +1,56 @@ +import { JSFX_DENY_COMPILATION } from '../../constants'; +import { binaryExpression } from '../binaryExpression/binaryExpression'; +import { blockStatement } from '../blockStatement/blockStatement'; + +import type { WhileStatement } from 'estree'; +import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; + +export const whileStatement = ( + whileStatement: WhileStatement, + instance: Js2EelCompiler +): string => { + let testSrc = ''; + let bodySrc = ''; + console.log('whileStatement', whileStatement); + + switch (whileStatement.test.type) { + case 'BinaryExpression': { + testSrc += binaryExpression(whileStatement.test, instance); + + break; + } + + default: { + instance.error( + 'TypeError', + `While statement test clause type not allowed: ${whileStatement.test.type}`, + whileStatement.test + ); + + return JSFX_DENY_COMPILATION; + } + } + + switch (whileStatement.body.type) { + case 'BlockStatement': { + bodySrc += blockStatement(whileStatement.body, null, instance); + break; + } + + default: { + instance.error( + 'TypeError', + `While statement body type not allowed: ${whileStatement.test.type}`, + whileStatement.test + ); + + return JSFX_DENY_COMPILATION; + } + } + + const whileStatementSrc = `while (${testSrc}) ( + ${bodySrc}); +`; + + return whileStatementSrc; +}; From 12aea95dac09f4db987fcfad5e50cb8e73098ee6 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 20:39:51 +0200 Subject: [PATCH 10/42] Allow update expressions --- .../expressionStatement.ts | 5 +++ .../updateExpression/updateExpression.ts | 36 +++++++++++++++++++ .../whileStatement/whileStatement.ts | 1 - 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.ts diff --git a/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.ts b/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.ts index 0d6f99d..7ee65c0 100644 --- a/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.ts +++ b/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.ts @@ -1,6 +1,7 @@ import { binaryExpression } from '../binaryExpression/binaryExpression.js'; import { assignmentExpression } from '../assignmentExpression/assignmentExpression.js'; import { callExpression } from '../callExpression/callExpression.js'; +import { updateExpression } from '../updateExpression/updateExpression.js'; import { addSemicolonIfNone } from '../../suffixersAndPrefixers/addSemicolonIfNone.js'; import type { ExpressionStatement, Node } from 'estree'; @@ -28,6 +29,10 @@ export const expressionStatement = ( expressionSrc += assignmentExpression(expressionStatement.expression, instance); break; } + case 'UpdateExpression': { + expressionSrc += updateExpression(expressionStatement.expression, instance); + break; + } default: { instance.error( 'TypeError', diff --git a/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.ts b/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.ts new file mode 100644 index 0000000..504c148 --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.ts @@ -0,0 +1,36 @@ +import { identifier } from '../identifier/identifier'; +import { JSFX_DENY_COMPILATION } from '../../constants'; + +import type { UpdateExpression } from 'estree'; +import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; + +export const updateExpression = ( + updateExpression: UpdateExpression, + instance: Js2EelCompiler +): string => { + let argumentSrc = ''; + + switch (updateExpression.argument.type) { + case 'Identifier': { + argumentSrc += identifier(updateExpression.argument, instance); + + break; + } + + default: { + instance.error( + 'TypeError', + `Update expression argument type not allowed: ${updateExpression.argument.type}`, + updateExpression.argument + ); + + return JSFX_DENY_COMPILATION; + } + } + + if (updateExpression.operator === '++') { + return `${argumentSrc} += 1`; + } else { + return `${argumentSrc} -= 1`; + } +}; diff --git a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts index f9d93e3..72747e8 100644 --- a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts +++ b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts @@ -11,7 +11,6 @@ export const whileStatement = ( ): string => { let testSrc = ''; let bodySrc = ''; - console.log('whileStatement', whileStatement); switch (whileStatement.test.type) { case 'BinaryExpression': { From 2fb82ef981c7b2d90fdbe20b775aa2864534a173 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 21:06:12 +0200 Subject: [PATCH 11/42] Offset buffers --- compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts | 6 +++--- compiler/src/js2eel/compiler/Js2EelCompiler.ts | 10 +++++++--- .../conditionalExpression.spec.ts | 8 ++++---- .../js2EelLib/eelBufferMemberCall.spec.ts | 8 ++++---- .../memberExpression/memberExpressionComputed.spec.ts | 8 ++++---- .../newExpression/js2EelLib/newEelBuffer.ts | 2 +- .../js2eel/test/examplePlugins/03_monoDelay.spec.ts | 4 ++-- .../js2eel/test/examplePlugins/04_stereoDelay.spec.ts | 4 ++-- compiler/src/js2eel/types.ts | 2 +- 9 files changed, 28 insertions(+), 24 deletions(-) diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts index c35800a..311490b 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts @@ -78,8 +78,8 @@ out_pin:In 1 @init -myBuf__B0 = 0 * 6; -myBuf__B1 = 1 * 6; +myBuf__B0 = 0 * 6 + 0; +myBuf__B1 = 1 * 6 + 0; myBuf__size = 6; @@ -88,7 +88,7 @@ myBuf__size = 6; compiler.setEelArray({ dimensions: 2, name: 'myArr', size: 3 }); expect(compiler.getErrors().length).to.equal(1); expect(compiler.getErrors()[0].type).to.equal('SymbolAlreadyDeclaredError'); - compiler.setEelBuffer({ dimensions: 2, name: 'myBuf', sizeSrc: '6' }); + compiler.setEelBuffer({ dimensions: 2, name: 'myBuf', size: 6 }); expect(compiler.getErrors().length).to.equal(2); expect(compiler.getErrors()[1].type).to.equal('SymbolAlreadyDeclaredError'); }); diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index d317230..b41f3af 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -282,15 +282,19 @@ export class Js2EelCompiler { // Buffers + let bufferOffset = 0; + for (const [_eelBufferName, eelBuffer] of Object.entries(this.pluginData.eelBuffers)) { if (eelBuffer) { for (let i = 0; i < eelBuffer.dimensions; i++) { initStageText += `${suffixEelBuffer(eelBuffer.name, i.toString())} = ${i} * ${ - eelBuffer.sizeSrc - };\n`; + eelBuffer.size + } + ${bufferOffset};\n`; } - initStageText += `${suffixBufferSize(eelBuffer.name)} = ${eelBuffer.sizeSrc};\n`; + bufferOffset += eelBuffer.size * eelBuffer.dimensions; + + initStageText += `${suffixBufferSize(eelBuffer.name)} = ${eelBuffer.size};\n`; } } diff --git a/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts b/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts index 420fcb6..5828da7 100644 --- a/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts @@ -287,8 +287,8 @@ out_pin:In 1 @init -myEelbuf__B0 = 0 * 2; -myEelbuf__B1 = 1 * 2; +myEelbuf__B0 = 0 * 2 + 0; +myEelbuf__B1 = 1 * 2 + 0; myEelbuf__size = 2; @@ -328,8 +328,8 @@ out_pin:In 1 @init -myEelbuf__B0 = 0 * 2; -myEelbuf__B1 = 1 * 2; +myEelbuf__B0 = 0 * 2 + 0; +myEelbuf__B1 = 1 * 2 + 0; myEelbuf__size = 2; diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts index 1aa37e4..1e510d3 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts @@ -29,8 +29,8 @@ out_pin:In 1 @init -myBuf__B0 = 0 * 3; -myBuf__B1 = 1 * 3; +myBuf__B0 = 0 * 3 + 0; +myBuf__B1 = 1 * 3 + 0; myBuf__size = 3; @@ -66,8 +66,8 @@ out_pin:In 1 @init -myBuf__B0 = 0 * 3; -myBuf__B1 = 1 * 3; +myBuf__B0 = 0 * 3 + 0; +myBuf__B1 = 1 * 3 + 0; myBuf__size = 3; diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts index f5f081f..da72a37 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts @@ -358,8 +358,8 @@ out_pin:In 1 @init -buf__B0 = 0 * 2; -buf__B1 = 1 * 2; +buf__B0 = 0 * 2 + 0; +buf__B1 = 1 * 2 + 0; buf__size = 2; @@ -449,8 +449,8 @@ out_pin:In 1 @init -buf__B0 = 0 * 2; -buf__B1 = 1 * 2; +buf__B0 = 0 * 2 + 0; +buf__B1 = 1 * 2 + 0; buf__size = 2; diff --git a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts index a910398..e12ce25 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts @@ -38,7 +38,7 @@ export const newEelBuffer = ( const newEelBuffer: EelBuffer = { name: symbolName, dimensions: args.dimensions.value, - sizeSrc: args.size.value + size: args.size.value }; instance.setEelBuffer(newEelBuffer); diff --git a/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts b/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts index 8c8d896..6c7956a 100644 --- a/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts @@ -24,8 +24,8 @@ out_pin:In 1 readIndex = 0; writeIndex = 0; bufferValue = 0; -buffer__B0 = 0 * 400000; -buffer__B1 = 1 * 400000; +buffer__B0 = 0 * 400000 + 0; +buffer__B1 = 1 * 400000 + 0; buffer__size = 400000; diff --git a/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts b/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts index 50eb72a..7b1c766 100644 --- a/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts @@ -32,8 +32,8 @@ numSamples__L = 0; numSamples__R = 0; bufferPos__L = 0; bufferPos__R = 0; -buffer__B0 = 0 * 400000; -buffer__B1 = 1 * 400000; +buffer__B0 = 0 * 400000 + 0; +buffer__B1 = 1 * 400000 + 0; buffer__size = 400000; diff --git a/compiler/src/js2eel/types.ts b/compiler/src/js2eel/types.ts index 8c53292..0cb7250 100644 --- a/compiler/src/js2eel/types.ts +++ b/compiler/src/js2eel/types.ts @@ -199,7 +199,7 @@ export type FileSelector = { export type EelBuffer = { name: string; dimensions: number; - sizeSrc: string; + size: number; }; export type EelArray = { From ff676da9ea006a118c144a4c5ef4d3250867932a Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 21:40:07 +0200 Subject: [PATCH 12/42] EelBuffer start pointer getter --- compiler/js2eel.d.ts | 1 + .../eelLib/eelLibraryFunctionCall.ts | 6 ++++-- .../js2EelLib/eelBufferMemberCall.ts | 5 +++++ .../memberExpressionComputed.ts | 17 ++++++++++++++++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index cef8990..92af7d7 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -141,6 +141,7 @@ declare class EelBuffer { dimensions(): number; size(): number; + start(): number; } /** diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index b59b4b1..257b42e 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -257,7 +257,8 @@ export const eelLibraryFunctionCall = ( validationSchema: Joi.number() }, { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' } + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } ] }, { @@ -269,7 +270,8 @@ export const eelLibraryFunctionCall = ( validationSchema: Joi.number() }, { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' } + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } ] } ], diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts index b0e21c8..b6f966a 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts @@ -1,4 +1,5 @@ import { suffixBufferSize } from '../../../suffixersAndPrefixers/suffixBufferSize.js'; +import { suffixEelBuffer } from '../../../suffixersAndPrefixers/suffixEelBuffer.js'; import type { Identifier, PrivateIdentifier } from 'estree'; import type { Js2EelCompiler } from '../../../index.js'; @@ -21,6 +22,10 @@ export const eelBufferMemberCall = ( bufferMemberCallSrc += eelBuffer.dimensions; break; } + case 'start': { + bufferMemberCallSrc += suffixEelBuffer(eelBuffer.name, '0'); + break; + } default: { instance.error( 'UnknownSymbolError', diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.ts index eddfd99..6fda19e 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.ts @@ -1,5 +1,6 @@ import { literal } from '../literal/literal.js'; import { identifier } from '../identifier/identifier.js'; +import { binaryExpression } from '../binaryExpression/binaryExpression.js'; import { memberExpression as compileMemberExpression } from './memberExpression.js'; import { inScope } from '../../environment/inScope.js'; @@ -7,7 +8,6 @@ import { suffixEelBuffer } from '../../suffixersAndPrefixers/suffixEelBuffer.js' import { suffixEelArray } from '../../suffixersAndPrefixers/suffixEelArray.js'; import { prefixParam } from '../../suffixersAndPrefixers/prefixParam.js'; import { suffixScopeByScopeSuffix } from '../../suffixersAndPrefixers/suffixScope.js'; -import { callExpression } from '../callExpression/callExpression.js'; import { stripChannelPrefix } from '../../suffixersAndPrefixers/prefixChannel.js'; import { JSFX_DENY_COMPILATION } from '../../constants.js'; @@ -222,6 +222,21 @@ export const memberExpressionComputed = ( break; } + case 'BinaryExpression': { + if (potentialBuffer) { + positionText += binaryExpression(property, instance); + } else { + instance.error( + 'TypeError', + `Property access on array is not allowed with this type: ${property.type}`, + memberExpression.property + ); + + positionText += JSFX_DENY_COMPILATION; + } + + break; + } default: { // property node is of wrong type, e.g. myArr[0][-3] instance.error( From 8994257c4e60e6e1c2c4fedcc4732e9d49ea7744 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 22:27:25 +0200 Subject: [PATCH 13/42] New eel lib functions: memset, fft, ifft, convolve_c --- compiler/js2eel.d.ts | 38 +++++ compiler/scripts/parseTypeDocs.mjs | 4 + .../eelLib/eelLibraryFunctionCall.ts | 146 +++++++++++++++++- compiler/src/popupDocs.ts | 34 +++- docs/api-documentation.md | 49 ++++++ gui/src/docs/rendered-docs.json | 2 +- 6 files changed, 270 insertions(+), 3 deletions(-) diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index 92af7d7..4fd0929 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -431,6 +431,13 @@ declare function ceil(x: number): number; */ declare function invsqrt(x: number): number; +// MEMORY FUNCTIONS + +/** + * + */ +declare function memset(): void; + // FILE FUNCTIONS /** @@ -462,6 +469,37 @@ declare function file_riff(fileHandle: any, numberOfCh: number, sampleRate: numb */ declare function file_mem(fileHandle: any, offset: number, length: number): number; +// FFT & MDCT FUNCTIONS + +/** + * Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used. + +Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items). + +Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly. + +The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2). + */ +declare function fft(startIndex: number, size: number): void; + +/** + * Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used. + +Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items). + +Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly. + +The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2). + */ +declare function ifft(startIndex: number, size: number): void; + +/** + * Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs). + +Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly. + */ +declare function convolve_c(destination: number, source: number, size: number): void; + // SPECIAL FUNCTIONS AND VARIABLES /** diff --git a/compiler/scripts/parseTypeDocs.mjs b/compiler/scripts/parseTypeDocs.mjs index d4314ee..5d1c3f2 100644 --- a/compiler/scripts/parseTypeDocs.mjs +++ b/compiler/scripts/parseTypeDocs.mjs @@ -245,6 +245,10 @@ parts.forEach((part) => { addMarkdownHeading('Special Functions & Variables'); } else if (part.name.startsWith('file_open')) { addMarkdownHeading('File Functions'); + } else if (part.name.startsWith('fft')) { + addMarkdownHeading('FFT & MDCT Functions'); + } else if (part.name.startsWith('memset')) { + addMarkdownHeading('Memory Functions'); } else if (part.name.match(/^spl\d/)) { if (parseInt(part.name.slice(3, 4)) === 0) { partHeading = `### spl<1-64> diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index 257b42e..ae9402f 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -143,6 +143,60 @@ export const eelLibraryFunctionCall = ( break; } + // Memory functions + case 'memset': { + const { errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'destination', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } + ] + }, + { + name: 'value', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } + ] + }, + { + name: 'length', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } + ] + } + ], + instance + ); + + evaluationErrors = errors; + + break; + + break; + } // File functions case 'file_open': { const { args, errors } = evaluateLibraryFunctionCall( @@ -221,7 +275,6 @@ export const eelLibraryFunctionCall = ( break; } - case 'file_avail': { const { errors } = evaluateLibraryFunctionCall( callExpression, @@ -282,6 +335,97 @@ export const eelLibraryFunctionCall = ( break; } + // FFT functions + case 'fft': + case 'ifft': { + const { errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'startIndex', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } + ] + }, + { + name: 'size', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } + ] + } + ], + instance + ); + + evaluationErrors = errors; + + break; + } + case 'convolve_c': { + const { errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'destination', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } + ] + }, + { + name: 'source', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } + ] + }, + { + name: 'size', + required: true, + allowedValues: [ + { + nodeType: 'Literal', + validationSchema: Joi.number() + }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' }, + { nodeType: 'CallExpression' } + ] + } + ], + instance + ); + + evaluationErrors = errors; + + break; + } default: { instance.error( diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index 28cd6e5..c6ce9cd 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -95,7 +95,7 @@ EelBuffer: { "type": "class", "text": "A fixed-size, multi-dimensional container for audio samples.\n\nAccess: `buf[dimension][position]`\n\nTranslates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.", "example": null, - "signature": "EelBuffer {\n constructor(dimensions: number, size: number);\n\n dimensions(): number;\n size(): number;\n}", + "signature": "EelBuffer {\n constructor(dimensions: number, size: number);\n\n dimensions(): number;\n size(): number;\n start(): number;\n}", "autoCompleteTemplate": "EelBuffer(${dimensions}, ${size});" }, EelArray: { @@ -866,6 +866,14 @@ invsqrt: { "signature": "invsqrt(x: number): number;", "autoCompleteTemplate": "invsqrt(${x});" }, +memset: { + "name": "memset", + "type": "function", + "text": "", + "example": null, + "signature": "memset(): void;", + "autoCompleteTemplate": "memset();" +}, file_open: { "name": "file_open", "type": "function", @@ -906,6 +914,30 @@ file_mem: { "signature": "file_mem(fileHandle: any, offset: number, length: number): number;", "autoCompleteTemplate": "file_mem(${offset}, ${length});" }, +fft: { + "name": "fft", + "type": "function", + "text": "Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.\n\nNote that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).\n\nNote that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.\n\nThe fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).", + "example": null, + "signature": "fft(startIndex: number, size: number): void;", + "autoCompleteTemplate": "fft(${startIndex}, ${size});" +}, +ifft: { + "name": "ifft", + "type": "function", + "text": "Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.\n\nNote that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).\n\nNote that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.\n\nThe fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).", + "example": null, + "signature": "ifft(startIndex: number, size: number): void;", + "autoCompleteTemplate": "ifft(${startIndex}, ${size});" +}, +convolve_c: { + "name": "convolve_c", + "type": "function", + "text": "Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).\n\nNote that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.", + "example": null, + "signature": "convolve_c(destination: number, source: number, size: number): void;", + "autoCompleteTemplate": "convolve_c(${destination}, ${source}, ${size});" +}, extTailSize: { "name": "extTailSize", "type": "function", diff --git a/docs/api-documentation.md b/docs/api-documentation.md index 6a77fb0..fd0b39b 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -7,7 +7,9 @@ - [Audio Constants](#audio-constants) - [Math Constants](#math-constants) - [Math Functions](#math-functions) +- [Memory Functions](#memory-functions) - [File Functions](#file-functions) +- [FFT & MDCT Functions](#fft-&-mdct-functions) - [Special Functions & Variables](#special-functions-&-variables) @@ -177,6 +179,7 @@ EelBuffer { dimensions(): number; size(): number; + start(): number; } ``` ### EelArray @@ -405,6 +408,16 @@ invsqrt(x: number): number; ``` +## Memory Functions + +### memset() + + +```typescript +memset(): void; +``` + + ## File Functions ### file_open() @@ -443,6 +456,42 @@ file_mem(fileHandle: any, offset: number, length: number): number; ``` +## FFT & MDCT Functions + +### fft() +Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used. + +Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items). + +Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly. + +The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2). + +```typescript +fft(startIndex: number, size: number): void; +``` +### ifft() +Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used. + +Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items). + +Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly. + +The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2). + +```typescript +ifft(startIndex: number, size: number): void; +``` +### convolve_c() +Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs). + +Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly. + +```typescript +convolve_c(destination: number, source: number, size: number): void; +``` + + ## Special Functions & Variables ### extTailSize() diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index 5321379..379b8e1 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,5 +1,5 @@ { - "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onBlock()

\n

Called for every audio block.

\n
onBlock(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

File Functions

\n

file_open()

\n

Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

\n

@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

\n
file_open(fileSelector: any): any;\n
\n

file_close()

\n

Closes a file opened with file_open().

\n
file_close(fileHandle: any): void;\n
\n

file_avail()

\n

Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

\n
file_avail(fileSelector: any): number;\n
\n

file_riff()

\n

If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

\n

REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

\n
file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
\n

file_mem()

\n

Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

\n
file_mem(fileHandle: any, offset: number, length: number): number;\n
\n

Special Functions & Variables

\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", + "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onBlock()

\n

Called for every audio block.

\n
onBlock(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

Memory Functions

\n

memset()

\n
memset(): void;\n
\n

File Functions

\n

file_open()

\n

Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

\n

@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

\n
file_open(fileSelector: any): any;\n
\n

file_close()

\n

Closes a file opened with file_open().

\n
file_close(fileHandle: any): void;\n
\n

file_avail()

\n

Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

\n
file_avail(fileSelector: any): number;\n
\n

file_riff()

\n

If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

\n

REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

\n
file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
\n

file_mem()

\n

Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

\n
file_mem(fileHandle: any, offset: number, length: number): number;\n
\n

FFT & MDCT Functions

\n

fft()

\n

Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

\n

Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

\n

Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

\n

The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

\n
fft(startIndex: number, size: number): void;\n
\n

ifft()

\n

Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

\n

Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

\n

Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

\n

The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

\n
ifft(startIndex: number, size: number): void;\n
\n

convolve_c()

\n

Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

\n

Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

\n
convolve_c(destination: number, source: number, size: number): void;\n
\n

Special Functions & Variables

\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", "changelog": "

Changelog

\n
    \n
  • v0.9.1:
      \n
    • New example: 4-Band RBJ EQ
    \n
  • v0.7.0:
      \n
    • Allow simple plain objects
    • Allow function declaration in block statement
    • Allow member expression returns
    \n
  • v0.5.0:
      \n
    • MacOS App is signed now ๐Ÿ–‹๏ธ
    • More documentation
    \n
  • v0.3.0: Initial release
\n", "development": "

Development

\n

Requirements

\n
    \n
  • Node.js 18 and higher
  • Terminal emulator
      \n
    • Linux, MacOS: bash or zsh
    • Windows: git bash (comes with git)
    \n
  • Reaper DAW, obviously
\n

Setup

\n
    \n
  • Install dependencies for all packages:
      \n
    • cd scripts
    • ./install.sh
    \n
  • Open a different terminal session for each of the following steps
      \n
    • Go to compiler and do npm run dev
    • Go to gui and do npm run dev
    • Go to desktop and do npm run dev. Now, the electron build should open.
    \n
\n

Guidelines

\n
    \n
  • We aim for 100% test coverage for the compiler package
\n

Architecture

\n

TODO

\n

Recommended VSCode Extensions

\n

TODO

\n", "feature-comparison": "

Feature Comparison with JSFX

\n

JSFX Reference: https://www.reaper.fm/sdk/js/js.php

\n

Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

\n

โœ…: Implemented

\n

๐Ÿ•’: Should be implemented

\n

โŒ: Won't be implemented

\n

โ”: Unknown if feasible, useful, or working properly

\n

Description Lines and Utility Features

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…descImplemented as part of config()
๐Ÿ•’tags
๐Ÿ•’options
๐Ÿ•’JSFX comments
\n

Code Sections

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…@initonInit()
โœ…@slideronSlider()
๐Ÿ•’@block
โœ…@sampleonSample()
๐Ÿ•’@serialize
๐Ÿ•’@gfxDeclarative with React-like syntax?
\n

File Handling

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’import
๐Ÿ•’filename
โœ…file_open(index | slider)Slider variant implemented
โœ…file_close(handle)
๐Ÿ•’file_rewind(handle)
๐Ÿ•’file_var(handle, variable)
โœ…file_mem(handle, offset, length)
โœ…file_avail(handle)
โœ…file_riff(handle, nch, samplerate)
๐Ÿ•’file_text(handle, istext)
๐Ÿ•’file_string(handle,str)
\n

Routing and Input

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…in_pin, out_pinImplemented as part of config()
\n

UI

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Slider: Normalslider()
โœ…Slider: SelectselectBox()
โœ…Slider: File
๐Ÿ•’Hidden sliders
๐Ÿ•’Slider: shapes
โŒslider(index)Might not be necessary as every slider is bound to a variable
๐Ÿ•’slider_next_chg(sliderindex,nextval)
\n

Sample Access

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…spl0 - spl63
โœ…spl(index)
\n

Audio and Transport State Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…srate
โœ…num_ch
โœ…samplesblock
โœ…tempo
โœ…play_state
โœ…play_position
โœ…beat_position
โœ…ts_num
โœ…ts_denom
\n

Data Structures and Encodings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Local variableslet & const
โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
โ”Local address space 8m word restriction
๐Ÿ•’Global address space (gmem[])
๐Ÿ•’Named global address space
โ”Global named variables (_global. prefix)
๐Ÿ•’Hex numbers
๐Ÿ•’ASCII chars
๐Ÿ•’Bitmasks
โ”StringsAlready fully implemented?
\n

Control Structures

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…FunctionsUser definable functions are inlined in compiled code
โœ…Conditionals
โœ…Conditional Branching
๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
๐Ÿ•’while(actions..., condition)
๐Ÿ•’while(condition) (actions...)
\n

Operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…!value
โœ…-value
โœ…+value
โœ…base ^ exponentMath.pow(base, exponent) or **
โœ…numerator % denominator
โœ…value / divisor
โœ…value * another_value
โœ…value - another_value
โœ…value + another_value
โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 === value2
โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 !== value2
โœ…value1 < value2
โœ…value1 > value2
โœ…value1 <= value2
โœ…value1 >= value2
โœ…y || z
โœ…y && z
โœ…y ? z
โœ…y ? z : x
โœ…y = z
โœ…y *= z
โœ…y /= divisor
โœ…y %= divisor
๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
โœ…y += z
โœ…y -= z
\n

Bitwise operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’value << shift_amt
๐Ÿ•’value >> shift_amt
๐Ÿ•’a | b
๐Ÿ•’a & b
๐Ÿ•’a ~ b
๐Ÿ•’y | = z
๐Ÿ•’y &= z
๐Ÿ•’y ~= z
\n

Math Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…sin(angle)
โœ…cos(angle)
โœ…tan(angle)
โœ…asin(x)
โœ…acos(x)
โœ…atan(x)
โœ…atan2(x, y)
โœ…sqr(x)
โœ…sqrt(x)
โœ…pow(x, y)
โœ…exp(x)
โœ…log(x)
โœ…log10(x)
โœ…abs(x)
โœ…min(x, y)
โœ…max(x, y)
โœ…sign(x)
โœ…rand(x)
โœ…floor(x)
โœ…ceil(x)
โœ…invsqrt(x)
\n

Time Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’time([v])
๐Ÿ•’time_precise([v])
\n

Midi Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’midisend(offset, msg1, msg2)
๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
๐Ÿ•’midisend(offset, msg1, msg2, msg3)
๐Ÿ•’midisend_buf(offset, buf, len)
๐Ÿ•’midisend_str(offset, string)
๐Ÿ•’midirecv(offset, msg1, msg23)
๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
๐Ÿ•’midirecv_buf(offset, buf, maxlen)
๐Ÿ•’midirecv_str(offset, string)
๐Ÿ•’midisyx(offset, msgptr, len)
\n

Memory/FFT/MDCT Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’mdct(start_index, size)
๐Ÿ•’imdct(start_index, size)
๐Ÿ•’fft(start_index, size)
๐Ÿ•’ifft(start_index, size)
๐Ÿ•’fft_real(start_index, size)
๐Ÿ•’ifft_real(start_index, size)
๐Ÿ•’fft_permute(index, size)
๐Ÿ•’fft_ipermute(index, size)
๐Ÿ•’convolve_c(dest, src, size)
๐Ÿ•’freembuf(top)
๐Ÿ•’memcpy(dest, source, length)
๐Ÿ•’memset(dest, value, length)
๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
๐Ÿ•’mem_insert_shuffle(buf, len, value)
๐Ÿ•’__memtop()
๐Ÿ•’stack_push(value)
๐Ÿ•’stack_pop(value)
๐Ÿ•’stack_peek(index)
๐Ÿ•’stack_exch(value)
๐Ÿ•’atomic_setifequal(dest, value, newvalue)
๐Ÿ•’atomic_exch(val1, val2)
๐Ÿ•’atomic_add(dest_val1, val2)
๐Ÿ•’atomic_set(dest_val1, val2)
๐Ÿ•’atomic_get(val)
\n

Host Interaction Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’sliderchange(mask | sliderX)
๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
๐Ÿ•’slider_show(mask or sliderX[, value])
๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
๐Ÿ•’get_host_numchan()
๐Ÿ•’set_host_numchan(numchan)
๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
๐Ÿ•’get_pinmapper_flags(no parameters)
๐Ÿ•’set_pinmapper_flags(flags)
๐Ÿ•’get_host_placement([chain_pos, flags])
\n

String Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’strlen(str)
๐Ÿ•’strcpy(str, srcstr)
๐Ÿ•’strcat(str, srcstr)
๐Ÿ•’strcmp(str, str2)
๐Ÿ•’stricmp(str, str2)
๐Ÿ•’strncmp(str, str2, maxlen)
๐Ÿ•’strnicmp(str, str2, maxlen)
๐Ÿ•’strncpy(str, srcstr, maxlen)
๐Ÿ•’strncat(str, srcstr, maxlen)
๐Ÿ•’strcpy_from(str, srcstr, offset)
๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
๐Ÿ•’str_getchar(str, offset[, type])
๐Ÿ•’str_setchar(str, offset, value[, type])
๐Ÿ•’strcpy_fromslider(str, slider)
๐Ÿ•’sprintf(str, format, ...)
๐Ÿ•’match(needle, haystack, ...)
๐Ÿ•’matchi(needle, haystack, ...)
\n

GFX Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
๐Ÿ•’gfx_lineto(x, y, aa)
๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
๐Ÿ•’gfx_rectto(x, y)
๐Ÿ•’gfx_rect(x, y, w, h)
๐Ÿ•’gfx_setpixel(r, g, b)
๐Ÿ•’gfx_getpixel(r, g, b)
๐Ÿ•’gfx_drawnumber(n, ndigits)
๐Ÿ•’gfx_drawchar($'c')
๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
๐Ÿ•’gfx_measurestr(str, w, h)
๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
๐Ÿ•’gfx_getfont()
๐Ÿ•’gfx_printf(str, ...)
๐Ÿ•’gfx_blurto(x,y)
๐Ÿ•’gfx_blit(source, scale, rotation)
๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
๐Ÿ•’gfx_getimgdim(image, w, h)
๐Ÿ•’gfx_setimgdim(image, w,h)
๐Ÿ•’gfx_loadimg(image, filename)
๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
๐Ÿ•’gfx_getchar([char, unicodechar])
๐Ÿ•’gfx_showmenu("str")
๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
\n

GFX Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
๐Ÿ•’gfx_w, gfx_h
๐Ÿ•’gfx_x, gfx_y
๐Ÿ•’gfx_mode
๐Ÿ•’gfx_clear
๐Ÿ•’gfx_dest
๐Ÿ•’gfx_texth
๐Ÿ•’gfx_ext_retina
๐Ÿ•’gfx_ext_flags
๐Ÿ•’mouse_x, mouse_y
๐Ÿ•’mouse_cap
๐Ÿ•’mouse_wheel, mouse_hwheel
\n

Special Vars and Extended Functionality

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’trigger
๐Ÿ•’ext_noinit
๐Ÿ•’ext_nodenorm
โœ…ext_tail_size
๐Ÿ•’reg00-reg99
๐Ÿ•’_global.*
\n

Delay Compensation Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’pdc_delay
๐Ÿ•’pdc_bot_ch
๐Ÿ•’pdc_top_ch
๐Ÿ•’pdc_midi
\n", From 80231515610cf4997a0a4bca9a9b6d09c409d665 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 22:48:19 +0200 Subject: [PATCH 14/42] We maybe don't need that detail for lib function params --- .../eelLib/eelLibraryFunctionCall.ts | 70 +-------- .../test/examplePlugins/08_cab_sim.spec.ts | 106 +++++++++++++- examples/08_cab_sim.js | 136 +++++++++++++++++- 3 files changed, 243 insertions(+), 69 deletions(-) diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index ae9402f..1864456 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -304,28 +304,12 @@ export const eelLibraryFunctionCall = ( { name: 'offset', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues }, { name: 'length', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues } ], instance @@ -344,28 +328,12 @@ export const eelLibraryFunctionCall = ( { name: 'startIndex', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues }, { name: 'size', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues } ], instance @@ -382,41 +350,17 @@ export const eelLibraryFunctionCall = ( { name: 'destination', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues }, { name: 'source', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues }, { name: 'size', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues } ], instance diff --git a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts index 2bdc366..f6e5756 100644 --- a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts @@ -9,7 +9,7 @@ const JS_CAB_SIM_SRC = fs.readFileSync(path.resolve('../examples/08_cab_sim.js') const EEL_CAB_SIM_SRC_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ -desc:sd_amp_sim +desc:cab_sim slider1:/amp_models:none:Impulse Response @@ -19,6 +19,99 @@ out_pin:In 0 out_pin:In 1 +@init + +fftSize = -1; +needsReFft = 1; +lastAmpModel = -1; +importedBufferChAmount = 0; +interpolationStepCount = 1; +convolutionSource__B0 = 0 * 131072 + 0; +convolutionSource__size = 131072; +importedBuffer__B0 = 0 * 131072 + 131072; +importedBuffer__size = 131072; +lastBlock__B0 = 0 * 65536 + 262144; +lastBlock__size = 65536; + + +@slider + +ampModel !== lastAmpModel ? ( +lastAmpModel = ampModel; +fileHandle__S5 = file_open(slider1); +importedBufferSampleRate__S5 = 0; +fileHandle__S5 > 0 ? ( +file_riff(fileHandle__S5, importedBufferChAmount, importedBufferSampleRate__S5); +importedBufferChAmount ? ( +importedBufferSize = file_avail(fileHandle__S5) / (importedBufferChAmount); +needsReFft = 1; +file_mem(fileHandle__S5, importedBuffer__B0, importedBufferSize * importedBufferChAmount); +); +file_close(fileHandle__S5); +); +); + + +@block + +needsReFft ? ( +importedBufferSize > 16384 ? ( +importedBufferSize = 16384; +); +fftSize = 32; +while (importedBufferSize > fftSize * 0.5) ( + fftSize += fftSize; +); +chunkSize = ((fftSize - importedBufferSize) - 1); +chunkSize2x = chunkSize * 2; +bufferPosition = 0; +currentBlock = 0; +inverseFftSize = 1 / (fftSize); +i__S10 = 0; +i2__S10 = 0; +interpolationCounter__S10 = 0; +while (interpolationCounter__S10 < min(fftSize, importedBufferSize)) ( + ipos__S13 = i__S10; +ipart__S13 = (i__S10 - ipos__S13); +convolutionSource__B0[i2__S10] = (importedBuffer__B0[ipos__S13 * importedBufferChAmount] * (1 - ipart__S13) + importedBuffer__B0[((ipos__S13 + 1) * importedBufferChAmount - 1)] * ipart__S13); +convolutionSource__B0[(i2__S10 + 1)] = (importedBuffer__B0[(ipos__S13 * importedBufferChAmount - 1)] * (1 - ipart__S13) + importedBuffer__B0[((ipos__S13 + 2) * importedBufferChAmount - 1)] * ipart__S13); +i__S10 += interpolationStepCount; +i2__S10 += 2; +interpolationCounter__S10 += 1; +); +zeroPadCounter__S10 = 0; +while (zeroPadCounter__S10 < (fftSize - importedBufferSize)) ( + convolutionSource__B0[i2__S10] = 0; +convolutionSource__B0[(i2__S10 + 1)] = 0; +i2__S10 += 2; +); +fft(convolutionSource__B0, fftSize); +i__S10 = 0; +normalizeCounter__S10 = 0; +while (normalizeCounter__S10 < fftSize * 2) ( + convolutionSource__B0[i__S10] *= inverseFftSize; +i__S10 += 1; +); +needsReFft = 0; +); +@sample + +importedBufferSize > 0 ? ( +bufferPosition >= chunkSize ? ( +t__S19 = ?รค__DENY_COMPILATION; +?รค__DENY_COMPILATION = currentBlock; +currentBlock = t__S19; +memset(currentBlock * chunkSize * 2, 0, (fftSize - chunkSize) * 2); +fft(currentBlock, fftSize); +convolve_c(currentBlock, convolutionSource__B0, fftSize); +ifft(currentBlock, fftSize); +bufferPosition = 0; +); +bufferPosition2x__S18 = bufferPosition * 2; +?รค__DENY_COMPILATION = spl0; +); + + `; const js2EelCompiler = new Js2EelCompiler(); @@ -27,9 +120,14 @@ describe('Example Test: Cab Sim', () => { it('Compiles cab sim', () => { const result = js2EelCompiler.compile(JS_CAB_SIM_SRC); - expect(result.success).to.equal(true); + expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal(testEelSrc(EEL_CAB_SIM_SRC_EXPECTED)); - expect(result.errors.length).to.equal(0); - expect(result.warnings.length).to.equal(0); + expect(result.errors.length).to.equal(3); + expect(result.errors.map((error) => error.type)).to.deep.equal([ + 'GenericError', + 'GenericError', + 'GenericError' + ]); + expect(result.warnings.length).to.equal(2); }); }); diff --git a/examples/08_cab_sim.js b/examples/08_cab_sim.js index 7f197cf..177af2c 100644 --- a/examples/08_cab_sim.js +++ b/examples/08_cab_sim.js @@ -1,7 +1,139 @@ -config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); +config({ description: 'cab_sim', inChannels: 2, outChannels: 2 }); + +let fftSize = -1; +let needsReFft = true; +let convolutionSource = new EelBuffer(1, 131072); // 128 * 1024; +let lastAmpModel = -1; +let importedBuffer = new EelBuffer(1, 131072); // 256 * 1024; +let importedBufferChAmount = 0; +let importedBufferSize; +let chunkSize; +let chunkSize2x; +let bufferPosition; +let currentBlock; +let lastBlock = new EelBuffer(1, 65536); // 64 * 1024 +let inverseFftSize; +const interpolationStepCount = 1.0; let ampModel; fileSelector(1, ampModel, 'amp_models', 'none', 'Impulse Response'); -onSample(() => {}); +onInit(() => { + extTailSize(32768); +}); + +onSlider(() => { + if (ampModel !== lastAmpModel) { + lastAmpModel = ampModel; + + const fileHandle = file_open(ampModel); + + let importedBufferSampleRate = 0; + + if (fileHandle > 0) { + file_riff(fileHandle, importedBufferChAmount, importedBufferSampleRate); + + if (importedBufferChAmount) { + importedBufferSize = file_avail(fileHandle) / importedBufferChAmount; + + needsReFft = true; + + // FIXME multi dim buffer? + file_mem( + fileHandle, + importedBuffer.start(), + importedBufferSize * importedBufferChAmount + ); + } + + file_close(fileHandle); + } + } +}); + +onBlock(() => { + if (needsReFft) { + if (importedBufferSize > 16384) { + importedBufferSize = 16384; + } + + fftSize = 32; + + while (importedBufferSize > fftSize * 0.5) { + fftSize += fftSize; + } + + chunkSize = fftSize - importedBufferSize - 1; + chunkSize2x = chunkSize * 2; + bufferPosition = 0; + currentBlock = 0; + + inverseFftSize = 1 / fftSize; + + let i = 0; + let i2 = 0; + + let interpolationCounter = 0; + + while (interpolationCounter < min(fftSize, importedBufferSize)) { + const ipos = i; + const ipart = i - ipos; + + convolutionSource[0][i2] = + importedBuffer[0][ipos * importedBufferChAmount] * (1 - ipart) + + importedBuffer[0][(ipos + 1) * importedBufferChAmount - 1] * ipart; + + convolutionSource[0][i2 + 1] = + importedBuffer[0][ipos * importedBufferChAmount - 1] * (1 - ipart) + + importedBuffer[0][(ipos + 2) * importedBufferChAmount - 1] * ipart; + + i += interpolationStepCount; + i2 += 2; + + interpolationCounter++; + } + + let zeroPadCounter = 0; + + while (zeroPadCounter < fftSize - importedBufferSize) { + convolutionSource[0][i2] = 0; + convolutionSource[0][i2 + 1] = 0; + i2 += 2; + } + + fft(convolutionSource.start(), fftSize); + + i = 0; + + let normalizeCounter = 0; + + while (normalizeCounter < fftSize * 2) { + convolutionSource[0][i] *= inverseFftSize; + i += 1; + } + + needsReFft = false; + } +}); + +onSample(() => { + if (importedBufferSize > 0) { + if (bufferPosition >= chunkSize) { + const t = lastBlock; + lastBlock = currentBlock; + currentBlock = t; + + memset(currentBlock * chunkSize * 2, 0, (fftSize - chunkSize) * 2); + + fft(currentBlock, fftSize); + convolve_c(currentBlock, convolutionSource.start(), fftSize); + ifft(currentBlock, fftSize); + + bufferPosition = 0; + } + + const bufferPosition2x = bufferPosition * 2; + lastBlock[bufferPosition2x] = spl0; + } +}); From aa812aa62f2e71b17ad3211da026b3371bb6be55 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 16 Oct 2023 22:49:18 +0200 Subject: [PATCH 15/42] Might not need those as well --- .../eelLib/eelLibraryFunctionCall.ts | 30 ++----------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index 1864456..fc1dfbf 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -151,41 +151,17 @@ export const eelLibraryFunctionCall = ( { name: 'destination', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues }, { name: 'value', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues }, { name: 'length', required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'CallExpression' } - ] + allowedValues: defaultNumericArgAllowedValues } ], instance From b880fd8415a9962ca55822a14fdcaabe0e9060d3 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Wed, 18 Oct 2023 20:42:38 +0200 Subject: [PATCH 16/42] Set buffer start in memory with EelBuffer setStart() --- compiler/js2eel.d.ts | 1 + .../js2eel/compiler/Js2EelCompiler.spec.ts | 2 +- .../src/js2eel/compiler/Js2EelCompiler.ts | 16 ++++++--- .../eelLib/eelLibraryFunctionCall.ts | 12 ++----- compiler/src/js2eel/generatorNodes/helpers.ts | 12 +++++++ .../js2EelLib/eelBufferMemberCall.ts | 33 ++++++++++++++++++- .../memberExpression/memberExpressionCall.ts | 1 + .../newExpression/js2EelLib/newEelBuffer.ts | 6 +++- compiler/src/js2eel/types.ts | 2 ++ compiler/src/popupDocs.ts | 2 +- docs/api-documentation.md | 1 + gui/src/docs/rendered-docs.json | 2 +- 12 files changed, 70 insertions(+), 20 deletions(-) create mode 100644 compiler/src/js2eel/generatorNodes/helpers.ts diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index 4fd0929..bd0fdb7 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -142,6 +142,7 @@ declare class EelBuffer { dimensions(): number; size(): number; start(): number; + setStart(newPosition: number): void; } /** diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts index 311490b..03045f8 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts @@ -88,7 +88,7 @@ myBuf__size = 6; compiler.setEelArray({ dimensions: 2, name: 'myArr', size: 3 }); expect(compiler.getErrors().length).to.equal(1); expect(compiler.getErrors()[0].type).to.equal('SymbolAlreadyDeclaredError'); - compiler.setEelBuffer({ dimensions: 2, name: 'myBuf', size: 6 }); + compiler.setEelBuffer({ dimensions: 2, offset: 0, name: 'myBuf', size: 6 }); expect(compiler.getErrors().length).to.equal(2); expect(compiler.getErrors()[1].type).to.equal('SymbolAlreadyDeclaredError'); }); diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index b41f3af..568c5d4 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -75,6 +75,7 @@ export class Js2EelCompiler { selectBoxes: {}, fileSelectors: {}, eelBuffers: {}, + eelBufferOffset: 0, eelArrays: {}, environment: { root: { @@ -154,6 +155,7 @@ export class Js2EelCompiler { selectBoxes: {}, fileSelectors: {}, eelBuffers: {}, + eelBufferOffset: 0, eelArrays: {}, environment: { root: { @@ -282,18 +284,14 @@ export class Js2EelCompiler { // Buffers - let bufferOffset = 0; - for (const [_eelBufferName, eelBuffer] of Object.entries(this.pluginData.eelBuffers)) { if (eelBuffer) { for (let i = 0; i < eelBuffer.dimensions; i++) { initStageText += `${suffixEelBuffer(eelBuffer.name, i.toString())} = ${i} * ${ eelBuffer.size - } + ${bufferOffset};\n`; + } + ${eelBuffer.offset};\n`; } - bufferOffset += eelBuffer.size * eelBuffer.dimensions; - initStageText += `${suffixBufferSize(eelBuffer.name)} = ${eelBuffer.size};\n`; } } @@ -468,6 +466,14 @@ export class Js2EelCompiler { return this.pluginData.eelBuffers[eelBufferName]; } + addEelBufferOffset(offset: number): void { + this.pluginData.eelBufferOffset += offset; + } + + getEelBufferOffset(): number { + return this.pluginData.eelBufferOffset; + } + setEelBuffer(eelBuffer: EelBuffer): void { if (!this.pluginData.eelBuffers[eelBuffer.name]) { this.pluginData.eelBuffers[eelBuffer.name] = eelBuffer; diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index fc1dfbf..77e3a71 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -7,20 +7,12 @@ import { binaryExpression } from '../../binaryExpression/binaryExpression.js'; import { callExpression as compileCallExpression } from '../callExpression.js'; import { memberExpression } from '../../memberExpression/memberExpression.js'; import { evaluateLibraryFunctionCall } from '../utils/evaluateLibraryFunctionCall.js'; +import { defaultNumericArgAllowedValues } from '../../helpers.js'; import { JSFX_DENY_COMPILATION } from '../../../constants.js'; import type { CallExpression } from 'estree'; import type { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; -import type { EelGeneratorError, FunctionCallAllowedValues } from '../../../types.js'; - -const defaultNumericArgAllowedValues: FunctionCallAllowedValues = [ - { nodeType: 'Literal', validationSchema: Joi.number() }, - { nodeType: 'Identifier' }, - { nodeType: 'BinaryExpression' }, - { nodeType: 'UnaryExpression', validationSchema: Joi.number() }, - { nodeType: 'CallExpression' }, - { nodeType: 'MemberExpression' } -]; +import type { EelGeneratorError } from '../../../types.js'; export const eelLibraryFunctionCall = ( callExpression: CallExpression, diff --git a/compiler/src/js2eel/generatorNodes/helpers.ts b/compiler/src/js2eel/generatorNodes/helpers.ts new file mode 100644 index 0000000..7bcbce0 --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/helpers.ts @@ -0,0 +1,12 @@ +import Joi from 'joi'; + +import type { FunctionCallAllowedValues } from '../types'; + +export const defaultNumericArgAllowedValues: FunctionCallAllowedValues = [ + { nodeType: 'Literal', validationSchema: Joi.number() }, + { nodeType: 'Identifier' }, + { nodeType: 'BinaryExpression' }, + { nodeType: 'UnaryExpression', validationSchema: Joi.number() }, + { nodeType: 'CallExpression' }, + { nodeType: 'MemberExpression' } +]; diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts index b6f966a..f65b817 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts @@ -1,7 +1,10 @@ import { suffixBufferSize } from '../../../suffixersAndPrefixers/suffixBufferSize.js'; import { suffixEelBuffer } from '../../../suffixersAndPrefixers/suffixEelBuffer.js'; +import { evaluateLibraryFunctionCall } from '../../callExpression/utils/evaluateLibraryFunctionCall.js'; +import { defaultNumericArgAllowedValues } from '../../helpers.js'; +import { JSFX_DENY_COMPILATION } from '../../../constants.js'; -import type { Identifier, PrivateIdentifier } from 'estree'; +import type { CallExpression, Identifier, PrivateIdentifier } from 'estree'; import type { Js2EelCompiler } from '../../../index.js'; import type { EelBuffer } from '../../../types.js'; @@ -9,6 +12,7 @@ export const eelBufferMemberCall = ( eelBuffer: EelBuffer, calleeObject: Identifier, calleeProperty: Identifier | PrivateIdentifier, + callExpression: CallExpression, instance: Js2EelCompiler ): string => { let bufferMemberCallSrc = ''; @@ -26,6 +30,33 @@ export const eelBufferMemberCall = ( bufferMemberCallSrc += suffixEelBuffer(eelBuffer.name, '0'); break; } + case 'setStart': { + const { args, errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'position', + required: true, + allowedValues: defaultNumericArgAllowedValues + } + ], + instance + ); + + if (errors) { + instance.multipleErrors(errors); + + return JSFX_DENY_COMPILATION; + } + + for (let i = 0; i < eelBuffer.dimensions; i++) { + bufferMemberCallSrc += `${suffixEelBuffer(eelBuffer.name, i.toString())} = ${i} * ${ + eelBuffer.size + } + ${args.position.value};\n`; + } + + break; + } default: { instance.error( 'UnknownSymbolError', diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.ts index 3a033bd..40cc787 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.ts @@ -77,6 +77,7 @@ export const memberExpressionCall = ( eelBuffer, calleeObject, calleeProperty, + parentCallExpression, instance ); } else if (eelArray) { diff --git a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts index e12ce25..62cd927 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts @@ -16,7 +16,9 @@ export const newEelBuffer = ( { name: 'dimensions', required: true, - allowedValues: [{ nodeType: 'Literal', validationSchema: Joi.number().min(1).max(64) }] + allowedValues: [ + { nodeType: 'Literal', validationSchema: Joi.number().min(1).max(64) } + ] }, { name: 'size', @@ -37,10 +39,12 @@ export const newEelBuffer = ( } else { const newEelBuffer: EelBuffer = { name: symbolName, + offset: instance.getEelBufferOffset(), dimensions: args.dimensions.value, size: args.size.value }; instance.setEelBuffer(newEelBuffer); + instance.addEelBufferOffset(args.dimensions.value * args.size.value); } }; diff --git a/compiler/src/js2eel/types.ts b/compiler/src/js2eel/types.ts index 0cb7250..351cfc4 100644 --- a/compiler/src/js2eel/types.ts +++ b/compiler/src/js2eel/types.ts @@ -77,6 +77,7 @@ export type PluginData = { selectBoxes: { [name in string]: SelectBox }; fileSelectors: { [id in string]: FileSelector }; eelBuffers: { [name in string]?: EelBuffer }; + eelBufferOffset: number; eelArrays: { [name in string]?: EelArray }; environment: Environment; initVariableNames: string[]; @@ -198,6 +199,7 @@ export type FileSelector = { export type EelBuffer = { name: string; + offset: number; dimensions: number; size: number; }; diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index c6ce9cd..e69d897 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -95,7 +95,7 @@ EelBuffer: { "type": "class", "text": "A fixed-size, multi-dimensional container for audio samples.\n\nAccess: `buf[dimension][position]`\n\nTranslates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.", "example": null, - "signature": "EelBuffer {\n constructor(dimensions: number, size: number);\n\n dimensions(): number;\n size(): number;\n start(): number;\n}", + "signature": "EelBuffer {\n constructor(dimensions: number, size: number);\n\n dimensions(): number;\n size(): number;\n start(): number;\n setStart(newPosition: number): void;\n}", "autoCompleteTemplate": "EelBuffer(${dimensions}, ${size});" }, EelArray: { diff --git a/docs/api-documentation.md b/docs/api-documentation.md index fd0b39b..b821c77 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -180,6 +180,7 @@ EelBuffer { dimensions(): number; size(): number; start(): number; + setStart(newPosition: number): void; } ``` ### EelArray diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index 379b8e1..8aeb03c 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,5 +1,5 @@ { - "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onBlock()

\n

Called for every audio block.

\n
onBlock(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

Memory Functions

\n

memset()

\n
memset(): void;\n
\n

File Functions

\n

file_open()

\n

Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

\n

@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

\n
file_open(fileSelector: any): any;\n
\n

file_close()

\n

Closes a file opened with file_open().

\n
file_close(fileHandle: any): void;\n
\n

file_avail()

\n

Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

\n
file_avail(fileSelector: any): number;\n
\n

file_riff()

\n

If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

\n

REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

\n
file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
\n

file_mem()

\n

Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

\n
file_mem(fileHandle: any, offset: number, length: number): number;\n
\n

FFT & MDCT Functions

\n

fft()

\n

Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

\n

Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

\n

Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

\n

The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

\n
fft(startIndex: number, size: number): void;\n
\n

ifft()

\n

Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

\n

Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

\n

Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

\n

The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

\n
ifft(startIndex: number, size: number): void;\n
\n

convolve_c()

\n

Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

\n

Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

\n
convolve_c(destination: number, source: number, size: number): void;\n
\n

Special Functions & Variables

\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", + "api-documentation": "

API Documentation

\n
    \n
\n

Configuration

\n

config()

\n

Configures the plugin.

\n
config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
\n

Example:

\n
config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
\n

slider()

\n

Registers a slider and its bound variable to be displayed in the plugin.

\n
slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
\n

Example:

\n
slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
\n

selectBox()

\n

Registers a select box and its bound variable to be displayed in the plugin.

\n
selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
\n

Example:

\n
selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
\n

fileSelector()

\n

Registers a file selector to be displayed in the plugin.

\n

The path is relative to /data.

\n
fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
\n

Example:

\n
fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
\n

Debugging

\n

console

\n

JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

\n
console: {\n    log: (someVar: number | string) => void;\n};\n
\n

Example:

\n
let myVal = 3;\nconsole.log(myVal);\n
\n

JSFX Computation Stages

\n

These functions correspond to JSFX's @sample etc.

\n

onInit()

\n

Init variables and functions here.

\n
onInit(callback: () => void): void;\n
\n

onSlider()

\n

What happens when a slider is moved.

\n
onSlider(callback: () => void): void;\n
\n

onBlock()

\n

Called for every audio block.

\n
onBlock(callback: () => void): void;\n
\n

onSample()

\n

Called for every single sample.

\n
onSample(callback: () => void): void;\n
\n

eachChannel()

\n

Iterates over each channel and provides the current sample for manipulation.

\n
eachChannel(callback: (sample: number, channel: number) => void): void;\n
\n

Data Structures

\n

EelBuffer

\n

A fixed-size, multi-dimensional container for audio samples.

\n

Access: buf[dimension][position]

\n

Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

\n
EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n    setStart(newPosition: number): void;\n}\n
\n

EelArray

\n

A fixed-size, multi-dimensional container for numeric data.

\n

Access: arr[dimension][position]

\n

Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

\n
EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
\n

Audio Constants

\n

srate

\n

The sample rate of your project

\n
srate: number;\n
\n

num_ch

\n

Number of channels available

\n
num_ch: number;\n
\n

samplesblock

\n

How many samples will come before the next onBlock() call

\n
samplesblock: number;\n
\n

tempo

\n

The tempo of your project

\n
tempo: number;\n
\n

play_state

\n

The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

\n
play_state: number;\n
\n

play_position

\n

The current playback position in REAPER (as of last @block), in seconds

\n
play_position: number;\n
\n

beat_position

\n

Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

\n
beat_position: number;\n
\n

ts_num

\n

Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

\n
ts_num: number;\n
\n

ts_denom

\n

Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

\n
ts_denom: number;\n
\n

spl<1-64>

\n

Channel 1 (L) sample variable

\n
spl0: number;\n
\n

Math Constants

\n

$pi

\n

Pi

\n
$pi: number;\n
\n

Math Functions

\n

These functions correspond exactly to their equivalents in JSFX/EEL2.

\n

sin()

\n

Returns the Sine of the angle specified (specified in radians).

\n
sin(angle: number): number;\n
\n

cos()

\n

Returns the Cosine of the angle specified (specified in radians).

\n
cos(angle: number): number;\n
\n

tan()

\n

Returns the Tangent of the angle specified (specified in radians).

\n
tan(angle: number): number;\n
\n

asin()

\n

Returns the Arc Sine of the value specified (return value is in radians).

\n
asin(x: number): number;\n
\n

acos()

\n

Returns the Arc Cosine of the value specified (return value is in radians).

\n
acos(x: number): number;\n
\n

atan()

\n

Returns the Arc Tangent of the value specified (return value is in radians).

\n
atan(x: number): number;\n
\n

atan2()

\n

Returns the Arc Tangent of x divided by y (return value is in radians).

\n
atan2(x: number, y: number): number;\n
\n

sqr()

\n

Returns the square of the parameter (similar to x*x, though only evaluating x once).

\n
sqr(x: number): number;\n
\n

sqrt()

\n

Returns the square root of the parameter.

\n
sqrt(x: number): number;\n
\n

pow()

\n

Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

\n
pow(x: number, y: number): number;\n
\n

exp()

\n

Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

\n
exp(x: number): number;\n
\n

log()

\n

Returns the natural logarithm (base e) of the parameter.

\n
log(x: number): number;\n
\n

log10()

\n

Returns the logarithm (base 10) of the parameter.

\n
log10(x: number): number;\n
\n

abs()

\n

Returns the absolute value of the parameter.

\n
abs(x: number): number;\n
\n

min()

\n

Returns the minimum value of the two parameters.

\n
min(x: number, y: number): number;\n
\n

max()

\n

Returns the maximum value of the two parameters.

\n
max(x: number, y: number): number;\n
\n

sign()

\n

Returns the sign of the parameter (-1, 0, or 1).

\n
sign(x: number): number;\n
\n

rand()

\n

Returns a pseudo-random number between 0 and the parameter.

\n
rand(x: number): number;\n
\n

floor()

\n

Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

\n
floor(x: number): number;\n
\n

ceil()

\n

Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

\n
ceil(x: number): number;\n
\n

invsqrt()

\n

Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

\n
invsqrt(x: number): number;\n
\n

Memory Functions

\n

memset()

\n
memset(): void;\n
\n

File Functions

\n

file_open()

\n

Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

\n

@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

\n
file_open(fileSelector: any): any;\n
\n

file_close()

\n

Closes a file opened with file_open().

\n
file_close(fileHandle: any): void;\n
\n

file_avail()

\n

Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

\n
file_avail(fileSelector: any): number;\n
\n

file_riff()

\n

If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

\n

REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

\n
file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
\n

file_mem()

\n

Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

\n
file_mem(fileHandle: any, offset: number, length: number): number;\n
\n

FFT & MDCT Functions

\n

fft()

\n

Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

\n

Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

\n

Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

\n

The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

\n
fft(startIndex: number, size: number): void;\n
\n

ifft()

\n

Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

\n

Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

\n

Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

\n

The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

\n
ifft(startIndex: number, size: number): void;\n
\n

convolve_c()

\n

Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

\n

Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

\n
convolve_c(destination: number, source: number, size: number): void;\n
\n

Special Functions & Variables

\n

extTailSize()

\n

Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

\n
extTailSize(samples: number): void;\n
\n", "changelog": "

Changelog

\n
    \n
  • v0.9.1:
      \n
    • New example: 4-Band RBJ EQ
    \n
  • v0.7.0:
      \n
    • Allow simple plain objects
    • Allow function declaration in block statement
    • Allow member expression returns
    \n
  • v0.5.0:
      \n
    • MacOS App is signed now ๐Ÿ–‹๏ธ
    • More documentation
    \n
  • v0.3.0: Initial release
\n", "development": "

Development

\n

Requirements

\n
    \n
  • Node.js 18 and higher
  • Terminal emulator
      \n
    • Linux, MacOS: bash or zsh
    • Windows: git bash (comes with git)
    \n
  • Reaper DAW, obviously
\n

Setup

\n
    \n
  • Install dependencies for all packages:
      \n
    • cd scripts
    • ./install.sh
    \n
  • Open a different terminal session for each of the following steps
      \n
    • Go to compiler and do npm run dev
    • Go to gui and do npm run dev
    • Go to desktop and do npm run dev. Now, the electron build should open.
    \n
\n

Guidelines

\n
    \n
  • We aim for 100% test coverage for the compiler package
\n

Architecture

\n

TODO

\n

Recommended VSCode Extensions

\n

TODO

\n", "feature-comparison": "

Feature Comparison with JSFX

\n

JSFX Reference: https://www.reaper.fm/sdk/js/js.php

\n

Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

\n

โœ…: Implemented

\n

๐Ÿ•’: Should be implemented

\n

โŒ: Won't be implemented

\n

โ”: Unknown if feasible, useful, or working properly

\n

Description Lines and Utility Features

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…descImplemented as part of config()
๐Ÿ•’tags
๐Ÿ•’options
๐Ÿ•’JSFX comments
\n

Code Sections

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…@initonInit()
โœ…@slideronSlider()
๐Ÿ•’@block
โœ…@sampleonSample()
๐Ÿ•’@serialize
๐Ÿ•’@gfxDeclarative with React-like syntax?
\n

File Handling

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’import
๐Ÿ•’filename
โœ…file_open(index | slider)Slider variant implemented
โœ…file_close(handle)
๐Ÿ•’file_rewind(handle)
๐Ÿ•’file_var(handle, variable)
โœ…file_mem(handle, offset, length)
โœ…file_avail(handle)
โœ…file_riff(handle, nch, samplerate)
๐Ÿ•’file_text(handle, istext)
๐Ÿ•’file_string(handle,str)
\n

Routing and Input

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…in_pin, out_pinImplemented as part of config()
\n

UI

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Slider: Normalslider()
โœ…Slider: SelectselectBox()
โœ…Slider: File
๐Ÿ•’Hidden sliders
๐Ÿ•’Slider: shapes
โŒslider(index)Might not be necessary as every slider is bound to a variable
๐Ÿ•’slider_next_chg(sliderindex,nextval)
\n

Sample Access

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…spl0 - spl63
โœ…spl(index)
\n

Audio and Transport State Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…srate
โœ…num_ch
โœ…samplesblock
โœ…tempo
โœ…play_state
โœ…play_position
โœ…beat_position
โœ…ts_num
โœ…ts_denom
\n

Data Structures and Encodings

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…Local variableslet & const
โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
โ”Local address space 8m word restriction
๐Ÿ•’Global address space (gmem[])
๐Ÿ•’Named global address space
โ”Global named variables (_global. prefix)
๐Ÿ•’Hex numbers
๐Ÿ•’ASCII chars
๐Ÿ•’Bitmasks
โ”StringsAlready fully implemented?
\n

Control Structures

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…FunctionsUser definable functions are inlined in compiled code
โœ…Conditionals
โœ…Conditional Branching
๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
๐Ÿ•’while(actions..., condition)
๐Ÿ•’while(condition) (actions...)
\n

Operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…!value
โœ…-value
โœ…+value
โœ…base ^ exponentMath.pow(base, exponent) or **
โœ…numerator % denominator
โœ…value / divisor
โœ…value * another_value
โœ…value - another_value
โœ…value + another_value
โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 === value2
โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
โœ…value1 !== value2
โœ…value1 < value2
โœ…value1 > value2
โœ…value1 <= value2
โœ…value1 >= value2
โœ…y || z
โœ…y && z
โœ…y ? z
โœ…y ? z : x
โœ…y = z
โœ…y *= z
โœ…y /= divisor
โœ…y %= divisor
๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
โœ…y += z
โœ…y -= z
\n

Bitwise operators

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’value << shift_amt
๐Ÿ•’value >> shift_amt
๐Ÿ•’a | b
๐Ÿ•’a & b
๐Ÿ•’a ~ b
๐Ÿ•’y | = z
๐Ÿ•’y &= z
๐Ÿ•’y ~= z
\n

Math Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
โœ…sin(angle)
โœ…cos(angle)
โœ…tan(angle)
โœ…asin(x)
โœ…acos(x)
โœ…atan(x)
โœ…atan2(x, y)
โœ…sqr(x)
โœ…sqrt(x)
โœ…pow(x, y)
โœ…exp(x)
โœ…log(x)
โœ…log10(x)
โœ…abs(x)
โœ…min(x, y)
โœ…max(x, y)
โœ…sign(x)
โœ…rand(x)
โœ…floor(x)
โœ…ceil(x)
โœ…invsqrt(x)
\n

Time Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’time([v])
๐Ÿ•’time_precise([v])
\n

Midi Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’midisend(offset, msg1, msg2)
๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
๐Ÿ•’midisend(offset, msg1, msg2, msg3)
๐Ÿ•’midisend_buf(offset, buf, len)
๐Ÿ•’midisend_str(offset, string)
๐Ÿ•’midirecv(offset, msg1, msg23)
๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
๐Ÿ•’midirecv_buf(offset, buf, maxlen)
๐Ÿ•’midirecv_str(offset, string)
๐Ÿ•’midisyx(offset, msgptr, len)
\n

Memory/FFT/MDCT Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’mdct(start_index, size)
๐Ÿ•’imdct(start_index, size)
๐Ÿ•’fft(start_index, size)
๐Ÿ•’ifft(start_index, size)
๐Ÿ•’fft_real(start_index, size)
๐Ÿ•’ifft_real(start_index, size)
๐Ÿ•’fft_permute(index, size)
๐Ÿ•’fft_ipermute(index, size)
๐Ÿ•’convolve_c(dest, src, size)
๐Ÿ•’freembuf(top)
๐Ÿ•’memcpy(dest, source, length)
๐Ÿ•’memset(dest, value, length)
๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
๐Ÿ•’mem_insert_shuffle(buf, len, value)
๐Ÿ•’__memtop()
๐Ÿ•’stack_push(value)
๐Ÿ•’stack_pop(value)
๐Ÿ•’stack_peek(index)
๐Ÿ•’stack_exch(value)
๐Ÿ•’atomic_setifequal(dest, value, newvalue)
๐Ÿ•’atomic_exch(val1, val2)
๐Ÿ•’atomic_add(dest_val1, val2)
๐Ÿ•’atomic_set(dest_val1, val2)
๐Ÿ•’atomic_get(val)
\n

Host Interaction Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’sliderchange(mask | sliderX)
๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
๐Ÿ•’slider_show(mask or sliderX[, value])
๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
๐Ÿ•’get_host_numchan()
๐Ÿ•’set_host_numchan(numchan)
๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
๐Ÿ•’get_pinmapper_flags(no parameters)
๐Ÿ•’set_pinmapper_flags(flags)
๐Ÿ•’get_host_placement([chain_pos, flags])
\n

String Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’strlen(str)
๐Ÿ•’strcpy(str, srcstr)
๐Ÿ•’strcat(str, srcstr)
๐Ÿ•’strcmp(str, str2)
๐Ÿ•’stricmp(str, str2)
๐Ÿ•’strncmp(str, str2, maxlen)
๐Ÿ•’strnicmp(str, str2, maxlen)
๐Ÿ•’strncpy(str, srcstr, maxlen)
๐Ÿ•’strncat(str, srcstr, maxlen)
๐Ÿ•’strcpy_from(str, srcstr, offset)
๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
๐Ÿ•’str_getchar(str, offset[, type])
๐Ÿ•’str_setchar(str, offset, value[, type])
๐Ÿ•’strcpy_fromslider(str, slider)
๐Ÿ•’sprintf(str, format, ...)
๐Ÿ•’match(needle, haystack, ...)
๐Ÿ•’matchi(needle, haystack, ...)
\n

GFX Functions

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
๐Ÿ•’gfx_lineto(x, y, aa)
๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
๐Ÿ•’gfx_rectto(x, y)
๐Ÿ•’gfx_rect(x, y, w, h)
๐Ÿ•’gfx_setpixel(r, g, b)
๐Ÿ•’gfx_getpixel(r, g, b)
๐Ÿ•’gfx_drawnumber(n, ndigits)
๐Ÿ•’gfx_drawchar($'c')
๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
๐Ÿ•’gfx_measurestr(str, w, h)
๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
๐Ÿ•’gfx_getfont()
๐Ÿ•’gfx_printf(str, ...)
๐Ÿ•’gfx_blurto(x,y)
๐Ÿ•’gfx_blit(source, scale, rotation)
๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
๐Ÿ•’gfx_getimgdim(image, w, h)
๐Ÿ•’gfx_setimgdim(image, w,h)
๐Ÿ•’gfx_loadimg(image, filename)
๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
๐Ÿ•’gfx_getchar([char, unicodechar])
๐Ÿ•’gfx_showmenu("str")
๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
\n

GFX Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
๐Ÿ•’gfx_w, gfx_h
๐Ÿ•’gfx_x, gfx_y
๐Ÿ•’gfx_mode
๐Ÿ•’gfx_clear
๐Ÿ•’gfx_dest
๐Ÿ•’gfx_texth
๐Ÿ•’gfx_ext_retina
๐Ÿ•’gfx_ext_flags
๐Ÿ•’mouse_x, mouse_y
๐Ÿ•’mouse_cap
๐Ÿ•’mouse_wheel, mouse_hwheel
\n

Special Vars and Extended Functionality

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’trigger
๐Ÿ•’ext_noinit
๐Ÿ•’ext_nodenorm
โœ…ext_tail_size
๐Ÿ•’reg00-reg99
๐Ÿ•’_global.*
\n

Delay Compensation Vars

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusFeatureComment
๐Ÿ•’pdc_delay
๐Ÿ•’pdc_bot_ch
๐Ÿ•’pdc_top_ch
๐Ÿ•’pdc_midi
\n", From b14e1f75cf253928fe0ebacd4e5322b178775c42 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Wed, 18 Oct 2023 21:18:01 +0200 Subject: [PATCH 17/42] If clauses & while: indent properly --- .../js2eel/compiler/Js2EelCompiler.spec.ts | 4 +- .../binaryExpression/binaryExpression.spec.ts | 21 +- .../binaryExpression/binaryExpression.ts | 16 +- .../ifStatement/ifStatement.spec.ts | 24 +- .../generatorNodes/ifStatement/ifStatement.ts | 17 +- .../logicalExpression.spec.ts | 24 +- .../unaryExpression/unaryExpression.spec.ts | 9 +- .../whileStatement/whileStatement.ts | 5 +- .../js2eel/suffixersAndPrefixers/indent.ts | 6 + .../removeLastLinebreak.ts | 7 + .../test/examplePlugins/01_volume.spec.ts | 7 +- .../test/examplePlugins/03_monoDelay.spec.ts | 6 +- .../examplePlugins/04_stereoDelay.spec.ts | 17 +- .../test/examplePlugins/05_lowpass.spec.ts | 34 +-- .../test/examplePlugins/06_saturation.spec.ts | 38 +-- .../test/examplePlugins/07_4band_eq.spec.ts | 278 +++++++++--------- .../test/examplePlugins/08_cab_sim.spec.ts | 124 ++++---- 17 files changed, 345 insertions(+), 292 deletions(-) create mode 100644 compiler/src/js2eel/suffixersAndPrefixers/indent.ts create mode 100644 compiler/src/js2eel/suffixersAndPrefixers/removeLastLinebreak.ts diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts index 03045f8..e02aa71 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts @@ -258,7 +258,7 @@ onSample(() => { expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.1.1 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:somevar @@ -281,12 +281,14 @@ someVar = 1; CH__0 = 0; someVar += ; +?รค__DENY_COMPILATION; /* Channel 1 */ CH__1 = 1; someVar += ; +?รค__DENY_COMPILATION; diff --git a/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.spec.ts b/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.spec.ts index a57c18e..f3f845f 100644 --- a/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.spec.ts @@ -84,11 +84,11 @@ selectBox( ); if (algorithm === myVar) { - // + let a = 1; } `; - const EEL_EXPECTED = `/* Compiled with JS2EEL v0.0.24 */ + const EEL_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ desc:binaryExpression @@ -105,7 +105,8 @@ out_pin:In 1 myVar = 1; - ? ( +?รค__DENY_COMPILATION ? ( + a__S1 = 1; ); `; @@ -135,11 +136,11 @@ selectBox( ); if (algorithm === 1) { - // + let a = 1; } `; - const EEL_EXPECTED = `/* Compiled with JS2EEL v0.0.24 */ + const EEL_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ desc:binaryExpression @@ -151,7 +152,8 @@ out_pin:In 0 out_pin:In 1 - ? ( +?รค__DENY_COMPILATION ? ( + a__S1 = 1; ); `; @@ -181,11 +183,11 @@ selectBox( ); if (algorithm === "sigmund") { - // + let a = 1; } `; - const EEL_EXPECTED = `/* Compiled with JS2EEL v0.0.24 */ + const EEL_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ desc:binaryExpression @@ -197,7 +199,8 @@ out_pin:In 0 out_pin:In 1 - ? ( +?รค__DENY_COMPILATION ? ( + a__S1 = 1; ); `; diff --git a/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.ts b/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.ts index 893dc10..ae8795a 100644 --- a/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.ts +++ b/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.ts @@ -4,7 +4,7 @@ import { identifier } from '../identifier/identifier.js'; import { unaryExpression } from '../unaryExpression/unaryExpression.js'; import { callExpression } from '../callExpression/callExpression.js'; import { memberExpression } from '../memberExpression/memberExpression.js'; -import { ALLOWED_BINARY_OPERATORS } from '../../constants.js'; +import { ALLOWED_BINARY_OPERATORS, JSFX_DENY_COMPILATION } from '../../constants.js'; import type { BinaryExpression } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; @@ -21,9 +21,13 @@ export const binaryExpression = ( const binaryOperator = expression.operator; if (!ALLOWED_BINARY_OPERATORS.has(binaryOperator)) { - instance.error('OperatorError', `Binary operator not allowed: ${binaryOperator}`, expression); + instance.error( + 'OperatorError', + `Binary operator not allowed: ${binaryOperator}`, + expression + ); - return ''; + return JSFX_DENY_COMPILATION; } // Select box enum value @@ -40,7 +44,7 @@ export const binaryExpression = ( rightExpression ); - return binarySrc; + return JSFX_DENY_COMPILATION; } if (typeof rightExpression.value !== 'string') { instance.error( @@ -49,7 +53,7 @@ export const binaryExpression = ( rightExpression ); - return binarySrc; + return JSFX_DENY_COMPILATION; } if (!potentialSelectBox.values.find((value) => value.name === rightExpression.value)) { @@ -63,7 +67,7 @@ export const binaryExpression = ( rightExpression ); - return binarySrc; + return JSFX_DENY_COMPILATION; } binarySrc += identifier(expression.left, instance); diff --git a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts index 9feec73..4773596 100644 --- a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts +++ b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts @@ -9,12 +9,12 @@ describe('ifStatement()', () => { compiler.compile(`config({ description: 'eachChannel', inChannels: 2, outChannels: 2 }); if ('string') { - // + let a = 1; } `); expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.0.24 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:eachChannel @@ -24,7 +24,8 @@ out_pin:In 0 out_pin:In 1 - ? ( +?รค__DENY_COMPILATION ? ( + a__S1 = 1; ); `) ); @@ -41,7 +42,7 @@ if (3 > 4) 3; `); expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.0.24 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:eachChannel @@ -52,6 +53,7 @@ out_pin:In 1 3 > 4 ? ( + ?รค__DENY_COMPILATION ); `) ); @@ -65,12 +67,12 @@ out_pin:In 1 compiler.compile(`config({ description: 'eachChannel', inChannels: 2, outChannels: 2 }); if (3 > 4) { - // + let a = 2; } else spl(0); `); expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.0.24 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:eachChannel @@ -81,6 +83,9 @@ out_pin:In 1 3 > 4 ? ( + a__S1 = 2; +) : ( + ?รค__DENY_COMPILATION ); `) ); @@ -108,7 +113,7 @@ onSample(() => { expect(result.success).to.equal(true); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.9.1 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:ifStatement @@ -127,8 +132,9 @@ result = 1; @sample !bool ? ( -result = 0; -) : (result = 1; + result = 0; +) : ( + result = 1; ); diff --git a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.ts b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.ts index ed1f640..29f8ef0 100644 --- a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.ts +++ b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.ts @@ -3,11 +3,13 @@ import { unaryExpression } from '../unaryExpression/unaryExpression.js'; import { binaryExpression } from '../binaryExpression/binaryExpression.js'; import { logicalExpression } from '../logicalExpression/logicalExpression.js'; import { identifier } from '../identifier/identifier.js'; - +import { indent } from '../../suffixersAndPrefixers/indent.js'; +import { removeLastLinebreak } from '../../suffixersAndPrefixers/removeLastLinebreak.js'; import { addSemicolonIfNone } from '../../suffixersAndPrefixers/addSemicolonIfNone.js'; import type { IfStatement } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { JSFX_DENY_COMPILATION } from '../../constants.js'; export const ifStatement = (ifStatementNode: IfStatement, instance: Js2EelCompiler): string => { let ifSrc = ``; @@ -39,6 +41,8 @@ export const ifStatement = (ifStatementNode: IfStatement, instance: Js2EelCompil `Type ${ifStatementNode.test.type} not allowed`, ifStatementNode.test ); + + testSrc += JSFX_DENY_COMPILATION; } } @@ -53,6 +57,8 @@ export const ifStatement = (ifStatementNode: IfStatement, instance: Js2EelCompil `Type ${ifStatementNode.consequent} not allowed`, ifStatementNode.consequent ); + + consequentSrc += JSFX_DENY_COMPILATION; } } if (ifStatementNode.alternate) { @@ -72,17 +78,22 @@ export const ifStatement = (ifStatementNode: IfStatement, instance: Js2EelCompil `Type ${ifStatementNode.alternate.type} not allowed`, ifStatementNode.alternate ); + + alternateSrc += JSFX_DENY_COMPILATION; } } } ifSrc += testSrc; ifSrc += ' ? '; - ifSrc += `(\n${consequentSrc})`; + ifSrc += `(\n${indent(removeLastLinebreak(consequentSrc))} +)`; if (alternateSrc) { ifSrc += ' : '; - ifSrc += `(${alternateSrc})`; + ifSrc += `( +${indent(removeLastLinebreak(alternateSrc))} +)`; } return addSemicolonIfNone(ifSrc); diff --git a/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts b/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts index d16ac6b..c4790b1 100644 --- a/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts @@ -21,7 +21,7 @@ if (one && two) { `); expect(result.success).to.equal(true); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.9.1 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:logicalExpression @@ -38,7 +38,7 @@ two = 0; (one && two) ? ( -__debug__one = one; + __debug__one = one; ); `) ); @@ -62,7 +62,7 @@ if (!one && !two) { `); expect(result.success).to.equal(true); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.9.1 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:logicalExpression @@ -79,7 +79,7 @@ two = 0; (!one && !two) ? ( -__debug__one = one; + __debug__one = one; ); `) ); @@ -103,7 +103,7 @@ if (one > 0 && two < 2) { `); expect(result.success).to.equal(true); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.9.1 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:logicalExpression @@ -120,7 +120,7 @@ two = 1; (one > 0 && two < 2) ? ( -__debug__one = one; + __debug__one = one; ); `) ); @@ -144,7 +144,7 @@ if (one > 0 && two < 2 && (1 < 2 || 2 < 3)) { `); expect(result.success).to.equal(true); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.9.1 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:logicalExpression @@ -161,7 +161,7 @@ two = 1; ((one > 0 && two < 2) && (1 < 2 || 2 < 3)) ? ( -__debug__one = one; + __debug__one = one; ); `) ); @@ -185,7 +185,7 @@ if (function myFunc() {} && two) { `); expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.9.1 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:logicalExpression @@ -202,7 +202,7 @@ two = 0; ?รค__DENY_COMPILATION ? ( -__debug__one = one; + __debug__one = one; ); `) ); @@ -227,7 +227,7 @@ if (one && function myFunc() {}) { `); expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.9.1 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:logicalExpression @@ -244,7 +244,7 @@ two = 0; ?รค__DENY_COMPILATION ? ( -__debug__one = one; + __debug__one = one; ); `) ); diff --git a/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts b/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts index b0c4c1b..a7fe670 100644 --- a/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts @@ -14,7 +14,7 @@ const myVar2 = -function myFunc() {}; expect(result.success).to.equal(false); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.0.22 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:test @@ -89,7 +89,7 @@ onSample(() => { expect(result.success).to.equal(true); expect(testEelSrc(result.src)).to.equal( - testEelSrc(`/* Compiled with JS2EEL v0.9.1 */ + testEelSrc(`/* Compiled with JS2EEL v0.10.0 */ desc:unaryExpression @@ -107,8 +107,9 @@ result = 1; @sample !bools__D0__0 ? ( -result = 0; -) : (result = 1; + result = 0; +) : ( + result = 1; ); diff --git a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts index 72747e8..c014090 100644 --- a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts +++ b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts @@ -1,6 +1,8 @@ import { JSFX_DENY_COMPILATION } from '../../constants'; import { binaryExpression } from '../binaryExpression/binaryExpression'; import { blockStatement } from '../blockStatement/blockStatement'; +import { indent } from '../../suffixersAndPrefixers/indent'; +import { removeLastLinebreak } from '../../suffixersAndPrefixers/removeLastLinebreak'; import type { WhileStatement } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; @@ -48,7 +50,8 @@ export const whileStatement = ( } const whileStatementSrc = `while (${testSrc}) ( - ${bodySrc}); +${indent(removeLastLinebreak(bodySrc))} +); `; return whileStatementSrc; diff --git a/compiler/src/js2eel/suffixersAndPrefixers/indent.ts b/compiler/src/js2eel/suffixersAndPrefixers/indent.ts new file mode 100644 index 0000000..1c4658b --- /dev/null +++ b/compiler/src/js2eel/suffixersAndPrefixers/indent.ts @@ -0,0 +1,6 @@ +export const indent = (src: string): string => { + return src + .split('\n') + .map((line) => ` ${line}`) + .join('\n'); +}; diff --git a/compiler/src/js2eel/suffixersAndPrefixers/removeLastLinebreak.ts b/compiler/src/js2eel/suffixersAndPrefixers/removeLastLinebreak.ts new file mode 100644 index 0000000..367fc7c --- /dev/null +++ b/compiler/src/js2eel/suffixersAndPrefixers/removeLastLinebreak.ts @@ -0,0 +1,7 @@ +export const removeLastLinebreak = (src: string): string => { + if (src.endsWith('\n')) { + return src.slice(0, -1); + } + + return src; +}; diff --git a/compiler/src/js2eel/test/examplePlugins/01_volume.spec.ts b/compiler/src/js2eel/test/examplePlugins/01_volume.spec.ts index 4deccea..1be30d4 100644 --- a/compiler/src/js2eel/test/examplePlugins/01_volume.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/01_volume.spec.ts @@ -6,7 +6,7 @@ import { testEelSrc } from '../helpers.js'; const JS_VOLUME_SRC = fs.readFileSync(path.resolve('../examples/01_volume.js'), 'utf-8'); -const EEL_VOLUME_SRC_EXPECTED = `/* Compiled with JS2EEL v0.0.1 */ +const EEL_VOLUME_SRC_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ desc:volume @@ -26,8 +26,9 @@ target = 0; @slider volume > -149.9 ? ( -target = 10 ^ (volume / (20)); -) : (target = 0; + target = 10 ^ (volume / (20)); +) : ( + target = 0; ); diff --git a/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts b/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts index 6c7956a..878a5b2 100644 --- a/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts @@ -6,7 +6,7 @@ import { testEelSrc } from '../helpers.js'; const JS_MONO_DELAY_SRC = fs.readFileSync(path.resolve('../examples/03_mono_delay.js'), 'utf-8'); -const EEL_MONO_DELAY_SRC_EXPECTED = `/* Compiled with JS2EEL v0.0.15 */ +const EEL_MONO_DELAY_SRC_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ desc:mono_delay @@ -39,11 +39,11 @@ mix = 2 ^ (mixDb / (6)); readIndex = (writeIndex - numSamples); readIndex < 0 ? ( -readIndex += buffer__size; + readIndex += buffer__size; ); writeIndex += 1; writeIndex >= buffer__size ? ( -writeIndex = 0; + writeIndex = 0; ); /* Channel 0 */ diff --git a/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts b/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts index 7b1c766..10305d7 100644 --- a/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts @@ -9,7 +9,7 @@ const JS_STEREO_DELAY_SRC = fs.readFileSync( 'utf-8' ); -const EEL_STEREO_DELAY_SRC_EXPECTED = `/* Compiled with JS2EEL v0.9.1 */ +const EEL_STEREO_DELAY_SRC_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ desc:stereo_delay @@ -43,7 +43,7 @@ feedback = feedbackPercent / (100); numSamples__L = lengthMsL * srate / (1000); numSamples__R = lengthMsR * srate / (1000); (type == 0 || type == 2) ? ( -lengthMsR = lengthMsL; + lengthMsR = lengthMsL; ); mix = 2 ^ (mixDb / (6)); @@ -53,18 +53,19 @@ mix = 2 ^ (mixDb / (6)); bufferValueL__S5 = buffer__B0[bufferPos__L]; bufferValueR__S5 = buffer__B1[bufferPos__R]; type == 2 ? ( -buffer__B1[bufferPos__R] = min((spl0 + bufferValueL__S5 * feedback), 1); -buffer__B0[bufferPos__L] = min((spl1 + bufferValueR__S5 * feedback), 1); -) : (buffer__B0[bufferPos__L] = min((spl0 + bufferValueL__S5 * feedback), 1); -buffer__B1[bufferPos__R] = min((spl1 + bufferValueR__S5 * feedback), 1); + buffer__B1[bufferPos__R] = min((spl0 + bufferValueL__S5 * feedback), 1); + buffer__B0[bufferPos__L] = min((spl1 + bufferValueR__S5 * feedback), 1); +) : ( + buffer__B0[bufferPos__L] = min((spl0 + bufferValueL__S5 * feedback), 1); + buffer__B1[bufferPos__R] = min((spl1 + bufferValueR__S5 * feedback), 1); ); bufferPos__L += 1; bufferPos__R += 1; bufferPos__L >= numSamples__L ? ( -bufferPos__L = 0; + bufferPos__L = 0; ); bufferPos__R >= numSamples__R ? ( -bufferPos__R = 0; + bufferPos__R = 0; ); spl0 = (spl0 + bufferValueL__S5 * mix); spl1 = (spl1 + bufferValueR__S5 * mix); diff --git a/compiler/src/js2eel/test/examplePlugins/05_lowpass.spec.ts b/compiler/src/js2eel/test/examplePlugins/05_lowpass.spec.ts index a3c7889..51ea6f3 100644 --- a/compiler/src/js2eel/test/examplePlugins/05_lowpass.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/05_lowpass.spec.ts @@ -6,7 +6,7 @@ import { testEelSrc } from '../helpers.js'; const JS_LOWPASS_SRC = fs.readFileSync(path.resolve('../examples/05_lowpass.js'), 'utf-8'); -const EEL_LOWPASS_SRC_EXPECTED = `/* Compiled with JS2EEL v0.8.0 */ +const EEL_LOWPASS_SRC_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ desc:lowpass @@ -58,14 +58,14 @@ outputGain = (10 ^ (outputGainDb / (20))); CH__0 = 0; lpFreq < 22000 ? ( -lpYStore__D0__0 = ((((lpCoefs__b0x * lpXStore__D0__0 + lpCoefs__b1x * lpXStore__D0__1) + lpCoefs__b2x * lpXStore__D0__2) - lpCoefs__a1x * lpYStore__D0__1) - lpCoefs__a2x * lpYStore__D0__2); -lpYStore__D0__2 = lpYStore__D0__1; -lpYStore__D0__1 = lpYStore__D0__0; -lpXStore__D0__2 = lpXStore__D0__1; -lpXStore__D0__1 = lpXStore__D0__0; -lpXStore__D0__0 = spl0; -R__S2__0 = lpYStore__D0__0; -spl0 = R__S2__0; + lpYStore__D0__0 = ((((lpCoefs__b0x * lpXStore__D0__0 + lpCoefs__b1x * lpXStore__D0__1) + lpCoefs__b2x * lpXStore__D0__2) - lpCoefs__a1x * lpYStore__D0__1) - lpCoefs__a2x * lpYStore__D0__2); + lpYStore__D0__2 = lpYStore__D0__1; + lpYStore__D0__1 = lpYStore__D0__0; + lpXStore__D0__2 = lpXStore__D0__1; + lpXStore__D0__1 = lpXStore__D0__0; + lpXStore__D0__0 = spl0; + R__S2__0 = lpYStore__D0__0; + spl0 = R__S2__0; ); spl0 = spl0 * outputGain; @@ -74,14 +74,14 @@ spl0 = spl0 * outputGain; CH__1 = 1; lpFreq < 22000 ? ( -lpYStore__D1__0 = ((((lpCoefs__b0x * lpXStore__D1__0 + lpCoefs__b1x * lpXStore__D1__1) + lpCoefs__b2x * lpXStore__D1__2) - lpCoefs__a1x * lpYStore__D1__1) - lpCoefs__a2x * lpYStore__D1__2); -lpYStore__D1__2 = lpYStore__D1__1; -lpYStore__D1__1 = lpYStore__D1__0; -lpXStore__D1__2 = lpXStore__D1__1; -lpXStore__D1__1 = lpXStore__D1__0; -lpXStore__D1__0 = spl1; -R__S2__0 = lpYStore__D1__0; -spl1 = R__S2__0; + lpYStore__D1__0 = ((((lpCoefs__b0x * lpXStore__D1__0 + lpCoefs__b1x * lpXStore__D1__1) + lpCoefs__b2x * lpXStore__D1__2) - lpCoefs__a1x * lpYStore__D1__1) - lpCoefs__a2x * lpYStore__D1__2); + lpYStore__D1__2 = lpYStore__D1__1; + lpYStore__D1__1 = lpYStore__D1__0; + lpXStore__D1__2 = lpXStore__D1__1; + lpXStore__D1__1 = lpXStore__D1__0; + lpXStore__D1__0 = spl1; + R__S2__0 = lpYStore__D1__0; + spl1 = R__S2__0; ); spl1 = spl1 * outputGain; diff --git a/compiler/src/js2eel/test/examplePlugins/06_saturation.spec.ts b/compiler/src/js2eel/test/examplePlugins/06_saturation.spec.ts index 9404e0e..c95588f 100644 --- a/compiler/src/js2eel/test/examplePlugins/06_saturation.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/06_saturation.spec.ts @@ -6,7 +6,7 @@ import { testEelSrc } from '../helpers.js'; const JS_SATURATION_SRC = fs.readFileSync(path.resolve('../examples/06_saturation.js'), 'utf-8'); -const EEL_SATURATION_SRC_EXPECTED = `/* Compiled with JS2EEL v0.8.0 */ +const EEL_SATURATION_SRC_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ desc:saturation @@ -35,14 +35,16 @@ volume = 10 ^ (volumeDb / (20)); CH__0 = 0; algorithm == 0 ? ( -spl0 = (2 * 1 / ((1 + exp(-gainIn * spl0))) - 1); -) : (algorithm == 1 ? ( -spl0 = (exp(2 * spl0 * gainIn) - 1) / ((exp(2 * spl0 * gainIn) + 1)) / ((exp(2 * gainIn) - 1) / ((exp(2 * gainIn) + 1))); -) : (algorithm == 2 ? ( -spl0 *= gainIn; -spl0 = abs(spl0) > 0.5 ? 0.5 * sign(spl0) : spl0; -); -); + spl0 = (2 * 1 / ((1 + exp(-gainIn * spl0))) - 1); +) : ( + algorithm == 1 ? ( + spl0 = (exp(2 * spl0 * gainIn) - 1) / ((exp(2 * spl0 * gainIn) + 1)) / ((exp(2 * gainIn) - 1) / ((exp(2 * gainIn) + 1))); + ) : ( + algorithm == 2 ? ( + spl0 *= gainIn; + spl0 = abs(spl0) > 0.5 ? 0.5 * sign(spl0) : spl0; + ); + ); ); spl0 *= volume; @@ -51,14 +53,16 @@ spl0 *= volume; CH__1 = 1; algorithm == 0 ? ( -spl1 = (2 * 1 / ((1 + exp(-gainIn * spl1))) - 1); -) : (algorithm == 1 ? ( -spl1 = (exp(2 * spl1 * gainIn) - 1) / ((exp(2 * spl1 * gainIn) + 1)) / ((exp(2 * gainIn) - 1) / ((exp(2 * gainIn) + 1))); -) : (algorithm == 2 ? ( -spl1 *= gainIn; -spl1 = abs(spl1) > 0.5 ? 0.5 * sign(spl1) : spl1; -); -); + spl1 = (2 * 1 / ((1 + exp(-gainIn * spl1))) - 1); +) : ( + algorithm == 1 ? ( + spl1 = (exp(2 * spl1 * gainIn) - 1) / ((exp(2 * spl1 * gainIn) + 1)) / ((exp(2 * gainIn) - 1) / ((exp(2 * gainIn) + 1))); + ) : ( + algorithm == 2 ? ( + spl1 *= gainIn; + spl1 = abs(spl1) > 0.5 ? 0.5 * sign(spl1) : spl1; + ); + ); ); spl1 *= volume; diff --git a/compiler/src/js2eel/test/examplePlugins/07_4band_eq.spec.ts b/compiler/src/js2eel/test/examplePlugins/07_4band_eq.spec.ts index 8f0190b..e2a2f7c 100644 --- a/compiler/src/js2eel/test/examplePlugins/07_4band_eq.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/07_4band_eq.spec.ts @@ -6,7 +6,7 @@ import { testEelSrc } from '../helpers.js'; const JS_4BAND_EQ_SRC = fs.readFileSync(path.resolve('../examples/07_4band_eq.js'), 'utf-8'); -const EEL_4BAND_EQ_SRC_EXPECTED = `/* Compiled with JS2EEL v0.9.0 */ +const EEL_4BAND_EQ_SRC_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ desc:4band_eq @@ -228,84 +228,86 @@ outputGain = (10 ^ (outputGainDb / (20))); CH__0 = 0; lpFreq < 22000 ? ( -lpYStore__D0__0 = ((((lpCoefs__b0x * lpXStore__D0__0 + lpCoefs__b1x * lpXStore__D0__1) + lpCoefs__b2x * lpXStore__D0__2) - lpCoefs__a1x * lpYStore__D0__1) - lpCoefs__a2x * lpYStore__D0__2); -lpYStore__D0__2 = lpYStore__D0__1; -lpYStore__D0__1 = lpYStore__D0__0; -lpXStore__D0__2 = lpXStore__D0__1; -lpXStore__D0__1 = lpXStore__D0__0; -lpXStore__D0__0 = spl0; -R__S6__0 = lpYStore__D0__0; -spl0 = R__S6__0; + lpYStore__D0__0 = ((((lpCoefs__b0x * lpXStore__D0__0 + lpCoefs__b1x * lpXStore__D0__1) + lpCoefs__b2x * lpXStore__D0__2) - lpCoefs__a1x * lpYStore__D0__1) - lpCoefs__a2x * lpYStore__D0__2); + lpYStore__D0__2 = lpYStore__D0__1; + lpYStore__D0__1 = lpYStore__D0__0; + lpXStore__D0__2 = lpXStore__D0__1; + lpXStore__D0__1 = lpXStore__D0__0; + lpXStore__D0__0 = spl0; + R__S6__0 = lpYStore__D0__0; + spl0 = R__S6__0; ); highGain !== 0 ? ( -highType == 1 ? ( -hiYStore__D0__0 = ((((hiCoefs__b0x * hiXStore__D0__0 + hiCoefs__b1x * hiXStore__D0__1) + hiCoefs__b2x * hiXStore__D0__2) - hiCoefs__a1x * hiYStore__D0__1) - hiCoefs__a2x * hiYStore__D0__2); -hiYStore__D0__2 = hiYStore__D0__1; -hiYStore__D0__1 = hiYStore__D0__0; -hiXStore__D0__2 = hiXStore__D0__1; -hiXStore__D0__1 = hiXStore__D0__0; -hiXStore__D0__0 = spl0; -R__S6__0 = hiYStore__D0__0; -spl0 = R__S6__0; -) : (hiShelfYStore__D0__0 = ((((hiShelfCoefs__b0x * hiShelfXStore__D0__0 + hiShelfCoefs__b1x * hiShelfXStore__D0__1) + hiShelfCoefs__b2x * hiShelfXStore__D0__2) - hiShelfCoefs__a1x * hiShelfYStore__D0__1) - hiShelfCoefs__a2x * hiShelfYStore__D0__2); -hiShelfYStore__D0__2 = hiShelfYStore__D0__1; -hiShelfYStore__D0__1 = hiShelfYStore__D0__0; -hiShelfXStore__D0__2 = hiShelfXStore__D0__1; -hiShelfXStore__D0__1 = hiShelfXStore__D0__0; -hiShelfXStore__D0__0 = spl0; -R__S6__0 = hiShelfYStore__D0__0; -spl0 = R__S6__0; -); + highType == 1 ? ( + hiYStore__D0__0 = ((((hiCoefs__b0x * hiXStore__D0__0 + hiCoefs__b1x * hiXStore__D0__1) + hiCoefs__b2x * hiXStore__D0__2) - hiCoefs__a1x * hiYStore__D0__1) - hiCoefs__a2x * hiYStore__D0__2); + hiYStore__D0__2 = hiYStore__D0__1; + hiYStore__D0__1 = hiYStore__D0__0; + hiXStore__D0__2 = hiXStore__D0__1; + hiXStore__D0__1 = hiXStore__D0__0; + hiXStore__D0__0 = spl0; + R__S6__0 = hiYStore__D0__0; + spl0 = R__S6__0; + ) : ( + hiShelfYStore__D0__0 = ((((hiShelfCoefs__b0x * hiShelfXStore__D0__0 + hiShelfCoefs__b1x * hiShelfXStore__D0__1) + hiShelfCoefs__b2x * hiShelfXStore__D0__2) - hiShelfCoefs__a1x * hiShelfYStore__D0__1) - hiShelfCoefs__a2x * hiShelfYStore__D0__2); + hiShelfYStore__D0__2 = hiShelfYStore__D0__1; + hiShelfYStore__D0__1 = hiShelfYStore__D0__0; + hiShelfXStore__D0__2 = hiShelfXStore__D0__1; + hiShelfXStore__D0__1 = hiShelfXStore__D0__0; + hiShelfXStore__D0__0 = spl0; + R__S6__0 = hiShelfYStore__D0__0; + spl0 = R__S6__0; + ); ); hiMidGain !== 0 ? ( -hiMidYStore__D0__0 = ((((hiMidCoefs__b0x * hiMidXStore__D0__0 + hiMidCoefs__b1x * hiMidXStore__D0__1) + hiMidCoefs__b2x * hiMidXStore__D0__2) - hiMidCoefs__a1x * hiMidYStore__D0__1) - hiMidCoefs__a2x * hiMidYStore__D0__2); -hiMidYStore__D0__2 = hiMidYStore__D0__1; -hiMidYStore__D0__1 = hiMidYStore__D0__0; -hiMidXStore__D0__2 = hiMidXStore__D0__1; -hiMidXStore__D0__1 = hiMidXStore__D0__0; -hiMidXStore__D0__0 = spl0; -R__S6__0 = hiMidYStore__D0__0; -spl0 = R__S6__0; + hiMidYStore__D0__0 = ((((hiMidCoefs__b0x * hiMidXStore__D0__0 + hiMidCoefs__b1x * hiMidXStore__D0__1) + hiMidCoefs__b2x * hiMidXStore__D0__2) - hiMidCoefs__a1x * hiMidYStore__D0__1) - hiMidCoefs__a2x * hiMidYStore__D0__2); + hiMidYStore__D0__2 = hiMidYStore__D0__1; + hiMidYStore__D0__1 = hiMidYStore__D0__0; + hiMidXStore__D0__2 = hiMidXStore__D0__1; + hiMidXStore__D0__1 = hiMidXStore__D0__0; + hiMidXStore__D0__0 = spl0; + R__S6__0 = hiMidYStore__D0__0; + spl0 = R__S6__0; ); loMidGain !== 0 ? ( -loMidYStore__D0__0 = ((((loMidCoefs__b0x * loMidXStore__D0__0 + loMidCoefs__b1x * loMidXStore__D0__1) + loMidCoefs__b2x * loMidXStore__D0__2) - loMidCoefs__a1x * loMidYStore__D0__1) - loMidCoefs__a2x * loMidYStore__D0__2); -loMidYStore__D0__2 = loMidYStore__D0__1; -loMidYStore__D0__1 = loMidYStore__D0__0; -loMidXStore__D0__2 = loMidXStore__D0__1; -loMidXStore__D0__1 = loMidXStore__D0__0; -loMidXStore__D0__0 = spl0; -R__S6__0 = loMidYStore__D0__0; -spl0 = R__S6__0; + loMidYStore__D0__0 = ((((loMidCoefs__b0x * loMidXStore__D0__0 + loMidCoefs__b1x * loMidXStore__D0__1) + loMidCoefs__b2x * loMidXStore__D0__2) - loMidCoefs__a1x * loMidYStore__D0__1) - loMidCoefs__a2x * loMidYStore__D0__2); + loMidYStore__D0__2 = loMidYStore__D0__1; + loMidYStore__D0__1 = loMidYStore__D0__0; + loMidXStore__D0__2 = loMidXStore__D0__1; + loMidXStore__D0__1 = loMidXStore__D0__0; + loMidXStore__D0__0 = spl0; + R__S6__0 = loMidYStore__D0__0; + spl0 = R__S6__0; ); lowGain !== 0 ? ( -lowType == 1 ? ( -loYStore__D0__0 = ((((loCoefs__b0x * loXStore__D0__0 + loCoefs__b1x * loXStore__D0__1) + loCoefs__b2x * loXStore__D0__2) - loCoefs__a1x * loYStore__D0__1) - loCoefs__a2x * loYStore__D0__2); -loYStore__D0__2 = loYStore__D0__1; -loYStore__D0__1 = loYStore__D0__0; -loXStore__D0__2 = loXStore__D0__1; -loXStore__D0__1 = loXStore__D0__0; -loXStore__D0__0 = spl0; -R__S6__0 = loYStore__D0__0; -spl0 = R__S6__0; -) : (loShelfYStore__D0__0 = ((((loShelfCoefs__b0x * loShelfXStore__D0__0 + loShelfCoefs__b1x * loShelfXStore__D0__1) + loShelfCoefs__b2x * loShelfXStore__D0__2) - loShelfCoefs__a1x * loShelfYStore__D0__1) - loShelfCoefs__a2x * loShelfYStore__D0__2); -loShelfYStore__D0__2 = loShelfYStore__D0__1; -loShelfYStore__D0__1 = loShelfYStore__D0__0; -loShelfXStore__D0__2 = loShelfXStore__D0__1; -loShelfXStore__D0__1 = loShelfXStore__D0__0; -loShelfXStore__D0__0 = spl0; -R__S6__0 = loShelfYStore__D0__0; -spl0 = R__S6__0; -); + lowType == 1 ? ( + loYStore__D0__0 = ((((loCoefs__b0x * loXStore__D0__0 + loCoefs__b1x * loXStore__D0__1) + loCoefs__b2x * loXStore__D0__2) - loCoefs__a1x * loYStore__D0__1) - loCoefs__a2x * loYStore__D0__2); + loYStore__D0__2 = loYStore__D0__1; + loYStore__D0__1 = loYStore__D0__0; + loXStore__D0__2 = loXStore__D0__1; + loXStore__D0__1 = loXStore__D0__0; + loXStore__D0__0 = spl0; + R__S6__0 = loYStore__D0__0; + spl0 = R__S6__0; + ) : ( + loShelfYStore__D0__0 = ((((loShelfCoefs__b0x * loShelfXStore__D0__0 + loShelfCoefs__b1x * loShelfXStore__D0__1) + loShelfCoefs__b2x * loShelfXStore__D0__2) - loShelfCoefs__a1x * loShelfYStore__D0__1) - loShelfCoefs__a2x * loShelfYStore__D0__2); + loShelfYStore__D0__2 = loShelfYStore__D0__1; + loShelfYStore__D0__1 = loShelfYStore__D0__0; + loShelfXStore__D0__2 = loShelfXStore__D0__1; + loShelfXStore__D0__1 = loShelfXStore__D0__0; + loShelfXStore__D0__0 = spl0; + R__S6__0 = loShelfYStore__D0__0; + spl0 = R__S6__0; + ); ); hpFreq > 20 ? ( -hpYStore__D0__0 = ((((hpCoefs__b0x * hpXStore__D0__0 + hpCoefs__b1x * hpXStore__D0__1) + hpCoefs__b2x * hpXStore__D0__2) - hpCoefs__a1x * hpYStore__D0__1) - hpCoefs__a2x * hpYStore__D0__2); -hpYStore__D0__2 = hpYStore__D0__1; -hpYStore__D0__1 = hpYStore__D0__0; -hpXStore__D0__2 = hpXStore__D0__1; -hpXStore__D0__1 = hpXStore__D0__0; -hpXStore__D0__0 = spl0; -R__S6__0 = hpYStore__D0__0; -spl0 = R__S6__0; + hpYStore__D0__0 = ((((hpCoefs__b0x * hpXStore__D0__0 + hpCoefs__b1x * hpXStore__D0__1) + hpCoefs__b2x * hpXStore__D0__2) - hpCoefs__a1x * hpYStore__D0__1) - hpCoefs__a2x * hpYStore__D0__2); + hpYStore__D0__2 = hpYStore__D0__1; + hpYStore__D0__1 = hpYStore__D0__0; + hpXStore__D0__2 = hpXStore__D0__1; + hpXStore__D0__1 = hpXStore__D0__0; + hpXStore__D0__0 = spl0; + R__S6__0 = hpYStore__D0__0; + spl0 = R__S6__0; ); spl0 = spl0 * outputGain; @@ -314,84 +316,86 @@ spl0 = spl0 * outputGain; CH__1 = 1; lpFreq < 22000 ? ( -lpYStore__D1__0 = ((((lpCoefs__b0x * lpXStore__D1__0 + lpCoefs__b1x * lpXStore__D1__1) + lpCoefs__b2x * lpXStore__D1__2) - lpCoefs__a1x * lpYStore__D1__1) - lpCoefs__a2x * lpYStore__D1__2); -lpYStore__D1__2 = lpYStore__D1__1; -lpYStore__D1__1 = lpYStore__D1__0; -lpXStore__D1__2 = lpXStore__D1__1; -lpXStore__D1__1 = lpXStore__D1__0; -lpXStore__D1__0 = spl1; -R__S6__0 = lpYStore__D1__0; -spl1 = R__S6__0; + lpYStore__D1__0 = ((((lpCoefs__b0x * lpXStore__D1__0 + lpCoefs__b1x * lpXStore__D1__1) + lpCoefs__b2x * lpXStore__D1__2) - lpCoefs__a1x * lpYStore__D1__1) - lpCoefs__a2x * lpYStore__D1__2); + lpYStore__D1__2 = lpYStore__D1__1; + lpYStore__D1__1 = lpYStore__D1__0; + lpXStore__D1__2 = lpXStore__D1__1; + lpXStore__D1__1 = lpXStore__D1__0; + lpXStore__D1__0 = spl1; + R__S6__0 = lpYStore__D1__0; + spl1 = R__S6__0; ); highGain !== 0 ? ( -highType == 1 ? ( -hiYStore__D1__0 = ((((hiCoefs__b0x * hiXStore__D1__0 + hiCoefs__b1x * hiXStore__D1__1) + hiCoefs__b2x * hiXStore__D1__2) - hiCoefs__a1x * hiYStore__D1__1) - hiCoefs__a2x * hiYStore__D1__2); -hiYStore__D1__2 = hiYStore__D1__1; -hiYStore__D1__1 = hiYStore__D1__0; -hiXStore__D1__2 = hiXStore__D1__1; -hiXStore__D1__1 = hiXStore__D1__0; -hiXStore__D1__0 = spl1; -R__S6__0 = hiYStore__D1__0; -spl1 = R__S6__0; -) : (hiShelfYStore__D1__0 = ((((hiShelfCoefs__b0x * hiShelfXStore__D1__0 + hiShelfCoefs__b1x * hiShelfXStore__D1__1) + hiShelfCoefs__b2x * hiShelfXStore__D1__2) - hiShelfCoefs__a1x * hiShelfYStore__D1__1) - hiShelfCoefs__a2x * hiShelfYStore__D1__2); -hiShelfYStore__D1__2 = hiShelfYStore__D1__1; -hiShelfYStore__D1__1 = hiShelfYStore__D1__0; -hiShelfXStore__D1__2 = hiShelfXStore__D1__1; -hiShelfXStore__D1__1 = hiShelfXStore__D1__0; -hiShelfXStore__D1__0 = spl1; -R__S6__0 = hiShelfYStore__D1__0; -spl1 = R__S6__0; -); + highType == 1 ? ( + hiYStore__D1__0 = ((((hiCoefs__b0x * hiXStore__D1__0 + hiCoefs__b1x * hiXStore__D1__1) + hiCoefs__b2x * hiXStore__D1__2) - hiCoefs__a1x * hiYStore__D1__1) - hiCoefs__a2x * hiYStore__D1__2); + hiYStore__D1__2 = hiYStore__D1__1; + hiYStore__D1__1 = hiYStore__D1__0; + hiXStore__D1__2 = hiXStore__D1__1; + hiXStore__D1__1 = hiXStore__D1__0; + hiXStore__D1__0 = spl1; + R__S6__0 = hiYStore__D1__0; + spl1 = R__S6__0; + ) : ( + hiShelfYStore__D1__0 = ((((hiShelfCoefs__b0x * hiShelfXStore__D1__0 + hiShelfCoefs__b1x * hiShelfXStore__D1__1) + hiShelfCoefs__b2x * hiShelfXStore__D1__2) - hiShelfCoefs__a1x * hiShelfYStore__D1__1) - hiShelfCoefs__a2x * hiShelfYStore__D1__2); + hiShelfYStore__D1__2 = hiShelfYStore__D1__1; + hiShelfYStore__D1__1 = hiShelfYStore__D1__0; + hiShelfXStore__D1__2 = hiShelfXStore__D1__1; + hiShelfXStore__D1__1 = hiShelfXStore__D1__0; + hiShelfXStore__D1__0 = spl1; + R__S6__0 = hiShelfYStore__D1__0; + spl1 = R__S6__0; + ); ); hiMidGain !== 0 ? ( -hiMidYStore__D1__0 = ((((hiMidCoefs__b0x * hiMidXStore__D1__0 + hiMidCoefs__b1x * hiMidXStore__D1__1) + hiMidCoefs__b2x * hiMidXStore__D1__2) - hiMidCoefs__a1x * hiMidYStore__D1__1) - hiMidCoefs__a2x * hiMidYStore__D1__2); -hiMidYStore__D1__2 = hiMidYStore__D1__1; -hiMidYStore__D1__1 = hiMidYStore__D1__0; -hiMidXStore__D1__2 = hiMidXStore__D1__1; -hiMidXStore__D1__1 = hiMidXStore__D1__0; -hiMidXStore__D1__0 = spl1; -R__S6__0 = hiMidYStore__D1__0; -spl1 = R__S6__0; + hiMidYStore__D1__0 = ((((hiMidCoefs__b0x * hiMidXStore__D1__0 + hiMidCoefs__b1x * hiMidXStore__D1__1) + hiMidCoefs__b2x * hiMidXStore__D1__2) - hiMidCoefs__a1x * hiMidYStore__D1__1) - hiMidCoefs__a2x * hiMidYStore__D1__2); + hiMidYStore__D1__2 = hiMidYStore__D1__1; + hiMidYStore__D1__1 = hiMidYStore__D1__0; + hiMidXStore__D1__2 = hiMidXStore__D1__1; + hiMidXStore__D1__1 = hiMidXStore__D1__0; + hiMidXStore__D1__0 = spl1; + R__S6__0 = hiMidYStore__D1__0; + spl1 = R__S6__0; ); loMidGain !== 0 ? ( -loMidYStore__D1__0 = ((((loMidCoefs__b0x * loMidXStore__D1__0 + loMidCoefs__b1x * loMidXStore__D1__1) + loMidCoefs__b2x * loMidXStore__D1__2) - loMidCoefs__a1x * loMidYStore__D1__1) - loMidCoefs__a2x * loMidYStore__D1__2); -loMidYStore__D1__2 = loMidYStore__D1__1; -loMidYStore__D1__1 = loMidYStore__D1__0; -loMidXStore__D1__2 = loMidXStore__D1__1; -loMidXStore__D1__1 = loMidXStore__D1__0; -loMidXStore__D1__0 = spl1; -R__S6__0 = loMidYStore__D1__0; -spl1 = R__S6__0; + loMidYStore__D1__0 = ((((loMidCoefs__b0x * loMidXStore__D1__0 + loMidCoefs__b1x * loMidXStore__D1__1) + loMidCoefs__b2x * loMidXStore__D1__2) - loMidCoefs__a1x * loMidYStore__D1__1) - loMidCoefs__a2x * loMidYStore__D1__2); + loMidYStore__D1__2 = loMidYStore__D1__1; + loMidYStore__D1__1 = loMidYStore__D1__0; + loMidXStore__D1__2 = loMidXStore__D1__1; + loMidXStore__D1__1 = loMidXStore__D1__0; + loMidXStore__D1__0 = spl1; + R__S6__0 = loMidYStore__D1__0; + spl1 = R__S6__0; ); lowGain !== 0 ? ( -lowType == 1 ? ( -loYStore__D1__0 = ((((loCoefs__b0x * loXStore__D1__0 + loCoefs__b1x * loXStore__D1__1) + loCoefs__b2x * loXStore__D1__2) - loCoefs__a1x * loYStore__D1__1) - loCoefs__a2x * loYStore__D1__2); -loYStore__D1__2 = loYStore__D1__1; -loYStore__D1__1 = loYStore__D1__0; -loXStore__D1__2 = loXStore__D1__1; -loXStore__D1__1 = loXStore__D1__0; -loXStore__D1__0 = spl1; -R__S6__0 = loYStore__D1__0; -spl1 = R__S6__0; -) : (loShelfYStore__D1__0 = ((((loShelfCoefs__b0x * loShelfXStore__D1__0 + loShelfCoefs__b1x * loShelfXStore__D1__1) + loShelfCoefs__b2x * loShelfXStore__D1__2) - loShelfCoefs__a1x * loShelfYStore__D1__1) - loShelfCoefs__a2x * loShelfYStore__D1__2); -loShelfYStore__D1__2 = loShelfYStore__D1__1; -loShelfYStore__D1__1 = loShelfYStore__D1__0; -loShelfXStore__D1__2 = loShelfXStore__D1__1; -loShelfXStore__D1__1 = loShelfXStore__D1__0; -loShelfXStore__D1__0 = spl1; -R__S6__0 = loShelfYStore__D1__0; -spl1 = R__S6__0; -); + lowType == 1 ? ( + loYStore__D1__0 = ((((loCoefs__b0x * loXStore__D1__0 + loCoefs__b1x * loXStore__D1__1) + loCoefs__b2x * loXStore__D1__2) - loCoefs__a1x * loYStore__D1__1) - loCoefs__a2x * loYStore__D1__2); + loYStore__D1__2 = loYStore__D1__1; + loYStore__D1__1 = loYStore__D1__0; + loXStore__D1__2 = loXStore__D1__1; + loXStore__D1__1 = loXStore__D1__0; + loXStore__D1__0 = spl1; + R__S6__0 = loYStore__D1__0; + spl1 = R__S6__0; + ) : ( + loShelfYStore__D1__0 = ((((loShelfCoefs__b0x * loShelfXStore__D1__0 + loShelfCoefs__b1x * loShelfXStore__D1__1) + loShelfCoefs__b2x * loShelfXStore__D1__2) - loShelfCoefs__a1x * loShelfYStore__D1__1) - loShelfCoefs__a2x * loShelfYStore__D1__2); + loShelfYStore__D1__2 = loShelfYStore__D1__1; + loShelfYStore__D1__1 = loShelfYStore__D1__0; + loShelfXStore__D1__2 = loShelfXStore__D1__1; + loShelfXStore__D1__1 = loShelfXStore__D1__0; + loShelfXStore__D1__0 = spl1; + R__S6__0 = loShelfYStore__D1__0; + spl1 = R__S6__0; + ); ); hpFreq > 20 ? ( -hpYStore__D1__0 = ((((hpCoefs__b0x * hpXStore__D1__0 + hpCoefs__b1x * hpXStore__D1__1) + hpCoefs__b2x * hpXStore__D1__2) - hpCoefs__a1x * hpYStore__D1__1) - hpCoefs__a2x * hpYStore__D1__2); -hpYStore__D1__2 = hpYStore__D1__1; -hpYStore__D1__1 = hpYStore__D1__0; -hpXStore__D1__2 = hpXStore__D1__1; -hpXStore__D1__1 = hpXStore__D1__0; -hpXStore__D1__0 = spl1; -R__S6__0 = hpYStore__D1__0; -spl1 = R__S6__0; + hpYStore__D1__0 = ((((hpCoefs__b0x * hpXStore__D1__0 + hpCoefs__b1x * hpXStore__D1__1) + hpCoefs__b2x * hpXStore__D1__2) - hpCoefs__a1x * hpYStore__D1__1) - hpCoefs__a2x * hpYStore__D1__2); + hpYStore__D1__2 = hpYStore__D1__1; + hpYStore__D1__1 = hpYStore__D1__0; + hpXStore__D1__2 = hpXStore__D1__1; + hpXStore__D1__1 = hpXStore__D1__0; + hpXStore__D1__0 = spl1; + R__S6__0 = hpYStore__D1__0; + spl1 = R__S6__0; ); spl1 = spl1 * outputGain; diff --git a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts index f6e5756..3bffb8f 100644 --- a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts @@ -37,78 +37,78 @@ lastBlock__size = 65536; @slider ampModel !== lastAmpModel ? ( -lastAmpModel = ampModel; -fileHandle__S5 = file_open(slider1); -importedBufferSampleRate__S5 = 0; -fileHandle__S5 > 0 ? ( -file_riff(fileHandle__S5, importedBufferChAmount, importedBufferSampleRate__S5); -importedBufferChAmount ? ( -importedBufferSize = file_avail(fileHandle__S5) / (importedBufferChAmount); -needsReFft = 1; -file_mem(fileHandle__S5, importedBuffer__B0, importedBufferSize * importedBufferChAmount); -); -file_close(fileHandle__S5); -); + lastAmpModel = ampModel; + fileHandle__S5 = file_open(slider1); + importedBufferSampleRate__S5 = 0; + fileHandle__S5 > 0 ? ( + file_riff(fileHandle__S5, importedBufferChAmount, importedBufferSampleRate__S5); + importedBufferChAmount ? ( + importedBufferSize = file_avail(fileHandle__S5) / (importedBufferChAmount); + needsReFft = 1; + file_mem(fileHandle__S5, importedBuffer__B0, importedBufferSize * importedBufferChAmount); + ); + file_close(fileHandle__S5); + ); ); @block needsReFft ? ( -importedBufferSize > 16384 ? ( -importedBufferSize = 16384; -); -fftSize = 32; -while (importedBufferSize > fftSize * 0.5) ( - fftSize += fftSize; -); -chunkSize = ((fftSize - importedBufferSize) - 1); -chunkSize2x = chunkSize * 2; -bufferPosition = 0; -currentBlock = 0; -inverseFftSize = 1 / (fftSize); -i__S10 = 0; -i2__S10 = 0; -interpolationCounter__S10 = 0; -while (interpolationCounter__S10 < min(fftSize, importedBufferSize)) ( - ipos__S13 = i__S10; -ipart__S13 = (i__S10 - ipos__S13); -convolutionSource__B0[i2__S10] = (importedBuffer__B0[ipos__S13 * importedBufferChAmount] * (1 - ipart__S13) + importedBuffer__B0[((ipos__S13 + 1) * importedBufferChAmount - 1)] * ipart__S13); -convolutionSource__B0[(i2__S10 + 1)] = (importedBuffer__B0[(ipos__S13 * importedBufferChAmount - 1)] * (1 - ipart__S13) + importedBuffer__B0[((ipos__S13 + 2) * importedBufferChAmount - 1)] * ipart__S13); -i__S10 += interpolationStepCount; -i2__S10 += 2; -interpolationCounter__S10 += 1; -); -zeroPadCounter__S10 = 0; -while (zeroPadCounter__S10 < (fftSize - importedBufferSize)) ( - convolutionSource__B0[i2__S10] = 0; -convolutionSource__B0[(i2__S10 + 1)] = 0; -i2__S10 += 2; -); -fft(convolutionSource__B0, fftSize); -i__S10 = 0; -normalizeCounter__S10 = 0; -while (normalizeCounter__S10 < fftSize * 2) ( - convolutionSource__B0[i__S10] *= inverseFftSize; -i__S10 += 1; -); -needsReFft = 0; + importedBufferSize > 16384 ? ( + importedBufferSize = 16384; + ); + fftSize = 32; + while (importedBufferSize > fftSize * 0.5) ( + fftSize += fftSize; + ); + chunkSize = ((fftSize - importedBufferSize) - 1); + chunkSize2x = chunkSize * 2; + bufferPosition = 0; + currentBlock = 0; + inverseFftSize = 1 / (fftSize); + i__S10 = 0; + i2__S10 = 0; + interpolationCounter__S10 = 0; + while (interpolationCounter__S10 < min(fftSize, importedBufferSize)) ( + ipos__S13 = i__S10; + ipart__S13 = (i__S10 - ipos__S13); + convolutionSource__B0[i2__S10] = (importedBuffer__B0[ipos__S13 * importedBufferChAmount] * (1 - ipart__S13) + importedBuffer__B0[((ipos__S13 + 1) * importedBufferChAmount - 1)] * ipart__S13); + convolutionSource__B0[(i2__S10 + 1)] = (importedBuffer__B0[(ipos__S13 * importedBufferChAmount - 1)] * (1 - ipart__S13) + importedBuffer__B0[((ipos__S13 + 2) * importedBufferChAmount - 1)] * ipart__S13); + i__S10 += interpolationStepCount; + i2__S10 += 2; + interpolationCounter__S10 += 1; + ); + zeroPadCounter__S10 = 0; + while (zeroPadCounter__S10 < (fftSize - importedBufferSize)) ( + convolutionSource__B0[i2__S10] = 0; + convolutionSource__B0[(i2__S10 + 1)] = 0; + i2__S10 += 2; + ); + fft(convolutionSource__B0, fftSize); + i__S10 = 0; + normalizeCounter__S10 = 0; + while (normalizeCounter__S10 < fftSize * 2) ( + convolutionSource__B0[i__S10] *= inverseFftSize; + i__S10 += 1; + ); + needsReFft = 0; ); @sample importedBufferSize > 0 ? ( -bufferPosition >= chunkSize ? ( -t__S19 = ?รค__DENY_COMPILATION; -?รค__DENY_COMPILATION = currentBlock; -currentBlock = t__S19; -memset(currentBlock * chunkSize * 2, 0, (fftSize - chunkSize) * 2); -fft(currentBlock, fftSize); -convolve_c(currentBlock, convolutionSource__B0, fftSize); -ifft(currentBlock, fftSize); -bufferPosition = 0; -); -bufferPosition2x__S18 = bufferPosition * 2; -?รค__DENY_COMPILATION = spl0; + bufferPosition >= chunkSize ? ( + t__S19 = ?รค__DENY_COMPILATION; + ?รค__DENY_COMPILATION = currentBlock; + currentBlock = t__S19; + memset(currentBlock * chunkSize * 2, 0, (fftSize - chunkSize) * 2); + fft(currentBlock, fftSize); + convolve_c(currentBlock, convolutionSource__B0, fftSize); + ifft(currentBlock, fftSize); + bufferPosition = 0; + ); + bufferPosition2x__S18 = bufferPosition * 2; + ?รค__DENY_COMPILATION = spl0; ); From f8d52195f0957c546f3ff8e6742dc590d92f46db Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 26 Aug 2024 14:40:03 +0200 Subject: [PATCH 18/42] Out pin label actually says "Out" --- .../js2eel/compiler/Js2EelCompiler.spec.ts | 24 ++++----- .../src/js2eel/compiler/Js2EelCompiler.ts | 2 +- .../registerDeclarationParam.spec.ts | 8 +-- .../arrayExpression/arrayExpression.spec.ts | 16 +++--- .../assignmentExpression.spec.ts | 52 +++++++++---------- .../binaryExpression/binaryExpression.spec.ts | 20 +++---- .../blockStatement/blockStatement.spec.ts | 12 ++--- .../callExpression/callExpression.spec.ts | 8 +-- .../eelLib/eelLibraryFunctionCall.spec.ts | 32 ++++++------ .../callExpression/js2EelLib/config.spec.ts | 12 ++--- .../js2EelLib/eachChannel.spec.ts | 16 +++--- .../js2EelLib/fileSelector.spec.ts | 16 +++--- .../js2EelLib/selectBox.spec.ts | 20 +++---- .../callExpression/js2EelLib/slider.spec.ts | 24 ++++----- .../utils/evaluateUserFunctionCall.spec.ts | 32 ++++++------ .../conditionalExpression.spec.ts | 40 +++++++------- .../arrowFunctionDeclaration.spec.ts | 20 +++---- .../functionDeclaration.spec.ts | 12 ++--- .../functionExpression.spec.ts | 12 ++--- .../identifier/identifier.spec.ts | 4 +- .../ifStatement/ifStatement.spec.ts | 16 +++--- .../generatorNodes/literal/literal.spec.ts | 12 ++--- .../logicalExpression.spec.ts | 24 ++++----- .../js2EelLib/consoleMemberCall.spec.ts | 16 +++--- .../js2EelLib/eelArrayMemberCall.spec.ts | 8 +-- .../js2EelLib/eelBufferMemberCall.spec.ts | 8 +-- .../js2EelLib/mathMemberCall.spec.ts | 4 +- .../memberExpressionCall.spec.ts | 8 +-- .../memberExpressionComputed.spec.ts | 52 +++++++++---------- .../memberExpressionStatic.spec.ts | 16 +++--- .../js2EelLib/newEelArray.spec.ts | 36 ++++++------- .../js2EelLib/newEelBuffer.spec.ts | 36 ++++++------- .../newExpression/newExpression.spec.ts | 8 +-- .../objectExpression/objectExpression.spec.ts | 16 +++--- .../generatorNodes/program/program.spec.ts | 32 ++++++------ .../returnStatement/returnStatement.spec.ts | 8 +-- .../unaryExpression/unaryExpression.spec.ts | 20 +++---- .../variableDeclaration.spec.ts | 44 ++++++++-------- .../test/examplePlugins/01_volume.spec.ts | 4 +- .../test/examplePlugins/02_sinewave.spec.ts | 4 +- .../test/examplePlugins/03_monoDelay.spec.ts | 4 +- .../examplePlugins/04_stereoDelay.spec.ts | 4 +- .../test/examplePlugins/05_lowpass.spec.ts | 4 +- .../test/examplePlugins/06_saturation.spec.ts | 4 +- .../test/examplePlugins/07_4band_eq.spec.ts | 4 +- .../test/examplePlugins/08_cab_sim.spec.ts | 4 +- .../test/examplePlugins/emptyPlugin.spec.ts | 4 +- 47 files changed, 391 insertions(+), 391 deletions(-) diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts index e02aa71..442d462 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts @@ -25,8 +25,8 @@ desc:somefunc in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -72,8 +72,8 @@ desc:somefunc in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -109,8 +109,8 @@ desc:somevar in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -264,8 +264,8 @@ desc:somevar in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -323,8 +323,8 @@ desc:somevar in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -372,8 +372,8 @@ slider1:myVar=3 < 0, 4, 1 >mySlider1 in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index 568c5d4..29c0797 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -251,7 +251,7 @@ export class Js2EelCompiler { this.src.eelSrcFinal += `in_pin:In ${i}\n`; } for (let i = 0; i < this.pluginData.outChannels; i++) { - this.src.eelSrcFinal += `out_pin:In ${i}\n`; + this.src.eelSrcFinal += `out_pin:Out ${i}\n`; } this.src.eelSrcFinal += '\n\n'; diff --git a/compiler/src/js2eel/declarationParams/registerDeclarationParam.spec.ts b/compiler/src/js2eel/declarationParams/registerDeclarationParam.spec.ts index 162c00c..9c0981e 100644 --- a/compiler/src/js2eel/declarationParams/registerDeclarationParam.spec.ts +++ b/compiler/src/js2eel/declarationParams/registerDeclarationParam.spec.ts @@ -20,8 +20,8 @@ desc:saturation in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -54,8 +54,8 @@ desc:saturation in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/arrayExpression/arrayExpression.spec.ts b/compiler/src/js2eel/generatorNodes/arrayExpression/arrayExpression.spec.ts index 783da17..49c6af9 100644 --- a/compiler/src/js2eel/generatorNodes/arrayExpression/arrayExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/arrayExpression/arrayExpression.spec.ts @@ -31,8 +31,8 @@ desc:wrongarray in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -69,8 +69,8 @@ desc:wrongarray in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -109,8 +109,8 @@ desc:wrongarray in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -145,8 +145,8 @@ slider1:algorithm=-1 < 0, 0, 1 {} >Algorithm in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/assignmentExpression/assignmentExpression.spec.ts b/compiler/src/js2eel/generatorNodes/assignmentExpression/assignmentExpression.spec.ts index aca9ff0..2e9f143 100644 --- a/compiler/src/js2eel/generatorNodes/assignmentExpression/assignmentExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/assignmentExpression/assignmentExpression.spec.ts @@ -28,8 +28,8 @@ desc:assignmentExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -73,8 +73,8 @@ desc:assignmentExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -116,8 +116,8 @@ desc:assignmentExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -165,8 +165,8 @@ slider1:algorithm=0 < 0, 2, 1 {Sigmoid, Hyperbolic Tangent} >Algorithm in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -214,8 +214,8 @@ slider1:algorithm=0 < 0, 2, 1 {Sigmoid, Hyperbolic Tangent} >Algorithm in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -263,8 +263,8 @@ slider1:algorithm=0 < 0, 2, 1 {Sigmoid, Hyperbolic Tangent} >Algorithm in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -312,8 +312,8 @@ slider1:algorithm=0 < 0, 2, 1 {Sigmoid, Hyperbolic Tangent} >Algorithm in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -348,8 +348,8 @@ desc:assignmentExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -387,8 +387,8 @@ desc:assignmentExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -426,8 +426,8 @@ desc:assignmentExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -477,8 +477,8 @@ desc:assignmentExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -507,8 +507,8 @@ desc:assignmentExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 myVar = ; @@ -537,8 +537,8 @@ desc:sinewave in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.spec.ts b/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.spec.ts index f3f845f..2e3c2e5 100644 --- a/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/binaryExpression/binaryExpression.spec.ts @@ -15,8 +15,8 @@ desc:teststuff in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -46,8 +46,8 @@ desc:teststuff in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -96,8 +96,8 @@ slider1:algorithm=0 < 0, 3, 1 {Sigmoid, Hyperbolic Tangent, Hard Clip} >Algorith in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -148,8 +148,8 @@ slider1:algorithm=0 < 0, 3, 1 {Sigmoid, Hyperbolic Tangent, Hard Clip} >Algorith in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 ?รค__DENY_COMPILATION ? ( @@ -195,8 +195,8 @@ slider1:algorithm=0 < 0, 3, 1 {Sigmoid, Hyperbolic Tangent, Hard Clip} >Algorith in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 ?รค__DENY_COMPILATION ? ( diff --git a/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.spec.ts b/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.spec.ts index 3cc2fc3..99eaff2 100644 --- a/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.spec.ts +++ b/compiler/src/js2eel/generatorNodes/blockStatement/blockStatement.spec.ts @@ -19,8 +19,8 @@ desc:blockStatement in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `; @@ -46,8 +46,8 @@ desc:blockStatement in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `; @@ -80,8 +80,8 @@ desc:blockStatement in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample diff --git a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.spec.ts index 03529b3..24af03d 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.spec.ts @@ -18,8 +18,8 @@ desc:teststuff in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 myVar = ; @@ -47,8 +47,8 @@ desc:callExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `; diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.spec.ts index 0140356..8808a98 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.spec.ts @@ -19,8 +19,8 @@ desc:libFuncCallTest in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -51,8 +51,8 @@ desc:libFuncCallTest in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -89,8 +89,8 @@ desc:libFuncCallTest in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -131,8 +131,8 @@ desc:libFuncCallTest in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -168,8 +168,8 @@ desc:libFuncCallTest in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -203,8 +203,8 @@ desc:libFuncCallTest in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -239,8 +239,8 @@ desc:libFuncCallTest in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -279,8 +279,8 @@ desc:libFuncCallTest in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.spec.ts index 24b3999..97241dc 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.spec.ts @@ -21,8 +21,8 @@ desc: in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -46,8 +46,8 @@ desc:config() in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -67,8 +67,8 @@ desc: in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/eachChannel.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/eachChannel.spec.ts index 410fb76..c08e4ed 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/eachChannel.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/eachChannel.spec.ts @@ -22,8 +22,8 @@ desc:eachChannel in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -49,8 +49,8 @@ desc:eachChannel in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -76,8 +76,8 @@ desc:eachChannel in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -107,8 +107,8 @@ desc:eachChannel in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts index 9ebcecd..e6ac5ec 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts @@ -28,8 +28,8 @@ desc:fileSelector in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -59,8 +59,8 @@ slider1:/amp_models:none:Impulse Response in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -89,8 +89,8 @@ slider1:/amp_models:none:Impulse Response in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -116,8 +116,8 @@ desc:sd_amp_sim in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts index 348830c..d478661 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts @@ -32,8 +32,8 @@ desc:selectBox in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -84,8 +84,8 @@ slider1:algorithm=0 < 0, 3, 1 {Sigmoid, Hyperbolic Tangent, Hard Clip} >Algorith in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -121,8 +121,8 @@ desc:selectBox in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -172,8 +172,8 @@ slider1:algorithm=0 < 0, 3, 1 {Sigmoid, Hyperbolic Tangent, Hard Clip} >Algorith in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -209,8 +209,8 @@ desc:selectBox in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.spec.ts index 0216604..8e81c5c 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.spec.ts @@ -22,8 +22,8 @@ desc:slider in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -53,8 +53,8 @@ slider1:volume=0 < -150, 18, 0.1 >Volume [dB] in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -80,8 +80,8 @@ desc:slider in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -110,8 +110,8 @@ slider1:volume=0 < -150, 18, 0.1 >Volume [dB] in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -139,8 +139,8 @@ slider1:volume=0 < -150, 18, 0.1 >Volume [dB] in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -166,8 +166,8 @@ desc:slider in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateUserFunctionCall.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateUserFunctionCall.spec.ts index 4824169..5e441e5 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateUserFunctionCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateUserFunctionCall.spec.ts @@ -24,8 +24,8 @@ desc:functions in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -63,8 +63,8 @@ desc:functions in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -102,8 +102,8 @@ desc:functions in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -141,8 +141,8 @@ desc:functions in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -180,8 +180,8 @@ desc:functions in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -218,8 +218,8 @@ desc:functions in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -258,8 +258,8 @@ desc:functions in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -296,8 +296,8 @@ desc:functions in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts b/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts index 5828da7..da152d1 100644 --- a/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts @@ -21,8 +21,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -54,8 +54,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -87,8 +87,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -120,8 +120,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -152,8 +152,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -184,8 +184,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -216,8 +216,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -248,8 +248,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -281,8 +281,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -322,8 +322,8 @@ desc:conditional in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/functionDeclaration/arrowFunctionDeclaration.spec.ts b/compiler/src/js2eel/generatorNodes/functionDeclaration/arrowFunctionDeclaration.spec.ts index 4cc6e62..4985a4d 100644 --- a/compiler/src/js2eel/generatorNodes/functionDeclaration/arrowFunctionDeclaration.spec.ts +++ b/compiler/src/js2eel/generatorNodes/functionDeclaration/arrowFunctionDeclaration.spec.ts @@ -19,8 +19,8 @@ desc:arrowFunction in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -47,8 +47,8 @@ desc:arrowFunction in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -83,8 +83,8 @@ desc:arrowFunction in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 R__S1__0 = 3; @@ -108,8 +108,8 @@ desc:arrowFunction in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -143,8 +143,8 @@ desc:nestedFunctionCalls in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 R__S1__0 = 3; diff --git a/compiler/src/js2eel/generatorNodes/functionDeclaration/functionDeclaration.spec.ts b/compiler/src/js2eel/generatorNodes/functionDeclaration/functionDeclaration.spec.ts index 24fda88..829f8a1 100644 --- a/compiler/src/js2eel/generatorNodes/functionDeclaration/functionDeclaration.spec.ts +++ b/compiler/src/js2eel/generatorNodes/functionDeclaration/functionDeclaration.spec.ts @@ -21,8 +21,8 @@ desc:functionDeclaration in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -52,8 +52,8 @@ desc:functionDeclaration in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -78,8 +78,8 @@ desc:functionDeclaration in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.spec.ts b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.spec.ts index fd3beb3..cae4340 100644 --- a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.spec.ts @@ -21,8 +21,8 @@ desc:function_expression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -54,8 +54,8 @@ desc:function_expression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -80,8 +80,8 @@ desc:function_expression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/identifier/identifier.spec.ts b/compiler/src/js2eel/generatorNodes/identifier/identifier.spec.ts index a000ef0..b2f5367 100644 --- a/compiler/src/js2eel/generatorNodes/identifier/identifier.spec.ts +++ b/compiler/src/js2eel/generatorNodes/identifier/identifier.spec.ts @@ -19,8 +19,8 @@ desc:mono_delay in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts index 4773596..72c15a8 100644 --- a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts +++ b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts @@ -20,8 +20,8 @@ desc:eachChannel in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 ?รค__DENY_COMPILATION ? ( @@ -48,8 +48,8 @@ desc:eachChannel in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 3 > 4 ? ( @@ -78,8 +78,8 @@ desc:eachChannel in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 3 > 4 ? ( @@ -119,8 +119,8 @@ desc:ifStatement in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/literal/literal.spec.ts b/compiler/src/js2eel/generatorNodes/literal/literal.spec.ts index d5cad8d..eb224bd 100644 --- a/compiler/src/js2eel/generatorNodes/literal/literal.spec.ts +++ b/compiler/src/js2eel/generatorNodes/literal/literal.spec.ts @@ -20,8 +20,8 @@ desc:accessors in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -50,8 +50,8 @@ desc:accessors in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -80,8 +80,8 @@ desc:accessors in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts b/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts index c4790b1..876eca4 100644 --- a/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts @@ -27,8 +27,8 @@ desc:logicalExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -68,8 +68,8 @@ desc:logicalExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -109,8 +109,8 @@ desc:logicalExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -150,8 +150,8 @@ desc:logicalExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -191,8 +191,8 @@ desc:logicalExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -233,8 +233,8 @@ desc:logicalExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/consoleMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/consoleMemberCall.spec.ts index 3e9f400..5ac17bc 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/consoleMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/consoleMemberCall.spec.ts @@ -17,8 +17,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -46,8 +46,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -75,8 +75,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -103,8 +103,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelArrayMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelArrayMemberCall.spec.ts index 0750d43..08c4fe6 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelArrayMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelArrayMemberCall.spec.ts @@ -19,8 +19,8 @@ desc:arraymembers in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 dim = ; @@ -50,8 +50,8 @@ desc:arraymembers in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 dim = 2; diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts index 1e510d3..f5a1cca 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts @@ -23,8 +23,8 @@ desc:eelBufferMemberCall in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -60,8 +60,8 @@ desc:eelBufferMemberCall in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/mathMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/mathMemberCall.spec.ts index 5122b55..ead4e3e 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/mathMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/mathMemberCall.spec.ts @@ -18,8 +18,8 @@ desc:blockStatement in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.spec.ts index 870822b..184cde4 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.spec.ts @@ -18,8 +18,8 @@ desc:member_expression_call in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 myVar = ; @@ -43,8 +43,8 @@ desc:member_expression_call in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 myVar = ; diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts index da72a37..6798a48 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts @@ -20,8 +20,8 @@ desc:memberExpressionComputed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 someVar = ?รค__DENY_COMPILATION; @@ -50,8 +50,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -86,8 +86,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -122,8 +122,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -158,8 +158,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -194,8 +194,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -230,8 +230,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -268,8 +268,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -311,8 +311,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -352,8 +352,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -396,8 +396,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample @@ -443,8 +443,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -486,8 +486,8 @@ desc:member_expression_computed in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.spec.ts index e28aa70..8cdd3e8 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.spec.ts @@ -23,8 +23,8 @@ desc:member_expression_static in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 myVar = ; @@ -56,8 +56,8 @@ desc:member_expression_static in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -93,8 +93,8 @@ desc:member_expression_static in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -133,8 +133,8 @@ desc:member_expression_static in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @sample diff --git a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.spec.ts b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.spec.ts index 5b8b48a..67eefbd 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.spec.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.spec.ts @@ -19,8 +19,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -47,8 +47,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -74,8 +74,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -100,8 +100,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -126,8 +126,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -153,8 +153,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -180,8 +180,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -207,8 +207,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -234,8 +234,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.spec.ts b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.spec.ts index f28b998..8f5794b 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.spec.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.spec.ts @@ -19,8 +19,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -47,8 +47,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -74,8 +74,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -100,8 +100,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -126,8 +126,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -153,8 +153,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -180,8 +180,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -207,8 +207,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -234,8 +234,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/newExpression/newExpression.spec.ts b/compiler/src/js2eel/generatorNodes/newExpression/newExpression.spec.ts index 4691f79..4603773 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/newExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/newExpression.spec.ts @@ -20,8 +20,8 @@ desc:newExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -46,8 +46,8 @@ desc:newExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.spec.ts b/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.spec.ts index 8d44920..5e1a8a2 100644 --- a/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.spec.ts @@ -25,8 +25,8 @@ desc:object_expression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -60,8 +60,8 @@ desc:object_expression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -90,8 +90,8 @@ desc:object_expression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -120,8 +120,8 @@ desc:object_expression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/program/program.spec.ts b/compiler/src/js2eel/generatorNodes/program/program.spec.ts index d11b97b..5f5494d 100644 --- a/compiler/src/js2eel/generatorNodes/program/program.spec.ts +++ b/compiler/src/js2eel/generatorNodes/program/program.spec.ts @@ -19,8 +19,8 @@ desc:return in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -43,8 +43,8 @@ desc: in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -76,8 +76,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -103,8 +103,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -130,8 +130,8 @@ desc:alert in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -157,8 +157,8 @@ desc:program in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -185,8 +185,8 @@ desc:program in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -212,8 +212,8 @@ desc:program in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/returnStatement/returnStatement.spec.ts b/compiler/src/js2eel/generatorNodes/returnStatement/returnStatement.spec.ts index fc330b0..babe733 100644 --- a/compiler/src/js2eel/generatorNodes/returnStatement/returnStatement.spec.ts +++ b/compiler/src/js2eel/generatorNodes/returnStatement/returnStatement.spec.ts @@ -21,8 +21,8 @@ desc:return in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -49,8 +49,8 @@ desc:return in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) diff --git a/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts b/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts index a7fe670..e394473 100644 --- a/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts @@ -20,8 +20,8 @@ desc:test in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -53,8 +53,8 @@ desc:sinewave in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -95,8 +95,8 @@ desc:unaryExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -144,8 +144,8 @@ desc:unaryExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -187,8 +187,8 @@ desc:unaryExpression in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/generatorNodes/variableDeclaration/variableDeclaration.spec.ts b/compiler/src/js2eel/generatorNodes/variableDeclaration/variableDeclaration.spec.ts index e10f418..e08123b 100644 --- a/compiler/src/js2eel/generatorNodes/variableDeclaration/variableDeclaration.spec.ts +++ b/compiler/src/js2eel/generatorNodes/variableDeclaration/variableDeclaration.spec.ts @@ -17,8 +17,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -41,8 +41,8 @@ desc:variableDeclaration in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -65,8 +65,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -89,8 +89,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -130,8 +130,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -159,8 +159,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -183,8 +183,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 myArr = ; @@ -210,8 +210,8 @@ desc:sAmEnAmE in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) @@ -234,8 +234,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -262,8 +262,8 @@ desc:volume in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init @@ -290,8 +290,8 @@ desc:variableDeclaration in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 someVar = 4 < 5 ? 1 : 2; diff --git a/compiler/src/js2eel/test/examplePlugins/01_volume.spec.ts b/compiler/src/js2eel/test/examplePlugins/01_volume.spec.ts index 1be30d4..fa7660d 100644 --- a/compiler/src/js2eel/test/examplePlugins/01_volume.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/01_volume.spec.ts @@ -14,8 +14,8 @@ slider1:volume=0 < -150, 18, 0.1 >Volume [dB] in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/test/examplePlugins/02_sinewave.spec.ts b/compiler/src/js2eel/test/examplePlugins/02_sinewave.spec.ts index 8a0498d..de5dcfe 100644 --- a/compiler/src/js2eel/test/examplePlugins/02_sinewave.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/02_sinewave.spec.ts @@ -15,8 +15,8 @@ slider2:voldb=-9 < -72, 0, 0.1 >Volume [dB] in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @slider diff --git a/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts b/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts index 878a5b2..1e32778 100644 --- a/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/03_monoDelay.spec.ts @@ -15,8 +15,8 @@ slider2:mixDb=-6 < -120, 6, 1 >Mix (dB) in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts b/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts index 10305d7..af2a6bf 100644 --- a/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/04_stereoDelay.spec.ts @@ -22,8 +22,8 @@ slider1:type=0 < 0, 3, 1 {Mono, Stereo, Ping Pong} >Type in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/test/examplePlugins/05_lowpass.spec.ts b/compiler/src/js2eel/test/examplePlugins/05_lowpass.spec.ts index 51ea6f3..031111a 100644 --- a/compiler/src/js2eel/test/examplePlugins/05_lowpass.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/05_lowpass.spec.ts @@ -16,8 +16,8 @@ slider50:outputGainDb=0 < -15, 15, 0.01 >Output Gain (dB) in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/test/examplePlugins/06_saturation.spec.ts b/compiler/src/js2eel/test/examplePlugins/06_saturation.spec.ts index c95588f..741caa6 100644 --- a/compiler/src/js2eel/test/examplePlugins/06_saturation.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/06_saturation.spec.ts @@ -17,8 +17,8 @@ slider3:algorithm=0 < 0, 3, 1 {Sigmoid, Hyperbolic Tangent, Hard Clip} >Algorith in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @slider diff --git a/compiler/src/js2eel/test/examplePlugins/07_4band_eq.spec.ts b/compiler/src/js2eel/test/examplePlugins/07_4band_eq.spec.ts index e2a2f7c..937a2be 100644 --- a/compiler/src/js2eel/test/examplePlugins/07_4band_eq.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/07_4band_eq.spec.ts @@ -33,8 +33,8 @@ slider20:lowType=0 < 0, 2, 1 {Shelf, Peak} >Low Type in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts index 3bffb8f..17d8324 100644 --- a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts @@ -15,8 +15,8 @@ slider1:/amp_models:none:Impulse Response in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 @init diff --git a/compiler/src/js2eel/test/examplePlugins/emptyPlugin.spec.ts b/compiler/src/js2eel/test/examplePlugins/emptyPlugin.spec.ts index b5c879f..3392413 100644 --- a/compiler/src/js2eel/test/examplePlugins/emptyPlugin.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/emptyPlugin.spec.ts @@ -16,8 +16,8 @@ desc:playground in_pin:In 0 in_pin:In 1 -out_pin:In 0 -out_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 `) From b9447ed8338e0ffffb173a09ee3ec16ea22323db Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 26 Aug 2024 14:59:32 +0200 Subject: [PATCH 19/42] Assign file selector value to its variable in @slider --- compiler/package.json | 2 +- compiler/src/js2eel/compiler/Js2EelCompiler.ts | 4 ++++ .../callExpression/js2EelLib/onSlider.ts | 11 +++++++++++ .../src/js2eel/test/examplePlugins/08_cab_sim.spec.ts | 2 ++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/compiler/package.json b/compiler/package.json index 28b76cb..8771ee5 100644 --- a/compiler/package.json +++ b/compiler/package.json @@ -21,7 +21,7 @@ "dist:esm": "tsc -p tsconfig.esm.json", "dist:cjs": "tsc -p tsconfig.cjs.json", "dist": "npm run parseTypeDocs && rm -rf ./dist/* && npm run dist:esm && npm run dist:cjs && node ./scripts/setVersionConstant.mjs", - "test": "c8 mocha './dist/cjs/**/*.spec.js' --reporter-option maxDiffSize=0", + "test": "npm run dist:cjs && c8 mocha './dist/cjs/**/*.spec.js' --reporter-option maxDiffSize=0", "test:single": "mocha './dist/cjs/**/*.spec.js' --reporter-option maxDiffSize=0 --grep", "check": "eslint ./src && tsc --noEmit", "parseTypeDocs": "node ./scripts/parseTypeDocs.mjs" diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index 29c0797..39a9f75 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -394,6 +394,10 @@ export class Js2EelCompiler { return this.pluginData.fileSelectors[fileSelectorName]; } + getFileSelectors(): { [id in string]: FileSelector } { + return this.pluginData.fileSelectors; + } + setOnInitSrc(src: string): void { this.src.onInitSrc = src; } diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.ts index b7a75ff..02608c3 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.ts @@ -51,6 +51,17 @@ export const onSlider = (callExpression: CallExpression, instance: Js2EelCompile if (onSlidersCallbackSrc) { onSlidersSrc += '@slider\n\n'; + + const fileSelectors = instance.getFileSelectors(); + + if (Object.entries(fileSelectors).length) { + for (const fileSelector of Object.values(fileSelectors)) { + onSlidersSrc += `${fileSelector.variable} = slider${fileSelector.sliderNumber};`; + } + + onSlidersSrc += '\n\n'; + } + onSlidersSrc += onSlidersCallbackSrc; onSlidersSrc += '\n\n'; } diff --git a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts index 17d8324..90996eb 100644 --- a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts @@ -36,6 +36,8 @@ lastBlock__size = 65536; @slider +ampModel = slider1; + ampModel !== lastAmpModel ? ( lastAmpModel = ampModel; fileHandle__S5 = file_open(slider1); From 26d3bcd51fe1132ebf00b65b3ca6b8e67df7ae87 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Mon, 26 Aug 2024 16:55:47 +0200 Subject: [PATCH 20/42] New lines after @block --- .../generatorNodes/functionExpression/functionExpression.ts | 2 ++ compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts index c22343e..398eb12 100644 --- a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts +++ b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts @@ -195,6 +195,8 @@ ${prefixChannel(i)} = ${i}; case 'BlockStatement': { functionExpressionSrc += '@block\n\n'; functionExpressionSrc += blockStatement(body, 'onBlock', instance); + functionExpressionSrc += '\n\n'; + break; } default: { diff --git a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts index 90996eb..c2a8114 100644 --- a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts @@ -96,6 +96,8 @@ needsReFft ? ( ); needsReFft = 0; ); + + @sample importedBufferSize > 0 ? ( From a8ba43ce238459c4631a55b03b9739354be33d87 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 14:54:44 +0200 Subject: [PATCH 21/42] Implement buffer swap --- .../src/js2eel/compiler/Js2EelCompiler.ts | 10 +-- .../eelLib/eelLibraryFunctionCall.ts | 2 +- .../utils/evaluateLibraryFunctionCall.ts | 2 +- .../js2EelLib/eelBufferMemberCall.ts | 64 +++++++++++++++++++ 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index 39a9f75..50691c5 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -478,15 +478,17 @@ export class Js2EelCompiler { return this.pluginData.eelBufferOffset; } - setEelBuffer(eelBuffer: EelBuffer): void { - if (!this.pluginData.eelBuffers[eelBuffer.name]) { - this.pluginData.eelBuffers[eelBuffer.name] = eelBuffer; - } else { + setEelBuffer(eelBuffer: EelBuffer, checkExisting = true): void { + const exists = !!this.pluginData.eelBuffers[eelBuffer.name]; + + if (checkExisting && exists) { this.error( 'SymbolAlreadyDeclaredError', 'EelBuffer with this name already exists: ' + eelBuffer.name, null ); + } else { + this.pluginData.eelBuffers[eelBuffer.name] = eelBuffer; } } diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index 77e3a71..9a68c36 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -361,7 +361,7 @@ export const eelLibraryFunctionCall = ( switch (arg.type) { case 'Identifier': { - argsSrc += identifier(arg, instance); + argsSrc += identifier(arg, instance, { isParam: true }); break; } case 'BinaryExpression': { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateLibraryFunctionCall.ts index 9e312db..362c2ac 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateLibraryFunctionCall.ts @@ -164,7 +164,7 @@ export const evaluateLibraryFunctionCall = ( break; } case 'Identifier': { - const id = identifier(givenArg, instance); + const id = identifier(givenArg, instance, { isParam: true }); value = id; rawValue = id; break; diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts index f65b817..04c189f 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts @@ -57,6 +57,70 @@ export const eelBufferMemberCall = ( break; } + case 'swap': { + const { args, errors } = evaluateLibraryFunctionCall( + callExpression, + [ + { + name: 'otherBuffer', + required: true, + allowedValues: [{ nodeType: 'Identifier' }] + } + ], + instance + ); + + if (errors) { + instance.multipleErrors(errors); + + return JSFX_DENY_COMPILATION; + } + + const otherBuffer = instance.getEelBuffer(args.otherBuffer.name); + + if (!otherBuffer) { + instance.error( + 'TypeError', + `Given argument ${args.otherBuffer.name} is not of type EelBuffer`, + args.otherBuffer.node + ); + + return JSFX_DENY_COMPILATION; + } + + if (otherBuffer.dimensions !== eelBuffer.dimensions) { + instance.error( + 'BoundaryError', + `Other buffer ${args.otherBuffer.name} has different dimensions: ${otherBuffer.dimensions}`, + args.otherBuffer.node + ); + + return JSFX_DENY_COMPILATION; + } + + if (otherBuffer.size !== eelBuffer.size) { + instance.error( + 'BoundaryError', + `Other buffer ${args.otherBuffer.name} has different size: ${otherBuffer.size}`, + args.otherBuffer.node + ); + + return JSFX_DENY_COMPILATION; + } + + for (let i = 0; i < eelBuffer.dimensions; i++) { + const printedOrigBuffer = suffixEelBuffer(eelBuffer.name, i.toString()); + const printedOtherBuffer = suffixEelBuffer(otherBuffer.name, i.toString()); + + bufferMemberCallSrc += `__TEMP_BUFFER_SWAP__${i} = ${printedOrigBuffer}; +${printedOrigBuffer} = ${printedOtherBuffer}; +${printedOtherBuffer} = __TEMP_BUFFER_SWAP__${i}; + +`; + } + + break; + } default: { instance.error( 'UnknownSymbolError', From 5cac942315265e39d7c5e3331f0c2241e03a2527 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 15:12:48 +0200 Subject: [PATCH 22/42] Actually print onInit code --- .../generatorNodes/functionExpression/functionExpression.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts index 398eb12..23a6ef8 100644 --- a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts +++ b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.ts @@ -177,7 +177,7 @@ ${prefixChannel(i)} = ${i}; case 'onInit': { switch (body.type) { case 'BlockStatement': { - blockStatement(body, 'onInit', instance); + functionExpressionSrc += blockStatement(body, 'onInit', instance); break; } default: { From bee19b6266bb59865f7f41e61ef3931cb7481c45 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 15:13:02 +0200 Subject: [PATCH 23/42] Cab sim (almost) works --- .../js2EelLib/eelBufferMemberCall.ts | 1 - .../test/examplePlugins/08_cab_sim.spec.ts | 45 +++++++++++-------- examples/08_cab_sim.js | 39 +++++++++++----- 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts index 04c189f..bd4a5a4 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts @@ -115,7 +115,6 @@ export const eelBufferMemberCall = ( bufferMemberCallSrc += `__TEMP_BUFFER_SWAP__${i} = ${printedOrigBuffer}; ${printedOrigBuffer} = ${printedOtherBuffer}; ${printedOtherBuffer} = __TEMP_BUFFER_SWAP__${i}; - `; } diff --git a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts index c2a8114..b093b79 100644 --- a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts @@ -9,7 +9,7 @@ const JS_CAB_SIM_SRC = fs.readFileSync(path.resolve('../examples/08_cab_sim.js') const EEL_CAB_SIM_SRC_EXPECTED = `/* Compiled with JS2EEL v0.10.0 */ -desc:cab_sim +desc:sd_amp_sim slider1:/amp_models:none:Impulse Response @@ -32,6 +32,11 @@ importedBuffer__B0 = 0 * 131072 + 131072; importedBuffer__size = 131072; lastBlock__B0 = 0 * 65536 + 262144; lastBlock__size = 65536; +currentBlock__B0 = 0 * 65536 + 327680; +currentBlock__size = 65536; + + +ext_tail_size = 32768; @slider @@ -67,7 +72,6 @@ needsReFft ? ( chunkSize = ((fftSize - importedBufferSize) - 1); chunkSize2x = chunkSize * 2; bufferPosition = 0; - currentBlock = 0; inverseFftSize = 1 / (fftSize); i__S10 = 0; i2__S10 = 0; @@ -86,6 +90,7 @@ needsReFft ? ( convolutionSource__B0[i2__S10] = 0; convolutionSource__B0[(i2__S10 + 1)] = 0; i2__S10 += 2; + zeroPadCounter__S10 += 1; ); fft(convolutionSource__B0, fftSize); i__S10 = 0; @@ -93,6 +98,7 @@ needsReFft ? ( while (normalizeCounter__S10 < fftSize * 2) ( convolutionSource__B0[i__S10] *= inverseFftSize; i__S10 += 1; + normalizeCounter__S10 += 1; ); needsReFft = 0; ); @@ -102,17 +108,25 @@ needsReFft ? ( importedBufferSize > 0 ? ( bufferPosition >= chunkSize ? ( - t__S19 = ?รค__DENY_COMPILATION; - ?รค__DENY_COMPILATION = currentBlock; - currentBlock = t__S19; - memset(currentBlock * chunkSize * 2, 0, (fftSize - chunkSize) * 2); - fft(currentBlock, fftSize); - convolve_c(currentBlock, convolutionSource__B0, fftSize); - ifft(currentBlock, fftSize); + __TEMP_BUFFER_SWAP__0 = lastBlock__B0; + lastBlock__B0 = currentBlock__B0; + currentBlock__B0 = __TEMP_BUFFER_SWAP__0; + memset((currentBlock__B0 + chunkSize * 2), 0, (fftSize - chunkSize) * 2); + fft(currentBlock__B0, fftSize); + convolve_c(currentBlock__B0, convolutionSource__B0, fftSize); + ifft(currentBlock__B0, fftSize); bufferPosition = 0; ); bufferPosition2x__S18 = bufferPosition * 2; - ?รค__DENY_COMPILATION = spl0; + lastBlock__B0[bufferPosition2x__S18] = spl0; + lastBlock__B0[(bufferPosition2x__S18 + 1)] = 0; + spl0 = currentBlock__B0[bufferPosition2x__S18]; + spl1 = currentBlock__B0[(bufferPosition2x__S18 + 1)]; + bufferPosition < (fftSize - chunkSize) ? ( + spl0 += lastBlock__B0[(chunkSize2x + bufferPosition2x__S18)]; + spl1 += lastBlock__B0[((chunkSize2x + bufferPosition2x__S18) + 1)]; + ); + bufferPosition += 1; ); @@ -124,14 +138,9 @@ describe('Example Test: Cab Sim', () => { it('Compiles cab sim', () => { const result = js2EelCompiler.compile(JS_CAB_SIM_SRC); - expect(result.success).to.equal(false); + expect(result.success).to.equal(true); expect(testEelSrc(result.src)).to.equal(testEelSrc(EEL_CAB_SIM_SRC_EXPECTED)); - expect(result.errors.length).to.equal(3); - expect(result.errors.map((error) => error.type)).to.deep.equal([ - 'GenericError', - 'GenericError', - 'GenericError' - ]); - expect(result.warnings.length).to.equal(2); + expect(result.errors.length).to.equal(0); + expect(result.warnings.length).to.equal(0); }); }); diff --git a/examples/08_cab_sim.js b/examples/08_cab_sim.js index 177af2c..15c5439 100644 --- a/examples/08_cab_sim.js +++ b/examples/08_cab_sim.js @@ -1,4 +1,4 @@ -config({ description: 'cab_sim', inChannels: 2, outChannels: 2 }); +config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); let fftSize = -1; let needsReFft = true; @@ -10,8 +10,8 @@ let importedBufferSize; let chunkSize; let chunkSize2x; let bufferPosition; -let currentBlock; let lastBlock = new EelBuffer(1, 65536); // 64 * 1024 +let currentBlock = new EelBuffer(1, 65536); // 64 * 1024 let inverseFftSize; const interpolationStepCount = 1.0; @@ -67,7 +67,6 @@ onBlock(() => { chunkSize = fftSize - importedBufferSize - 1; chunkSize2x = chunkSize * 2; bufferPosition = 0; - currentBlock = 0; inverseFftSize = 1 / fftSize; @@ -100,6 +99,8 @@ onBlock(() => { convolutionSource[0][i2] = 0; convolutionSource[0][i2 + 1] = 0; i2 += 2; + + zeroPadCounter++; } fft(convolutionSource.start(), fftSize); @@ -111,6 +112,8 @@ onBlock(() => { while (normalizeCounter < fftSize * 2) { convolutionSource[0][i] *= inverseFftSize; i += 1; + + normalizeCounter++; } needsReFft = false; @@ -120,20 +123,34 @@ onBlock(() => { onSample(() => { if (importedBufferSize > 0) { if (bufferPosition >= chunkSize) { - const t = lastBlock; - lastBlock = currentBlock; - currentBlock = t; + // Swap current and last blocks, zero-pad last block + lastBlock.swap(currentBlock); - memset(currentBlock * chunkSize * 2, 0, (fftSize - chunkSize) * 2); + memset(currentBlock.start() + chunkSize * 2, 0, (fftSize - chunkSize) * 2); - fft(currentBlock, fftSize); - convolve_c(currentBlock, convolutionSource.start(), fftSize); - ifft(currentBlock, fftSize); + // Perform FFT on currentBlock, convolve, and perform inverse FFT + fft(currentBlock.start(), fftSize); + convolve_c(currentBlock.start(), convolutionSource.start(), fftSize); + ifft(currentBlock.start(), fftSize); bufferPosition = 0; } + // Save sample const bufferPosition2x = bufferPosition * 2; - lastBlock[bufferPosition2x] = spl0; + + lastBlock[0][bufferPosition2x] = spl0; + lastBlock[0][bufferPosition2x + 1] = 0; + + spl0 = currentBlock[0][bufferPosition2x]; + spl1 = currentBlock[0][bufferPosition2x + 1]; + + // Apply overlap-and-add for block continuity + if (bufferPosition < fftSize - chunkSize) { + spl0 += lastBlock[0][chunkSize2x + bufferPosition2x]; + spl1 += lastBlock[0][chunkSize2x + bufferPosition2x + 1]; + } + + bufferPosition += 1; } }); From e26daf91ce2f138ef101df0598f0208661df7e3f Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 15:20:50 +0200 Subject: [PATCH 24/42] CI: Use current Node LTS (20) --- .github/workflows/node.js.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index c1ccbd9..4dfaa53 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [20.x] steps: - uses: actions/checkout@v3 @@ -42,7 +42,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [20.x] steps: - uses: actions/checkout@v3 @@ -71,7 +71,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [20.x] steps: - uses: actions/checkout@v3 From 7edc8c5bc0fd65fa57eb41908396cf0e1c4e1204 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 15:40:52 +0200 Subject: [PATCH 25/42] Convert compiler & tests to ESM; update all packages --- compiler/.eslintrc.cjs | 6 +- compiler/package-lock.json | 4681 +++++++++++++---- compiler/package.json | 36 +- .../js2eel/compiler/Js2EelCompiler.spec.ts | 4 +- .../registerDeclarationParam.spec.ts | 4 +- .../registerDeclarationParam.ts | 4 +- .../arrayExpression/arrayExpression.spec.ts | 4 +- .../callExpression/js2EelLib/config.spec.ts | 4 +- .../js2EelLib/eachChannel.spec.ts | 4 +- .../js2EelLib/fileSelector.spec.ts | 4 +- .../callExpression/js2EelLib/onInit.spec.ts | 2 +- .../callExpression/js2EelLib/onSample.spec.ts | 2 +- .../callExpression/js2EelLib/onSlider.spec.ts | 2 +- .../js2EelLib/selectBox.spec.ts | 4 +- .../callExpression/js2EelLib/slider.spec.ts | 4 +- .../utils/evaluateUserFunctionCall.spec.ts | 4 +- .../conditionalExpression.spec.ts | 4 +- .../conditionalExpression.ts | 10 +- .../expressionStatement.spec.ts | 2 +- .../arrowFunctionDeclaration.spec.ts | 4 +- .../functionDeclaration.spec.ts | 4 +- .../functionExpression.spec.ts | 4 +- .../identifier/identifier.spec.ts | 4 +- .../ifStatement/ifStatement.spec.ts | 4 +- .../generatorNodes/literal/literal.spec.ts | 4 +- .../logicalExpression.spec.ts | 4 +- .../logicalExpression/logicalExpression.ts | 8 +- .../js2EelLib/consoleMemberCall.spec.ts | 4 +- .../js2EelLib/eelArrayMemberCall.spec.ts | 4 +- .../js2EelLib/eelBufferMemberCall.spec.ts | 4 +- .../js2EelLib/mathMemberCall.spec.ts | 4 +- .../memberExpressionCall.spec.ts | 4 +- .../memberExpressionComputed.spec.ts | 4 +- .../memberExpressionStatic.spec.ts | 4 +- .../memberExpressionStatic.ts | 4 +- .../js2EelLib/newEelArray.spec.ts | 4 +- .../newExpression/js2EelLib/newEelArray.ts | 2 +- .../js2EelLib/newEelBuffer.spec.ts | 4 +- .../newExpression/js2EelLib/newEelBuffer.ts | 2 +- .../newExpression/newExpression.spec.ts | 4 +- .../objectExpression/objectExpression.spec.ts | 4 +- .../objectExpression/objectExpression.ts | 2 +- .../generatorNodes/program/program.spec.ts | 4 +- .../returnStatement/returnStatement.spec.ts | 4 +- .../unaryExpression/unaryExpression.spec.ts | 4 +- .../updateExpression/updateExpression.ts | 4 +- .../variableDeclaration.spec.ts | 4 +- .../whileStatement/whileStatement.ts | 10 +- compiler/src/js2eel/parser/JsParser.ts | 2 +- .../suffixArraySize.spec.ts | 2 +- .../suffixersAndPrefixers/suffixScope.spec.ts | 2 +- .../test/examplePlugins/emptyPlugin.spec.ts | 4 +- .../validation/validateSymbolName.spec.ts | 2 +- .../js2eel/validation/validateSymbolName.ts | 2 +- 54 files changed, 3817 insertions(+), 1102 deletions(-) diff --git a/compiler/.eslintrc.cjs b/compiler/.eslintrc.cjs index 55fa4e8..aea8d7d 100644 --- a/compiler/.eslintrc.cjs +++ b/compiler/.eslintrc.cjs @@ -4,19 +4,21 @@ module.exports = { }, extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], overrides: [], - ignorePatterns: ['/*', '!/src', "**/*.js"], + ignorePatterns: ['/*', '!/src', '**/*.js'], parser: '@typescript-eslint/parser', parserOptions: { ecmaVersion: '2021', sourceType: 'module' }, - plugins: ['@typescript-eslint'], + plugins: ['@typescript-eslint', 'import'], rules: { 'default-case': 'error', 'default-case-last': 'error', 'no-fallthrough': 'error', 'no-warning-comments': 'warn', 'prefer-const': 'warn', + 'import/extensions': ['error', 'always'], + '@typescript-eslint/no-explicit-any': ['warn'], '@typescript-eslint/explicit-function-return-type': 'error', '@typescript-eslint/consistent-type-imports': 'error', '@typescript-eslint/ban-ts-comment': 1, diff --git a/compiler/package-lock.json b/compiler/package-lock.json index 7770354..cbc5efb 100644 --- a/compiler/package-lock.json +++ b/compiler/package-lock.json @@ -9,23 +9,24 @@ "version": "0.10.0", "license": "GPL-3.0", "dependencies": { - "acorn": "8.9.0", - "joi": "17.9.2" + "acorn": "8.12.1", + "joi": "17.13.3" }, "devDependencies": { - "@types/chai": "4.3.5", - "@types/estree": "1.0.1", - "@types/mocha": "10.0.1", - "@types/node": "20.3.3", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "c8": "8.0.0", - "chai": "4.3.7", - "concurrently": "8.2.0", - "eslint": "8.44.0", - "mocha": "10.2.0", - "tsc-watch": "6.0.4", - "typescript": "5.1.6" + "@types/chai": "4.3.18", + "@types/estree": "1.0.5", + "@types/mocha": "10.0.7", + "@types/node": "22.5.0", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "c8": "10.1.2", + "chai": "5.1.1", + "concurrently": "8.2.2", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "mocha": "10.7.3", + "tsc-watch": "6.2.0", + "typescript": "5.5.4" }, "engines": { "node": ">=18.0.0" @@ -74,19 +75,21 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -105,33 +108,12 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -150,13 +132,15 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -177,16 +161,122 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -251,10 +341,22 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -270,16 +372,18 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", - "dev": true + "version": "4.3.18", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.18.tgz", + "integrity": "sha512-2UfJzigyNa8kYTKn7o4hNMPphkxtu4WTJyobK3m4FBpyj7EK5xgtPcOtxLm7Dznk/Qxr0QXn+gQbkg7mCZKdfg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", @@ -287,57 +391,57 @@ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", + "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", - "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true + "version": "22.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", + "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz", + "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/type-utils": "8.3.0", + "@typescript-eslint/utils": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -346,25 +450,27 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", + "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -373,16 +479,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", + "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -390,26 +497,24 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz", + "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/utils": "8.3.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "*" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -417,12 +522,13 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", + "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -430,21 +536,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", + "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -456,53 +564,85 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", + "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", + "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.3.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -515,15 +655,34 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -571,22 +730,150 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">=12" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/balanced-match": { @@ -615,12 +902,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -633,49 +921,113 @@ "dev": true }, "node_modules/c8": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-8.0.0.tgz", - "integrity": "sha512-XHA5vSfCLglAc0Xt8eLBZMv19lgiBSjnb1FLAQgnwkuhJYEonpilhEB4Ea3jPAbm0FhD6VVJrc0z73jPe7JyGQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.2.tgz", + "integrity": "sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==", "dev": true, + "license": "ISC", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@istanbuljs/schema": "^0.1.3", "find-up": "^5.0.0", - "foreground-child": "^2.0.0", + "foreground-child": "^3.1.1", "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^7.0.1", "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" }, "bin": { "c8": "bin/c8.js" }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "peerDependencies": { + "monocart-coverage-reports": "^2" + }, + "peerDependenciesMeta": { + "monocart-coverage-reports": { + "optional": true + } } }, - "node_modules/c8/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/c8/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/c8/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "engines": { - "node": ">=6" - } - }, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/c8/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -689,21 +1041,20 @@ } }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, + "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/chalk": { @@ -723,12 +1074,13 @@ } }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 16" } }, "node_modules/chokidar": { @@ -806,10 +1158,11 @@ "dev": true }, "node_modules/concurrently": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", - "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "date-fns": "^2.30.0", @@ -908,6 +1261,60 @@ "node": ">= 8" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -925,10 +1332,11 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -954,13 +1362,11 @@ } }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, + "license": "MIT", "engines": { "node": ">=6" } @@ -971,25 +1377,50 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, "engines": { - "node": ">=0.3.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, "node_modules/doctrine": { @@ -1010,12 +1441,159 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1038,27 +1616,29 @@ } }, "node_modules/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1068,7 +1648,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -1080,7 +1659,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -1093,52 +1671,127 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz", + "integrity": "sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=4" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -1150,26 +1803,25 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -1194,20 +1846,12 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -1215,20 +1859,12 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -1264,10 +1900,11 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1284,6 +1921,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -1325,10 +1963,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1380,17 +2019,31 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/from": { @@ -1419,9 +2072,48 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { @@ -1429,14 +2121,53 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -1470,10 +2201,11 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -1484,31 +2216,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/graphemer": { "version": "1.4.0", @@ -1516,6 +2252,16 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1525,6 +2271,74 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1538,13 +2352,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -1554,6 +2370,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1590,6 +2407,51 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1602,6 +2464,84 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1632,15 +2572,45 @@ "node": ">=0.10.0" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -1659,6 +2629,87 @@ "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -1671,6 +2722,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1678,33 +2749,36 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -1713,14 +2787,31 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -1737,12 +2828,32 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -1800,50 +2911,38 @@ } }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, + "license": "MIT", "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "license": "ISC" }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", @@ -1855,17 +2954,19 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -1884,33 +2985,53 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", @@ -1918,10 +3039,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/brace-expansion": { @@ -1929,15 +3046,38 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1972,30 +3112,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/node-cleanup": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", @@ -2011,6 +3133,100 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2067,11 +3283,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -2106,22 +3330,38 @@ "node": ">=8" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 14.16" } }, "node_modules/pause-stream": { @@ -2145,6 +3385,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2203,6 +3453,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -2225,6 +3476,25 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2234,11 +3504,30 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -2306,6 +3595,25 @@ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", "dev": true }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2324,16 +3632,33 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, - "node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2342,14 +3667,49 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2380,19 +3740,36 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/spawn-command": { @@ -2445,6 +3822,74 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2457,6 +3902,30 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2481,18 +3950,79 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/text-table": { @@ -2512,6 +4042,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2528,11 +4059,25 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tsc-watch": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-6.0.4.tgz", - "integrity": "sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-6.2.0.tgz", + "integrity": "sha512-2LBhf9kjKXnz7KQ/puLHlozMzzUNHAdYBNMkg3eksQJ9GBAgMg8czznM83T5PmsoUvDnXzfIeQn2lNcIYDr8LA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "node-cleanup": "^2.1.2", @@ -2549,25 +4094,17 @@ "typescript": "*" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, "node_modules/type-check": { @@ -2582,20 +4119,12 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2603,11 +4132,89 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2616,6 +4223,29 @@ "node": ">=14.17" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2654,11 +4284,49 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -2677,6 +4345,25 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2692,12 +4379,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -2717,10 +4398,11 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -2785,15 +4467,15 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true }, "@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -2805,32 +4487,12 @@ "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } } }, "@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, "@hapi/hoek": { @@ -2847,13 +4509,13 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" } }, @@ -2864,11 +4526,76 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -2925,10 +4652,17 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "requires": { "@hapi/hoek": "^9.0.0" } @@ -2944,15 +4678,15 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.18", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.18.tgz", + "integrity": "sha512-2UfJzigyNa8kYTKn7o4hNMPphkxtu4WTJyobK3m4FBpyj7EK5xgtPcOtxLm7Dznk/Qxr0QXn+gQbkg7mCZKdfg==", "dev": true }, "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/istanbul-lib-coverage": { @@ -2961,133 +4695,153 @@ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, - "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", + "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", "dev": true }, "@types/node": { - "version": "20.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", - "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", - "dev": true - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true + "version": "22.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", + "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } }, "@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz", + "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/type-utils": "8.3.0", + "@typescript-eslint/utils": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" } }, "@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", + "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", + "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" } }, "@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz", + "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/utils": "8.3.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" } }, "@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", + "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", + "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", + "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", + "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.3.0", + "eslint-visitor-keys": "^3.4.3" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==" + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==" }, "acorn-jsx": { "version": "5.3.2", @@ -3096,10 +4850,22 @@ "dev": true, "requires": {} }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "ansi-regex": { @@ -3133,18 +4899,99 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, + "array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + } + }, + "array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } }, "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3168,46 +5015,84 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "c8": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.2.tgz", + "integrity": "sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^7.0.1", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "c8": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-8.0.0.tgz", - "integrity": "sha512-XHA5vSfCLglAc0Xt8eLBZMv19lgiBSjnb1FLAQgnwkuhJYEonpilhEB4Ea3jPAbm0FhD6VVJrc0z73jPe7JyGQ==", + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "dependencies": { - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -3223,18 +5108,16 @@ "dev": true }, "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", "dev": true, "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" } }, "chalk": { @@ -3248,9 +5131,9 @@ } }, "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true }, "chokidar": { @@ -3313,9 +5196,9 @@ "dev": true }, "concurrently": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", - "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, "requires": { "chalk": "^4.1.2", @@ -3389,6 +5272,39 @@ "which": "^2.0.1" } }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, "date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -3399,9 +5315,9 @@ } }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { "ms": "2.1.2" @@ -3414,13 +5330,10 @@ "dev": true }, "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true }, "deep-is": { "version": "0.1.4", @@ -3428,21 +5341,34 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { - "path-type": "^4.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, + "diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -3458,12 +5384,127 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3477,27 +5518,28 @@ "dev": true }, "eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -3507,7 +5549,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -3519,66 +5560,122 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ms": "^2.1.1" } - }, - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + } + } + }, + "eslint-module-utils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz", + "integrity": "sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "ms": "^2.1.1" } }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { "acorn": "^8.9.0", @@ -3593,14 +5690,6 @@ "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "esrecurse": { @@ -3610,20 +5699,12 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -3654,9 +5735,9 @@ "dev": true }, "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -3708,9 +5789,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -3748,14 +5829,23 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "requires": { "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "signal-exit": "^4.0.1" } }, "from": { @@ -3777,6 +5867,30 @@ "dev": true, "optional": true }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3784,11 +5898,35 @@ "dev": true }, "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + } + }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -3813,33 +5951,32 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" } }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } }, "graphemer": { "version": "1.4.0", @@ -3847,12 +5984,57 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -3866,9 +6048,9 @@ "dev": true }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "import-fresh": { @@ -3903,6 +6085,36 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3912,6 +6124,49 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3933,12 +6188,27 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -3951,12 +6221,73 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3964,40 +6295,50 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true }, "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -4011,12 +6352,27 @@ "argparse": "^2.0.1" } }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4059,38 +6415,27 @@ } }, "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, "requires": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "semver": "^7.5.3" } }, "map-stream": { @@ -4106,12 +6451,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -4124,33 +6469,44 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "dependencies": { "brace-expansion": { @@ -4162,10 +6518,23 @@ "balanced-match": "^1.0.0" } }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -4194,24 +6563,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node-cleanup": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", @@ -4224,6 +6581,64 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + } + }, + "object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4265,6 +6680,12 @@ "p-limit": "^3.0.2" } }, + "package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4292,16 +6713,26 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + } + }, "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true }, "pause-stream": { @@ -4319,6 +6750,12 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4370,12 +6807,35 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4423,30 +6883,76 @@ } } }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" } }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4468,16 +6974,22 @@ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, "spawn-command": { @@ -4521,6 +7033,51 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4530,6 +7087,21 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -4545,15 +7117,55 @@ "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "text-table": { @@ -4583,10 +7195,17 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, "tsc-watch": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-6.0.4.tgz", - "integrity": "sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-6.2.0.tgz", + "integrity": "sha512-2LBhf9kjKXnz7KQ/puLHlozMzzUNHAdYBNMkg3eksQJ9GBAgMg8czznM83T5PmsoUvDnXzfIeQn2lNcIYDr8LA==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -4595,19 +7214,16 @@ "string-argv": "^0.3.1" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { - "tslib": "^1.8.1" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, "type-check": { @@ -4619,22 +7235,86 @@ "prelude-ls": "^1.2.1" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "uri-js": { @@ -4666,10 +7346,36 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", "dev": true }, "wrap-ansi": { @@ -4683,6 +7389,17 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4695,12 +7412,6 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -4717,9 +7428,9 @@ } }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, "yargs-unparser": { diff --git a/compiler/package.json b/compiler/package.json index 8771ee5..6849008 100644 --- a/compiler/package.json +++ b/compiler/package.json @@ -7,6 +7,7 @@ }, "main": "dist/cjs/index.js", "module": "dist/esm/index.js", + "type": "module", "types": "dist/types/index.d.ts", "exports": { ".": { @@ -21,8 +22,8 @@ "dist:esm": "tsc -p tsconfig.esm.json", "dist:cjs": "tsc -p tsconfig.cjs.json", "dist": "npm run parseTypeDocs && rm -rf ./dist/* && npm run dist:esm && npm run dist:cjs && node ./scripts/setVersionConstant.mjs", - "test": "npm run dist:cjs && c8 mocha './dist/cjs/**/*.spec.js' --reporter-option maxDiffSize=0", - "test:single": "mocha './dist/cjs/**/*.spec.js' --reporter-option maxDiffSize=0 --grep", + "test": "npm run dist:esm && c8 mocha './dist/esm/**/*.spec.js' --reporter-option maxDiffSize=0", + "test:single": "mocha './dist/esm/**/*.spec.js' --reporter-option maxDiffSize=0 --grep", "check": "eslint ./src && tsc --noEmit", "parseTypeDocs": "node ./scripts/parseTypeDocs.mjs" }, @@ -43,22 +44,23 @@ "author": "steeelydan", "license": "GPL-3.0", "dependencies": { - "acorn": "8.9.0", - "joi": "17.9.2" + "acorn": "8.12.1", + "joi": "17.13.3" }, "devDependencies": { - "@types/chai": "4.3.5", - "@types/estree": "1.0.1", - "@types/mocha": "10.0.1", - "@types/node": "20.3.3", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "c8": "8.0.0", - "chai": "4.3.7", - "concurrently": "8.2.0", - "eslint": "8.44.0", - "mocha": "10.2.0", - "tsc-watch": "6.0.4", - "typescript": "5.1.6" + "@types/chai": "4.3.18", + "@types/estree": "1.0.5", + "@types/mocha": "10.0.7", + "@types/node": "22.5.0", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "c8": "10.1.2", + "chai": "5.1.1", + "concurrently": "8.2.2", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "mocha": "10.7.3", + "tsc-watch": "6.2.0", + "typescript": "5.5.4" } } diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts index 442d462..96c33f9 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from './Js2EelCompiler'; -import { testEelSrc } from '../test/helpers'; +import { Js2EelCompiler } from './Js2EelCompiler.js'; +import { testEelSrc } from '../test/helpers.js'; describe('Js2EelCompiler', () => { it('setReturn(). getReturn()', () => { diff --git a/compiler/src/js2eel/declarationParams/registerDeclarationParam.spec.ts b/compiler/src/js2eel/declarationParams/registerDeclarationParam.spec.ts index 9c0981e..302aa7f 100644 --- a/compiler/src/js2eel/declarationParams/registerDeclarationParam.spec.ts +++ b/compiler/src/js2eel/declarationParams/registerDeclarationParam.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../compiler/Js2EelCompiler'; -import { testEelSrc } from '../test/helpers'; +import { Js2EelCompiler } from '../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../test/helpers.js'; describe('registerDeclarationParam()', () => { it('Error if reserved lib symbol', () => { diff --git a/compiler/src/js2eel/declarationParams/registerDeclarationParam.ts b/compiler/src/js2eel/declarationParams/registerDeclarationParam.ts index fb3adde..194e4ac 100644 --- a/compiler/src/js2eel/declarationParams/registerDeclarationParam.ts +++ b/compiler/src/js2eel/declarationParams/registerDeclarationParam.ts @@ -1,5 +1,5 @@ -import { getLowerCasedDeclaredSymbol } from '../environment/getLowerCaseDeclaredSymbol'; -import { ALL_RESERVED_SYMBOL_NAMES } from '../constants'; +import { getLowerCasedDeclaredSymbol } from '../environment/getLowerCaseDeclaredSymbol.js'; +import { ALL_RESERVED_SYMBOL_NAMES } from '../constants.js'; import type { Identifier } from 'estree'; import type { Js2EelCompiler } from '../compiler/Js2EelCompiler'; diff --git a/compiler/src/js2eel/generatorNodes/arrayExpression/arrayExpression.spec.ts b/compiler/src/js2eel/generatorNodes/arrayExpression/arrayExpression.spec.ts index 49c6af9..ab6a960 100644 --- a/compiler/src/js2eel/generatorNodes/arrayExpression/arrayExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/arrayExpression/arrayExpression.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('arrayExpression()', () => { it('content is objects: No spread expression', () => { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.spec.ts index 97241dc..fdf4ac6 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('config()', () => { it('Error if called in non-root scope', () => { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/eachChannel.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/eachChannel.spec.ts index c08e4ed..fae080f 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/eachChannel.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/eachChannel.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('eachChannel()', () => { it("Error if called isn't called in onSample scope", () => { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts index e6ac5ec..00b2dd7 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/fileSelector.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('fileSelector()', () => { it('Error if called in non-root scope', () => { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onInit.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onInit.spec.ts index 6e13c6e..f49b04e 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onInit.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onInit.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; describe('onInit()', () => { it('Error if called elsewhere than root scope', () => { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSample.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSample.spec.ts index 088a1f4..6d26e88 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSample.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSample.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; describe('onSample()', () => { it('Error if called elsewhere than root scope', () => { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.spec.ts index 3dae6e4..b4352ea 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onSlider.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; describe('onSlider()', () => { it('Error if called elsewhere than root scope', () => { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts index d478661..ee46cab 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/selectBox.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('selectBox()', () => { it('Error if called in non-root scope', () => { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.spec.ts index 8e81c5c..5bd230e 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/slider.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('slider()', () => { it('Error if called in non-root scope', () => { diff --git a/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateUserFunctionCall.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateUserFunctionCall.spec.ts index 5e441e5..a4b9c46 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateUserFunctionCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/utils/evaluateUserFunctionCall.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('evaluateUserFunctionCall()', () => { it('error if missing argument', () => { diff --git a/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts b/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts index da152d1..e4da3e7 100644 --- a/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('conditionalExpression()', () => { it('Test part is wrong node type', () => { diff --git a/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.ts b/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.ts index 47bfca8..1fd2bed 100644 --- a/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.ts +++ b/compiler/src/js2eel/generatorNodes/conditionalExpression/conditionalExpression.ts @@ -1,8 +1,8 @@ -import { literal } from '../literal/literal'; -import { identifier } from '../identifier/identifier'; -import { unaryExpression } from '../unaryExpression/unaryExpression'; -import { binaryExpression } from '../binaryExpression/binaryExpression'; -import { memberExpression } from '../memberExpression/memberExpression'; +import { literal } from '../literal/literal.js'; +import { identifier } from '../identifier/identifier.js'; +import { unaryExpression } from '../unaryExpression/unaryExpression.js'; +import { binaryExpression } from '../binaryExpression/binaryExpression.js'; +import { memberExpression } from '../memberExpression/memberExpression.js'; import type { ConditionalExpression } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; diff --git a/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.spec.ts b/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.spec.ts index eadb07f..cd53fc5 100644 --- a/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.spec.ts +++ b/compiler/src/js2eel/generatorNodes/expressionStatement/expressionStatement.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; describe('expressionStatement()', () => { it('Error if expression statement node type not allowed', () => { diff --git a/compiler/src/js2eel/generatorNodes/functionDeclaration/arrowFunctionDeclaration.spec.ts b/compiler/src/js2eel/generatorNodes/functionDeclaration/arrowFunctionDeclaration.spec.ts index 4985a4d..0241d2d 100644 --- a/compiler/src/js2eel/generatorNodes/functionDeclaration/arrowFunctionDeclaration.spec.ts +++ b/compiler/src/js2eel/generatorNodes/functionDeclaration/arrowFunctionDeclaration.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('arrowFunctionDeclaration()', () => { it('Error if arrow function body is not a block statement', () => { diff --git a/compiler/src/js2eel/generatorNodes/functionDeclaration/functionDeclaration.spec.ts b/compiler/src/js2eel/generatorNodes/functionDeclaration/functionDeclaration.spec.ts index 829f8a1..342f59e 100644 --- a/compiler/src/js2eel/generatorNodes/functionDeclaration/functionDeclaration.spec.ts +++ b/compiler/src/js2eel/generatorNodes/functionDeclaration/functionDeclaration.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('functionDeclaration()', () => { it('Prevents declaration if other symbol with the name, even in other casing, exists', () => { diff --git a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.spec.ts b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.spec.ts index cae4340..8a5e880 100644 --- a/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/functionExpression/functionExpression.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('functionExpression()', () => { it('Wrong param type', () => { diff --git a/compiler/src/js2eel/generatorNodes/identifier/identifier.spec.ts b/compiler/src/js2eel/generatorNodes/identifier/identifier.spec.ts index b2f5367..35c4748 100644 --- a/compiler/src/js2eel/generatorNodes/identifier/identifier.spec.ts +++ b/compiler/src/js2eel/generatorNodes/identifier/identifier.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('identifier()', () => { it('error if using EelArray or EelBuffer without accessors', () => { diff --git a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts index 72c15a8..9c9c5a2 100644 --- a/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts +++ b/compiler/src/js2eel/generatorNodes/ifStatement/ifStatement.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('ifStatement()', () => { it('Error if test part is of wrong node type', () => { diff --git a/compiler/src/js2eel/generatorNodes/literal/literal.spec.ts b/compiler/src/js2eel/generatorNodes/literal/literal.spec.ts index eb224bd..ac8b5ed 100644 --- a/compiler/src/js2eel/generatorNodes/literal/literal.spec.ts +++ b/compiler/src/js2eel/generatorNodes/literal/literal.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('literal()', () => { it('should compile a true boolean literal as 1', () => { diff --git a/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts b/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts index 876eca4..1bbcaf0 100644 --- a/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.spec.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('logicalExpression()', () => { it('logical expression containing identifiers', () => { diff --git a/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.ts b/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.ts index 377a58d..ad5a0dc 100644 --- a/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.ts +++ b/compiler/src/js2eel/generatorNodes/logicalExpression/logicalExpression.ts @@ -1,7 +1,7 @@ -import { identifier } from '../identifier/identifier'; -import { unaryExpression } from '../unaryExpression/unaryExpression'; -import { binaryExpression } from '../binaryExpression/binaryExpression'; -import { JSFX_DENY_COMPILATION } from '../../constants'; +import { identifier } from '../identifier/identifier.js'; +import { unaryExpression } from '../unaryExpression/unaryExpression.js'; +import { binaryExpression } from '../binaryExpression/binaryExpression.js'; +import { JSFX_DENY_COMPILATION } from '../../constants.js'; import type { LogicalExpression } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/consoleMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/consoleMemberCall.spec.ts index 5ac17bc..72aba1f 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/consoleMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/consoleMemberCall.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('console()', () => { it('Creates a debug variable if we console.log', () => { diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelArrayMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelArrayMemberCall.spec.ts index 08c4fe6..d8fb45b 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelArrayMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelArrayMemberCall.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; it('Error if member function does not exist', () => { const compiler = new Js2EelCompiler(); diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts index f5a1cca..6d56d04 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('eelBufferMemberCall()', () => { it(".dimensions() returns the buffer's dimensions", () => { diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/mathMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/mathMemberCall.spec.ts index ead4e3e..c3032d4 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/mathMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/mathMemberCall.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('mathMemberCall()', () => { it('pow(): Validation errors', () => { diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.spec.ts index 184cde4..a2d8e15 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionCall.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('memberExpressionCall()', () => { it('Error if callee object not declared', () => { diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts index 6798a48..d3e6fa9 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('memberExpressionComputed', () => { it('1-dimensional: not allowed', () => { diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.spec.ts index 8cdd3e8..83ea7ee 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('memberExpressionStatic', () => { it('object not found', () => { diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.ts index 1294129..3046a5c 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionStatic.ts @@ -1,5 +1,5 @@ -import { suffixScopeByScopeSuffix } from '../../suffixersAndPrefixers/suffixScope'; -import { prefixParam } from '../../suffixersAndPrefixers/prefixParam'; +import { suffixScopeByScopeSuffix } from '../../suffixersAndPrefixers/suffixScope.js'; +import { prefixParam } from '../../suffixersAndPrefixers/prefixParam.js'; import type { Identifier, MemberExpression } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; diff --git a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.spec.ts b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.spec.ts index 67eefbd..acc00fc 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.spec.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('newEelArray()', () => { it('gives error if no arguments', () => { diff --git a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.ts b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.ts index 66124a4..a66723f 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelArray.ts @@ -1,5 +1,5 @@ import Joi from 'joi'; -import { evaluateLibraryFunctionCall } from '../../callExpression/utils/evaluateLibraryFunctionCall'; +import { evaluateLibraryFunctionCall } from '../../callExpression/utils/evaluateLibraryFunctionCall.js'; import type { NewExpression } from 'estree'; import type { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; diff --git a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.spec.ts b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.spec.ts index 8f5794b..9b617e3 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.spec.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../../test/helpers'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../../test/helpers.js'; describe('newEelBuffer()', () => { it('gives error if no arguments', () => { diff --git a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts index 62cd927..9fefb2b 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/js2EelLib/newEelBuffer.ts @@ -1,5 +1,5 @@ import Joi from 'joi'; -import { evaluateLibraryFunctionCall } from '../../callExpression/utils/evaluateLibraryFunctionCall'; +import { evaluateLibraryFunctionCall } from '../../callExpression/utils/evaluateLibraryFunctionCall.js'; import type { NewExpression } from 'estree'; import type { Js2EelCompiler } from '../../../compiler/Js2EelCompiler'; diff --git a/compiler/src/js2eel/generatorNodes/newExpression/newExpression.spec.ts b/compiler/src/js2eel/generatorNodes/newExpression/newExpression.spec.ts index 4603773..61fa8af 100644 --- a/compiler/src/js2eel/generatorNodes/newExpression/newExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/newExpression/newExpression.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('newExpression()', () => { it('Error if called elsewhere than root scope', () => { diff --git a/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.spec.ts b/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.spec.ts index 5e1a8a2..a03cfb9 100644 --- a/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('objectExpression', () => { it('whole property of wrong type', () => { diff --git a/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.ts b/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.ts index 06dde06..181d7d6 100644 --- a/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.ts +++ b/compiler/src/js2eel/generatorNodes/objectExpression/objectExpression.ts @@ -1,4 +1,4 @@ -import { suffixScopeByScopeSuffix } from '../../suffixersAndPrefixers/suffixScope'; +import { suffixScopeByScopeSuffix } from '../../suffixersAndPrefixers/suffixScope.js'; import type { Identifier, ObjectExpression } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; diff --git a/compiler/src/js2eel/generatorNodes/program/program.spec.ts b/compiler/src/js2eel/generatorNodes/program/program.spec.ts index 5f5494d..44fe3e8 100644 --- a/compiler/src/js2eel/generatorNodes/program/program.spec.ts +++ b/compiler/src/js2eel/generatorNodes/program/program.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('program', () => { it('produces error if body node is of wrong type', () => { diff --git a/compiler/src/js2eel/generatorNodes/returnStatement/returnStatement.spec.ts b/compiler/src/js2eel/generatorNodes/returnStatement/returnStatement.spec.ts index babe733..7413bc9 100644 --- a/compiler/src/js2eel/generatorNodes/returnStatement/returnStatement.spec.ts +++ b/compiler/src/js2eel/generatorNodes/returnStatement/returnStatement.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('returnStatement', () => { it('produces error if return is without argument', () => { diff --git a/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts b/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts index e394473..9f2980f 100644 --- a/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts +++ b/compiler/src/js2eel/generatorNodes/unaryExpression/unaryExpression.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('unaryExpression()', () => { it('does not evaluate unary expression with wrong argument type', () => { diff --git a/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.ts b/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.ts index 504c148..816e209 100644 --- a/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.ts +++ b/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.ts @@ -1,5 +1,5 @@ -import { identifier } from '../identifier/identifier'; -import { JSFX_DENY_COMPILATION } from '../../constants'; +import { identifier } from '../identifier/identifier.js'; +import { JSFX_DENY_COMPILATION } from '../../constants.js'; import type { UpdateExpression } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; diff --git a/compiler/src/js2eel/generatorNodes/variableDeclaration/variableDeclaration.spec.ts b/compiler/src/js2eel/generatorNodes/variableDeclaration/variableDeclaration.spec.ts index e08123b..ca06b3a 100644 --- a/compiler/src/js2eel/generatorNodes/variableDeclaration/variableDeclaration.spec.ts +++ b/compiler/src/js2eel/generatorNodes/variableDeclaration/variableDeclaration.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../../test/helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; describe('variableDeclaration()', () => { it('Gives an error if "var" declaration', () => { diff --git a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts index c014090..d135302 100644 --- a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts +++ b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts @@ -1,8 +1,8 @@ -import { JSFX_DENY_COMPILATION } from '../../constants'; -import { binaryExpression } from '../binaryExpression/binaryExpression'; -import { blockStatement } from '../blockStatement/blockStatement'; -import { indent } from '../../suffixersAndPrefixers/indent'; -import { removeLastLinebreak } from '../../suffixersAndPrefixers/removeLastLinebreak'; +import { JSFX_DENY_COMPILATION } from '../../constants.js'; +import { binaryExpression } from '../binaryExpression/binaryExpression.js'; +import { blockStatement } from '../blockStatement/blockStatement.js'; +import { indent } from '../../suffixersAndPrefixers/indent.js'; +import { removeLastLinebreak } from '../../suffixersAndPrefixers/removeLastLinebreak.js'; import type { WhileStatement } from 'estree'; import type { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; diff --git a/compiler/src/js2eel/parser/JsParser.ts b/compiler/src/js2eel/parser/JsParser.ts index 4f0f8ca..c7e60cf 100644 --- a/compiler/src/js2eel/parser/JsParser.ts +++ b/compiler/src/js2eel/parser/JsParser.ts @@ -7,7 +7,7 @@ export class JsParser { this.src = jsSrc; } - parse(): { tree: acorn.Node | null; error?: any } { + parse(): { tree: acorn.Node | null; error?: unknown } { try { const tree = acorn.parse(this.src, { ecmaVersion: 2022, diff --git a/compiler/src/js2eel/suffixersAndPrefixers/suffixArraySize.spec.ts b/compiler/src/js2eel/suffixersAndPrefixers/suffixArraySize.spec.ts index 5ded24c..f172464 100644 --- a/compiler/src/js2eel/suffixersAndPrefixers/suffixArraySize.spec.ts +++ b/compiler/src/js2eel/suffixersAndPrefixers/suffixArraySize.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { suffixArraySize } from './suffixArraySize'; +import { suffixArraySize } from './suffixArraySize.js'; describe('suffixArraySize()', () => { it('Suffixes array size var correctly', () => { diff --git a/compiler/src/js2eel/suffixersAndPrefixers/suffixScope.spec.ts b/compiler/src/js2eel/suffixersAndPrefixers/suffixScope.spec.ts index 3e97652..4538479 100644 --- a/compiler/src/js2eel/suffixersAndPrefixers/suffixScope.spec.ts +++ b/compiler/src/js2eel/suffixersAndPrefixers/suffixScope.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { suffixScopeByScopeSuffix } from './suffixScope'; +import { suffixScopeByScopeSuffix } from './suffixScope.js'; describe('suffixScope()', () => { it("doesn't suffix if scope is 0", () => { diff --git a/compiler/src/js2eel/test/examplePlugins/emptyPlugin.spec.ts b/compiler/src/js2eel/test/examplePlugins/emptyPlugin.spec.ts index 3392413..47148b1 100644 --- a/compiler/src/js2eel/test/examplePlugins/emptyPlugin.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/emptyPlugin.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import { Js2EelCompiler } from '../../compiler/Js2EelCompiler'; -import { testEelSrc } from '../helpers'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../helpers.js'; describe('Empty Plugin', () => { it('Should make an empty JSFX plugin except description and channels', () => { diff --git a/compiler/src/js2eel/validation/validateSymbolName.spec.ts b/compiler/src/js2eel/validation/validateSymbolName.spec.ts index 839d8e4..2efdccb 100644 --- a/compiler/src/js2eel/validation/validateSymbolName.spec.ts +++ b/compiler/src/js2eel/validation/validateSymbolName.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'chai'; -import { validateSymbolName } from './validateSymbolName'; +import { validateSymbolName } from './validateSymbolName.js'; describe('validateSymbolName()', () => { it('Does not work with a name that is too long', () => { diff --git a/compiler/src/js2eel/validation/validateSymbolName.ts b/compiler/src/js2eel/validation/validateSymbolName.ts index 932cdc4..1feb79c 100644 --- a/compiler/src/js2eel/validation/validateSymbolName.ts +++ b/compiler/src/js2eel/validation/validateSymbolName.ts @@ -1,4 +1,4 @@ -import { EEL_MAX_SYMBOL_NAME_LENGTH, EEL_SYMBOL_REGEX } from '../constants'; +import { EEL_MAX_SYMBOL_NAME_LENGTH, EEL_SYMBOL_REGEX } from '../constants.js'; export const validateSymbolName = (symbolName: string): { errors: string[] } => { const errors: string[] = []; From 7646a56f0ae2ba49df4c16059062818e7f24908d Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 16:07:08 +0200 Subject: [PATCH 26/42] Downgrade chai again to make it work with cjs for now --- compiler/package-lock.json | 140 +++++++++++++++++++++++-------------- compiler/package.json | 7 +- compiler/tsconfig.cjs.json | 2 +- desktop/package.json | 2 +- gui/package.json | 2 +- 5 files changed, 92 insertions(+), 61 deletions(-) diff --git a/compiler/package-lock.json b/compiler/package-lock.json index cbc5efb..1c6e78e 100644 --- a/compiler/package-lock.json +++ b/compiler/package-lock.json @@ -20,7 +20,7 @@ "@typescript-eslint/eslint-plugin": "8.3.0", "@typescript-eslint/parser": "8.3.0", "c8": "10.1.2", - "chai": "5.1.1", + "chai": "4.5.0", "concurrently": "8.2.2", "eslint": "8.57.0", "eslint-plugin-import": "2.29.1", @@ -29,7 +29,7 @@ "typescript": "5.5.4" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -851,13 +851,13 @@ } }, "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, "node_modules/available-typed-arrays": { @@ -1041,20 +1041,22 @@ } }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" }, "engines": { - "node": ">=12" + "node": ">=4" } }, "node_modules/chalk": { @@ -1074,13 +1076,16 @@ } }, "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { - "node": ">= 16" + "node": "*" } }, "node_modules/chokidar": { @@ -1362,11 +1367,14 @@ } }, "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, "engines": { "node": ">=6" } @@ -2911,9 +2919,9 @@ } }, "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "license": "MIT", "dependencies": { @@ -3355,13 +3363,13 @@ } }, "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16" + "node": "*" } }, "node_modules/pause-stream": { @@ -4119,6 +4127,16 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -4978,9 +4996,9 @@ } }, "assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, "available-typed-arrays": { @@ -5108,16 +5126,18 @@ "dev": true }, "chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "requires": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" } }, "chalk": { @@ -5131,10 +5151,13 @@ } }, "check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "requires": { + "get-func-name": "^2.0.2" + } }, "chokidar": { "version": "3.5.3", @@ -5330,10 +5353,13 @@ "dev": true }, "deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } }, "deep-is": { "version": "0.1.4", @@ -6415,9 +6441,9 @@ } }, "loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "requires": { "get-func-name": "^2.0.1" @@ -6730,9 +6756,9 @@ } }, "pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, "pause-stream": { @@ -7235,6 +7261,12 @@ "prelude-ls": "^1.2.1" } }, + "type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", diff --git a/compiler/package.json b/compiler/package.json index 6849008..07f38dc 100644 --- a/compiler/package.json +++ b/compiler/package.json @@ -3,11 +3,10 @@ "version": "0.10.0", "description": "Write REAPER JSFX/EEL2 plugins in JavaScript", "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "main": "dist/cjs/index.js", "module": "dist/esm/index.js", - "type": "module", "types": "dist/types/index.d.ts", "exports": { ".": { @@ -22,7 +21,7 @@ "dist:esm": "tsc -p tsconfig.esm.json", "dist:cjs": "tsc -p tsconfig.cjs.json", "dist": "npm run parseTypeDocs && rm -rf ./dist/* && npm run dist:esm && npm run dist:cjs && node ./scripts/setVersionConstant.mjs", - "test": "npm run dist:esm && c8 mocha './dist/esm/**/*.spec.js' --reporter-option maxDiffSize=0", + "test": "npm run dist:cjs && c8 mocha './dist/cjs/**/*.spec.js' --reporter-option maxDiffSize=0", "test:single": "mocha './dist/esm/**/*.spec.js' --reporter-option maxDiffSize=0 --grep", "check": "eslint ./src && tsc --noEmit", "parseTypeDocs": "node ./scripts/parseTypeDocs.mjs" @@ -55,7 +54,7 @@ "@typescript-eslint/eslint-plugin": "8.3.0", "@typescript-eslint/parser": "8.3.0", "c8": "10.1.2", - "chai": "5.1.1", + "chai": "4.5.0", "concurrently": "8.2.2", "eslint": "8.57.0", "eslint-plugin-import": "2.29.1", diff --git a/compiler/tsconfig.cjs.json b/compiler/tsconfig.cjs.json index 6a5054b..93f776e 100644 --- a/compiler/tsconfig.cjs.json +++ b/compiler/tsconfig.cjs.json @@ -2,6 +2,6 @@ "extends": "./tsconfig.json", "compilerOptions": { "module": "CommonJS", - "outDir": "dist/cjs/" + "outDir": "dist/cjs/", } } diff --git a/desktop/package.json b/desktop/package.json index dac75ef..93ed3b5 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -4,7 +4,7 @@ "homepage": "https://js2eel.org", "description": "JS2EEL", "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "main": "build/main.js", "scripts": { diff --git a/gui/package.json b/gui/package.json index b2685e3..7c7ac28 100644 --- a/gui/package.json +++ b/gui/package.json @@ -3,7 +3,7 @@ "private": true, "version": "0.10.0", "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "type": "module", "scripts": { From b0ce4024ddcb0b150b3b1450061105a05e7e3a67 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 16:36:42 +0200 Subject: [PATCH 27/42] Update client packages --- gui/.eslintrc.cjs | 1 + gui/package-lock.json | 6934 +++++++++-------- gui/package.json | 43 +- gui/scripts/createDocs.js | 13 +- gui/src/components/EditorApp.tsx | 4 +- .../js2eel/tabs/EelReadonlyCodeEditor.tsx | 2 +- .../components/js2eel/tabs/JsCodeEditor.tsx | 4 +- .../js2eel/tabs/JsonReadonlyCodeEditor.tsx | 4 +- .../js2eel/useRecallScrollPosition.ts | 4 +- gui/src/components/ui/Modal.tsx | 2 +- gui/src/docs/rendered-docs.json | 10 +- 11 files changed, 3611 insertions(+), 3410 deletions(-) diff --git a/gui/.eslintrc.cjs b/gui/.eslintrc.cjs index f6a5c92..c0b8ec3 100644 --- a/gui/.eslintrc.cjs +++ b/gui/.eslintrc.cjs @@ -19,6 +19,7 @@ module.exports = { plugins: ['@typescript-eslint'], rules: { 'no-warning-comments': 'warn', + '@typescript-eslint/no-explicit-any': ['warn'], '@typescript-eslint/explicit-function-return-type': 'error', '@typescript-eslint/consistent-type-imports': 'error', '@typescript-eslint/ban-ts-comment': 1, diff --git a/gui/package-lock.json b/gui/package-lock.json index 138c56f..2fc2046 100644 --- a/gui/package-lock.json +++ b/gui/package-lock.json @@ -8,64 +8,64 @@ "name": "@js2eel/gui", "version": "0.10.0", "dependencies": { - "@codemirror/lang-javascript": "6.1.9", + "@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-json": "6.0.1", "@js2eel/compiler": "file:../compiler", "codemirror": "6.0.1", - "eslint-linter-browserify": "8.44.0", - "preact": "10.15.1", - "prettier": "3.0.0", + "eslint-linter-browserify": "9.9.1", + "preact": "10.23.2", + "prettier": "3.3.3", "react-feather": "2.0.10", - "zustand": "4.3.9" + "zustand": "4.5.5" }, "devDependencies": { - "@preact/preset-vite": "2.5.0", - "@types/audioworklet": "0.0.48", - "@types/electron": "1.6.10", - "@types/estree": "1.0.1", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "concurrently": "8.2.0", - "csstype": "3.1.2", - "eslint": "8.44.0", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-hooks": "4.6.0", - "highlight.js": "11.8.0", - "marked": "5.1.2", - "marked-highlight": "2.0.1", - "nodemon": "2.0.22", - "typescript": "5.1.6", - "vite": "4.3.9" - }, - "engines": { - "node": ">=18.0.0" + "@preact/preset-vite": "2.9.0", + "@types/audioworklet": "0.0.60", + "@types/estree": "1.0.5", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "concurrently": "8.2.2", + "csstype": "3.1.3", + "eslint": "8.57.0", + "eslint-plugin-react": "7.35.0", + "eslint-plugin-react-hooks": "4.6.2", + "highlight.js": "11.10.0", + "marked": "14.1.0", + "marked-highlight": "2.1.4", + "nodemon": "3.1.4", + "typescript": "5.5.4", + "vite": "5.4.2" + }, + "engines": { + "node": ">=20.0.0" } }, "../compiler": { "name": "@js2eel/compiler", - "version": "0.0.24", + "version": "0.10.0", "license": "GPL-3.0", "dependencies": { - "acorn": "8.9.0", - "joi": "17.9.2" + "acorn": "8.12.1", + "joi": "17.13.3" }, "devDependencies": { - "@types/chai": "4.3.5", - "@types/estree": "1.0.1", - "@types/mocha": "10.0.1", - "@types/node": "20.3.3", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "c8": "8.0.0", - "chai": "4.3.7", - "concurrently": "8.2.0", - "eslint": "8.44.0", - "mocha": "10.2.0", - "tsc-watch": "6.0.4", - "typescript": "5.1.6" + "@types/chai": "4.3.18", + "@types/estree": "1.0.5", + "@types/mocha": "10.0.7", + "@types/node": "22.5.0", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "c8": "10.1.2", + "chai": "4.5.0", + "concurrently": "8.2.2", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "mocha": "10.7.3", + "tsc-watch": "6.2.0", + "typescript": "5.5.4" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -91,47 +91,51 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.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.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -142,14 +146,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.25.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", + "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.21.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.4", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -157,194 +162,161 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@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.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.21.4" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@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" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.4" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -353,12 +325,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -368,16 +341,17 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", - "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.21.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -387,12 +361,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -414,34 +389,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", - "debug": "^4.1.0", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.4", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -449,13 +423,14 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -491,15 +466,16 @@ } }, "node_modules/@codemirror/lang-javascript": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.1.9.tgz", - "integrity": "sha512-z3jdkcqOEBT2txn2a87A0jSy6Te3679wg/U8QzMeftFt+4KA6QooMwfdFzJiuC3L6fXKfTXZcDocoaxMYfGz0w==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz", + "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==", + "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", + "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } @@ -547,49 +523,48 @@ } }, "node_modules/@codemirror/state": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz", - "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", + "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", + "license": "MIT" }, "node_modules/@codemirror/view": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.14.1.tgz", - "integrity": "sha512-ofcsI7lRFo4N0rfnd+V3Gh2boQU3DmaaSKhDOvXUWjeOeuupMXer2e/3i9TUFN7aEIntv300EFBWPEiYVm2svg==", + "version": "6.33.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.33.0.tgz", + "integrity": "sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==", + "license": "MIT", "dependencies": { - "@codemirror/state": "^6.1.4", - "style-mod": "^4.0.0", + "@codemirror/state": "^6.4.0", + "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, - "node_modules/@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.16.tgz", - "integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -599,13 +574,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz", - "integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -615,13 +591,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.16.tgz", - "integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -631,13 +608,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz", - "integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -647,13 +625,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz", - "integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -663,13 +642,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz", - "integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -679,13 +659,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz", - "integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -695,13 +676,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz", - "integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -711,13 +693,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz", - "integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -727,13 +710,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz", - "integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -743,13 +727,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz", - "integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -759,13 +744,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz", - "integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -775,13 +761,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz", - "integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -791,13 +778,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz", - "integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -807,13 +795,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz", - "integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -823,13 +812,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz", - "integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -839,13 +829,14 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz", - "integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -855,13 +846,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz", - "integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -871,13 +863,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz", - "integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -887,13 +880,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz", - "integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -903,13 +897,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz", - "integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -919,13 +914,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz", - "integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -950,19 +946,21 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -981,17 +979,12 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -1002,23 +995,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -1027,22 +1009,25 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -1063,20 +1048,23 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -1092,10 +1080,11 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1107,21 +1096,16 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@js2eel/compiler": { "resolved": "../compiler", "link": true @@ -1201,61 +1185,71 @@ } }, "node_modules/@preact/preset-vite": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.5.0.tgz", - "integrity": "sha512-BUhfB2xQ6ex0yPkrT1Z3LbfPzjpJecOZwQ/xJrXGFSZD84+ObyS//41RdEoQCMWsM0t7UHGaujUxUBub7WM1Jw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.9.0.tgz", + "integrity": "sha512-B9yVT7AkR6owrt84K3pLNyaKSvlioKdw65VqE/zMiR6HMovPekpsrwBNs5DJhBFEd5cvLMtCjHNHZ9P7Oblveg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.14.9", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@prefresh/vite": "^2.2.8", + "@babel/code-frame": "^7.22.13", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@prefresh/vite": "^2.4.1", "@rollup/pluginutils": "^4.1.1", "babel-plugin-transform-hook-names": "^1.0.2", - "debug": "^4.3.1", - "kolorist": "^1.2.10", - "resolve": "^1.20.0" + "debug": "^4.3.4", + "kolorist": "^1.8.0", + "magic-string": "0.30.5", + "node-html-parser": "^6.1.10", + "resolve": "^1.22.8", + "source-map": "^0.7.4", + "stack-trace": "^1.0.0-pre2" }, "peerDependencies": { "@babel/core": "7.x", - "vite": "2.x || 3.x || 4.x" + "vite": "2.x || 3.x || 4.x || 5.x" } }, "node_modules/@prefresh/babel-plugin": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.4.4.tgz", - "integrity": "sha512-/EvgIFMDL+nd20WNvMO0JQnzIl1EJPgmSaSYrZUww7A+aSdKsi37aL07TljrZR1cBMuzFxcr4xvqsUQLFJEukw==", - "dev": true + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.1.tgz", + "integrity": "sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==", + "dev": true, + "license": "MIT" }, "node_modules/@prefresh/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.4.1.tgz", - "integrity": "sha512-og1vaBj3LMJagVncNrDb37Gqc0cWaUcDbpVt5hZtsN4i2Iwzd/5hyTsDHvlMirhSym3wL9ihU0Xa2VhSaOue7g==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.2.tgz", + "integrity": "sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==", "dev": true, + "license": "MIT", "peerDependencies": { "preact": "^10.0.0" } }, "node_modules/@prefresh/utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.1.3.tgz", - "integrity": "sha512-Mb9abhJTOV4yCfkXrMrcgFiFT7MfNOw8sDa+XyZBdq/Ai2p4Zyxqsb3EgHLOEdHpMj6J9aiZ54W8H6FTam1u+A==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==", + "dev": true, + "license": "MIT" }, "node_modules/@prefresh/vite": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.2.9.tgz", - "integrity": "sha512-1ERBF85Ja9/lkrfaltmo4Gca7R2ClQPSHHDDysFgfvPzHmLUeyB0x9WHwhwov/AA1DnyPhsfYT54z3yQd8XrgA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.6.tgz", + "integrity": "sha512-miYbTl2J1YNaQJWyWHJzyIpNh7vKUuXC1qCDRzPeWjhQ+9bxeXkUBGDGd9I1f37R5GQYi1S65AN5oR0BR2WzvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.9.6", - "@prefresh/babel-plugin": "0.4.4", - "@prefresh/core": "^1.3.3", - "@prefresh/utils": "^1.1.2", - "@rollup/pluginutils": "^4.1.0" + "@babel/core": "^7.22.1", + "@prefresh/babel-plugin": "0.5.1", + "@prefresh/core": "^1.5.1", + "@prefresh/utils": "^1.2.0", + "@rollup/pluginutils": "^4.2.1" }, "peerDependencies": { "preact": "^10.4.0", - "vite": ">=2.0.0-beta.3" + "vite": ">=2.0.0" } }, "node_modules/@rollup/pluginutils": { @@ -1263,6 +1257,7 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", "dev": true, + "license": "MIT", "dependencies": { "estree-walker": "^2.0.1", "picomatch": "^2.2.2" @@ -1271,203 +1266,308 @@ "node": ">= 8.0.0" } }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz", + "integrity": "sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==", + "cpu": [ + "arm" + ], "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz", + "integrity": "sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@types/audioworklet": { - "version": "0.0.48", - "resolved": "https://registry.npmjs.org/@types/audioworklet/-/audioworklet-0.0.48.tgz", - "integrity": "sha512-p5XQ+iuQ9fBPch52memypxYsGRiaHXdwoIXoPACGlaEhje5eO6ECiKYs1oEK1oaNyvHyVJElgVRASfSfbMag3g==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz", + "integrity": "sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@types/electron": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@types/electron/-/electron-1.6.10.tgz", - "integrity": "sha512-MOCVyzIwkBEloreoCVrTV108vSf8fFIJPsGruLCoAoBZdxtnJUqKA4lNonf/2u1twSjAspPEfmEheC+TLm/cMw==", - "deprecated": "This is a stub types definition for electron (https://github.com/electron/electron). electron provides its own type definitions, so you don't need @types/electron installed!", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz", + "integrity": "sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "electron": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz", + "integrity": "sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz", + "integrity": "sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz", + "integrity": "sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/node": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz", + "integrity": "sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz", + "integrity": "sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@types/node": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz", + "integrity": "sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz", + "integrity": "sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==", + "cpu": [ + "s390x" + ], "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@types/node": "*" - } + "os": [ + "linux" + ] }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.1.tgz", + "integrity": "sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz", + "integrity": "sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz", + "integrity": "sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz", + "integrity": "sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz", + "integrity": "sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/audioworklet": { + "version": "0.0.60", + "resolved": "https://registry.npmjs.org/@types/audioworklet/-/audioworklet-0.0.60.tgz", + "integrity": "sha512-BCYklConpVRbPlNVcjzIhRsPWBTbCFSbkfjBC+VLULryaBI1M651y4nK0SMsSuTgtVSrKVY7Y+fsobCjviuDWA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz", + "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/type-utils": "8.3.0", + "@typescript-eslint/utils": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", + "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1476,16 +1576,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", + "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1493,26 +1594,24 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz", + "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/utils": "8.3.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "*" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -1520,12 +1619,13 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", + "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1533,21 +1633,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", + "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1559,26 +1661,38 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1586,88 +1700,54 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", + "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", + "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.3.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -1675,10 +1755,11 @@ "dev": true }, "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1691,6 +1772,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1700,6 +1782,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1725,6 +1808,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -1745,29 +1829,42 @@ "node": ">= 8" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -1777,24 +1874,37 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1805,23 +1915,54 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -1853,12 +1994,12 @@ "node": ">=8" } }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, - "optional": true + "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -1871,21 +2012,22 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -1895,13 +2037,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -1910,50 +2057,21 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1964,14 +2082,15 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001478", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz", - "integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==", + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "dev": true, "funding": [ { @@ -1986,13 +2105,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2043,18 +2164,6 @@ "node": ">=12" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/codemirror": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", @@ -2074,6 +2183,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -2082,7 +2192,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", @@ -2091,10 +2202,11 @@ "dev": true }, "node_modules/concurrently": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", - "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "date-fns": "^2.30.0", @@ -2203,10 +2315,11 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" }, "node_modules/crelt": { "version": "1.0.6", @@ -2227,11 +2340,96 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/date-fns": { "version": "2.30.0", @@ -2266,54 +2464,38 @@ } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2324,25 +2506,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "optional": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2355,29 +2518,71 @@ "node": ">=6.0.0" } }, - "node_modules/electron": { - "version": "25.3.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-25.3.2.tgz", - "integrity": "sha512-xiktJvXraaE/ARf2OVHFyTze1TksSbsbJgOaBtdIiBvUduez6ipATEPIec8Msz1n6eQ+xqYb6YF8tDuIZtJSPw==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", - "extract-zip": "^2.0.1" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "bin": { - "electron": "cli.js" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" }, "engines": { - "node": ">= 12.20.55" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/electron-to-chromium": { - "version": "1.4.359", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.359.tgz", - "integrity": "sha512-OoVcngKCIuNXtZnsYoqlCvr0Cf3NIPzDIgwUfI9bdTFjXCrr79lI0kwQstLPZ7WhCezLlGksZk/BFAzoXC7GDw==", - "dev": true + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -2385,93 +2590,165 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, + "license": "MIT", "dependencies": { - "once": "^1.4.0" + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" }, "engines": { "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -2479,6 +2756,7 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -2491,19 +2769,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, "node_modules/esbuild": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz", - "integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -2511,35 +2783,37 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.16", - "@esbuild/android-arm64": "0.17.16", - "@esbuild/android-x64": "0.17.16", - "@esbuild/darwin-arm64": "0.17.16", - "@esbuild/darwin-x64": "0.17.16", - "@esbuild/freebsd-arm64": "0.17.16", - "@esbuild/freebsd-x64": "0.17.16", - "@esbuild/linux-arm": "0.17.16", - "@esbuild/linux-arm64": "0.17.16", - "@esbuild/linux-ia32": "0.17.16", - "@esbuild/linux-loong64": "0.17.16", - "@esbuild/linux-mips64el": "0.17.16", - "@esbuild/linux-ppc64": "0.17.16", - "@esbuild/linux-riscv64": "0.17.16", - "@esbuild/linux-s390x": "0.17.16", - "@esbuild/linux-x64": "0.17.16", - "@esbuild/netbsd-x64": "0.17.16", - "@esbuild/openbsd-x64": "0.17.16", - "@esbuild/sunos-x64": "0.17.16", - "@esbuild/win32-arm64": "0.17.16", - "@esbuild/win32-ia32": "0.17.16", - "@esbuild/win32-x64": "0.17.16" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2549,32 +2823,35 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2584,7 +2861,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -2596,7 +2872,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2610,44 +2885,50 @@ } }, "node_modules/eslint-linter-browserify": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint-linter-browserify/-/eslint-linter-browserify-8.44.0.tgz", - "integrity": "sha512-LKnZSBsd7WJ8f5LwZCNB7zkWbs/zesNAUa0fH4mRsqBML7A7lfmDRkkp6wYhMFE4hdvp8OSNWjs+6jl61cMa6A==" + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/eslint-linter-browserify/-/eslint-linter-browserify-9.9.1.tgz", + "integrity": "sha512-b0u6vxwvQU47QqEohr1WYprX5H7CdbHiBaFdV7i53aPTD+0mAxw1Gow2WOc4OJsiNqL41viohAakf2zr6gFqHg==", + "license": "MIT" }, "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2667,22 +2948,14 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -2694,23 +2967,28 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2733,12 +3011,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2785,31 +3057,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2862,18 +3109,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2929,10 +3164,11 @@ } }, "node_modules/espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -2957,20 +3193,12 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2978,20 +3206,12 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3000,7 +3220,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", @@ -3011,37 +3232,19 @@ "node": ">=0.10.0" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3057,7 +3260,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -3074,15 +3278,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3096,10 +3291,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3131,24 +3327,11 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3156,11 +3339,12 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3170,21 +3354,26 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -3198,6 +3387,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3221,42 +3411,35 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -3297,60 +3480,6 @@ "node": ">= 6" } }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/global-agent/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -3361,12 +3490,14 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -3375,31 +3506,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -3407,66 +3519,18 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3481,22 +3545,24 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3517,12 +3583,13 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -3531,39 +3598,45 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/highlight.js": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.4" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "node_modules/highlight.js": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.10.0.tgz", + "integrity": "sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==", "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=10.19.0" + "node": ">=12.0.0" } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -3579,24 +3652,16 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { @@ -3625,13 +3690,14 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -3639,14 +3705,33 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3657,6 +3742,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -3681,6 +3767,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -3697,6 +3784,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3705,12 +3793,32 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3721,6 +3829,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3740,6 +3849,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3749,6 +3871,22 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3761,11 +3899,25 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3778,6 +3930,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3787,6 +3940,7 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3811,6 +3965,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -3822,13 +3977,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3839,6 +4011,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3854,6 +4027,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -3865,17 +4039,27 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3888,6 +4072,7 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -3895,17 +4080,68 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -3918,17 +4154,12 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -3936,13 +4167,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "optional": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3955,15 +4179,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -3977,20 +4192,12 @@ "node": ">=4.0" } }, - "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kolorist": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.7.0.tgz", - "integrity": "sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==", - "dev": true + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" }, "node_modules/levn": { "version": "0.4.1", @@ -4028,69 +4235,50 @@ "loose-envify": "cli.js" } }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, - "node_modules/marked": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz", - "integrity": "sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==", + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dev": true, - "bin": { - "marked": "bin/marked.js" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">= 16" - } - }, - "node_modules/marked-highlight": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.0.1.tgz", - "integrity": "sha512-LDUfR/zDvD+dJ+lQOWHkxvBLNxiXcaN8pBtwJ/i4pI0bkDC/Ef6Mz1qUrAuHXfnpdr2rabdMpVFhqFuU+5Mskg==", - "dev": true, - "peerDependencies": { - "marked": "^4 || ^5" + "node": ">=12" } }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "node_modules/marked": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.1.0.tgz", + "integrity": "sha512-P93GikH/Pde0hM5TAXEd8I4JAYi8IB03n8qzW8Bh1BIEFpEyBoYxi/XWZA53LSpTeLBiMQOoSMj0u5E/tiVYTA==", "dev": true, - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" + "license": "MIT", + "bin": { + "marked": "bin/marked.js" }, "engines": { - "node": ">=10" + "node": ">= 18" } }, - "node_modules/matcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/marked-highlight": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.1.4.tgz", + "integrity": "sha512-D1GOkcdzP+1dzjoColL7umojefFrASDuLeyaHS0Zr/Uo9jkr1V6vpLRCzfi1djmEaWyK0SYMFtHnpkZ+cwFT1w==", "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "peerDependencies": { + "marked": ">=4 <15" } }, "node_modules/merge2": { @@ -4098,32 +4286,25 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4143,9 +4324,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -4153,6 +4334,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -4166,31 +4348,38 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" }, "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -4199,29 +4388,24 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/nopt": { @@ -4248,16 +4432,17 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "engines": { - "node": ">=10" + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/object-assign": { @@ -4269,10 +4454,14 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4287,13 +4476,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -4305,28 +4495,31 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4335,28 +4528,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4391,15 +4572,6 @@ "node": ">= 0.8.0" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4420,6 +4592,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -4460,26 +4633,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -4493,10 +4652,20 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "dev": true, "funding": [ { @@ -4512,19 +4681,21 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/preact": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", - "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==", + "version": "10.23.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.2.tgz", + "integrity": "sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -4540,9 +4711,10 @@ } }, "node_modules/prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -4553,15 +4725,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -4583,21 +4746,12 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4622,18 +4776,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -4669,6 +4811,28 @@ "node": ">=8.10.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -4676,14 +4840,16 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -4702,12 +4868,13 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4718,22 +4885,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/reusify": { @@ -4761,37 +4920,39 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "node_modules/rollup": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.1.tgz", + "integrity": "sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" + "@types/estree": "1.0.5" }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/rollup": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.0.tgz", - "integrity": "sha512-YzJH0eunH2hr3knvF3i6IkLO/jTjAEwU4HoMUbQl4//Tnl3ou0e7P5SjxdDr8HQJdeUJShlbEHXrrnEHy1l7Yg==", - "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.21.1", + "@rollup/rollup-android-arm64": "4.21.1", + "@rollup/rollup-darwin-arm64": "4.21.1", + "@rollup/rollup-darwin-x64": "4.21.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.1", + "@rollup/rollup-linux-arm-musleabihf": "4.21.1", + "@rollup/rollup-linux-arm64-gnu": "4.21.1", + "@rollup/rollup-linux-arm64-musl": "4.21.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.1", + "@rollup/rollup-linux-riscv64-gnu": "4.21.1", + "@rollup/rollup-linux-s390x-gnu": "4.21.1", + "@rollup/rollup-linux-x64-gnu": "4.21.1", + "@rollup/rollup-linux-x64-musl": "4.21.1", + "@rollup/rollup-win32-arm64-msvc": "4.21.1", + "@rollup/rollup-win32-ia32-msvc": "4.21.1", + "@rollup/rollup-win32-x64-msvc": "4.21.1", "fsevents": "~2.3.2" } }, @@ -4827,50 +4988,85 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "optional": true + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.13.1" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, "node_modules/shebang-command": { @@ -4904,54 +5100,66 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, + "license": "MIT", "dependencies": { - "semver": "~7.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" } }, "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">= 8" } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4962,12 +5170,15 @@ "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", "dev": true }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", "dev": true, - "optional": true + "license": "MIT", + "engines": { + "node": ">=16" + } }, "node_modules/string-width": { "version": "4.2.3", @@ -4984,33 +5195,54 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5020,28 +5252,33 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5064,6 +5301,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -5072,21 +5310,10 @@ } }, "node_modules/style-mod": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.3.tgz", - "integrity": "sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==" - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "license": "MIT" }, "node_modules/supports-color": { "version": "5.5.0", @@ -5132,6 +5359,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -5160,31 +5388,23 @@ "tree-kill": "cli.js" } }, - "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=16" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "typescript": ">=4.2.0" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "dev": true }, "node_modules/type-check": { @@ -5199,38 +5419,89 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "optional": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -5244,6 +5515,7 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -5260,19 +5532,10 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -5282,14 +5545,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -5300,41 +5568,49 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", + "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", "dev": true, + "license": "MIT", "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.41", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -5346,9 +5622,15 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -5385,6 +5667,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -5396,18 +5679,64 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5485,7 +5814,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", @@ -5514,16 +5844,6 @@ "node": ">=12" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -5537,20 +5857,25 @@ } }, "node_modules/zustand": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.9.tgz", - "integrity": "sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", + "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", + "license": "MIT", "dependencies": { - "use-sync-external-store": "1.2.0" + "use-sync-external-store": "1.2.2" }, "engines": { "node": ">=12.7.0" }, "peerDependencies": { - "immer": ">=9.0", + "@types/react": ">=16.8", + "immer": ">=9.0.6", "react": ">=16.8" }, "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, "immer": { "optional": true }, @@ -5578,226 +5903,194 @@ } }, "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true }, "@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.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.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" } }, "@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.25.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", + "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", "dev": true, "requires": { - "@babel/types": "^7.21.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.4", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" } }, "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" } }, "@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@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.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "semver": "^6.3.1" } }, "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "requires": { - "@babel/types": "^7.21.4" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@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-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true }, "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" } }, "@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", - "dev": true + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", + "dev": true, + "requires": { + "@babel/types": "^7.25.4" + } }, "@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", - "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.21.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", "dev": true, "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.24.7" } }, "@babel/runtime": { @@ -5810,42 +6103,39 @@ } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", - "debug": "^4.1.0", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.4", + "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" } }, @@ -5872,15 +6162,15 @@ } }, "@codemirror/lang-javascript": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.1.9.tgz", - "integrity": "sha512-z3jdkcqOEBT2txn2a87A0jSy6Te3679wg/U8QzMeftFt+4KA6QooMwfdFzJiuC3L6fXKfTXZcDocoaxMYfGz0w==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz", + "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==", "requires": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", + "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } @@ -5928,187 +6218,178 @@ } }, "@codemirror/state": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz", - "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", + "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==" }, "@codemirror/view": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.14.1.tgz", - "integrity": "sha512-ofcsI7lRFo4N0rfnd+V3Gh2boQU3DmaaSKhDOvXUWjeOeuupMXer2e/3i9TUFN7aEIntv300EFBWPEiYVm2svg==", + "version": "6.33.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.33.0.tgz", + "integrity": "sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==", "requires": { - "@codemirror/state": "^6.1.4", - "style-mod": "^4.0.0", + "@codemirror/state": "^6.4.0", + "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, - "@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "dev": true, - "requires": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "global-agent": "^3.0.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - } + "optional": true }, "@esbuild/android-arm": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.16.tgz", - "integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz", - "integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.16.tgz", - "integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz", - "integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz", - "integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz", - "integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz", - "integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz", - "integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz", - "integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz", - "integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz", - "integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz", - "integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz", - "integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz", - "integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz", - "integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz", - "integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz", - "integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz", - "integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz", - "integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz", - "integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz", - "integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz", - "integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "dev": true, "optional": true }, @@ -6122,15 +6403,15 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true }, "@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -6144,30 +6425,15 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -6177,19 +6443,19 @@ } }, "@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" } }, @@ -6200,20 +6466,20 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { @@ -6223,9 +6489,9 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/sourcemap-codec": { @@ -6235,41 +6501,34 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@js2eel/compiler": { "version": "file:../compiler", "requires": { - "@types/chai": "4.3.5", - "@types/estree": "1.0.1", - "@types/mocha": "10.0.1", - "@types/node": "20.3.3", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "acorn": "8.9.0", - "c8": "8.0.0", - "chai": "4.3.7", - "concurrently": "8.2.0", - "eslint": "8.44.0", - "joi": "17.9.2", - "mocha": "10.2.0", - "tsc-watch": "6.0.4", - "typescript": "5.1.6" + "@types/chai": "4.3.18", + "@types/estree": "1.0.5", + "@types/mocha": "10.0.7", + "@types/node": "22.5.0", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "acorn": "8.12.1", + "c8": "10.1.2", + "chai": "4.5.0", + "concurrently": "8.2.2", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "joi": "17.13.3", + "mocha": "10.7.3", + "tsc-watch": "6.2.0", + "typescript": "5.5.4" } }, "@lezer/common": { @@ -6338,51 +6597,56 @@ } }, "@preact/preset-vite": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.5.0.tgz", - "integrity": "sha512-BUhfB2xQ6ex0yPkrT1Z3LbfPzjpJecOZwQ/xJrXGFSZD84+ObyS//41RdEoQCMWsM0t7UHGaujUxUBub7WM1Jw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.9.0.tgz", + "integrity": "sha512-B9yVT7AkR6owrt84K3pLNyaKSvlioKdw65VqE/zMiR6HMovPekpsrwBNs5DJhBFEd5cvLMtCjHNHZ9P7Oblveg==", "dev": true, "requires": { - "@babel/plugin-transform-react-jsx": "^7.14.9", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@prefresh/vite": "^2.2.8", + "@babel/code-frame": "^7.22.13", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@prefresh/vite": "^2.4.1", "@rollup/pluginutils": "^4.1.1", "babel-plugin-transform-hook-names": "^1.0.2", - "debug": "^4.3.1", - "kolorist": "^1.2.10", - "resolve": "^1.20.0" + "debug": "^4.3.4", + "kolorist": "^1.8.0", + "magic-string": "0.30.5", + "node-html-parser": "^6.1.10", + "resolve": "^1.22.8", + "source-map": "^0.7.4", + "stack-trace": "^1.0.0-pre2" } }, "@prefresh/babel-plugin": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.4.4.tgz", - "integrity": "sha512-/EvgIFMDL+nd20WNvMO0JQnzIl1EJPgmSaSYrZUww7A+aSdKsi37aL07TljrZR1cBMuzFxcr4xvqsUQLFJEukw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.1.tgz", + "integrity": "sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==", "dev": true }, "@prefresh/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.4.1.tgz", - "integrity": "sha512-og1vaBj3LMJagVncNrDb37Gqc0cWaUcDbpVt5hZtsN4i2Iwzd/5hyTsDHvlMirhSym3wL9ihU0Xa2VhSaOue7g==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.2.tgz", + "integrity": "sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==", "dev": true, "requires": {} }, "@prefresh/utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.1.3.tgz", - "integrity": "sha512-Mb9abhJTOV4yCfkXrMrcgFiFT7MfNOw8sDa+XyZBdq/Ai2p4Zyxqsb3EgHLOEdHpMj6J9aiZ54W8H6FTam1u+A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==", "dev": true }, "@prefresh/vite": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.2.9.tgz", - "integrity": "sha512-1ERBF85Ja9/lkrfaltmo4Gca7R2ClQPSHHDDysFgfvPzHmLUeyB0x9WHwhwov/AA1DnyPhsfYT54z3yQd8XrgA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.6.tgz", + "integrity": "sha512-miYbTl2J1YNaQJWyWHJzyIpNh7vKUuXC1qCDRzPeWjhQ+9bxeXkUBGDGd9I1f37R5GQYi1S65AN5oR0BR2WzvQ==", "dev": true, "requires": { - "@babel/core": "^7.9.6", - "@prefresh/babel-plugin": "0.4.4", - "@prefresh/core": "^1.3.3", - "@prefresh/utils": "^1.1.2", - "@rollup/pluginutils": "^4.1.0" + "@babel/core": "^7.22.1", + "@prefresh/babel-plugin": "0.5.1", + "@prefresh/core": "^1.5.1", + "@prefresh/utils": "^1.2.0", + "@rollup/pluginutils": "^4.2.1" } }, "@rollup/pluginutils": { @@ -6395,283 +6659,266 @@ "picomatch": "^2.2.2" } }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true + "@rollup/rollup-android-arm-eabi": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz", + "integrity": "sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==", + "dev": true, + "optional": true }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "@rollup/rollup-android-arm64": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz", + "integrity": "sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==", "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } + "optional": true }, - "@types/audioworklet": { - "version": "0.0.48", - "resolved": "https://registry.npmjs.org/@types/audioworklet/-/audioworklet-0.0.48.tgz", - "integrity": "sha512-p5XQ+iuQ9fBPch52memypxYsGRiaHXdwoIXoPACGlaEhje5eO6ECiKYs1oEK1oaNyvHyVJElgVRASfSfbMag3g==", - "dev": true + "@rollup/rollup-darwin-arm64": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz", + "integrity": "sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==", + "dev": true, + "optional": true }, - "@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "@rollup/rollup-darwin-x64": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz", + "integrity": "sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==", "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } + "optional": true }, - "@types/electron": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@types/electron/-/electron-1.6.10.tgz", - "integrity": "sha512-MOCVyzIwkBEloreoCVrTV108vSf8fFIJPsGruLCoAoBZdxtnJUqKA4lNonf/2u1twSjAspPEfmEheC+TLm/cMw==", + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz", + "integrity": "sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==", "dev": true, - "requires": { - "electron": "*" - } + "optional": true }, - "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz", + "integrity": "sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==", + "dev": true, + "optional": true }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz", + "integrity": "sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==", + "dev": true, + "optional": true }, - "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true + "@rollup/rollup-linux-arm64-musl": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz", + "integrity": "sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==", + "dev": true, + "optional": true }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz", + "integrity": "sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==", "dev": true, - "requires": { - "@types/node": "*" - } + "optional": true }, - "@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz", + "integrity": "sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==", + "dev": true, + "optional": true }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz", + "integrity": "sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==", "dev": true, - "requires": { - "@types/node": "*" - } + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.1.tgz", + "integrity": "sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz", + "integrity": "sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz", + "integrity": "sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz", + "integrity": "sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==", + "dev": true, + "optional": true }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "@rollup/rollup-win32-x64-msvc": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz", + "integrity": "sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==", + "dev": true, + "optional": true + }, + "@types/audioworklet": { + "version": "0.0.60", + "resolved": "https://registry.npmjs.org/@types/audioworklet/-/audioworklet-0.0.60.tgz", + "integrity": "sha512-BCYklConpVRbPlNVcjzIhRsPWBTbCFSbkfjBC+VLULryaBI1M651y4nK0SMsSuTgtVSrKVY7Y+fsobCjviuDWA==", + "dev": true + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, - "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "@types/node": { + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", "dev": true, "optional": true, - "requires": { - "@types/node": "*" - } + "peer": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz", + "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/type-utils": "8.3.0", + "@typescript-eslint/utils": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" } }, "@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", + "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", + "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" } }, "@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz", + "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/utils": "8.3.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" } }, "@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", + "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", + "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "yallist": "^4.0.0" + "balanced-match": "^1.0.0" } }, - "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "brace-expansion": "^2.0.1" } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } }, "@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", + "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", + "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.3.0", + "eslint-visitor-keys": "^3.4.3" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -6679,9 +6926,9 @@ "dev": true }, "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true }, "acorn-jsx": { @@ -6728,65 +6975,99 @@ "picomatch": "^2.0.4" } }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" } }, "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } }, "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" } }, "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "babel-plugin-transform-hook-names": { "version": "1.0.2", @@ -6807,12 +7088,11 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true, - "optional": true + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true }, "brace-expansion": { "version": "1.1.11", @@ -6825,61 +7105,37 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -6889,9 +7145,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001478", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz", - "integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==", + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "dev": true }, "chalk": { @@ -6932,15 +7188,6 @@ "wrap-ansi": "^7.0.0" } }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "codemirror": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", @@ -6977,9 +7224,9 @@ "dev": true }, "concurrently": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", - "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, "requires": { "chalk": "^4.1.2", @@ -7056,9 +7303,9 @@ } }, "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "crelt": { @@ -7077,12 +7324,64 @@ "which": "^2.0.1" } }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, "date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -7098,24 +7397,7 @@ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } + "ms": "2.1.2" } }, "deep-is": { @@ -7124,62 +7406,78 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } }, "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "optional": true + "requires": { + "esutils": "^2.0.2" + } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { - "path-type": "^4.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "esutils": "^2.0.2" + "domelementtype": "^2.3.0" } }, - "electron": { - "version": "25.3.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-25.3.2.tgz", - "integrity": "sha512-xiktJvXraaE/ARf2OVHFyTze1TksSbsbJgOaBtdIiBvUduez6ipATEPIec8Msz1n6eQ+xqYb6YF8tDuIZtJSPw==", + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "requires": { - "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", - "extract-zip": "^2.0.1" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" } }, "electron-to-chromium": { - "version": "1.4.359", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.359.tgz", - "integrity": "sha512-OoVcngKCIuNXtZnsYoqlCvr0Cf3NIPzDIgwUfI9bdTFjXCrr79lI0kwQstLPZ7WhCezLlGksZk/BFAzoXC7GDw==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "emoji-regex": { @@ -7188,81 +7486,130 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + } + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" } }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "es-to-primitive": { @@ -7276,47 +7623,41 @@ "is-symbol": "^1.0.2" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, "esbuild": { - "version": "0.17.16", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.16.tgz", - "integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.17.16", - "@esbuild/android-arm64": "0.17.16", - "@esbuild/android-x64": "0.17.16", - "@esbuild/darwin-arm64": "0.17.16", - "@esbuild/darwin-x64": "0.17.16", - "@esbuild/freebsd-arm64": "0.17.16", - "@esbuild/freebsd-x64": "0.17.16", - "@esbuild/linux-arm": "0.17.16", - "@esbuild/linux-arm64": "0.17.16", - "@esbuild/linux-ia32": "0.17.16", - "@esbuild/linux-loong64": "0.17.16", - "@esbuild/linux-mips64el": "0.17.16", - "@esbuild/linux-ppc64": "0.17.16", - "@esbuild/linux-riscv64": "0.17.16", - "@esbuild/linux-s390x": "0.17.16", - "@esbuild/linux-x64": "0.17.16", - "@esbuild/netbsd-x64": "0.17.16", - "@esbuild/openbsd-x64": "0.17.16", - "@esbuild/sunos-x64": "0.17.16", - "@esbuild/win32-arm64": "0.17.16", - "@esbuild/win32-ia32": "0.17.16", - "@esbuild/win32-x64": "0.17.16" + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true }, "escape-string-regexp": { @@ -7326,27 +7667,28 @@ "dev": true }, "eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -7356,7 +7698,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -7368,7 +7709,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -7381,12 +7721,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7418,22 +7752,6 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -7468,15 +7786,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7513,31 +7822,34 @@ } }, "eslint-linter-browserify": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint-linter-browserify/-/eslint-linter-browserify-8.44.0.tgz", - "integrity": "sha512-LKnZSBsd7WJ8f5LwZCNB7zkWbs/zesNAUa0fH4mRsqBML7A7lfmDRkkp6wYhMFE4hdvp8OSNWjs+6jl61cMa6A==" + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/eslint-linter-browserify/-/eslint-linter-browserify-9.9.1.tgz", + "integrity": "sha512-b0u6vxwvQU47QqEohr1WYprX5H7CdbHiBaFdV7i53aPTD+0mAxw1Gow2WOc4OJsiNqL41viohAakf2zr6gFqHg==" }, "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "dependencies": { "doctrine": { @@ -7549,19 +7861,13 @@ "esutils": "^2.0.2" } }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -7569,32 +7875,32 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "requires": {} }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { "acorn": "^8.9.0", @@ -7609,14 +7915,6 @@ "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "esrecurse": { @@ -7626,20 +7924,12 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "estree-walker": { @@ -7654,18 +7944,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7673,9 +7951,9 @@ "dev": true }, "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -7706,15 +7984,6 @@ "reusify": "^1.0.4" } }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -7725,9 +7994,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -7758,17 +8027,6 @@ "is-callable": "^1.1.3" } }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -7776,28 +8034,28 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functions-have-names": { @@ -7819,33 +8077,27 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "pump": "^3.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "glob": { @@ -7871,50 +8123,6 @@ "is-glob": "^4.0.1" } }, - "global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "optional": true - } - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -7922,26 +8130,13 @@ "dev": true }, "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" } }, "gopd": { @@ -7953,52 +8148,12 @@ "get-intrinsic": "^1.1.3" } }, - "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -8012,18 +8167,18 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "requires": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true }, "has-symbols": { @@ -8033,40 +8188,39 @@ "dev": true }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, - "highlight.js": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", - "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "function-bind": "^1.1.2" } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "highlight.js": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.10.0.tgz", + "integrity": "sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==", + "dev": true + }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "ignore-by-default": { @@ -8083,14 +8237,6 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } } }, "imurmurhash": { @@ -8116,25 +8262,33 @@ "dev": true }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + } + }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" } }, "is-bigint": { @@ -8172,12 +8326,21 @@ "dev": true }, "is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "requires": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" } }, "is-date-object": { @@ -8195,12 +8358,30 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -8210,10 +8391,16 @@ "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true + }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, "is-number": { @@ -8247,13 +8434,19 @@ "has-tostringtag": "^1.0.0" } }, + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true + }, "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" } }, "is-string": { @@ -8275,50 +8468,84 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" } }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" } }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "requires": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -8331,28 +8558,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "optional": true - }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, "jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -8363,19 +8574,10 @@ "object.assign": "^4.1.3" } }, - "keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, "kolorist": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.7.0.tgz", - "integrity": "sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", "dev": true }, "levn": { @@ -8408,12 +8610,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -8423,38 +8619,28 @@ "yallist": "^3.0.2" } }, + "magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, "marked": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz", - "integrity": "sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.1.0.tgz", + "integrity": "sha512-P93GikH/Pde0hM5TAXEd8I4JAYi8IB03n8qzW8Bh1BIEFpEyBoYxi/XWZA53LSpTeLBiMQOoSMj0u5E/tiVYTA==", "dev": true }, "marked-highlight": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.0.1.tgz", - "integrity": "sha512-LDUfR/zDvD+dJ+lQOWHkxvBLNxiXcaN8pBtwJ/i4pI0bkDC/Ef6Mz1qUrAuHXfnpdr2rabdMpVFhqFuU+5Mskg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.1.4.tgz", + "integrity": "sha512-D1GOkcdzP+1dzjoColL7umojefFrASDuLeyaHS0Zr/Uo9jkr1V6vpLRCzfi1djmEaWyK0SYMFtHnpkZ+cwFT1w==", "dev": true, "requires": {} }, - "matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^4.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "optional": true - } - } - }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -8462,21 +8648,15 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8493,9 +8673,9 @@ "dev": true }, "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true }, "natural-compare": { @@ -8504,49 +8684,44 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "dev": true, + "requires": { + "css-select": "^5.1.0", + "he": "1.2.0" + } }, "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", "dev": true, "requires": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -8566,11 +8741,14 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } }, "object-assign": { "version": "4.1.1", @@ -8578,9 +8756,9 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true }, "object-keys": { @@ -8590,58 +8768,49 @@ "dev": true }, "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "once": { @@ -8667,12 +8836,6 @@ "type-check": "^0.4.0" } }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8715,22 +8878,10 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "picomatch": { @@ -8739,21 +8890,27 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "dev": true, "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" } }, "preact": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", - "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==" + "version": "10.23.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.2.tgz", + "integrity": "sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==" }, "prelude-ls": { "version": "1.2.1", @@ -8762,15 +8919,9 @@ "dev": true }, "prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==" }, "prop-types": { "version": "15.8.1", @@ -8795,20 +8946,10 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "queue-microtask": { @@ -8817,12 +8958,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, "react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -8849,6 +8984,21 @@ "picomatch": "^2.2.1" } }, + "reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + } + }, "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -8856,14 +9006,15 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "require-directory": { @@ -8873,31 +9024,22 @@ "dev": true }, "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8913,27 +9055,29 @@ "glob": "^7.1.3" } }, - "roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - } - }, "rollup": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.0.tgz", - "integrity": "sha512-YzJH0eunH2hr3knvF3i6IkLO/jTjAEwU4HoMUbQl4//Tnl3ou0e7P5SjxdDr8HQJdeUJShlbEHXrrnEHy1l7Yg==", - "dev": true, - "requires": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.1.tgz", + "integrity": "sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.21.1", + "@rollup/rollup-android-arm64": "4.21.1", + "@rollup/rollup-darwin-arm64": "4.21.1", + "@rollup/rollup-darwin-x64": "4.21.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.1", + "@rollup/rollup-linux-arm-musleabihf": "4.21.1", + "@rollup/rollup-linux-arm64-gnu": "4.21.1", + "@rollup/rollup-linux-arm64-musl": "4.21.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.1", + "@rollup/rollup-linux-riscv64-gnu": "4.21.1", + "@rollup/rollup-linux-s390x-gnu": "4.21.1", + "@rollup/rollup-linux-x64-gnu": "4.21.1", + "@rollup/rollup-linux-x64-musl": "4.21.1", + "@rollup/rollup-win32-arm64-msvc": "4.21.1", + "@rollup/rollup-win32-ia32-msvc": "4.21.1", + "@rollup/rollup-win32-x64-msvc": "4.21.1", + "@types/estree": "1.0.5", "fsevents": "~2.3.2" } }, @@ -8955,38 +9099,59 @@ "tslib": "^2.1.0" } }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "optional": true + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } }, - "serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "optional": true, "requires": { - "type-fest": "^0.13.1" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" } }, "shebang-command": { @@ -9011,43 +9176,44 @@ "dev": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "requires": { - "semver": "~7.0.0" + "semver": "^7.5.3" }, "dependencies": { "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true }, "spawn-command": { @@ -9056,12 +9222,11 @@ "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", "dev": true }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, - "optional": true + "stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "dev": true }, "string-width": { "version": "4.2.3", @@ -9075,52 +9240,67 @@ } }, "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + } + }, + "string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { @@ -9139,18 +9319,9 @@ "dev": true }, "style-mod": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.3.tgz", - "integrity": "sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==" - }, - "sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "requires": { - "debug": "^4.1.0" - } + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==" }, "supports-color": { "version": "5.5.0", @@ -9203,29 +9374,19 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, "tslib": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "dev": true }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9235,28 +9396,62 @@ "prelude-ls": "^1.2.1" } }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "optional": true + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } }, "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true }, "unbox-primitive": { @@ -9277,20 +9472,14 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -9303,21 +9492,21 @@ } }, "use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "requires": {} }, "vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", + "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", "dev": true, "requires": { - "esbuild": "^0.17.5", - "fsevents": "~2.3.2", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.21.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.41", + "rollup": "^4.20.0" } }, "w3c-keyname": { @@ -9347,18 +9536,49 @@ "is-symbol": "^1.0.3" } }, + "which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "requires": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "requires": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + } + }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" } }, "wrap-ansi": { @@ -9437,16 +9657,6 @@ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -9454,11 +9664,11 @@ "dev": true }, "zustand": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.9.tgz", - "integrity": "sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", + "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", "requires": { - "use-sync-external-store": "1.2.0" + "use-sync-external-store": "1.2.2" } } } diff --git a/gui/package.json b/gui/package.json index 7c7ac28..e7646e1 100644 --- a/gui/package.json +++ b/gui/package.json @@ -17,33 +17,32 @@ "docs": "node scripts/createDocs.js" }, "dependencies": { - "@codemirror/lang-javascript": "6.1.9", + "@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-json": "6.0.1", "@js2eel/compiler": "file:../compiler", "codemirror": "6.0.1", - "eslint-linter-browserify": "8.44.0", - "preact": "10.15.1", - "prettier": "3.0.0", + "eslint-linter-browserify": "9.9.1", + "preact": "10.23.2", + "prettier": "3.3.3", "react-feather": "2.0.10", - "zustand": "4.3.9" + "zustand": "4.5.5" }, "devDependencies": { - "@preact/preset-vite": "2.5.0", - "@types/audioworklet": "0.0.48", - "@types/electron": "1.6.10", - "@types/estree": "1.0.1", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "concurrently": "8.2.0", - "csstype": "3.1.2", - "eslint": "8.44.0", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-hooks": "4.6.0", - "highlight.js": "11.8.0", - "marked": "5.1.2", - "marked-highlight": "2.0.1", - "nodemon": "2.0.22", - "typescript": "5.1.6", - "vite": "4.3.9" + "@preact/preset-vite": "2.9.0", + "@types/audioworklet": "0.0.60", + "@types/estree": "1.0.5", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "concurrently": "8.2.2", + "csstype": "3.1.3", + "eslint": "8.57.0", + "eslint-plugin-react": "7.35.0", + "eslint-plugin-react-hooks": "4.6.2", + "highlight.js": "11.10.0", + "marked": "14.1.0", + "marked-highlight": "2.1.4", + "nodemon": "3.1.4", + "typescript": "5.5.4", + "vite": "5.4.2" } } diff --git a/gui/scripts/createDocs.js b/gui/scripts/createDocs.js index fcec967..e931a0f 100644 --- a/gui/scripts/createDocs.js +++ b/gui/scripts/createDocs.js @@ -20,17 +20,8 @@ const marked = new Marked( const renderer = new marked.Renderer(); -renderer.link = (href, title, text) => { - return `${text}`; -}; - -// Removes internal links for now in the webapp as they don't work there. -renderer.listitem = (text, task, checked) => { - if (text.includes('href="#')) { - return ''; - } else { - return `
  • ${text}
  • `; - } +renderer.link = (link) => { + return `${link.text}`; }; const files = fs.readdirSync(DOCS_MD_PATH); diff --git a/gui/src/components/EditorApp.tsx b/gui/src/components/EditorApp.tsx index 3b03734..3e3e808 100644 --- a/gui/src/components/EditorApp.tsx +++ b/gui/src/components/EditorApp.tsx @@ -93,7 +93,7 @@ export const EditorApp = ({ initialStorage, environment, onCompile }: Props): VN lastTickRef.current = Date.now(); }, 500); - return () => { + return (): void => { clearInterval(tickInterval); }; }, []); @@ -107,7 +107,7 @@ export const EditorApp = ({ initialStorage, environment, onCompile }: Props): VN window.onbeforeunload = onBeforeUnload; - return () => { + return (): void => { window.removeEventListener('beforeunload', onBeforeUnload); }; } diff --git a/gui/src/components/js2eel/tabs/EelReadonlyCodeEditor.tsx b/gui/src/components/js2eel/tabs/EelReadonlyCodeEditor.tsx index 4a35820..0a84bb5 100644 --- a/gui/src/components/js2eel/tabs/EelReadonlyCodeEditor.tsx +++ b/gui/src/components/js2eel/tabs/EelReadonlyCodeEditor.tsx @@ -43,7 +43,7 @@ export const EelReadonlyCodeEditor = (): VNode => { scrollContainerRef.current = eelReadonlyElRef.current.querySelector('.cm-scroller'); setScrollId('eelReadonlyCodeEditor'); - return () => { + return (): void => { eelEditorRef.current?.destroy(); }; }, [eelEditorRef, compileResult]); diff --git a/gui/src/components/js2eel/tabs/JsCodeEditor.tsx b/gui/src/components/js2eel/tabs/JsCodeEditor.tsx index b941a34..7ed138d 100644 --- a/gui/src/components/js2eel/tabs/JsCodeEditor.tsx +++ b/gui/src/components/js2eel/tabs/JsCodeEditor.tsx @@ -114,7 +114,7 @@ export const JsCodeEditor = (): VNode => { document.addEventListener('keydown', onKeyPress); - return () => { + return (): void => { document.removeEventListener('keydown', onKeyPress); }; }, [currentFile, jsEditorRef, storage, setSaved, setModalOpen, setTakeCurrentFileAsTemplate]); @@ -136,7 +136,7 @@ export const JsCodeEditor = (): VNode => { scrollContainerRef.current = jsEditorElRef.current.querySelector('.cm-scroller'); setScrollId('jsCodeEditor'); - return () => { + return (): void => { if (jsCompileTimeoutRef.current) { clearTimeout(jsCompileTimeoutRef.current); } diff --git a/gui/src/components/js2eel/tabs/JsonReadonlyCodeEditor.tsx b/gui/src/components/js2eel/tabs/JsonReadonlyCodeEditor.tsx index 4ea56d8..f17747a 100644 --- a/gui/src/components/js2eel/tabs/JsonReadonlyCodeEditor.tsx +++ b/gui/src/components/js2eel/tabs/JsonReadonlyCodeEditor.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'preact/hooks'; import { EditorView } from 'codemirror'; import { EditorState } from '@codemirror/state'; import { json } from '@codemirror/lang-json'; -import { syntaxHighlighting, defaultHighlightStyle } from '@codemirror/language'; +import { syntaxHighlighting } from '@codemirror/language'; import { searchKeymap } from '@codemirror/search'; import { keymap, drawSelection } from '@codemirror/view'; @@ -47,7 +47,7 @@ export const JsonReadonlyCodeEditor = ({ scrollId, content }: Props): VNode => { setStateScrollId(scrollId); - return () => { + return (): void => { jsonEditorRef.current?.destroy(); }; }, [content, scrollId, stateScrollId]); diff --git a/gui/src/components/js2eel/useRecallScrollPosition.ts b/gui/src/components/js2eel/useRecallScrollPosition.ts index be7b604..fb3c8ea 100644 --- a/gui/src/components/js2eel/useRecallScrollPosition.ts +++ b/gui/src/components/js2eel/useRecallScrollPosition.ts @@ -19,7 +19,7 @@ export const useRecallScrollPosition = ( } }, 250); - return () => { + return (): void => { clearInterval(timer); }; }, [scrollElementId, scrollElementRef]); @@ -68,7 +68,7 @@ export const useRecallScrollPosition = ( } }, 500); - return () => { + return (): void => { clearInterval(scrollInterval); }; } diff --git a/gui/src/components/ui/Modal.tsx b/gui/src/components/ui/Modal.tsx index f5b668a..68e4987 100644 --- a/gui/src/components/ui/Modal.tsx +++ b/gui/src/components/ui/Modal.tsx @@ -29,7 +29,7 @@ export const Modal = ({ title, children, onOutsideClick, setModalOpen }: Props): window.addEventListener('keydown', keyPressHandler); - return () => { + return (): void => { window.removeEventListener('keydown', keyPressHandler); }; }, [setModalOpen, setTakeCurrentFileAsTemplate]); diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index 8aeb03c..76fc690 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,10 +1,10 @@ { - "api-documentation": "

    API Documentation

    \n
      \n
    \n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n    setStart(newPosition: number): void;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): any;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n

    Special Functions & Variables

    \n

    extTailSize()

    \n

    Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

    \n
    extTailSize(samples: number): void;\n
    \n", - "changelog": "

    Changelog

    \n
      \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • Allow function declaration in block statement
      • Allow member expression returns
      \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • More documentation
      \n
    • v0.3.0: Initial release
    \n", - "development": "

    Development

    \n

    Requirements

    \n
      \n
    • Node.js 18 and higher
    • Terminal emulator
        \n
      • Linux, MacOS: bash or zsh
      • Windows: git bash (comes with git)
      \n
    • Reaper DAW, obviously
    \n

    Setup

    \n
      \n
    • Install dependencies for all packages:
        \n
      • cd scripts
      • ./install.sh
      \n
    • Open a different terminal session for each of the following steps
        \n
      • Go to compiler and do npm run dev
      • Go to gui and do npm run dev
      • Go to desktop and do npm run dev. Now, the electron build should open.
      \n
    \n

    Guidelines

    \n
      \n
    • We aim for 100% test coverage for the compiler package
    \n

    Architecture

    \n

    TODO

    \n

    Recommended VSCode Extensions

    \n

    TODO

    \n", + "api-documentation": "

    API Documentation

    \n\n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n    setStart(newPosition: number): void;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): any;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n

    Special Functions & Variables

    \n

    extTailSize()

    \n

    Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

    \n
    extTailSize(samples: number): void;\n
    \n", + "changelog": "

    Changelog

    \n
      \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      • \n
      \n
    • \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • \n
      • Allow function declaration in block statement
      • \n
      • Allow member expression returns
      • \n
      \n
    • \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • \n
      • More documentation
      • \n
      \n
    • \n
    • v0.3.0: Initial release
    • \n
    \n", + "development": "

    Development

    \n

    Requirements

    \n
      \n
    • Node.js 18 and higher
    • \n
    • Terminal emulator
        \n
      • Linux, MacOS: bash or zsh
      • \n
      • Windows: git bash (comes with git)
      • \n
      \n
    • \n
    • Reaper DAW, obviously
    • \n
    \n

    Setup

    \n
      \n
    • Install dependencies for all packages:
        \n
      • cd scripts
      • \n
      • ./install.sh
      • \n
      \n
    • \n
    • Open a different terminal session for each of the following steps
        \n
      • Go to compiler and do npm run dev
      • \n
      • Go to gui and do npm run dev
      • \n
      • Go to desktop and do npm run dev. Now, the electron build should open.
      • \n
      \n
    • \n
    \n

    Guidelines

    \n
      \n
    • We aim for 100% test coverage for the compiler package
    • \n
    \n

    Architecture

    \n

    TODO

    \n

    Recommended VSCode Extensions

    \n

    TODO

    \n", "feature-comparison": "

    Feature Comparison with JSFX

    \n

    JSFX Reference: https://www.reaper.fm/sdk/js/js.php

    \n

    Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

    \n

    โœ…: Implemented

    \n

    ๐Ÿ•’: Should be implemented

    \n

    โŒ: Won't be implemented

    \n

    โ”: Unknown if feasible, useful, or working properly

    \n

    Description Lines and Utility Features

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…descImplemented as part of config()
    ๐Ÿ•’tags
    ๐Ÿ•’options
    ๐Ÿ•’JSFX comments
    \n

    Code Sections

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…@initonInit()
    โœ…@slideronSlider()
    ๐Ÿ•’@block
    โœ…@sampleonSample()
    ๐Ÿ•’@serialize
    ๐Ÿ•’@gfxDeclarative with React-like syntax?
    \n

    File Handling

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’import
    ๐Ÿ•’filename
    โœ…file_open(index | slider)Slider variant implemented
    โœ…file_close(handle)
    ๐Ÿ•’file_rewind(handle)
    ๐Ÿ•’file_var(handle, variable)
    โœ…file_mem(handle, offset, length)
    โœ…file_avail(handle)
    โœ…file_riff(handle, nch, samplerate)
    ๐Ÿ•’file_text(handle, istext)
    ๐Ÿ•’file_string(handle,str)
    \n

    Routing and Input

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…in_pin, out_pinImplemented as part of config()
    \n

    UI

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Slider: Normalslider()
    โœ…Slider: SelectselectBox()
    โœ…Slider: File
    ๐Ÿ•’Hidden sliders
    ๐Ÿ•’Slider: shapes
    โŒslider(index)Might not be necessary as every slider is bound to a variable
    ๐Ÿ•’slider_next_chg(sliderindex,nextval)
    \n

    Sample Access

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…spl0 - spl63
    โœ…spl(index)
    \n

    Audio and Transport State Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…srate
    โœ…num_ch
    โœ…samplesblock
    โœ…tempo
    โœ…play_state
    โœ…play_position
    โœ…beat_position
    โœ…ts_num
    โœ…ts_denom
    \n

    Data Structures and Encodings

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Local variableslet & const
    โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
    โ”Local address space 8m word restriction
    ๐Ÿ•’Global address space (gmem[])
    ๐Ÿ•’Named global address space
    โ”Global named variables (_global. prefix)
    ๐Ÿ•’Hex numbers
    ๐Ÿ•’ASCII chars
    ๐Ÿ•’Bitmasks
    โ”StringsAlready fully implemented?
    \n

    Control Structures

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…FunctionsUser definable functions are inlined in compiled code
    โœ…Conditionals
    โœ…Conditional Branching
    ๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
    ๐Ÿ•’while(actions..., condition)
    ๐Ÿ•’while(condition) (actions...)
    \n

    Operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…!value
    โœ…-value
    โœ…+value
    โœ…base ^ exponentMath.pow(base, exponent) or **
    โœ…numerator % denominator
    โœ…value / divisor
    โœ…value * another_value
    โœ…value - another_value
    โœ…value + another_value
    โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 === value2
    โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 !== value2
    โœ…value1 < value2
    โœ…value1 > value2
    โœ…value1 <= value2
    โœ…value1 >= value2
    โœ…y || z
    โœ…y && z
    โœ…y ? z
    โœ…y ? z : x
    โœ…y = z
    โœ…y *= z
    โœ…y /= divisor
    โœ…y %= divisor
    ๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
    โœ…y += z
    โœ…y -= z
    \n

    Bitwise operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’value << shift_amt
    ๐Ÿ•’value >> shift_amt
    ๐Ÿ•’a | b
    ๐Ÿ•’a & b
    ๐Ÿ•’a ~ b
    ๐Ÿ•’y | = z
    ๐Ÿ•’y &= z
    ๐Ÿ•’y ~= z
    \n

    Math Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…sin(angle)
    โœ…cos(angle)
    โœ…tan(angle)
    โœ…asin(x)
    โœ…acos(x)
    โœ…atan(x)
    โœ…atan2(x, y)
    โœ…sqr(x)
    โœ…sqrt(x)
    โœ…pow(x, y)
    โœ…exp(x)
    โœ…log(x)
    โœ…log10(x)
    โœ…abs(x)
    โœ…min(x, y)
    โœ…max(x, y)
    โœ…sign(x)
    โœ…rand(x)
    โœ…floor(x)
    โœ…ceil(x)
    โœ…invsqrt(x)
    \n

    Time Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’time([v])
    ๐Ÿ•’time_precise([v])
    \n

    Midi Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’midisend(offset, msg1, msg2)
    ๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
    ๐Ÿ•’midisend(offset, msg1, msg2, msg3)
    ๐Ÿ•’midisend_buf(offset, buf, len)
    ๐Ÿ•’midisend_str(offset, string)
    ๐Ÿ•’midirecv(offset, msg1, msg23)
    ๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
    ๐Ÿ•’midirecv_buf(offset, buf, maxlen)
    ๐Ÿ•’midirecv_str(offset, string)
    ๐Ÿ•’midisyx(offset, msgptr, len)
    \n

    Memory/FFT/MDCT Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’mdct(start_index, size)
    ๐Ÿ•’imdct(start_index, size)
    ๐Ÿ•’fft(start_index, size)
    ๐Ÿ•’ifft(start_index, size)
    ๐Ÿ•’fft_real(start_index, size)
    ๐Ÿ•’ifft_real(start_index, size)
    ๐Ÿ•’fft_permute(index, size)
    ๐Ÿ•’fft_ipermute(index, size)
    ๐Ÿ•’convolve_c(dest, src, size)
    ๐Ÿ•’freembuf(top)
    ๐Ÿ•’memcpy(dest, source, length)
    ๐Ÿ•’memset(dest, value, length)
    ๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
    ๐Ÿ•’mem_insert_shuffle(buf, len, value)
    ๐Ÿ•’__memtop()
    ๐Ÿ•’stack_push(value)
    ๐Ÿ•’stack_pop(value)
    ๐Ÿ•’stack_peek(index)
    ๐Ÿ•’stack_exch(value)
    ๐Ÿ•’atomic_setifequal(dest, value, newvalue)
    ๐Ÿ•’atomic_exch(val1, val2)
    ๐Ÿ•’atomic_add(dest_val1, val2)
    ๐Ÿ•’atomic_set(dest_val1, val2)
    ๐Ÿ•’atomic_get(val)
    \n

    Host Interaction Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’sliderchange(mask | sliderX)
    ๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
    ๐Ÿ•’slider_show(mask or sliderX[, value])
    ๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
    ๐Ÿ•’get_host_numchan()
    ๐Ÿ•’set_host_numchan(numchan)
    ๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
    ๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
    ๐Ÿ•’get_pinmapper_flags(no parameters)
    ๐Ÿ•’set_pinmapper_flags(flags)
    ๐Ÿ•’get_host_placement([chain_pos, flags])
    \n

    String Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’strlen(str)
    ๐Ÿ•’strcpy(str, srcstr)
    ๐Ÿ•’strcat(str, srcstr)
    ๐Ÿ•’strcmp(str, str2)
    ๐Ÿ•’stricmp(str, str2)
    ๐Ÿ•’strncmp(str, str2, maxlen)
    ๐Ÿ•’strnicmp(str, str2, maxlen)
    ๐Ÿ•’strncpy(str, srcstr, maxlen)
    ๐Ÿ•’strncat(str, srcstr, maxlen)
    ๐Ÿ•’strcpy_from(str, srcstr, offset)
    ๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
    ๐Ÿ•’str_getchar(str, offset[, type])
    ๐Ÿ•’str_setchar(str, offset, value[, type])
    ๐Ÿ•’strcpy_fromslider(str, slider)
    ๐Ÿ•’sprintf(str, format, ...)
    ๐Ÿ•’match(needle, haystack, ...)
    ๐Ÿ•’matchi(needle, haystack, ...)
    \n

    GFX Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
    ๐Ÿ•’gfx_lineto(x, y, aa)
    ๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
    ๐Ÿ•’gfx_rectto(x, y)
    ๐Ÿ•’gfx_rect(x, y, w, h)
    ๐Ÿ•’gfx_setpixel(r, g, b)
    ๐Ÿ•’gfx_getpixel(r, g, b)
    ๐Ÿ•’gfx_drawnumber(n, ndigits)
    ๐Ÿ•’gfx_drawchar($'c')
    ๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
    ๐Ÿ•’gfx_measurestr(str, w, h)
    ๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
    ๐Ÿ•’gfx_getfont()
    ๐Ÿ•’gfx_printf(str, ...)
    ๐Ÿ•’gfx_blurto(x,y)
    ๐Ÿ•’gfx_blit(source, scale, rotation)
    ๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
    ๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
    ๐Ÿ•’gfx_getimgdim(image, w, h)
    ๐Ÿ•’gfx_setimgdim(image, w,h)
    ๐Ÿ•’gfx_loadimg(image, filename)
    ๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
    ๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
    ๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
    ๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
    ๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
    ๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
    ๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
    ๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
    ๐Ÿ•’gfx_getchar([char, unicodechar])
    ๐Ÿ•’gfx_showmenu("str")
    ๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
    \n

    GFX Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
    ๐Ÿ•’gfx_w, gfx_h
    ๐Ÿ•’gfx_x, gfx_y
    ๐Ÿ•’gfx_mode
    ๐Ÿ•’gfx_clear
    ๐Ÿ•’gfx_dest
    ๐Ÿ•’gfx_texth
    ๐Ÿ•’gfx_ext_retina
    ๐Ÿ•’gfx_ext_flags
    ๐Ÿ•’mouse_x, mouse_y
    ๐Ÿ•’mouse_cap
    ๐Ÿ•’mouse_wheel, mouse_hwheel
    \n

    Special Vars and Extended Functionality

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’trigger
    ๐Ÿ•’ext_noinit
    ๐Ÿ•’ext_nodenorm
    โœ…ext_tail_size
    ๐Ÿ•’reg00-reg99
    ๐Ÿ•’_global.*
    \n

    Delay Compensation Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’pdc_delay
    ๐Ÿ•’pdc_bot_ch
    ๐Ÿ•’pdc_top_ch
    ๐Ÿ•’pdc_midi
    \n", "getting-started": "

    Getting Started: Your First JS2EEL Plugin

    \n

    Let's create our first JS2EEL plugin. We'll write it in JavaScript. JS2EEL will compile it into a REAPER JSFX plugin that you can use instantly.

    \n

    Our plugin will take an input audio signal and modify its volume. If you'd like to see the finished plugin, feel free to load the example plugin volume.js.

    \n

    Step 1: Create a New File

    \n

    Click on the "New File" button in the upper left half of the window.

    \n

    A modal will appear where you have to enter a filename for the JavaScript code and a description that will be used to reference the JSFX plugin in REAPER. Let's start with the same value for both: volume.

    \n

    As you create the new file, the JS code tab will be pre-populated with a minimal template. There will be a call to the config() function, where the name and the channel configuration of the plugin is defined:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    Take a look at the resulting JSFX code on the right. If you're familiar with JSFX, you'll meet some old friends here: desc: and the in_pin and out_pin configuration for your plugin's channel routing.

    \n

    Additionally, a template for the onSample() function call is provided. This is a JS2EEL library function that iterates through every sample of the audio block and allows you to modify it. This corresponds to the @sample part in JSFX.

    \n

    Step 2: Declare Volume Adjustment Holder Variables

    \n

    Next, we will create variables to hold the current volume level and the target volume level. Between config() and onSample(), add the following code:

    \n
    let volume = 0;\nlet target = 0;\n
    \n

    volume represents the volume in dB, and target represents the target volume in linear scale.

    \n

    Step 3: Create a Slider for User Input

    \n

    To allow the user to adjust the volume, we'll use a slider. We'll bind that slider to the volume variable created above. After the variable declarations, add the following code to your file:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    As you might know, slider numbering is important in EEL. It starts at 1, and so our slider takes 1 as the first argument.

    \n

    The second argument is the variable to bind to: volume.

    \n

    The third argument is the default value: 0.

    \n

    The fourth and fifth arguments are the minimum and maximum values: -150 and 18 dB, respectively.

    \n

    The sixth argument is the step size: 0.1.

    \n

    The last argument is the label for the slider which will be displayed in the GUI: Volume [dB].

    \n

    Step 4: Handle Slider Value Changes

    \n

    Now, we need to update the target variable whenever the user adjusts the slider. We'll use the onSlider() library function to handle slider value changes. This corresponds to EEL's @slider. After the slider definition via slider(), add the following code to your file:

    \n
    onSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n
    \n

    Here we assign a linear target level to the target variable, which will be used later to adjust our sample amplitude. If the slider is at its lower boundary, we set the target to 0 to mute the audio.

    \n

    Step 5: Process Audio Samples

    \n

    The final step is to process audio samples based on the calculated target volume. We'll use the onSample() function to perform audio processing. This corresponds to EEL's @sample. In the callback arrow function parameter of onSample(), add the following code:

    \n
    eachChannel((sample, _ch) => {\n    sample *= target;\n});\n
    \n

    eachChannel() is another JS2EEL library function that makes it easy to manipulate samples per channel. It can only be called in onSample. It has no equivalent in EEL. We just multiply every sample in each of the two channels by the target volume to adjust its amplitude respectively.

    \n

    Finished Plugin

    \n

    Here is the complete code:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n\nlet volume = 0;\nlet target = 0;\n\nslider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n\nonSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n\nonSample(() => {\n    eachChannel((sample, _ch) => {\n        sample *= target;\n    });\n});\n
    \n

    Conclusion

    \n

    That's it! You've successfully created a simple volume plugin using JS2EEL. If you're using the web app version of JS2EEL, copy the JSFX code into a new JSFX in REAPER to hear it in action. If you're using the desktop app and have configured the output path correctly, your volume JSFX should appear in the JS subdirectory of the FX selector.

    \n

    Feel free to take a look at the other examples. You'll be inspired to write your own JS2EEL plugin in no time!

    \n", - "limitations": "

    Limitations

    \n
      \n
    • Right now still not very expressive
    \n

    Accessing Arrays

    \n
      \n
    • Iteration only possible with variable known at compile time
        \n
      • Alternative: loops (TBI), but slower
      \n
    \n

    TODO

    \n", + "limitations": "

    Limitations

    \n
      \n
    • Right now still not very expressive
    • \n
    \n

    Accessing Arrays

    \n
      \n
    • Iteration only possible with variable known at compile time
        \n
      • Alternative: loops (TBI), but slower
      • \n
      \n
    • \n
    \n

    TODO

    \n", "shortcuts": "

    Keyboard Shortcuts

    \n

    Editor

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Linux & WindowsMacDescription
    Ctrl + SCmd + SSave
    Ctrl + ICmd + IAutoformat
    Ctrl + /Cmd + /Toggle line comment(s)
    Alt + Up/DownAlt + Up/DownMove line(s) up/down
    Ctrl + DCmd + DSelect next symbol occurence
    Ctrl + FCmd + FOpen search panel
    \n", - "useful-resources": "

    Useful Resources

    \n

    REAPER EEL Language / JSFX

    \n\n

    DSP

    \n\n

    Compiler Development

    \n\n" + "useful-resources": "

    Useful Resources

    \n

    REAPER EEL Language / JSFX

    \n\n

    DSP

    \n\n

    Compiler Development

    \n\n" } \ No newline at end of file From 8e038295304d64b4041e46e355f761431295fb35 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 16:39:01 +0200 Subject: [PATCH 28/42] Desktop: update packages --- desktop/package-lock.json | 3337 ++++++++++++++++++++++++++----------- desktop/package.json | 22 +- 2 files changed, 2378 insertions(+), 981 deletions(-) diff --git a/desktop/package-lock.json b/desktop/package-lock.json index a747241..2708833 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -10,49 +10,50 @@ "license": "GPL-3.0", "dependencies": { "@js2eel/compiler": "file:../compiler", - "chokidar": "3.5.3" + "chokidar": "3.6.0" }, "devDependencies": { - "@electron/notarize": "1.2.4", - "@types/node": "20.3.3", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "concurrently": "8.2.0", - "electron": "25.3.2", - "electron-builder": "24.6.3", - "eslint": "8.44.0", - "nodemon": "3.0.1", - "typescript": "5.1.6" + "@electron/notarize": "2.4.0", + "@types/node": "22.5.0", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "concurrently": "8.2.2", + "electron": "32.0.1", + "electron-builder": "24.13.3", + "eslint": "8.57.0", + "nodemon": "3.1.4", + "typescript": "5.5.4" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "../compiler": { "name": "@js2eel/compiler", - "version": "0.6.2", + "version": "0.10.0", "license": "GPL-3.0", "dependencies": { - "acorn": "8.9.0", - "joi": "17.9.2" + "acorn": "8.12.1", + "joi": "17.13.3" }, "devDependencies": { - "@types/chai": "4.3.5", - "@types/estree": "1.0.1", - "@types/mocha": "10.0.1", - "@types/node": "20.3.3", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "c8": "8.0.0", - "chai": "4.3.7", - "concurrently": "8.2.0", - "eslint": "8.44.0", - "mocha": "10.2.0", - "tsc-watch": "6.0.4", - "typescript": "5.1.6" + "@types/chai": "4.3.18", + "@types/estree": "1.0.5", + "@types/mocha": "10.0.7", + "@types/node": "22.5.0", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "c8": "10.1.2", + "chai": "4.5.0", + "concurrently": "8.2.2", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "mocha": "10.7.3", + "tsc-watch": "6.2.0", + "typescript": "5.5.4" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -81,6 +82,7 @@ "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" @@ -94,12 +96,12 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", - "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", + "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", "dev": true, + "license": "MIT", "dependencies": { - "chromium-pickle-js": "^0.2.0", "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" @@ -142,13 +144,15 @@ } }, "node_modules/@electron/notarize": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", - "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.4.0.tgz", + "integrity": "sha512-ArHnRPIJJGrmV+uWNQSINAht+cM4gAo3uA3WFI54bYF93mzmD15gzhPQ0Dd+v/fkMhnRiiIO8NNkGdn87Vsy0g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", - "fs-extra": "^9.0.1" + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" }, "engines": { "node": ">= 10.0.0" @@ -191,10 +195,11 @@ } }, "node_modules/@electron/osx-sign": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.4.tgz", - "integrity": "sha512-xfhdEcIOfAZg7scZ9RQPya1G1lWo8/zMCwUXAulq0SfY7ONIW+b9qGyKdMyuMctNYwllrIS+vmxfijSfjeh97g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", @@ -216,6 +221,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -230,6 +236,7 @@ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8.0.0" }, @@ -242,6 +249,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -250,19 +258,21 @@ } }, "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/@electron/universal": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.3.4.tgz", - "integrity": "sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", "dev": true, + "license": "MIT", "dependencies": { "@electron/asar": "^3.2.1", "@malept/cross-spawn-promise": "^1.1.0", @@ -281,6 +291,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -296,6 +307,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -304,10 +316,11 @@ } }, "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -328,19 +341,21 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -360,22 +375,25 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -396,10 +414,115 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, "node_modules/@js2eel/compiler": { "resolved": "../compiler", @@ -420,6 +543,7 @@ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" } ], + "license": "Apache-2.0", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -432,6 +556,7 @@ "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", @@ -447,6 +572,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -462,6 +588,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -470,10 +597,11 @@ } }, "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -513,6 +641,17 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -542,6 +681,7 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -559,10 +699,11 @@ } }, "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } @@ -572,6 +713,7 @@ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -582,12 +724,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -598,22 +734,28 @@ } }, "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", - "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", - "dev": true + "version": "22.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", + "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } }, "node_modules/@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*", @@ -629,17 +771,12 @@ "@types/node": "*" } }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, "node_modules/@types/verror": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", + "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@types/yauzl": { @@ -653,32 +790,32 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz", + "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/type-utils": "8.3.0", + "@typescript-eslint/utils": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -687,25 +824,27 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", + "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -714,16 +853,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", + "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -731,26 +871,24 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz", + "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/utils": "8.3.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "*" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -758,12 +896,13 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", + "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -771,21 +910,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", + "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -797,63 +938,96 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", + "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", + "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.3.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", - "dev": true + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true, + "license": "MIT" }, "node_modules/abbrev": { "version": "1.1.1", @@ -862,10 +1036,11 @@ "dev": true }, "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -878,6 +1053,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -887,6 +1063,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -915,6 +1092,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -959,29 +1137,30 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/app-builder-lib": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.3.tgz", - "integrity": "sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", + "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", "dev": true, + "license": "MIT", "dependencies": { "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "^1.2.3", - "@electron/osx-sign": "^1.0.4", - "@electron/universal": "1.3.4", + "@electron/notarize": "2.2.1", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.5.1", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", - "7zip-bin": "~5.1.1", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "chromium-pickle-js": "^0.2.0", "debug": "^4.3.4", "ejs": "^3.1.8", - "electron-publish": "24.5.0", + "electron-publish": "24.13.1", "form-data": "^4.0.0", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", @@ -998,6 +1177,41 @@ }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "24.13.3", + "electron-builder-squirrel-windows": "24.13.3" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/notarize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", + "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/app-builder-lib/node_modules/brace-expansion": { @@ -1005,6 +1219,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1014,6 +1229,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1028,6 +1244,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -1040,6 +1257,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1048,34 +1266,106 @@ } }, "node_modules/app-builder-lib/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } }, - "node_modules/array-union": { + "node_modules/archiver-utils": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=0.8" @@ -1086,22 +1376,25 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=8" } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" }, "node_modules/async-exit-hook": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1110,7 +1403,8 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", @@ -1145,7 +1439,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -1155,17 +1450,32 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bluebird-lst": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", "dev": true, + "license": "MIT", "dependencies": { "bluebird": "^3.5.5" } @@ -1188,11 +1498,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1217,7 +1528,7 @@ "url": "https://feross.org/support" } ], - "optional": true, + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1237,6 +1548,7 @@ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" }, @@ -1248,19 +1560,21 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/builder-util": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz", - "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==", + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", + "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", "dev": true, + "license": "MIT", "dependencies": { "@types/debug": "^4.1.6", - "7zip-bin": "~5.1.1", + "7zip-bin": "~5.2.0", "app-builder-bin": "4.0.0", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.1", + "builder-util-runtime": "9.2.4", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "debug": "^4.3.4", @@ -1275,10 +1589,11 @@ } }, "node_modules/builder-util-runtime": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz", - "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" @@ -1292,6 +1607,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1306,6 +1622,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -1314,10 +1631,11 @@ } }, "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -1354,6 +1672,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1375,15 +1694,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1396,6 +1710,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -1405,6 +1722,7 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -1413,12 +1731,13 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -1426,6 +1745,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -1435,6 +1755,7 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "slice-ansi": "^3.0.0", @@ -1482,6 +1803,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1494,6 +1816,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -1503,10 +1826,28 @@ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1514,10 +1855,11 @@ "dev": true }, "node_modules/concurrently": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", - "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "date-fns": "^2.30.0", @@ -1597,26 +1939,71 @@ } }, "node_modules/config-file-ts": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", - "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.6", - "typescript": "^4.0.2" + "glob": "^10.3.10", + "typescript": "^5.3.3" } }, - "node_modules/config-file-ts/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "node_modules/config-file-ts/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=4.2.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/core-util-is": { @@ -1624,18 +2011,48 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true, - "optional": true + "license": "MIT" }, "node_modules/crc": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "buffer": "^5.1.0" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1747,6 +2164,7 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -1763,32 +2181,22 @@ "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", "dev": true, + "license": "MIT", "dependencies": { "buffer-equal": "^1.0.0", "minimatch": "^3.0.4" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dmg-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.3.tgz", - "integrity": "sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", + "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", "dev": true, + "license": "MIT", "dependencies": { - "app-builder-lib": "24.6.3", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -1802,6 +2210,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1811,23 +2220,12 @@ "node": ">=12" } }, - "node_modules/dmg-builder/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/dmg-builder/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -1836,10 +2234,11 @@ } }, "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -1849,6 +2248,7 @@ "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1887,6 +2287,7 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=10" } @@ -1895,13 +2296,22 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -1913,14 +2323,15 @@ } }, "node_modules/electron": { - "version": "25.3.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-25.3.2.tgz", - "integrity": "sha512-xiktJvXraaE/ARf2OVHFyTze1TksSbsbJgOaBtdIiBvUduez6ipATEPIec8Msz1n6eQ+xqYb6YF8tDuIZtJSPw==", + "version": "32.0.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-32.0.1.tgz", + "integrity": "sha512-5Hd5Jaf9niYVR2hZxoRd3gOrcxPOxQV1XPV5WaoSfT9jLJHFadhlKtuSDIk3U6rQZke+aC7GqPPAv55nWFCMsA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", + "@types/node": "^20.9.0", "extract-zip": "^2.0.1" }, "bin": { @@ -1931,16 +2342,17 @@ } }, "node_modules/electron-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.3.tgz", - "integrity": "sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", + "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", "dev": true, + "license": "MIT", "dependencies": { - "app-builder-lib": "24.6.3", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "chalk": "^4.1.2", - "dmg-builder": "24.6.3", + "dmg-builder": "24.13.3", "fs-extra": "^10.1.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -1956,6 +2368,61 @@ "node": ">=14.0.0" } }, + "node_modules/electron-builder-squirrel-windows": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", + "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "24.13.3", + "archiver": "^5.3.1", + "builder-util": "24.13.1", + "fs-extra": "^10.1.0" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/electron-builder/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -2033,14 +2500,15 @@ } }, "node_modules/electron-publish": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz", - "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==", + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", + "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", "dev": true, + "license": "MIT", "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "chalk": "^4.1.2", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", @@ -2052,6 +2520,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2066,6 +2535,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -2073,32 +2543,25 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/electron-publish/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/electron/node_modules/@types/node": { - "version": "18.17.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", - "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==", - "dev": true + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -2124,6 +2587,13 @@ "node": ">=6" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -2153,27 +2623,29 @@ } }, "node_modules/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2183,7 +2655,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -2195,7 +2666,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2209,23 +2679,15 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2233,15 +2695,12 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2249,15 +2708,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -2271,10 +2721,11 @@ } }, "node_modules/espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -2299,20 +2750,12 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2320,20 +2763,12 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2375,6 +2810,7 @@ "engines": [ "node >=0.6.0" ], + "license": "MIT", "optional": true }, "node_modules/fast-deep-equal": { @@ -2384,10 +2820,11 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2446,6 +2883,7 @@ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -2455,6 +2893,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -2464,6 +2903,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2472,9 +2912,10 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2517,11 +2958,29 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -2531,6 +2990,14 @@ "node": ">= 6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -2550,6 +3017,7 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -2562,6 +3030,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2636,15 +3105,17 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -2685,10 +3156,11 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2715,26 +3187,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", @@ -2766,12 +3218,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2844,6 +3290,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2862,6 +3309,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -2889,6 +3337,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -2902,6 +3351,7 @@ "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2914,6 +3364,19 @@ "node": "^8.11.2 || >=10" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2933,13 +3396,14 @@ "url": "https://feross.org/support" } ], - "optional": true + "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -2955,6 +3419,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3007,6 +3472,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, + "license": "MIT", "dependencies": { "ci-info": "^3.2.0" }, @@ -3046,6 +3512,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3059,13 +3526,22 @@ "node": ">=8" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 14.0.0" + "node": ">= 18.0.0" }, "funding": { "url": "https://github.com/sponsors/gjtorikian/" @@ -3077,11 +3553,28 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -3137,6 +3630,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -3166,7 +3660,58 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } }, "node_modules/levn": { "version": "0.4.1", @@ -3202,14 +3747,54 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lowercase-keys": { - "version": "2.0.0", + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, @@ -3222,6 +3807,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3247,28 +3833,44 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3278,6 +3880,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3311,6 +3914,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3320,6 +3924,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } @@ -3329,6 +3934,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -3342,6 +3948,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3354,6 +3961,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -3373,27 +3981,23 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", @@ -3414,15 +4018,6 @@ "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -3554,11 +4149,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -3593,15 +4196,30 @@ "node": ">=8" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -3624,6 +4242,7 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, + "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -3642,6 +4261,14 @@ "node": ">= 0.8.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -3651,6 +4278,20 @@ "node": ">=0.4.0" } }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -3713,6 +4354,7 @@ "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", "dev": true, + "license": "MIT", "dependencies": { "config-file-ts": "^0.2.4", "dotenv": "^9.0.2", @@ -3725,6 +4367,58 @@ "node": ">=12.0.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3762,6 +4456,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -3778,6 +4473,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -3859,35 +4564,58 @@ "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", "dev": true }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "dev": true, + "license": "WTFPL OR ISC", "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3961,6 +4689,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -3973,20 +4714,12 @@ "node": ">=10" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -4002,6 +4735,7 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">= 6.0.0", @@ -4013,6 +4747,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4022,6 +4757,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -4045,10 +4781,22 @@ "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4063,6 +4811,22 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4075,11 +4839,26 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4112,10 +4891,11 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -4128,11 +4908,30 @@ "node": ">=10" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/temp-file": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", "dev": true, + "license": "MIT", "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" @@ -4143,6 +4942,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -4157,6 +4957,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -4165,10 +4966,11 @@ } }, "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -4180,15 +4982,13 @@ "dev": true }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/tmp-promise": { @@ -4196,6 +4996,7 @@ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", "dev": true, + "license": "MIT", "dependencies": { "tmp": "^0.2.0" } @@ -4204,6 +5005,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -4237,29 +5039,22 @@ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, + "license": "WTFPL", "dependencies": { "utf8-byte-length": "^1.0.1" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=16" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "typescript": ">=4.2.0" } }, "node_modules/type-check": { @@ -4279,6 +5074,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4287,10 +5083,11 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4305,6 +5102,13 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -4324,16 +5128,26 @@ } }, "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/verror": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "assert-plus": "^1.0.0", @@ -4376,6 +5190,25 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4387,6 +5220,7 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0" } @@ -4404,7 +5238,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yauzl": { "version": "2.10.0", @@ -4427,6 +5262,45 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } } }, "dependencies": { @@ -4456,12 +5330,11 @@ } }, "@electron/asar": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", - "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", + "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", "dev": true, "requires": { - "chromium-pickle-js": "^0.2.0", "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" @@ -4492,13 +5365,14 @@ } }, "@electron/notarize": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", - "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.4.0.tgz", + "integrity": "sha512-ArHnRPIJJGrmV+uWNQSINAht+cM4gAo3uA3WFI54bYF93mzmD15gzhPQ0Dd+v/fkMhnRiiIO8NNkGdn87Vsy0g==", "dev": true, "requires": { "debug": "^4.1.1", - "fs-extra": "^9.0.1" + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" }, "dependencies": { "fs-extra": { @@ -4532,9 +5406,9 @@ } }, "@electron/osx-sign": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.4.tgz", - "integrity": "sha512-xfhdEcIOfAZg7scZ9RQPya1G1lWo8/zMCwUXAulq0SfY7ONIW+b9qGyKdMyuMctNYwllrIS+vmxfijSfjeh97g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", "dev": true, "requires": { "compare-version": "^0.1.2", @@ -4573,17 +5447,17 @@ } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true } } }, "@electron/universal": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.3.4.tgz", - "integrity": "sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", "dev": true, "requires": { "@electron/asar": "^3.2.1", @@ -4618,9 +5492,9 @@ } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true } } @@ -4635,15 +5509,15 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true }, "@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -4658,19 +5532,19 @@ } }, "@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" } }, @@ -4681,29 +5555,95 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@js2eel/compiler": { "version": "file:../compiler", "requires": { - "@types/chai": "4.3.5", - "@types/estree": "1.0.1", - "@types/mocha": "10.0.1", - "@types/node": "20.3.3", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "acorn": "8.9.0", - "c8": "8.0.0", - "chai": "4.3.7", - "concurrently": "8.2.0", - "eslint": "8.44.0", - "joi": "17.9.2", - "mocha": "10.2.0", - "tsc-watch": "6.0.4", - "typescript": "5.1.6" + "@types/chai": "4.3.18", + "@types/estree": "1.0.5", + "@types/mocha": "10.0.7", + "@types/node": "22.5.0", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "acorn": "8.12.1", + "c8": "10.1.2", + "chai": "4.5.0", + "concurrently": "8.2.2", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "joi": "17.13.3", + "mocha": "10.7.3", + "tsc-watch": "6.2.0", + "typescript": "5.5.4" } }, "@malept/cross-spawn-promise": { @@ -4750,9 +5690,9 @@ } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true } } @@ -4783,6 +5723,13 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -4817,9 +5764,9 @@ } }, "@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "requires": { "@types/ms": "*" @@ -4840,12 +5787,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, "@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -4856,21 +5797,24 @@ } }, "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "dev": true }, "@types/node": { - "version": "20.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", - "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", - "dev": true + "version": "22.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", + "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } }, "@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", "dev": true, "optional": true, "requires": { @@ -4887,16 +5831,10 @@ "@types/node": "*" } }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, "@types/verror": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.10.tgz", + "integrity": "sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==", "dev": true, "optional": true }, @@ -4911,104 +5849,127 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz", + "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/type-utils": "8.3.0", + "@typescript-eslint/utils": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" } }, "@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz", + "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz", + "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0" } }, "@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz", + "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "8.3.0", + "@typescript-eslint/utils": "8.3.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" } }, "@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz", + "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz", + "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/visitor-keys": "8.3.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz", + "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.3.0", + "@typescript-eslint/types": "8.3.0", + "@typescript-eslint/typescript-estree": "8.3.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz", + "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.3.0", + "eslint-visitor-keys": "^3.4.3" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -5016,9 +5977,9 @@ "dev": true }, "7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", "dev": true }, "abbrev": { @@ -5028,9 +5989,9 @@ "dev": true }, "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true }, "acorn-jsx": { @@ -5099,26 +6060,25 @@ "dev": true }, "app-builder-lib": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.3.tgz", - "integrity": "sha512-++0Zp7vcCHfXMBGVj7luFxpqvMPk5mcWeTuw7OK0xNAaNtYQTTN0d9YfWRsb1MvviTOOhyHeULWz1CaixrdrDg==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", + "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", "dev": true, "requires": { "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "^1.2.3", - "@electron/osx-sign": "^1.0.4", - "@electron/universal": "1.3.4", + "@electron/notarize": "2.2.1", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.5.1", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", - "7zip-bin": "~5.1.1", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "chromium-pickle-js": "^0.2.0", "debug": "^4.3.4", "ejs": "^3.1.8", - "electron-publish": "24.5.0", + "electron-publish": "24.13.1", "form-data": "^4.0.0", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", @@ -5134,6 +6094,31 @@ "temp-file": "^3.4.0" }, "dependencies": { + "@electron/notarize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", + "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -5174,25 +6159,89 @@ } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true } } }, + "archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "peer": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "peer": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -5208,9 +6257,9 @@ "optional": true }, "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "async-exit-hook": { @@ -5248,6 +6297,18 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "peer": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -5281,11 +6342,11 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "buffer": { @@ -5293,7 +6354,6 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "optional": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -5318,16 +6378,16 @@ "dev": true }, "builder-util": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz", - "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==", + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", + "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", "dev": true, "requires": { "@types/debug": "^4.1.6", - "7zip-bin": "~5.1.1", + "7zip-bin": "~5.2.0", "app-builder-bin": "4.0.0", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.1", + "builder-util-runtime": "9.2.4", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "debug": "^4.3.4", @@ -5363,17 +6423,17 @@ } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true } } }, "builder-util-runtime": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz", - "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", "dev": true, "requires": { "debug": "^4.3.4", @@ -5418,9 +6478,9 @@ } }, "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5445,9 +6505,9 @@ "dev": true }, "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true }, "cli-truncate": { @@ -5506,6 +6566,19 @@ "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true }, + "compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "peer": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5513,9 +6586,9 @@ "dev": true }, "concurrently": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.0.tgz", - "integrity": "sha512-nnLMxO2LU492mTUj9qX/az/lESonSZu81UznYDoXtz1IQf996ixVqPAgHXwvHiHCAef/7S8HIK+fTFK7Ifk8YA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", "dev": true, "requires": { "chalk": "^4.1.2", @@ -5573,19 +6646,51 @@ } }, "config-file-ts": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", - "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", "dev": true, "requires": { - "glob": "^7.1.6", - "typescript": "^4.0.2" + "glob": "^10.3.10", + "typescript": "^5.3.3" }, "dependencies": { - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true } } @@ -5594,8 +6699,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "optional": true + "dev": true }, "crc": { "version": "3.8.0", @@ -5607,6 +6711,24 @@ "buffer": "^5.1.0" } }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "peer": true + }, + "crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "peer": true, + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5699,24 +6821,15 @@ "minimatch": "^3.0.4" } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, "dmg-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.3.tgz", - "integrity": "sha512-O7KNT7OKqtV54fMYUpdlyTOCP5DoPuRMLqMTgxxV2PO8Hj/so6zOl5o8GTs8pdDkeAhJzCFOUNB3BDhgXbUbJg==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", + "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", "dev": true, "requires": { - "app-builder-lib": "24.6.3", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "dmg-license": "^1.0.11", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", @@ -5734,15 +6847,6 @@ "universalify": "^2.0.0" } }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -5754,9 +6858,9 @@ } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true } } @@ -5799,45 +6903,54 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "requires": { "jake": "^10.8.5" } }, "electron": { - "version": "25.3.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-25.3.2.tgz", - "integrity": "sha512-xiktJvXraaE/ARf2OVHFyTze1TksSbsbJgOaBtdIiBvUduez6ipATEPIec8Msz1n6eQ+xqYb6YF8tDuIZtJSPw==", + "version": "32.0.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-32.0.1.tgz", + "integrity": "sha512-5Hd5Jaf9niYVR2hZxoRd3gOrcxPOxQV1XPV5WaoSfT9jLJHFadhlKtuSDIk3U6rQZke+aC7GqPPAv55nWFCMsA==", "dev": true, "requires": { "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", + "@types/node": "^20.9.0", "extract-zip": "^2.0.1" }, "dependencies": { "@types/node": { - "version": "18.17.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", - "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==", - "dev": true + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } } } }, "electron-builder": { - "version": "24.6.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.3.tgz", - "integrity": "sha512-O6PqhRXwfxCNTXI4BlhELSeYYO6/tqlxRuy+4+xKBokQvwDDjDgZMMoSgAmanVSCuzjE7MZldI9XYrKFk+EQDw==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", + "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", "dev": true, "requires": { - "app-builder-lib": "24.6.3", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "chalk": "^4.1.2", - "dmg-builder": "24.6.3", + "dmg-builder": "24.13.3", "fs-extra": "^10.1.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -5907,15 +7020,60 @@ } } }, + "electron-builder-squirrel-windows": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", + "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", + "dev": true, + "peer": true, + "requires": { + "app-builder-lib": "24.13.3", + "archiver": "^5.3.1", + "builder-util": "24.13.1", + "fs-extra": "^10.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "peer": true + } + } + }, "electron-publish": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz", - "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==", + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", + "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", "dev": true, "requires": { "@types/fs-extra": "^9.0.11", - "builder-util": "24.5.0", - "builder-util-runtime": "9.2.1", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", "chalk": "^4.1.2", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", @@ -5943,16 +7101,10 @@ "universalify": "^2.0.0" } }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true } } @@ -5978,6 +7130,12 @@ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -5998,27 +7156,28 @@ "dev": true }, "eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -6028,7 +7187,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -6040,26 +7198,9 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -6072,25 +7213,25 @@ } }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { "acorn": "^8.9.0", @@ -6105,14 +7246,6 @@ "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "esrecurse": { @@ -6122,20 +7255,12 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -6170,9 +7295,9 @@ "dev": true }, "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -6251,9 +7376,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "requires": { "to-regex-range": "^5.0.1" } @@ -6284,6 +7409,16 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -6295,6 +7430,13 @@ "mime-types": "^2.1.12" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "peer": true + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -6374,15 +7516,15 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -6411,9 +7553,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -6429,20 +7571,6 @@ "define-properties": "^1.1.3" } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, "got": { "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", @@ -6468,12 +7596,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -6577,17 +7699,25 @@ "node-addon-api": "^1.6.3" } }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "optional": true + "dev": true }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "ignore-by-default": { @@ -6675,10 +7805,17 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "peer": true + }, "isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", "dev": true }, "isexe": { @@ -6687,10 +7824,20 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, "requires": { "async": "^3.2.3", @@ -6763,6 +7910,51 @@ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", "dev": true }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "peer": true, + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6788,12 +7980,47 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "peer": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "peer": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "peer": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "peer": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "peer": true + }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -6826,15 +8053,21 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -6916,12 +8149,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -6930,13 +8157,13 @@ "optional": true }, "nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", "dev": true, "requires": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", @@ -6947,15 +8174,6 @@ "undefsafe": "^2.0.5" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -7047,6 +8265,12 @@ "p-limit": "^3.0.2" } }, + "package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7074,11 +8298,23 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + } + } }, "pend": { "version": "1.2.0", @@ -7108,12 +8344,29 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "peer": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, "pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -7162,6 +8415,50 @@ "lazy-val": "^1.0.4" } }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "peer": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "peer": true, + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "peer": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -7203,6 +8500,12 @@ "lowercase-keys": "^2.0.0" } }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -7259,6 +8562,13 @@ } } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "peer": true + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -7275,19 +8585,16 @@ } }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "dev": true }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true }, "semver-compare": { "version": "1.0.0", @@ -7336,6 +8643,12 @@ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "dev": true }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, "simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -7345,12 +8658,6 @@ "semver": "^7.5.3" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", @@ -7405,6 +8712,16 @@ "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "peer": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -7416,6 +8733,17 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7425,6 +8753,15 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7450,9 +8787,9 @@ } }, "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -7463,6 +8800,20 @@ "yallist": "^4.0.0" } }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "peer": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "temp-file": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", @@ -7495,9 +8846,9 @@ } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true } } @@ -7509,13 +8860,10 @@ "dev": true }, "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true }, "tmp-promise": { "version": "3.0.3", @@ -7558,20 +8906,12 @@ "utf8-byte-length": "^1.0.1" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, - "requires": { - "tslib": "^1.8.1" - } + "requires": {} }, "type-check": { "version": "0.4.0", @@ -7589,9 +8929,9 @@ "dev": true }, "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true }, "undefsafe": { @@ -7600,6 +8940,12 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -7616,11 +8962,18 @@ } }, "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", "dev": true }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "peer": true + }, "verror": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", @@ -7653,6 +9006,17 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7692,6 +9056,39 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "peer": true, + "requires": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "peer": true, + "requires": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + } + } } } } diff --git a/desktop/package.json b/desktop/package.json index 93ed3b5..c8a9486 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -51,18 +51,18 @@ "license": "GPL-3.0", "dependencies": { "@js2eel/compiler": "file:../compiler", - "chokidar": "3.5.3" + "chokidar": "3.6.0" }, "devDependencies": { - "@electron/notarize": "1.2.4", - "@types/node": "20.3.3", - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "concurrently": "8.2.0", - "electron": "25.3.2", - "electron-builder": "24.6.3", - "eslint": "8.44.0", - "nodemon": "3.0.1", - "typescript": "5.1.6" + "@electron/notarize": "2.4.0", + "@types/node": "22.5.0", + "@typescript-eslint/eslint-plugin": "8.3.0", + "@typescript-eslint/parser": "8.3.0", + "concurrently": "8.2.2", + "electron": "32.0.1", + "electron-builder": "24.13.3", + "eslint": "8.57.0", + "nodemon": "3.1.4", + "typescript": "5.5.4" } } From 05139e978a8f64def1048ff90b3705c2800b91b7 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 17:15:07 +0200 Subject: [PATCH 29/42] ext_tail_size in plugin config --- compiler/js2eel.d.ts | 11 +-- .../src/js2eel/compiler/Js2EelCompiler.ts | 14 ++++ .../callExpression/callExpression.ts | 5 -- .../callExpression/js2EelLib/config.ts | 6 +- .../callExpression/js2EelLib/extTailSize.ts | 53 ------------- .../test/examplePlugins/08_cab_sim.spec.ts | 79 +++++++++---------- compiler/src/js2eel/types.ts | 1 + compiler/src/popupDocs.ts | 12 +-- docs/api-documentation.md | 15 +--- examples/08_cab_sim.js | 9 +-- gui/src/docs/rendered-docs.json | 2 +- 11 files changed, 70 insertions(+), 137 deletions(-) delete mode 100644 compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/extTailSize.ts diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index bd0fdb7..4d860d7 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -12,11 +12,13 @@ declare function config({ description, inChannels, - outChannels + outChannels, + extTailSize }: { description: number; inChannels: number; outChannels: number; + extTailSize?: number; }): void; /** @@ -500,10 +502,3 @@ declare function ifft(startIndex: number, size: number): void; Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly. */ declare function convolve_c(destination: number, source: number, size: number): void; - -// SPECIAL FUNCTIONS AND VARIABLES - -/** - * Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state. - */ -declare function extTailSize(samples: number): void; diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index 50691c5..e067b22 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -63,6 +63,7 @@ export class Js2EelCompiler { description: '', inChannels: 2, outChannels: 2, + extTailSize: null, currentChannel: 0, eachChannelParamMap: {}, currentScopePath: 'root', @@ -143,6 +144,7 @@ export class Js2EelCompiler { description: '', inChannels: 2, outChannels: 2, + extTailSize: null, currentChannel: 0, eachChannelParamMap: {}, currentScopePath: 'root', @@ -262,6 +264,10 @@ export class Js2EelCompiler { const initStageHeader = '@init\n\n'; + if (this.pluginData.extTailSize !== null) { + initStageText += `ext_tail_size = ${this.pluginData.extTailSize};\n\n`; + } + this.pluginData.initVariableNames.forEach((initVariableName) => { // Cannot declare slider identifier in eel2 if (!this.pluginData.sliders[initVariableName]) { @@ -528,6 +534,14 @@ export class Js2EelCompiler { return { inChannels: this.pluginData.inChannels, outChannels: this.pluginData.outChannels }; } + setExtTailSize(extTailSize: number): void { + this.pluginData.extTailSize = extTailSize; + } + + getExtTailSize(): number | null { + return this.pluginData.extTailSize; + } + setCurrentChannel(channel: number): void { this.pluginData.currentChannel = channel; } diff --git a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts index 8192c94..a1ba158 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/callExpression.ts @@ -6,7 +6,6 @@ import { onInit } from './js2EelLib/onInit.js'; import { onSlider } from './js2EelLib/onSlider.js'; import { onSample } from './js2EelLib/onSample.js'; import { eachChannel } from './js2EelLib/eachChannel.js'; -import { extTailSize } from './js2EelLib/extTailSize.js'; import { eelLibraryFunctionCall } from './eelLib/eelLibraryFunctionCall.js'; import { memberExpressionCall } from '../memberExpression/memberExpressionCall.js'; @@ -68,10 +67,6 @@ export const callExpression = ( callExpressionSrc += eachChannel(callExpression, instance); break; } - case 'extTailSize': { - callExpressionSrc += extTailSize(callExpression, instance); - break; - } default: { // EEL Library functions diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.ts index b5c8003..4c68029 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/config.ts @@ -34,7 +34,8 @@ export const config = (callExpression: CallExpression, instance: Js2EelCompiler) validationSchema: Joi.object({ description: Joi.string().required().max(64), inChannels: Joi.number().min(1).max(64).required(), - outChannels: Joi.number().min(1).max(64).required() + outChannels: Joi.number().min(1).max(64).required(), + extTailSize: Joi.number().min(-2).optional() }) } ] @@ -54,5 +55,8 @@ export const config = (callExpression: CallExpression, instance: Js2EelCompiler) instance.setDescription(configObject.description); instance.setName(configObject.description); instance.setChannels(configObject.inChannels, configObject.outChannels); + if (configObject.extTailSize !== null && configObject.extTailSize !== undefined) { + instance.setExtTailSize(configObject.extTailSize); + } } }; diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/extTailSize.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/extTailSize.ts deleted file mode 100644 index 7e40381..0000000 --- a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/extTailSize.ts +++ /dev/null @@ -1,53 +0,0 @@ -import Joi from 'joi'; - -import { evaluateLibraryFunctionCall } from '../utils/evaluateLibraryFunctionCall.js'; -import { JSFX_DENY_COMPILATION } from '../../../constants.js'; - -import type { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; -import type { CallExpression } from 'estree'; - -export const extTailSize = (callExpression: CallExpression, instance: Js2EelCompiler): string => { - let extTailSizeSrc = ''; - const scopePath = instance.getCurrentScopePath(); - const scopedEnvironment = instance.getScopeEntry(scopePath); - - if ( - !scopedEnvironment || - (scopedEnvironment.scopeId !== 'onInit' && scopedEnvironment.scopeId !== 'onSlider') - ) { - instance.error( - 'ScopeError', - 'extTailSize() can only be called in onInit() and onSlider()', - callExpression - ); - - return JSFX_DENY_COMPILATION; - } - - const { args, errors } = evaluateLibraryFunctionCall( - callExpression, - [ - { - name: 'value', - required: true, - allowedValues: [ - { - nodeType: 'Literal', - validationSchema: Joi.number() - } - ] - } - ], - instance - ); - - if (errors) { - instance.multipleErrors(errors); - - return JSFX_DENY_COMPILATION; - } - - extTailSizeSrc += `ext_tail_size = ${args.value.value};\n`; - - return extTailSizeSrc; -}; diff --git a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts index b093b79..ff213a0 100644 --- a/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts +++ b/compiler/src/js2eel/test/examplePlugins/08_cab_sim.spec.ts @@ -21,6 +21,8 @@ out_pin:Out 1 @init +ext_tail_size = 32768; + fftSize = -1; needsReFft = 1; lastAmpModel = -1; @@ -36,25 +38,22 @@ currentBlock__B0 = 0 * 65536 + 327680; currentBlock__size = 65536; -ext_tail_size = 32768; - - @slider ampModel = slider1; ampModel !== lastAmpModel ? ( lastAmpModel = ampModel; - fileHandle__S5 = file_open(slider1); - importedBufferSampleRate__S5 = 0; - fileHandle__S5 > 0 ? ( - file_riff(fileHandle__S5, importedBufferChAmount, importedBufferSampleRate__S5); + fileHandle__S3 = file_open(slider1); + importedBufferSampleRate__S3 = 0; + fileHandle__S3 > 0 ? ( + file_riff(fileHandle__S3, importedBufferChAmount, importedBufferSampleRate__S3); importedBufferChAmount ? ( - importedBufferSize = file_avail(fileHandle__S5) / (importedBufferChAmount); + importedBufferSize = file_avail(fileHandle__S3) / (importedBufferChAmount); needsReFft = 1; - file_mem(fileHandle__S5, importedBuffer__B0, importedBufferSize * importedBufferChAmount); + file_mem(fileHandle__S3, importedBuffer__B0, importedBufferSize * importedBufferChAmount); ); - file_close(fileHandle__S5); + file_close(fileHandle__S3); ); ); @@ -73,32 +72,32 @@ needsReFft ? ( chunkSize2x = chunkSize * 2; bufferPosition = 0; inverseFftSize = 1 / (fftSize); - i__S10 = 0; - i2__S10 = 0; - interpolationCounter__S10 = 0; - while (interpolationCounter__S10 < min(fftSize, importedBufferSize)) ( - ipos__S13 = i__S10; - ipart__S13 = (i__S10 - ipos__S13); - convolutionSource__B0[i2__S10] = (importedBuffer__B0[ipos__S13 * importedBufferChAmount] * (1 - ipart__S13) + importedBuffer__B0[((ipos__S13 + 1) * importedBufferChAmount - 1)] * ipart__S13); - convolutionSource__B0[(i2__S10 + 1)] = (importedBuffer__B0[(ipos__S13 * importedBufferChAmount - 1)] * (1 - ipart__S13) + importedBuffer__B0[((ipos__S13 + 2) * importedBufferChAmount - 1)] * ipart__S13); - i__S10 += interpolationStepCount; - i2__S10 += 2; - interpolationCounter__S10 += 1; + i__S8 = 0; + i2__S8 = 0; + interpolationCounter__S8 = 0; + while (interpolationCounter__S8 < min(fftSize, importedBufferSize)) ( + ipos__S11 = i__S8; + ipart__S11 = (i__S8 - ipos__S11); + convolutionSource__B0[i2__S8] = (importedBuffer__B0[ipos__S11 * importedBufferChAmount] * (1 - ipart__S11) + importedBuffer__B0[((ipos__S11 + 1) * importedBufferChAmount - 1)] * ipart__S11); + convolutionSource__B0[(i2__S8 + 1)] = (importedBuffer__B0[(ipos__S11 * importedBufferChAmount - 1)] * (1 - ipart__S11) + importedBuffer__B0[((ipos__S11 + 2) * importedBufferChAmount - 1)] * ipart__S11); + i__S8 += interpolationStepCount; + i2__S8 += 2; + interpolationCounter__S8 += 1; ); - zeroPadCounter__S10 = 0; - while (zeroPadCounter__S10 < (fftSize - importedBufferSize)) ( - convolutionSource__B0[i2__S10] = 0; - convolutionSource__B0[(i2__S10 + 1)] = 0; - i2__S10 += 2; - zeroPadCounter__S10 += 1; + zeroPadCounter__S8 = 0; + while (zeroPadCounter__S8 < (fftSize - importedBufferSize)) ( + convolutionSource__B0[i2__S8] = 0; + convolutionSource__B0[(i2__S8 + 1)] = 0; + i2__S8 += 2; + zeroPadCounter__S8 += 1; ); fft(convolutionSource__B0, fftSize); - i__S10 = 0; - normalizeCounter__S10 = 0; - while (normalizeCounter__S10 < fftSize * 2) ( - convolutionSource__B0[i__S10] *= inverseFftSize; - i__S10 += 1; - normalizeCounter__S10 += 1; + i__S8 = 0; + normalizeCounter__S8 = 0; + while (normalizeCounter__S8 < fftSize * 2) ( + convolutionSource__B0[i__S8] *= inverseFftSize; + i__S8 += 1; + normalizeCounter__S8 += 1; ); needsReFft = 0; ); @@ -117,14 +116,14 @@ importedBufferSize > 0 ? ( ifft(currentBlock__B0, fftSize); bufferPosition = 0; ); - bufferPosition2x__S18 = bufferPosition * 2; - lastBlock__B0[bufferPosition2x__S18] = spl0; - lastBlock__B0[(bufferPosition2x__S18 + 1)] = 0; - spl0 = currentBlock__B0[bufferPosition2x__S18]; - spl1 = currentBlock__B0[(bufferPosition2x__S18 + 1)]; + bufferPosition2x__S16 = bufferPosition * 2; + lastBlock__B0[bufferPosition2x__S16] = spl0; + lastBlock__B0[(bufferPosition2x__S16 + 1)] = 0; + spl0 = currentBlock__B0[bufferPosition2x__S16]; + spl1 = currentBlock__B0[(bufferPosition2x__S16 + 1)]; bufferPosition < (fftSize - chunkSize) ? ( - spl0 += lastBlock__B0[(chunkSize2x + bufferPosition2x__S18)]; - spl1 += lastBlock__B0[((chunkSize2x + bufferPosition2x__S18) + 1)]; + spl0 += lastBlock__B0[(chunkSize2x + bufferPosition2x__S16)]; + spl1 += lastBlock__B0[((chunkSize2x + bufferPosition2x__S16) + 1)]; ); bufferPosition += 1; ); diff --git a/compiler/src/js2eel/types.ts b/compiler/src/js2eel/types.ts index 351cfc4..2beb871 100644 --- a/compiler/src/js2eel/types.ts +++ b/compiler/src/js2eel/types.ts @@ -65,6 +65,7 @@ export type PluginData = { description: string; inChannels: number; outChannels: number; + extTailSize: number | null; currentChannel: number; eachChannelParamMap: EachChannelParamMap; currentScopePath: string; diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index e69d897..ac3d9e0 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -15,8 +15,8 @@ export const POPUP_DOCS: { "type": "function", "text": "Configures the plugin.", "example": "```javascript\nconfig({ description: 'volume', inChannels: 2, outChannels: 2 });\n```", - "signature": "config({\n description,\n inChannels,\n outChannels\n}: {\n description: number;\n inChannels: number;\n outChannels: number;\n}): void;", - "autoCompleteTemplate": "config({description: '${}', inChannels: , outChannels: });" + "signature": "config({\n description,\n inChannels,\n outChannels,\n extTailSize\n}: {\n description: number;\n inChannels: number;\n outChannels: number;\n extTailSize?: number;\n}): void;", + "autoCompleteTemplate": "config({description: '${}', inChannels: , outChannels: , extTailSize: });" }, slider: { "name": "slider", @@ -937,13 +937,5 @@ convolve_c: { "example": null, "signature": "convolve_c(destination: number, source: number, size: number): void;", "autoCompleteTemplate": "convolve_c(${destination}, ${source}, ${size});" -}, -extTailSize: { - "name": "extTailSize", - "type": "function", - "text": "Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.", - "example": null, - "signature": "extTailSize(samples: number): void;", - "autoCompleteTemplate": "extTailSize(${samples});" } }; diff --git a/docs/api-documentation.md b/docs/api-documentation.md index b821c77..c1655b6 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -10,7 +10,6 @@ - [Memory Functions](#memory-functions) - [File Functions](#file-functions) - [FFT & MDCT Functions](#fft-&-mdct-functions) -- [Special Functions & Variables](#special-functions-&-variables) @@ -23,11 +22,13 @@ Configures the plugin. config({ description, inChannels, - outChannels + outChannels, + extTailSize }: { description: number; inChannels: number; outChannels: number; + extTailSize?: number; }): void; ``` @@ -491,13 +492,3 @@ Note that the convolution must NOT cross a 65,536 item boundary, so be sure to s ```typescript convolve_c(destination: number, source: number, size: number): void; ``` - - -## Special Functions & Variables - -### extTailSize() -Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state. - -```typescript -extTailSize(samples: number): void; -``` diff --git a/examples/08_cab_sim.js b/examples/08_cab_sim.js index 15c5439..48671ac 100644 --- a/examples/08_cab_sim.js +++ b/examples/08_cab_sim.js @@ -1,10 +1,10 @@ -config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2 }); +config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2, extTailSize: 32768 }); let fftSize = -1; let needsReFft = true; let convolutionSource = new EelBuffer(1, 131072); // 128 * 1024; let lastAmpModel = -1; -let importedBuffer = new EelBuffer(1, 131072); // 256 * 1024; +let importedBuffer = new EelBuffer(1, 131072); // 128 * 1024; let importedBufferChAmount = 0; let importedBufferSize; let chunkSize; @@ -19,10 +19,6 @@ let ampModel; fileSelector(1, ampModel, 'amp_models', 'none', 'Impulse Response'); -onInit(() => { - extTailSize(32768); -}); - onSlider(() => { if (ampModel !== lastAmpModel) { lastAmpModel = ampModel; @@ -123,7 +119,6 @@ onBlock(() => { onSample(() => { if (importedBufferSize > 0) { if (bufferPosition >= chunkSize) { - // Swap current and last blocks, zero-pad last block lastBlock.swap(currentBlock); memset(currentBlock.start() + chunkSize * 2, 0, (fftSize - chunkSize) * 2); diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index 76fc690..6c60d9a 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,5 +1,5 @@ { - "api-documentation": "

    API Documentation

    \n\n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n    setStart(newPosition: number): void;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): any;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n

    Special Functions & Variables

    \n

    extTailSize()

    \n

    Set to nonzero if the plug-in produces silence from silence. If positive, specifies length in samples that the plug-in should keep processing after silence (either the output tail length, or the number of samples needed for the plug-in state to settle). If set to -1, REAPER will use automatic output silence detection and let plug-in state settle. If set to -2, then REAPER will assume the plug-in has no tail and no inter-sample state.

    \n
    extTailSize(samples: number): void;\n
    \n", + "api-documentation": "

    API Documentation

    \n\n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels,\n    extTailSize\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n    extTailSize?: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n    setStart(newPosition: number): void;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): any;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n", "changelog": "

    Changelog

    \n
      \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      • \n
      \n
    • \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • \n
      • Allow function declaration in block statement
      • \n
      • Allow member expression returns
      • \n
      \n
    • \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • \n
      • More documentation
      • \n
      \n
    • \n
    • v0.3.0: Initial release
    • \n
    \n", "development": "

    Development

    \n

    Requirements

    \n
      \n
    • Node.js 18 and higher
    • \n
    • Terminal emulator
        \n
      • Linux, MacOS: bash or zsh
      • \n
      • Windows: git bash (comes with git)
      • \n
      \n
    • \n
    • Reaper DAW, obviously
    • \n
    \n

    Setup

    \n
      \n
    • Install dependencies for all packages:
        \n
      • cd scripts
      • \n
      • ./install.sh
      • \n
      \n
    • \n
    • Open a different terminal session for each of the following steps
        \n
      • Go to compiler and do npm run dev
      • \n
      • Go to gui and do npm run dev
      • \n
      • Go to desktop and do npm run dev. Now, the electron build should open.
      • \n
      \n
    • \n
    \n

    Guidelines

    \n
      \n
    • We aim for 100% test coverage for the compiler package
    • \n
    \n

    Architecture

    \n

    TODO

    \n

    Recommended VSCode Extensions

    \n

    TODO

    \n", "feature-comparison": "

    Feature Comparison with JSFX

    \n

    JSFX Reference: https://www.reaper.fm/sdk/js/js.php

    \n

    Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

    \n

    โœ…: Implemented

    \n

    ๐Ÿ•’: Should be implemented

    \n

    โŒ: Won't be implemented

    \n

    โ”: Unknown if feasible, useful, or working properly

    \n

    Description Lines and Utility Features

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…descImplemented as part of config()
    ๐Ÿ•’tags
    ๐Ÿ•’options
    ๐Ÿ•’JSFX comments
    \n

    Code Sections

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…@initonInit()
    โœ…@slideronSlider()
    ๐Ÿ•’@block
    โœ…@sampleonSample()
    ๐Ÿ•’@serialize
    ๐Ÿ•’@gfxDeclarative with React-like syntax?
    \n

    File Handling

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’import
    ๐Ÿ•’filename
    โœ…file_open(index | slider)Slider variant implemented
    โœ…file_close(handle)
    ๐Ÿ•’file_rewind(handle)
    ๐Ÿ•’file_var(handle, variable)
    โœ…file_mem(handle, offset, length)
    โœ…file_avail(handle)
    โœ…file_riff(handle, nch, samplerate)
    ๐Ÿ•’file_text(handle, istext)
    ๐Ÿ•’file_string(handle,str)
    \n

    Routing and Input

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…in_pin, out_pinImplemented as part of config()
    \n

    UI

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Slider: Normalslider()
    โœ…Slider: SelectselectBox()
    โœ…Slider: File
    ๐Ÿ•’Hidden sliders
    ๐Ÿ•’Slider: shapes
    โŒslider(index)Might not be necessary as every slider is bound to a variable
    ๐Ÿ•’slider_next_chg(sliderindex,nextval)
    \n

    Sample Access

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…spl0 - spl63
    โœ…spl(index)
    \n

    Audio and Transport State Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…srate
    โœ…num_ch
    โœ…samplesblock
    โœ…tempo
    โœ…play_state
    โœ…play_position
    โœ…beat_position
    โœ…ts_num
    โœ…ts_denom
    \n

    Data Structures and Encodings

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Local variableslet & const
    โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
    โ”Local address space 8m word restriction
    ๐Ÿ•’Global address space (gmem[])
    ๐Ÿ•’Named global address space
    โ”Global named variables (_global. prefix)
    ๐Ÿ•’Hex numbers
    ๐Ÿ•’ASCII chars
    ๐Ÿ•’Bitmasks
    โ”StringsAlready fully implemented?
    \n

    Control Structures

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…FunctionsUser definable functions are inlined in compiled code
    โœ…Conditionals
    โœ…Conditional Branching
    ๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
    ๐Ÿ•’while(actions..., condition)
    ๐Ÿ•’while(condition) (actions...)
    \n

    Operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…!value
    โœ…-value
    โœ…+value
    โœ…base ^ exponentMath.pow(base, exponent) or **
    โœ…numerator % denominator
    โœ…value / divisor
    โœ…value * another_value
    โœ…value - another_value
    โœ…value + another_value
    โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 === value2
    โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 !== value2
    โœ…value1 < value2
    โœ…value1 > value2
    โœ…value1 <= value2
    โœ…value1 >= value2
    โœ…y || z
    โœ…y && z
    โœ…y ? z
    โœ…y ? z : x
    โœ…y = z
    โœ…y *= z
    โœ…y /= divisor
    โœ…y %= divisor
    ๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
    โœ…y += z
    โœ…y -= z
    \n

    Bitwise operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’value << shift_amt
    ๐Ÿ•’value >> shift_amt
    ๐Ÿ•’a | b
    ๐Ÿ•’a & b
    ๐Ÿ•’a ~ b
    ๐Ÿ•’y | = z
    ๐Ÿ•’y &= z
    ๐Ÿ•’y ~= z
    \n

    Math Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…sin(angle)
    โœ…cos(angle)
    โœ…tan(angle)
    โœ…asin(x)
    โœ…acos(x)
    โœ…atan(x)
    โœ…atan2(x, y)
    โœ…sqr(x)
    โœ…sqrt(x)
    โœ…pow(x, y)
    โœ…exp(x)
    โœ…log(x)
    โœ…log10(x)
    โœ…abs(x)
    โœ…min(x, y)
    โœ…max(x, y)
    โœ…sign(x)
    โœ…rand(x)
    โœ…floor(x)
    โœ…ceil(x)
    โœ…invsqrt(x)
    \n

    Time Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’time([v])
    ๐Ÿ•’time_precise([v])
    \n

    Midi Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’midisend(offset, msg1, msg2)
    ๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
    ๐Ÿ•’midisend(offset, msg1, msg2, msg3)
    ๐Ÿ•’midisend_buf(offset, buf, len)
    ๐Ÿ•’midisend_str(offset, string)
    ๐Ÿ•’midirecv(offset, msg1, msg23)
    ๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
    ๐Ÿ•’midirecv_buf(offset, buf, maxlen)
    ๐Ÿ•’midirecv_str(offset, string)
    ๐Ÿ•’midisyx(offset, msgptr, len)
    \n

    Memory/FFT/MDCT Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’mdct(start_index, size)
    ๐Ÿ•’imdct(start_index, size)
    ๐Ÿ•’fft(start_index, size)
    ๐Ÿ•’ifft(start_index, size)
    ๐Ÿ•’fft_real(start_index, size)
    ๐Ÿ•’ifft_real(start_index, size)
    ๐Ÿ•’fft_permute(index, size)
    ๐Ÿ•’fft_ipermute(index, size)
    ๐Ÿ•’convolve_c(dest, src, size)
    ๐Ÿ•’freembuf(top)
    ๐Ÿ•’memcpy(dest, source, length)
    ๐Ÿ•’memset(dest, value, length)
    ๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
    ๐Ÿ•’mem_insert_shuffle(buf, len, value)
    ๐Ÿ•’__memtop()
    ๐Ÿ•’stack_push(value)
    ๐Ÿ•’stack_pop(value)
    ๐Ÿ•’stack_peek(index)
    ๐Ÿ•’stack_exch(value)
    ๐Ÿ•’atomic_setifequal(dest, value, newvalue)
    ๐Ÿ•’atomic_exch(val1, val2)
    ๐Ÿ•’atomic_add(dest_val1, val2)
    ๐Ÿ•’atomic_set(dest_val1, val2)
    ๐Ÿ•’atomic_get(val)
    \n

    Host Interaction Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’sliderchange(mask | sliderX)
    ๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
    ๐Ÿ•’slider_show(mask or sliderX[, value])
    ๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
    ๐Ÿ•’get_host_numchan()
    ๐Ÿ•’set_host_numchan(numchan)
    ๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
    ๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
    ๐Ÿ•’get_pinmapper_flags(no parameters)
    ๐Ÿ•’set_pinmapper_flags(flags)
    ๐Ÿ•’get_host_placement([chain_pos, flags])
    \n

    String Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’strlen(str)
    ๐Ÿ•’strcpy(str, srcstr)
    ๐Ÿ•’strcat(str, srcstr)
    ๐Ÿ•’strcmp(str, str2)
    ๐Ÿ•’stricmp(str, str2)
    ๐Ÿ•’strncmp(str, str2, maxlen)
    ๐Ÿ•’strnicmp(str, str2, maxlen)
    ๐Ÿ•’strncpy(str, srcstr, maxlen)
    ๐Ÿ•’strncat(str, srcstr, maxlen)
    ๐Ÿ•’strcpy_from(str, srcstr, offset)
    ๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
    ๐Ÿ•’str_getchar(str, offset[, type])
    ๐Ÿ•’str_setchar(str, offset, value[, type])
    ๐Ÿ•’strcpy_fromslider(str, slider)
    ๐Ÿ•’sprintf(str, format, ...)
    ๐Ÿ•’match(needle, haystack, ...)
    ๐Ÿ•’matchi(needle, haystack, ...)
    \n

    GFX Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
    ๐Ÿ•’gfx_lineto(x, y, aa)
    ๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
    ๐Ÿ•’gfx_rectto(x, y)
    ๐Ÿ•’gfx_rect(x, y, w, h)
    ๐Ÿ•’gfx_setpixel(r, g, b)
    ๐Ÿ•’gfx_getpixel(r, g, b)
    ๐Ÿ•’gfx_drawnumber(n, ndigits)
    ๐Ÿ•’gfx_drawchar($'c')
    ๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
    ๐Ÿ•’gfx_measurestr(str, w, h)
    ๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
    ๐Ÿ•’gfx_getfont()
    ๐Ÿ•’gfx_printf(str, ...)
    ๐Ÿ•’gfx_blurto(x,y)
    ๐Ÿ•’gfx_blit(source, scale, rotation)
    ๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
    ๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
    ๐Ÿ•’gfx_getimgdim(image, w, h)
    ๐Ÿ•’gfx_setimgdim(image, w,h)
    ๐Ÿ•’gfx_loadimg(image, filename)
    ๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
    ๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
    ๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
    ๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
    ๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
    ๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
    ๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
    ๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
    ๐Ÿ•’gfx_getchar([char, unicodechar])
    ๐Ÿ•’gfx_showmenu("str")
    ๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
    \n

    GFX Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
    ๐Ÿ•’gfx_w, gfx_h
    ๐Ÿ•’gfx_x, gfx_y
    ๐Ÿ•’gfx_mode
    ๐Ÿ•’gfx_clear
    ๐Ÿ•’gfx_dest
    ๐Ÿ•’gfx_texth
    ๐Ÿ•’gfx_ext_retina
    ๐Ÿ•’gfx_ext_flags
    ๐Ÿ•’mouse_x, mouse_y
    ๐Ÿ•’mouse_cap
    ๐Ÿ•’mouse_wheel, mouse_hwheel
    \n

    Special Vars and Extended Functionality

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’trigger
    ๐Ÿ•’ext_noinit
    ๐Ÿ•’ext_nodenorm
    โœ…ext_tail_size
    ๐Ÿ•’reg00-reg99
    ๐Ÿ•’_global.*
    \n

    Delay Compensation Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’pdc_delay
    ๐Ÿ•’pdc_bot_ch
    ๐Ÿ•’pdc_top_ch
    ๐Ÿ•’pdc_midi
    \n", From 9ef65e5e1fa747d1adae00887687530335eb9580 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 17:32:06 +0200 Subject: [PATCH 30/42] Docs --- compiler/js2eel.d.ts | 2 +- compiler/src/popupDocs.ts | 2 +- docs/api-documentation.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index 4d860d7..e6cabc2 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -448,7 +448,7 @@ declare function memset(): void; * * @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types */ -declare function file_open(fileSelector: any): any; +declare function file_open(fileSelector: any): number; /** * Closes a file opened with file_open(). diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index ac3d9e0..808770c 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -879,7 +879,7 @@ file_open: { "type": "function", "text": "Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.\n\n@param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types", "example": null, - "signature": "file_open(fileSelector: any): any;", + "signature": "file_open(fileSelector: any): number;", "autoCompleteTemplate": "file_open();" }, file_close: { diff --git a/docs/api-documentation.md b/docs/api-documentation.md index c1655b6..3a572ea 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -428,7 +428,7 @@ Opens a file from a file slider. Once open, you may use all of the file function @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types ```typescript -file_open(fileSelector: any): any; +file_open(fileSelector: any): number; ``` ### file_close() Closes a file opened with file_open(). From 6a11da157757ba5312eac7e28411f3d99aceac11 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 17:44:17 +0200 Subject: [PATCH 31/42] Remove EelBuffer.setStart() --- compiler/js2eel.d.ts | 1 - compiler/scripts/parseTypeDocs.mjs | 2 -- .../js2EelLib/eelBufferMemberCall.ts | 27 ------------------- compiler/src/popupDocs.ts | 2 +- docs/api-documentation.md | 1 - gui/src/docs/rendered-docs.json | 4 +-- 6 files changed, 3 insertions(+), 34 deletions(-) diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index e6cabc2..3cd6bbd 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -144,7 +144,6 @@ declare class EelBuffer { dimensions(): number; size(): number; start(): number; - setStart(newPosition: number): void; } /** diff --git a/compiler/scripts/parseTypeDocs.mjs b/compiler/scripts/parseTypeDocs.mjs index 5d1c3f2..a07204f 100644 --- a/compiler/scripts/parseTypeDocs.mjs +++ b/compiler/scripts/parseTypeDocs.mjs @@ -241,8 +241,6 @@ parts.forEach((part) => { addMarkdownHeading('Math Constants'); } else if (part.name.startsWith('srate')) { addMarkdownHeading('Audio Constants'); - } else if (part.name.startsWith('extTailSize')) { - addMarkdownHeading('Special Functions & Variables'); } else if (part.name.startsWith('file_open')) { addMarkdownHeading('File Functions'); } else if (part.name.startsWith('fft')) { diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts index bd4a5a4..a756ec7 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.ts @@ -30,33 +30,6 @@ export const eelBufferMemberCall = ( bufferMemberCallSrc += suffixEelBuffer(eelBuffer.name, '0'); break; } - case 'setStart': { - const { args, errors } = evaluateLibraryFunctionCall( - callExpression, - [ - { - name: 'position', - required: true, - allowedValues: defaultNumericArgAllowedValues - } - ], - instance - ); - - if (errors) { - instance.multipleErrors(errors); - - return JSFX_DENY_COMPILATION; - } - - for (let i = 0; i < eelBuffer.dimensions; i++) { - bufferMemberCallSrc += `${suffixEelBuffer(eelBuffer.name, i.toString())} = ${i} * ${ - eelBuffer.size - } + ${args.position.value};\n`; - } - - break; - } case 'swap': { const { args, errors } = evaluateLibraryFunctionCall( callExpression, diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index 808770c..c7c756f 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -95,7 +95,7 @@ EelBuffer: { "type": "class", "text": "A fixed-size, multi-dimensional container for audio samples.\n\nAccess: `buf[dimension][position]`\n\nTranslates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.", "example": null, - "signature": "EelBuffer {\n constructor(dimensions: number, size: number);\n\n dimensions(): number;\n size(): number;\n start(): number;\n setStart(newPosition: number): void;\n}", + "signature": "EelBuffer {\n constructor(dimensions: number, size: number);\n\n dimensions(): number;\n size(): number;\n start(): number;\n}", "autoCompleteTemplate": "EelBuffer(${dimensions}, ${size});" }, EelArray: { diff --git a/docs/api-documentation.md b/docs/api-documentation.md index 3a572ea..debd09b 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -181,7 +181,6 @@ EelBuffer { dimensions(): number; size(): number; start(): number; - setStart(newPosition: number): void; } ``` ### EelArray diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index 6c60d9a..9a311d6 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,6 +1,6 @@ { - "api-documentation": "

    API Documentation

    \n\n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels,\n    extTailSize\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n    extTailSize?: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n    setStart(newPosition: number): void;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): any;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n", - "changelog": "

    Changelog

    \n
      \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      • \n
      \n
    • \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • \n
      • Allow function declaration in block statement
      • \n
      • Allow member expression returns
      • \n
      \n
    • \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • \n
      • More documentation
      • \n
      \n
    • \n
    • v0.3.0: Initial release
    • \n
    \n", + "api-documentation": "

    API Documentation

    \n\n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels,\n    extTailSize\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n    extTailSize?: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): number;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n", + "changelog": "

    Changelog

    \n
      \n
    • v0.11.0:
        \n
      • Allow configuration of ext_tail_size
      • \n
      • File selector slider
      • \n
      • onBlock section
      • \n
      \n
    • \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      • \n
      \n
    • \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • \n
      • Allow function declaration in block statement
      • \n
      • Allow member expression returns
      • \n
      \n
    • \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • \n
      • More documentation
      • \n
      \n
    • \n
    • v0.3.0: Initial release
    • \n
    \n", "development": "

    Development

    \n

    Requirements

    \n
      \n
    • Node.js 18 and higher
    • \n
    • Terminal emulator
        \n
      • Linux, MacOS: bash or zsh
      • \n
      • Windows: git bash (comes with git)
      • \n
      \n
    • \n
    • Reaper DAW, obviously
    • \n
    \n

    Setup

    \n
      \n
    • Install dependencies for all packages:
        \n
      • cd scripts
      • \n
      • ./install.sh
      • \n
      \n
    • \n
    • Open a different terminal session for each of the following steps
        \n
      • Go to compiler and do npm run dev
      • \n
      • Go to gui and do npm run dev
      • \n
      • Go to desktop and do npm run dev. Now, the electron build should open.
      • \n
      \n
    • \n
    \n

    Guidelines

    \n
      \n
    • We aim for 100% test coverage for the compiler package
    • \n
    \n

    Architecture

    \n

    TODO

    \n

    Recommended VSCode Extensions

    \n

    TODO

    \n", "feature-comparison": "

    Feature Comparison with JSFX

    \n

    JSFX Reference: https://www.reaper.fm/sdk/js/js.php

    \n

    Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

    \n

    โœ…: Implemented

    \n

    ๐Ÿ•’: Should be implemented

    \n

    โŒ: Won't be implemented

    \n

    โ”: Unknown if feasible, useful, or working properly

    \n

    Description Lines and Utility Features

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…descImplemented as part of config()
    ๐Ÿ•’tags
    ๐Ÿ•’options
    ๐Ÿ•’JSFX comments
    \n

    Code Sections

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…@initonInit()
    โœ…@slideronSlider()
    ๐Ÿ•’@block
    โœ…@sampleonSample()
    ๐Ÿ•’@serialize
    ๐Ÿ•’@gfxDeclarative with React-like syntax?
    \n

    File Handling

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’import
    ๐Ÿ•’filename
    โœ…file_open(index | slider)Slider variant implemented
    โœ…file_close(handle)
    ๐Ÿ•’file_rewind(handle)
    ๐Ÿ•’file_var(handle, variable)
    โœ…file_mem(handle, offset, length)
    โœ…file_avail(handle)
    โœ…file_riff(handle, nch, samplerate)
    ๐Ÿ•’file_text(handle, istext)
    ๐Ÿ•’file_string(handle,str)
    \n

    Routing and Input

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…in_pin, out_pinImplemented as part of config()
    \n

    UI

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Slider: Normalslider()
    โœ…Slider: SelectselectBox()
    โœ…Slider: File
    ๐Ÿ•’Hidden sliders
    ๐Ÿ•’Slider: shapes
    โŒslider(index)Might not be necessary as every slider is bound to a variable
    ๐Ÿ•’slider_next_chg(sliderindex,nextval)
    \n

    Sample Access

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…spl0 - spl63
    โœ…spl(index)
    \n

    Audio and Transport State Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…srate
    โœ…num_ch
    โœ…samplesblock
    โœ…tempo
    โœ…play_state
    โœ…play_position
    โœ…beat_position
    โœ…ts_num
    โœ…ts_denom
    \n

    Data Structures and Encodings

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Local variableslet & const
    โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
    โ”Local address space 8m word restriction
    ๐Ÿ•’Global address space (gmem[])
    ๐Ÿ•’Named global address space
    โ”Global named variables (_global. prefix)
    ๐Ÿ•’Hex numbers
    ๐Ÿ•’ASCII chars
    ๐Ÿ•’Bitmasks
    โ”StringsAlready fully implemented?
    \n

    Control Structures

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…FunctionsUser definable functions are inlined in compiled code
    โœ…Conditionals
    โœ…Conditional Branching
    ๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
    ๐Ÿ•’while(actions..., condition)
    ๐Ÿ•’while(condition) (actions...)
    \n

    Operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…!value
    โœ…-value
    โœ…+value
    โœ…base ^ exponentMath.pow(base, exponent) or **
    โœ…numerator % denominator
    โœ…value / divisor
    โœ…value * another_value
    โœ…value - another_value
    โœ…value + another_value
    โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 === value2
    โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 !== value2
    โœ…value1 < value2
    โœ…value1 > value2
    โœ…value1 <= value2
    โœ…value1 >= value2
    โœ…y || z
    โœ…y && z
    โœ…y ? z
    โœ…y ? z : x
    โœ…y = z
    โœ…y *= z
    โœ…y /= divisor
    โœ…y %= divisor
    ๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
    โœ…y += z
    โœ…y -= z
    \n

    Bitwise operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’value << shift_amt
    ๐Ÿ•’value >> shift_amt
    ๐Ÿ•’a | b
    ๐Ÿ•’a & b
    ๐Ÿ•’a ~ b
    ๐Ÿ•’y | = z
    ๐Ÿ•’y &= z
    ๐Ÿ•’y ~= z
    \n

    Math Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…sin(angle)
    โœ…cos(angle)
    โœ…tan(angle)
    โœ…asin(x)
    โœ…acos(x)
    โœ…atan(x)
    โœ…atan2(x, y)
    โœ…sqr(x)
    โœ…sqrt(x)
    โœ…pow(x, y)
    โœ…exp(x)
    โœ…log(x)
    โœ…log10(x)
    โœ…abs(x)
    โœ…min(x, y)
    โœ…max(x, y)
    โœ…sign(x)
    โœ…rand(x)
    โœ…floor(x)
    โœ…ceil(x)
    โœ…invsqrt(x)
    \n

    Time Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’time([v])
    ๐Ÿ•’time_precise([v])
    \n

    Midi Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’midisend(offset, msg1, msg2)
    ๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
    ๐Ÿ•’midisend(offset, msg1, msg2, msg3)
    ๐Ÿ•’midisend_buf(offset, buf, len)
    ๐Ÿ•’midisend_str(offset, string)
    ๐Ÿ•’midirecv(offset, msg1, msg23)
    ๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
    ๐Ÿ•’midirecv_buf(offset, buf, maxlen)
    ๐Ÿ•’midirecv_str(offset, string)
    ๐Ÿ•’midisyx(offset, msgptr, len)
    \n

    Memory/FFT/MDCT Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’mdct(start_index, size)
    ๐Ÿ•’imdct(start_index, size)
    ๐Ÿ•’fft(start_index, size)
    ๐Ÿ•’ifft(start_index, size)
    ๐Ÿ•’fft_real(start_index, size)
    ๐Ÿ•’ifft_real(start_index, size)
    ๐Ÿ•’fft_permute(index, size)
    ๐Ÿ•’fft_ipermute(index, size)
    ๐Ÿ•’convolve_c(dest, src, size)
    ๐Ÿ•’freembuf(top)
    ๐Ÿ•’memcpy(dest, source, length)
    ๐Ÿ•’memset(dest, value, length)
    ๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
    ๐Ÿ•’mem_insert_shuffle(buf, len, value)
    ๐Ÿ•’__memtop()
    ๐Ÿ•’stack_push(value)
    ๐Ÿ•’stack_pop(value)
    ๐Ÿ•’stack_peek(index)
    ๐Ÿ•’stack_exch(value)
    ๐Ÿ•’atomic_setifequal(dest, value, newvalue)
    ๐Ÿ•’atomic_exch(val1, val2)
    ๐Ÿ•’atomic_add(dest_val1, val2)
    ๐Ÿ•’atomic_set(dest_val1, val2)
    ๐Ÿ•’atomic_get(val)
    \n

    Host Interaction Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’sliderchange(mask | sliderX)
    ๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
    ๐Ÿ•’slider_show(mask or sliderX[, value])
    ๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
    ๐Ÿ•’get_host_numchan()
    ๐Ÿ•’set_host_numchan(numchan)
    ๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
    ๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
    ๐Ÿ•’get_pinmapper_flags(no parameters)
    ๐Ÿ•’set_pinmapper_flags(flags)
    ๐Ÿ•’get_host_placement([chain_pos, flags])
    \n

    String Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’strlen(str)
    ๐Ÿ•’strcpy(str, srcstr)
    ๐Ÿ•’strcat(str, srcstr)
    ๐Ÿ•’strcmp(str, str2)
    ๐Ÿ•’stricmp(str, str2)
    ๐Ÿ•’strncmp(str, str2, maxlen)
    ๐Ÿ•’strnicmp(str, str2, maxlen)
    ๐Ÿ•’strncpy(str, srcstr, maxlen)
    ๐Ÿ•’strncat(str, srcstr, maxlen)
    ๐Ÿ•’strcpy_from(str, srcstr, offset)
    ๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
    ๐Ÿ•’str_getchar(str, offset[, type])
    ๐Ÿ•’str_setchar(str, offset, value[, type])
    ๐Ÿ•’strcpy_fromslider(str, slider)
    ๐Ÿ•’sprintf(str, format, ...)
    ๐Ÿ•’match(needle, haystack, ...)
    ๐Ÿ•’matchi(needle, haystack, ...)
    \n

    GFX Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
    ๐Ÿ•’gfx_lineto(x, y, aa)
    ๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
    ๐Ÿ•’gfx_rectto(x, y)
    ๐Ÿ•’gfx_rect(x, y, w, h)
    ๐Ÿ•’gfx_setpixel(r, g, b)
    ๐Ÿ•’gfx_getpixel(r, g, b)
    ๐Ÿ•’gfx_drawnumber(n, ndigits)
    ๐Ÿ•’gfx_drawchar($'c')
    ๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
    ๐Ÿ•’gfx_measurestr(str, w, h)
    ๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
    ๐Ÿ•’gfx_getfont()
    ๐Ÿ•’gfx_printf(str, ...)
    ๐Ÿ•’gfx_blurto(x,y)
    ๐Ÿ•’gfx_blit(source, scale, rotation)
    ๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
    ๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
    ๐Ÿ•’gfx_getimgdim(image, w, h)
    ๐Ÿ•’gfx_setimgdim(image, w,h)
    ๐Ÿ•’gfx_loadimg(image, filename)
    ๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
    ๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
    ๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
    ๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
    ๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
    ๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
    ๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
    ๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
    ๐Ÿ•’gfx_getchar([char, unicodechar])
    ๐Ÿ•’gfx_showmenu("str")
    ๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
    \n

    GFX Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
    ๐Ÿ•’gfx_w, gfx_h
    ๐Ÿ•’gfx_x, gfx_y
    ๐Ÿ•’gfx_mode
    ๐Ÿ•’gfx_clear
    ๐Ÿ•’gfx_dest
    ๐Ÿ•’gfx_texth
    ๐Ÿ•’gfx_ext_retina
    ๐Ÿ•’gfx_ext_flags
    ๐Ÿ•’mouse_x, mouse_y
    ๐Ÿ•’mouse_cap
    ๐Ÿ•’mouse_wheel, mouse_hwheel
    \n

    Special Vars and Extended Functionality

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’trigger
    ๐Ÿ•’ext_noinit
    ๐Ÿ•’ext_nodenorm
    โœ…ext_tail_size
    ๐Ÿ•’reg00-reg99
    ๐Ÿ•’_global.*
    \n

    Delay Compensation Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’pdc_delay
    ๐Ÿ•’pdc_bot_ch
    ๐Ÿ•’pdc_top_ch
    ๐Ÿ•’pdc_midi
    \n", "getting-started": "

    Getting Started: Your First JS2EEL Plugin

    \n

    Let's create our first JS2EEL plugin. We'll write it in JavaScript. JS2EEL will compile it into a REAPER JSFX plugin that you can use instantly.

    \n

    Our plugin will take an input audio signal and modify its volume. If you'd like to see the finished plugin, feel free to load the example plugin volume.js.

    \n

    Step 1: Create a New File

    \n

    Click on the "New File" button in the upper left half of the window.

    \n

    A modal will appear where you have to enter a filename for the JavaScript code and a description that will be used to reference the JSFX plugin in REAPER. Let's start with the same value for both: volume.

    \n

    As you create the new file, the JS code tab will be pre-populated with a minimal template. There will be a call to the config() function, where the name and the channel configuration of the plugin is defined:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    Take a look at the resulting JSFX code on the right. If you're familiar with JSFX, you'll meet some old friends here: desc: and the in_pin and out_pin configuration for your plugin's channel routing.

    \n

    Additionally, a template for the onSample() function call is provided. This is a JS2EEL library function that iterates through every sample of the audio block and allows you to modify it. This corresponds to the @sample part in JSFX.

    \n

    Step 2: Declare Volume Adjustment Holder Variables

    \n

    Next, we will create variables to hold the current volume level and the target volume level. Between config() and onSample(), add the following code:

    \n
    let volume = 0;\nlet target = 0;\n
    \n

    volume represents the volume in dB, and target represents the target volume in linear scale.

    \n

    Step 3: Create a Slider for User Input

    \n

    To allow the user to adjust the volume, we'll use a slider. We'll bind that slider to the volume variable created above. After the variable declarations, add the following code to your file:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    As you might know, slider numbering is important in EEL. It starts at 1, and so our slider takes 1 as the first argument.

    \n

    The second argument is the variable to bind to: volume.

    \n

    The third argument is the default value: 0.

    \n

    The fourth and fifth arguments are the minimum and maximum values: -150 and 18 dB, respectively.

    \n

    The sixth argument is the step size: 0.1.

    \n

    The last argument is the label for the slider which will be displayed in the GUI: Volume [dB].

    \n

    Step 4: Handle Slider Value Changes

    \n

    Now, we need to update the target variable whenever the user adjusts the slider. We'll use the onSlider() library function to handle slider value changes. This corresponds to EEL's @slider. After the slider definition via slider(), add the following code to your file:

    \n
    onSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n
    \n

    Here we assign a linear target level to the target variable, which will be used later to adjust our sample amplitude. If the slider is at its lower boundary, we set the target to 0 to mute the audio.

    \n

    Step 5: Process Audio Samples

    \n

    The final step is to process audio samples based on the calculated target volume. We'll use the onSample() function to perform audio processing. This corresponds to EEL's @sample. In the callback arrow function parameter of onSample(), add the following code:

    \n
    eachChannel((sample, _ch) => {\n    sample *= target;\n});\n
    \n

    eachChannel() is another JS2EEL library function that makes it easy to manipulate samples per channel. It can only be called in onSample. It has no equivalent in EEL. We just multiply every sample in each of the two channels by the target volume to adjust its amplitude respectively.

    \n

    Finished Plugin

    \n

    Here is the complete code:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n\nlet volume = 0;\nlet target = 0;\n\nslider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n\nonSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n\nonSample(() => {\n    eachChannel((sample, _ch) => {\n        sample *= target;\n    });\n});\n
    \n

    Conclusion

    \n

    That's it! You've successfully created a simple volume plugin using JS2EEL. If you're using the web app version of JS2EEL, copy the JSFX code into a new JSFX in REAPER to hear it in action. If you're using the desktop app and have configured the output path correctly, your volume JSFX should appear in the JS subdirectory of the FX selector.

    \n

    Feel free to take a look at the other examples. You'll be inspired to write your own JS2EEL plugin in no time!

    \n", From caed475c0f60a5e10a72d865515f80de31ea8056 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 17:47:29 +0200 Subject: [PATCH 32/42] Update changelog --- docs/changelog.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index 8755df9..050428a 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,5 +1,14 @@ # Changelog +- v0.11.0: + - Allow configuration of `ext_tail_size` (`config.extTailSize`) + - File selector slider + - @block section (`onBlock`) + - Start location getter for `EelBuffer`: `EelBuffer.start()` + - New memory function: `memset()` + - New file functions: `file_open()`, `file_close()`, `file_avail()`, `file_riff()`, `file_mem()` + - FFT functions: `fft()`, `ifft()`, `convolve_c()` + - Cab sim demo (very early stage) - v0.9.1: - New example: 4-Band RBJ EQ - v0.7.0: From 990b0fe090e8d265906edc443aefe80da8e23f8d Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 17:50:52 +0200 Subject: [PATCH 33/42] Update changelog & feature comparison --- docs/changelog.md | 1 + docs/feature-comparison.md | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 050428a..7ef4ba4 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -4,6 +4,7 @@ - Allow configuration of `ext_tail_size` (`config.extTailSize`) - File selector slider - @block section (`onBlock`) + - `while` loops - Start location getter for `EelBuffer`: `EelBuffer.start()` - New memory function: `memset()` - New file functions: `file_open()`, `file_close()`, `file_avail()`, `file_riff()`, `file_mem()` diff --git a/docs/feature-comparison.md b/docs/feature-comparison.md index 1bc11ca..c3008c7 100644 --- a/docs/feature-comparison.md +++ b/docs/feature-comparison.md @@ -27,7 +27,7 @@ Find the JS2EEL type declarations [here](https://github.com/steeelydan/js2eel/bl | ------ | ------------ | ----------------------------------- | | โœ… | `@init` | `onInit()` | | โœ… | `@slider` | `onSlider()` | -| ๐Ÿ•’ | `@block` | | +| โœ… | `@block` | | | โœ… | `@sample` | `onSample()` | | ๐Ÿ•’ | `@serialize` | | | ๐Ÿ•’ | `@gfx` | Declarative with React-like syntax? | @@ -111,7 +111,7 @@ Find the JS2EEL type declarations [here](https://github.com/steeelydan/js2eel/bl | โœ… | Conditional Branching | | | ๐Ÿ•’ | `loop(counter, actions...)` | We should have generic loops even if sample- and channel related iterations should be handled by `eachChannel()` | | ๐Ÿ•’ | `while(actions..., condition)` | | -| ๐Ÿ•’ | `while(condition) (actions...)` | | +| โœ… | `while(condition) (actions...)` | | ## Operators @@ -213,16 +213,16 @@ Find the JS2EEL type declarations [here](https://github.com/steeelydan/js2eel/bl | ------ | ------------------------------------------ | ------- | | ๐Ÿ•’ | `mdct(start_index, size)` | | | ๐Ÿ•’ | `imdct(start_index, size)` | | -| ๐Ÿ•’ | `fft(start_index, size)` | | -| ๐Ÿ•’ | `ifft(start_index, size)` | | +| โœ… | `fft(start_index, size)` | | +| โœ… | `ifft(start_index, size)` | | | ๐Ÿ•’ | `fft_real(start_index, size)` | | | ๐Ÿ•’ | `ifft_real(start_index, size)` | | | ๐Ÿ•’ | `fft_permute(index, size)` | | | ๐Ÿ•’ | `fft_ipermute(index, size)` | | -| ๐Ÿ•’ | `convolve_c(dest, src, size)` | | +| โœ… | `convolve_c(dest, src, size)` | | | ๐Ÿ•’ | `freembuf(top)` | | | ๐Ÿ•’ | `memcpy(dest, source, length)` | | -| ๐Ÿ•’ | `memset(dest, value, length)` | | +| โœ… | `memset(dest, value, length)` | | | ๐Ÿ•’ | `mem_multiply_sum(buf1, buf2, length)` | | | ๐Ÿ•’ | `mem_insert_shuffle(buf, len, value)` | | | ๐Ÿ•’ | `__memtop()` | | From 0cca2bbd5aec1da33a27a196c5ec8cd5db4fc8e1 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 17:55:51 +0200 Subject: [PATCH 34/42] Bump version --- compiler/package-lock.json | 4 ++-- compiler/package.json | 2 +- desktop/package-lock.json | 4 ++-- desktop/package.json | 2 +- gui/package-lock.json | 4 ++-- gui/package.json | 2 +- gui/src/docs/rendered-docs.json | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/compiler/package-lock.json b/compiler/package-lock.json index 1c6e78e..73b9422 100644 --- a/compiler/package-lock.json +++ b/compiler/package-lock.json @@ -1,12 +1,12 @@ { "name": "@js2eel/compiler", - "version": "0.10.0", + "version": "0.11.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@js2eel/compiler", - "version": "0.10.0", + "version": "0.11.0", "license": "GPL-3.0", "dependencies": { "acorn": "8.12.1", diff --git a/compiler/package.json b/compiler/package.json index 07f38dc..27bdc68 100644 --- a/compiler/package.json +++ b/compiler/package.json @@ -1,6 +1,6 @@ { "name": "@js2eel/compiler", - "version": "0.10.0", + "version": "0.11.0", "description": "Write REAPER JSFX/EEL2 plugins in JavaScript", "engines": { "node": ">=20.0.0" diff --git a/desktop/package-lock.json b/desktop/package-lock.json index 2708833..c1aa965 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "js2eel-desktop", - "version": "0.10.0", + "version": "0.11.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "js2eel-desktop", - "version": "0.10.0", + "version": "0.11.0", "license": "GPL-3.0", "dependencies": { "@js2eel/compiler": "file:../compiler", diff --git a/desktop/package.json b/desktop/package.json index c8a9486..9a8848c 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,6 +1,6 @@ { "name": "js2eel-desktop", - "version": "0.10.0", + "version": "0.11.0", "homepage": "https://js2eel.org", "description": "JS2EEL", "engines": { diff --git a/gui/package-lock.json b/gui/package-lock.json index 2fc2046..b9f2515 100644 --- a/gui/package-lock.json +++ b/gui/package-lock.json @@ -1,12 +1,12 @@ { "name": "@js2eel/gui", - "version": "0.10.0", + "version": "0.11.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@js2eel/gui", - "version": "0.10.0", + "version": "0.11.0", "dependencies": { "@codemirror/lang-javascript": "6.2.2", "@codemirror/lang-json": "6.0.1", diff --git a/gui/package.json b/gui/package.json index e7646e1..ee44eb8 100644 --- a/gui/package.json +++ b/gui/package.json @@ -1,7 +1,7 @@ { "name": "@js2eel/gui", "private": true, - "version": "0.10.0", + "version": "0.11.0", "engines": { "node": ">=20.0.0" }, diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index 9a311d6..d6d510b 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,8 +1,8 @@ { "api-documentation": "

    API Documentation

    \n\n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels,\n    extTailSize\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n    extTailSize?: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): number;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n", - "changelog": "

    Changelog

    \n
      \n
    • v0.11.0:
        \n
      • Allow configuration of ext_tail_size
      • \n
      • File selector slider
      • \n
      • onBlock section
      • \n
      \n
    • \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      • \n
      \n
    • \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • \n
      • Allow function declaration in block statement
      • \n
      • Allow member expression returns
      • \n
      \n
    • \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • \n
      • More documentation
      • \n
      \n
    • \n
    • v0.3.0: Initial release
    • \n
    \n", + "changelog": "

    Changelog

    \n
      \n
    • v0.11.0:
        \n
      • Allow configuration of ext_tail_size (config.extTailSize)
      • \n
      • File selector slider
      • \n
      • @block section (onBlock)
      • \n
      • while loops
      • \n
      • Start location getter for EelBuffer: EelBuffer.start()
      • \n
      • New memory function: memset()
      • \n
      • New file functions: file_open(), file_close(), file_avail(), file_riff(), file_mem()
      • \n
      • FFT functions: fft(), ifft(), convolve_c()
      • \n
      • Cab sim demo (very early stage)
      • \n
      \n
    • \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      • \n
      \n
    • \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • \n
      • Allow function declaration in block statement
      • \n
      • Allow member expression returns
      • \n
      \n
    • \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • \n
      • More documentation
      • \n
      \n
    • \n
    • v0.3.0: Initial release
    • \n
    \n", "development": "

    Development

    \n

    Requirements

    \n
      \n
    • Node.js 18 and higher
    • \n
    • Terminal emulator
        \n
      • Linux, MacOS: bash or zsh
      • \n
      • Windows: git bash (comes with git)
      • \n
      \n
    • \n
    • Reaper DAW, obviously
    • \n
    \n

    Setup

    \n
      \n
    • Install dependencies for all packages:
        \n
      • cd scripts
      • \n
      • ./install.sh
      • \n
      \n
    • \n
    • Open a different terminal session for each of the following steps
        \n
      • Go to compiler and do npm run dev
      • \n
      • Go to gui and do npm run dev
      • \n
      • Go to desktop and do npm run dev. Now, the electron build should open.
      • \n
      \n
    • \n
    \n

    Guidelines

    \n
      \n
    • We aim for 100% test coverage for the compiler package
    • \n
    \n

    Architecture

    \n

    TODO

    \n

    Recommended VSCode Extensions

    \n

    TODO

    \n", - "feature-comparison": "

    Feature Comparison with JSFX

    \n

    JSFX Reference: https://www.reaper.fm/sdk/js/js.php

    \n

    Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

    \n

    โœ…: Implemented

    \n

    ๐Ÿ•’: Should be implemented

    \n

    โŒ: Won't be implemented

    \n

    โ”: Unknown if feasible, useful, or working properly

    \n

    Description Lines and Utility Features

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…descImplemented as part of config()
    ๐Ÿ•’tags
    ๐Ÿ•’options
    ๐Ÿ•’JSFX comments
    \n

    Code Sections

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…@initonInit()
    โœ…@slideronSlider()
    ๐Ÿ•’@block
    โœ…@sampleonSample()
    ๐Ÿ•’@serialize
    ๐Ÿ•’@gfxDeclarative with React-like syntax?
    \n

    File Handling

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’import
    ๐Ÿ•’filename
    โœ…file_open(index | slider)Slider variant implemented
    โœ…file_close(handle)
    ๐Ÿ•’file_rewind(handle)
    ๐Ÿ•’file_var(handle, variable)
    โœ…file_mem(handle, offset, length)
    โœ…file_avail(handle)
    โœ…file_riff(handle, nch, samplerate)
    ๐Ÿ•’file_text(handle, istext)
    ๐Ÿ•’file_string(handle,str)
    \n

    Routing and Input

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…in_pin, out_pinImplemented as part of config()
    \n

    UI

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Slider: Normalslider()
    โœ…Slider: SelectselectBox()
    โœ…Slider: File
    ๐Ÿ•’Hidden sliders
    ๐Ÿ•’Slider: shapes
    โŒslider(index)Might not be necessary as every slider is bound to a variable
    ๐Ÿ•’slider_next_chg(sliderindex,nextval)
    \n

    Sample Access

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…spl0 - spl63
    โœ…spl(index)
    \n

    Audio and Transport State Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…srate
    โœ…num_ch
    โœ…samplesblock
    โœ…tempo
    โœ…play_state
    โœ…play_position
    โœ…beat_position
    โœ…ts_num
    โœ…ts_denom
    \n

    Data Structures and Encodings

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Local variableslet & const
    โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
    โ”Local address space 8m word restriction
    ๐Ÿ•’Global address space (gmem[])
    ๐Ÿ•’Named global address space
    โ”Global named variables (_global. prefix)
    ๐Ÿ•’Hex numbers
    ๐Ÿ•’ASCII chars
    ๐Ÿ•’Bitmasks
    โ”StringsAlready fully implemented?
    \n

    Control Structures

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…FunctionsUser definable functions are inlined in compiled code
    โœ…Conditionals
    โœ…Conditional Branching
    ๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
    ๐Ÿ•’while(actions..., condition)
    ๐Ÿ•’while(condition) (actions...)
    \n

    Operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…!value
    โœ…-value
    โœ…+value
    โœ…base ^ exponentMath.pow(base, exponent) or **
    โœ…numerator % denominator
    โœ…value / divisor
    โœ…value * another_value
    โœ…value - another_value
    โœ…value + another_value
    โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 === value2
    โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 !== value2
    โœ…value1 < value2
    โœ…value1 > value2
    โœ…value1 <= value2
    โœ…value1 >= value2
    โœ…y || z
    โœ…y && z
    โœ…y ? z
    โœ…y ? z : x
    โœ…y = z
    โœ…y *= z
    โœ…y /= divisor
    โœ…y %= divisor
    ๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
    โœ…y += z
    โœ…y -= z
    \n

    Bitwise operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’value << shift_amt
    ๐Ÿ•’value >> shift_amt
    ๐Ÿ•’a | b
    ๐Ÿ•’a & b
    ๐Ÿ•’a ~ b
    ๐Ÿ•’y | = z
    ๐Ÿ•’y &= z
    ๐Ÿ•’y ~= z
    \n

    Math Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…sin(angle)
    โœ…cos(angle)
    โœ…tan(angle)
    โœ…asin(x)
    โœ…acos(x)
    โœ…atan(x)
    โœ…atan2(x, y)
    โœ…sqr(x)
    โœ…sqrt(x)
    โœ…pow(x, y)
    โœ…exp(x)
    โœ…log(x)
    โœ…log10(x)
    โœ…abs(x)
    โœ…min(x, y)
    โœ…max(x, y)
    โœ…sign(x)
    โœ…rand(x)
    โœ…floor(x)
    โœ…ceil(x)
    โœ…invsqrt(x)
    \n

    Time Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’time([v])
    ๐Ÿ•’time_precise([v])
    \n

    Midi Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’midisend(offset, msg1, msg2)
    ๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
    ๐Ÿ•’midisend(offset, msg1, msg2, msg3)
    ๐Ÿ•’midisend_buf(offset, buf, len)
    ๐Ÿ•’midisend_str(offset, string)
    ๐Ÿ•’midirecv(offset, msg1, msg23)
    ๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
    ๐Ÿ•’midirecv_buf(offset, buf, maxlen)
    ๐Ÿ•’midirecv_str(offset, string)
    ๐Ÿ•’midisyx(offset, msgptr, len)
    \n

    Memory/FFT/MDCT Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’mdct(start_index, size)
    ๐Ÿ•’imdct(start_index, size)
    ๐Ÿ•’fft(start_index, size)
    ๐Ÿ•’ifft(start_index, size)
    ๐Ÿ•’fft_real(start_index, size)
    ๐Ÿ•’ifft_real(start_index, size)
    ๐Ÿ•’fft_permute(index, size)
    ๐Ÿ•’fft_ipermute(index, size)
    ๐Ÿ•’convolve_c(dest, src, size)
    ๐Ÿ•’freembuf(top)
    ๐Ÿ•’memcpy(dest, source, length)
    ๐Ÿ•’memset(dest, value, length)
    ๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
    ๐Ÿ•’mem_insert_shuffle(buf, len, value)
    ๐Ÿ•’__memtop()
    ๐Ÿ•’stack_push(value)
    ๐Ÿ•’stack_pop(value)
    ๐Ÿ•’stack_peek(index)
    ๐Ÿ•’stack_exch(value)
    ๐Ÿ•’atomic_setifequal(dest, value, newvalue)
    ๐Ÿ•’atomic_exch(val1, val2)
    ๐Ÿ•’atomic_add(dest_val1, val2)
    ๐Ÿ•’atomic_set(dest_val1, val2)
    ๐Ÿ•’atomic_get(val)
    \n

    Host Interaction Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’sliderchange(mask | sliderX)
    ๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
    ๐Ÿ•’slider_show(mask or sliderX[, value])
    ๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
    ๐Ÿ•’get_host_numchan()
    ๐Ÿ•’set_host_numchan(numchan)
    ๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
    ๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
    ๐Ÿ•’get_pinmapper_flags(no parameters)
    ๐Ÿ•’set_pinmapper_flags(flags)
    ๐Ÿ•’get_host_placement([chain_pos, flags])
    \n

    String Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’strlen(str)
    ๐Ÿ•’strcpy(str, srcstr)
    ๐Ÿ•’strcat(str, srcstr)
    ๐Ÿ•’strcmp(str, str2)
    ๐Ÿ•’stricmp(str, str2)
    ๐Ÿ•’strncmp(str, str2, maxlen)
    ๐Ÿ•’strnicmp(str, str2, maxlen)
    ๐Ÿ•’strncpy(str, srcstr, maxlen)
    ๐Ÿ•’strncat(str, srcstr, maxlen)
    ๐Ÿ•’strcpy_from(str, srcstr, offset)
    ๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
    ๐Ÿ•’str_getchar(str, offset[, type])
    ๐Ÿ•’str_setchar(str, offset, value[, type])
    ๐Ÿ•’strcpy_fromslider(str, slider)
    ๐Ÿ•’sprintf(str, format, ...)
    ๐Ÿ•’match(needle, haystack, ...)
    ๐Ÿ•’matchi(needle, haystack, ...)
    \n

    GFX Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
    ๐Ÿ•’gfx_lineto(x, y, aa)
    ๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
    ๐Ÿ•’gfx_rectto(x, y)
    ๐Ÿ•’gfx_rect(x, y, w, h)
    ๐Ÿ•’gfx_setpixel(r, g, b)
    ๐Ÿ•’gfx_getpixel(r, g, b)
    ๐Ÿ•’gfx_drawnumber(n, ndigits)
    ๐Ÿ•’gfx_drawchar($'c')
    ๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
    ๐Ÿ•’gfx_measurestr(str, w, h)
    ๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
    ๐Ÿ•’gfx_getfont()
    ๐Ÿ•’gfx_printf(str, ...)
    ๐Ÿ•’gfx_blurto(x,y)
    ๐Ÿ•’gfx_blit(source, scale, rotation)
    ๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
    ๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
    ๐Ÿ•’gfx_getimgdim(image, w, h)
    ๐Ÿ•’gfx_setimgdim(image, w,h)
    ๐Ÿ•’gfx_loadimg(image, filename)
    ๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
    ๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
    ๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
    ๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
    ๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
    ๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
    ๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
    ๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
    ๐Ÿ•’gfx_getchar([char, unicodechar])
    ๐Ÿ•’gfx_showmenu("str")
    ๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
    \n

    GFX Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
    ๐Ÿ•’gfx_w, gfx_h
    ๐Ÿ•’gfx_x, gfx_y
    ๐Ÿ•’gfx_mode
    ๐Ÿ•’gfx_clear
    ๐Ÿ•’gfx_dest
    ๐Ÿ•’gfx_texth
    ๐Ÿ•’gfx_ext_retina
    ๐Ÿ•’gfx_ext_flags
    ๐Ÿ•’mouse_x, mouse_y
    ๐Ÿ•’mouse_cap
    ๐Ÿ•’mouse_wheel, mouse_hwheel
    \n

    Special Vars and Extended Functionality

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’trigger
    ๐Ÿ•’ext_noinit
    ๐Ÿ•’ext_nodenorm
    โœ…ext_tail_size
    ๐Ÿ•’reg00-reg99
    ๐Ÿ•’_global.*
    \n

    Delay Compensation Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’pdc_delay
    ๐Ÿ•’pdc_bot_ch
    ๐Ÿ•’pdc_top_ch
    ๐Ÿ•’pdc_midi
    \n", + "feature-comparison": "

    Feature Comparison with JSFX

    \n

    JSFX Reference: https://www.reaper.fm/sdk/js/js.php

    \n

    Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

    \n

    โœ…: Implemented

    \n

    ๐Ÿ•’: Should be implemented

    \n

    โŒ: Won't be implemented

    \n

    โ”: Unknown if feasible, useful, or working properly

    \n

    Description Lines and Utility Features

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…descImplemented as part of config()
    ๐Ÿ•’tags
    ๐Ÿ•’options
    ๐Ÿ•’JSFX comments
    \n

    Code Sections

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…@initonInit()
    โœ…@slideronSlider()
    โœ…@block
    โœ…@sampleonSample()
    ๐Ÿ•’@serialize
    ๐Ÿ•’@gfxDeclarative with React-like syntax?
    \n

    File Handling

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’import
    ๐Ÿ•’filename
    โœ…file_open(index | slider)Slider variant implemented
    โœ…file_close(handle)
    ๐Ÿ•’file_rewind(handle)
    ๐Ÿ•’file_var(handle, variable)
    โœ…file_mem(handle, offset, length)
    โœ…file_avail(handle)
    โœ…file_riff(handle, nch, samplerate)
    ๐Ÿ•’file_text(handle, istext)
    ๐Ÿ•’file_string(handle,str)
    \n

    Routing and Input

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…in_pin, out_pinImplemented as part of config()
    \n

    UI

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Slider: Normalslider()
    โœ…Slider: SelectselectBox()
    โœ…Slider: File
    ๐Ÿ•’Hidden sliders
    ๐Ÿ•’Slider: shapes
    โŒslider(index)Might not be necessary as every slider is bound to a variable
    ๐Ÿ•’slider_next_chg(sliderindex,nextval)
    \n

    Sample Access

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…spl0 - spl63
    โœ…spl(index)
    \n

    Audio and Transport State Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…srate
    โœ…num_ch
    โœ…samplesblock
    โœ…tempo
    โœ…play_state
    โœ…play_position
    โœ…beat_position
    โœ…ts_num
    โœ…ts_denom
    \n

    Data Structures and Encodings

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Local variableslet & const
    โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
    โ”Local address space 8m word restriction
    ๐Ÿ•’Global address space (gmem[])
    ๐Ÿ•’Named global address space
    โ”Global named variables (_global. prefix)
    ๐Ÿ•’Hex numbers
    ๐Ÿ•’ASCII chars
    ๐Ÿ•’Bitmasks
    โ”StringsAlready fully implemented?
    \n

    Control Structures

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…FunctionsUser definable functions are inlined in compiled code
    โœ…Conditionals
    โœ…Conditional Branching
    ๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
    ๐Ÿ•’while(actions..., condition)
    โœ…while(condition) (actions...)
    \n

    Operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…!value
    โœ…-value
    โœ…+value
    โœ…base ^ exponentMath.pow(base, exponent) or **
    โœ…numerator % denominator
    โœ…value / divisor
    โœ…value * another_value
    โœ…value - another_value
    โœ…value + another_value
    โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 === value2
    โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 !== value2
    โœ…value1 < value2
    โœ…value1 > value2
    โœ…value1 <= value2
    โœ…value1 >= value2
    โœ…y || z
    โœ…y && z
    โœ…y ? z
    โœ…y ? z : x
    โœ…y = z
    โœ…y *= z
    โœ…y /= divisor
    โœ…y %= divisor
    ๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
    โœ…y += z
    โœ…y -= z
    \n

    Bitwise operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’value << shift_amt
    ๐Ÿ•’value >> shift_amt
    ๐Ÿ•’a | b
    ๐Ÿ•’a & b
    ๐Ÿ•’a ~ b
    ๐Ÿ•’y | = z
    ๐Ÿ•’y &= z
    ๐Ÿ•’y ~= z
    \n

    Math Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…sin(angle)
    โœ…cos(angle)
    โœ…tan(angle)
    โœ…asin(x)
    โœ…acos(x)
    โœ…atan(x)
    โœ…atan2(x, y)
    โœ…sqr(x)
    โœ…sqrt(x)
    โœ…pow(x, y)
    โœ…exp(x)
    โœ…log(x)
    โœ…log10(x)
    โœ…abs(x)
    โœ…min(x, y)
    โœ…max(x, y)
    โœ…sign(x)
    โœ…rand(x)
    โœ…floor(x)
    โœ…ceil(x)
    โœ…invsqrt(x)
    \n

    Time Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’time([v])
    ๐Ÿ•’time_precise([v])
    \n

    Midi Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’midisend(offset, msg1, msg2)
    ๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
    ๐Ÿ•’midisend(offset, msg1, msg2, msg3)
    ๐Ÿ•’midisend_buf(offset, buf, len)
    ๐Ÿ•’midisend_str(offset, string)
    ๐Ÿ•’midirecv(offset, msg1, msg23)
    ๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
    ๐Ÿ•’midirecv_buf(offset, buf, maxlen)
    ๐Ÿ•’midirecv_str(offset, string)
    ๐Ÿ•’midisyx(offset, msgptr, len)
    \n

    Memory/FFT/MDCT Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’mdct(start_index, size)
    ๐Ÿ•’imdct(start_index, size)
    โœ…fft(start_index, size)
    โœ…ifft(start_index, size)
    ๐Ÿ•’fft_real(start_index, size)
    ๐Ÿ•’ifft_real(start_index, size)
    ๐Ÿ•’fft_permute(index, size)
    ๐Ÿ•’fft_ipermute(index, size)
    โœ…convolve_c(dest, src, size)
    ๐Ÿ•’freembuf(top)
    ๐Ÿ•’memcpy(dest, source, length)
    โœ…memset(dest, value, length)
    ๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
    ๐Ÿ•’mem_insert_shuffle(buf, len, value)
    ๐Ÿ•’__memtop()
    ๐Ÿ•’stack_push(value)
    ๐Ÿ•’stack_pop(value)
    ๐Ÿ•’stack_peek(index)
    ๐Ÿ•’stack_exch(value)
    ๐Ÿ•’atomic_setifequal(dest, value, newvalue)
    ๐Ÿ•’atomic_exch(val1, val2)
    ๐Ÿ•’atomic_add(dest_val1, val2)
    ๐Ÿ•’atomic_set(dest_val1, val2)
    ๐Ÿ•’atomic_get(val)
    \n

    Host Interaction Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’sliderchange(mask | sliderX)
    ๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
    ๐Ÿ•’slider_show(mask or sliderX[, value])
    ๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
    ๐Ÿ•’get_host_numchan()
    ๐Ÿ•’set_host_numchan(numchan)
    ๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
    ๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
    ๐Ÿ•’get_pinmapper_flags(no parameters)
    ๐Ÿ•’set_pinmapper_flags(flags)
    ๐Ÿ•’get_host_placement([chain_pos, flags])
    \n

    String Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’strlen(str)
    ๐Ÿ•’strcpy(str, srcstr)
    ๐Ÿ•’strcat(str, srcstr)
    ๐Ÿ•’strcmp(str, str2)
    ๐Ÿ•’stricmp(str, str2)
    ๐Ÿ•’strncmp(str, str2, maxlen)
    ๐Ÿ•’strnicmp(str, str2, maxlen)
    ๐Ÿ•’strncpy(str, srcstr, maxlen)
    ๐Ÿ•’strncat(str, srcstr, maxlen)
    ๐Ÿ•’strcpy_from(str, srcstr, offset)
    ๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
    ๐Ÿ•’str_getchar(str, offset[, type])
    ๐Ÿ•’str_setchar(str, offset, value[, type])
    ๐Ÿ•’strcpy_fromslider(str, slider)
    ๐Ÿ•’sprintf(str, format, ...)
    ๐Ÿ•’match(needle, haystack, ...)
    ๐Ÿ•’matchi(needle, haystack, ...)
    \n

    GFX Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
    ๐Ÿ•’gfx_lineto(x, y, aa)
    ๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
    ๐Ÿ•’gfx_rectto(x, y)
    ๐Ÿ•’gfx_rect(x, y, w, h)
    ๐Ÿ•’gfx_setpixel(r, g, b)
    ๐Ÿ•’gfx_getpixel(r, g, b)
    ๐Ÿ•’gfx_drawnumber(n, ndigits)
    ๐Ÿ•’gfx_drawchar($'c')
    ๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
    ๐Ÿ•’gfx_measurestr(str, w, h)
    ๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
    ๐Ÿ•’gfx_getfont()
    ๐Ÿ•’gfx_printf(str, ...)
    ๐Ÿ•’gfx_blurto(x,y)
    ๐Ÿ•’gfx_blit(source, scale, rotation)
    ๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
    ๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
    ๐Ÿ•’gfx_getimgdim(image, w, h)
    ๐Ÿ•’gfx_setimgdim(image, w,h)
    ๐Ÿ•’gfx_loadimg(image, filename)
    ๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
    ๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
    ๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
    ๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
    ๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
    ๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
    ๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
    ๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
    ๐Ÿ•’gfx_getchar([char, unicodechar])
    ๐Ÿ•’gfx_showmenu("str")
    ๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
    \n

    GFX Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
    ๐Ÿ•’gfx_w, gfx_h
    ๐Ÿ•’gfx_x, gfx_y
    ๐Ÿ•’gfx_mode
    ๐Ÿ•’gfx_clear
    ๐Ÿ•’gfx_dest
    ๐Ÿ•’gfx_texth
    ๐Ÿ•’gfx_ext_retina
    ๐Ÿ•’gfx_ext_flags
    ๐Ÿ•’mouse_x, mouse_y
    ๐Ÿ•’mouse_cap
    ๐Ÿ•’mouse_wheel, mouse_hwheel
    \n

    Special Vars and Extended Functionality

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’trigger
    ๐Ÿ•’ext_noinit
    ๐Ÿ•’ext_nodenorm
    โœ…ext_tail_size
    ๐Ÿ•’reg00-reg99
    ๐Ÿ•’_global.*
    \n

    Delay Compensation Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’pdc_delay
    ๐Ÿ•’pdc_bot_ch
    ๐Ÿ•’pdc_top_ch
    ๐Ÿ•’pdc_midi
    \n", "getting-started": "

    Getting Started: Your First JS2EEL Plugin

    \n

    Let's create our first JS2EEL plugin. We'll write it in JavaScript. JS2EEL will compile it into a REAPER JSFX plugin that you can use instantly.

    \n

    Our plugin will take an input audio signal and modify its volume. If you'd like to see the finished plugin, feel free to load the example plugin volume.js.

    \n

    Step 1: Create a New File

    \n

    Click on the "New File" button in the upper left half of the window.

    \n

    A modal will appear where you have to enter a filename for the JavaScript code and a description that will be used to reference the JSFX plugin in REAPER. Let's start with the same value for both: volume.

    \n

    As you create the new file, the JS code tab will be pre-populated with a minimal template. There will be a call to the config() function, where the name and the channel configuration of the plugin is defined:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    Take a look at the resulting JSFX code on the right. If you're familiar with JSFX, you'll meet some old friends here: desc: and the in_pin and out_pin configuration for your plugin's channel routing.

    \n

    Additionally, a template for the onSample() function call is provided. This is a JS2EEL library function that iterates through every sample of the audio block and allows you to modify it. This corresponds to the @sample part in JSFX.

    \n

    Step 2: Declare Volume Adjustment Holder Variables

    \n

    Next, we will create variables to hold the current volume level and the target volume level. Between config() and onSample(), add the following code:

    \n
    let volume = 0;\nlet target = 0;\n
    \n

    volume represents the volume in dB, and target represents the target volume in linear scale.

    \n

    Step 3: Create a Slider for User Input

    \n

    To allow the user to adjust the volume, we'll use a slider. We'll bind that slider to the volume variable created above. After the variable declarations, add the following code to your file:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    As you might know, slider numbering is important in EEL. It starts at 1, and so our slider takes 1 as the first argument.

    \n

    The second argument is the variable to bind to: volume.

    \n

    The third argument is the default value: 0.

    \n

    The fourth and fifth arguments are the minimum and maximum values: -150 and 18 dB, respectively.

    \n

    The sixth argument is the step size: 0.1.

    \n

    The last argument is the label for the slider which will be displayed in the GUI: Volume [dB].

    \n

    Step 4: Handle Slider Value Changes

    \n

    Now, we need to update the target variable whenever the user adjusts the slider. We'll use the onSlider() library function to handle slider value changes. This corresponds to EEL's @slider. After the slider definition via slider(), add the following code to your file:

    \n
    onSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n
    \n

    Here we assign a linear target level to the target variable, which will be used later to adjust our sample amplitude. If the slider is at its lower boundary, we set the target to 0 to mute the audio.

    \n

    Step 5: Process Audio Samples

    \n

    The final step is to process audio samples based on the calculated target volume. We'll use the onSample() function to perform audio processing. This corresponds to EEL's @sample. In the callback arrow function parameter of onSample(), add the following code:

    \n
    eachChannel((sample, _ch) => {\n    sample *= target;\n});\n
    \n

    eachChannel() is another JS2EEL library function that makes it easy to manipulate samples per channel. It can only be called in onSample. It has no equivalent in EEL. We just multiply every sample in each of the two channels by the target volume to adjust its amplitude respectively.

    \n

    Finished Plugin

    \n

    Here is the complete code:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n\nlet volume = 0;\nlet target = 0;\n\nslider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n\nonSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n\nonSample(() => {\n    eachChannel((sample, _ch) => {\n        sample *= target;\n    });\n});\n
    \n

    Conclusion

    \n

    That's it! You've successfully created a simple volume plugin using JS2EEL. If you're using the web app version of JS2EEL, copy the JSFX code into a new JSFX in REAPER to hear it in action. If you're using the desktop app and have configured the output path correctly, your volume JSFX should appear in the JS subdirectory of the FX selector.

    \n

    Feel free to take a look at the other examples. You'll be inspired to write your own JS2EEL plugin in no time!

    \n", "limitations": "

    Limitations

    \n
      \n
    • Right now still not very expressive
    • \n
    \n

    Accessing Arrays

    \n
      \n
    • Iteration only possible with variable known at compile time
        \n
      • Alternative: loops (TBI), but slower
      • \n
      \n
    • \n
    \n

    TODO

    \n", "shortcuts": "

    Keyboard Shortcuts

    \n

    Editor

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Linux & WindowsMacDescription
    Ctrl + SCmd + SSave
    Ctrl + ICmd + IAutoformat
    Ctrl + /Cmd + /Toggle line comment(s)
    Alt + Up/DownAlt + Up/DownMove line(s) up/down
    Ctrl + DCmd + DSelect next symbol occurence
    Ctrl + FCmd + FOpen search panel
    \n", From e10e46a790615d89053e7a85aefc8ad75c3bafb1 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 18:15:21 +0200 Subject: [PATCH 35/42] Exclude files from desktop build --- compiler/package.json | 3 ++- desktop/package-lock.json | 2 +- gui/package-lock.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/compiler/package.json b/compiler/package.json index 27bdc68..5baab8c 100644 --- a/compiler/package.json +++ b/compiler/package.json @@ -20,7 +20,8 @@ "dev": "npm run parseTypeDocs && concurrently -n esm,cjs -c yellow,green \"npm run watch:esm\" \"npm run watch:cjs\"", "dist:esm": "tsc -p tsconfig.esm.json", "dist:cjs": "tsc -p tsconfig.cjs.json", - "dist": "npm run parseTypeDocs && rm -rf ./dist/* && npm run dist:esm && npm run dist:cjs && node ./scripts/setVersionConstant.mjs", + "removeTempFiles": "rm -r debug_tsoutput.json && rm -r coverage", + "dist": "npm run parseTypeDocs && npm run removeTempFiles && rm -rf ./dist/* && npm run dist:esm && npm run dist:cjs && node ./scripts/setVersionConstant.mjs", "test": "npm run dist:cjs && c8 mocha './dist/cjs/**/*.spec.js' --reporter-option maxDiffSize=0", "test:single": "mocha './dist/esm/**/*.spec.js' --reporter-option maxDiffSize=0 --grep", "check": "eslint ./src && tsc --noEmit", diff --git a/desktop/package-lock.json b/desktop/package-lock.json index c1aa965..b7cebaa 100644 --- a/desktop/package-lock.json +++ b/desktop/package-lock.json @@ -30,7 +30,7 @@ }, "../compiler": { "name": "@js2eel/compiler", - "version": "0.10.0", + "version": "0.11.0", "license": "GPL-3.0", "dependencies": { "acorn": "8.12.1", diff --git a/gui/package-lock.json b/gui/package-lock.json index b9f2515..ad2c9d1 100644 --- a/gui/package-lock.json +++ b/gui/package-lock.json @@ -42,7 +42,7 @@ }, "../compiler": { "name": "@js2eel/compiler", - "version": "0.10.0", + "version": "0.11.0", "license": "GPL-3.0", "dependencies": { "acorn": "8.12.1", From 556f606d25933c6342f6907089a5babe372e9c33 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 18:20:41 +0200 Subject: [PATCH 36/42] Remove superfluous break statement --- .../callExpression/eelLib/eelLibraryFunctionCall.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts index 9a68c36..838bff8 100644 --- a/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts +++ b/compiler/src/js2eel/generatorNodes/callExpression/eelLib/eelLibraryFunctionCall.ts @@ -162,8 +162,6 @@ export const eelLibraryFunctionCall = ( evaluationErrors = errors; break; - - break; } // File functions case 'file_open': { From 7b42ba311407472e7fbf71eff7fab56fc4b523a7 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 18:29:46 +0200 Subject: [PATCH 37/42] Docs fixes --- compiler/js2eel.d.ts | 1 + compiler/src/popupDocs.ts | 2 +- docs/api-documentation.md | 1 + gui/scripts/createDocs.js | 4 ++++ gui/src/docs/rendered-docs.json | 2 +- 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/compiler/js2eel.d.ts b/compiler/js2eel.d.ts index 3cd6bbd..8c87ca1 100644 --- a/compiler/js2eel.d.ts +++ b/compiler/js2eel.d.ts @@ -144,6 +144,7 @@ declare class EelBuffer { dimensions(): number; size(): number; start(): number; + swap(otherBuffer: EelBuffer): void; } /** diff --git a/compiler/src/popupDocs.ts b/compiler/src/popupDocs.ts index c7c756f..a0f9610 100644 --- a/compiler/src/popupDocs.ts +++ b/compiler/src/popupDocs.ts @@ -95,7 +95,7 @@ EelBuffer: { "type": "class", "text": "A fixed-size, multi-dimensional container for audio samples.\n\nAccess: `buf[dimension][position]`\n\nTranslates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.", "example": null, - "signature": "EelBuffer {\n constructor(dimensions: number, size: number);\n\n dimensions(): number;\n size(): number;\n start(): number;\n}", + "signature": "EelBuffer {\n constructor(dimensions: number, size: number);\n\n dimensions(): number;\n size(): number;\n start(): number;\n swap(otherBuffer: EelBuffer): void;\n}", "autoCompleteTemplate": "EelBuffer(${dimensions}, ${size});" }, EelArray: { diff --git a/docs/api-documentation.md b/docs/api-documentation.md index debd09b..c509750 100644 --- a/docs/api-documentation.md +++ b/docs/api-documentation.md @@ -181,6 +181,7 @@ EelBuffer { dimensions(): number; size(): number; start(): number; + swap(otherBuffer: EelBuffer): void; } ``` ### EelArray diff --git a/gui/scripts/createDocs.js b/gui/scripts/createDocs.js index e931a0f..03aa3ac 100644 --- a/gui/scripts/createDocs.js +++ b/gui/scripts/createDocs.js @@ -21,6 +21,10 @@ const marked = new Marked( const renderer = new marked.Renderer(); renderer.link = (link) => { + if (link.href.startsWith('#')) { + return `${link.text}`; + } + return `${link.text}`; }; diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index d6d510b..205793e 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,5 +1,5 @@ { - "api-documentation": "

    API Documentation

    \n\n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels,\n    extTailSize\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n    extTailSize?: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): number;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n", + "api-documentation": "

    API Documentation

    \n\n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels,\n    extTailSize\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n    extTailSize?: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n    swap(otherBuffer: EelBuffer): void;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): number;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n", "changelog": "

    Changelog

    \n
      \n
    • v0.11.0:
        \n
      • Allow configuration of ext_tail_size (config.extTailSize)
      • \n
      • File selector slider
      • \n
      • @block section (onBlock)
      • \n
      • while loops
      • \n
      • Start location getter for EelBuffer: EelBuffer.start()
      • \n
      • New memory function: memset()
      • \n
      • New file functions: file_open(), file_close(), file_avail(), file_riff(), file_mem()
      • \n
      • FFT functions: fft(), ifft(), convolve_c()
      • \n
      • Cab sim demo (very early stage)
      • \n
      \n
    • \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      • \n
      \n
    • \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • \n
      • Allow function declaration in block statement
      • \n
      • Allow member expression returns
      • \n
      \n
    • \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • \n
      • More documentation
      • \n
      \n
    • \n
    • v0.3.0: Initial release
    • \n
    \n", "development": "

    Development

    \n

    Requirements

    \n
      \n
    • Node.js 18 and higher
    • \n
    • Terminal emulator
        \n
      • Linux, MacOS: bash or zsh
      • \n
      • Windows: git bash (comes with git)
      • \n
      \n
    • \n
    • Reaper DAW, obviously
    • \n
    \n

    Setup

    \n
      \n
    • Install dependencies for all packages:
        \n
      • cd scripts
      • \n
      • ./install.sh
      • \n
      \n
    • \n
    • Open a different terminal session for each of the following steps
        \n
      • Go to compiler and do npm run dev
      • \n
      • Go to gui and do npm run dev
      • \n
      • Go to desktop and do npm run dev. Now, the electron build should open.
      • \n
      \n
    • \n
    \n

    Guidelines

    \n
      \n
    • We aim for 100% test coverage for the compiler package
    • \n
    \n

    Architecture

    \n

    TODO

    \n

    Recommended VSCode Extensions

    \n

    TODO

    \n", "feature-comparison": "

    Feature Comparison with JSFX

    \n

    JSFX Reference: https://www.reaper.fm/sdk/js/js.php

    \n

    Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

    \n

    โœ…: Implemented

    \n

    ๐Ÿ•’: Should be implemented

    \n

    โŒ: Won't be implemented

    \n

    โ”: Unknown if feasible, useful, or working properly

    \n

    Description Lines and Utility Features

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…descImplemented as part of config()
    ๐Ÿ•’tags
    ๐Ÿ•’options
    ๐Ÿ•’JSFX comments
    \n

    Code Sections

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…@initonInit()
    โœ…@slideronSlider()
    โœ…@block
    โœ…@sampleonSample()
    ๐Ÿ•’@serialize
    ๐Ÿ•’@gfxDeclarative with React-like syntax?
    \n

    File Handling

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’import
    ๐Ÿ•’filename
    โœ…file_open(index | slider)Slider variant implemented
    โœ…file_close(handle)
    ๐Ÿ•’file_rewind(handle)
    ๐Ÿ•’file_var(handle, variable)
    โœ…file_mem(handle, offset, length)
    โœ…file_avail(handle)
    โœ…file_riff(handle, nch, samplerate)
    ๐Ÿ•’file_text(handle, istext)
    ๐Ÿ•’file_string(handle,str)
    \n

    Routing and Input

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…in_pin, out_pinImplemented as part of config()
    \n

    UI

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Slider: Normalslider()
    โœ…Slider: SelectselectBox()
    โœ…Slider: File
    ๐Ÿ•’Hidden sliders
    ๐Ÿ•’Slider: shapes
    โŒslider(index)Might not be necessary as every slider is bound to a variable
    ๐Ÿ•’slider_next_chg(sliderindex,nextval)
    \n

    Sample Access

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…spl0 - spl63
    โœ…spl(index)
    \n

    Audio and Transport State Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…srate
    โœ…num_ch
    โœ…samplesblock
    โœ…tempo
    โœ…play_state
    โœ…play_position
    โœ…beat_position
    โœ…ts_num
    โœ…ts_denom
    \n

    Data Structures and Encodings

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Local variableslet & const
    โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
    โ”Local address space 8m word restriction
    ๐Ÿ•’Global address space (gmem[])
    ๐Ÿ•’Named global address space
    โ”Global named variables (_global. prefix)
    ๐Ÿ•’Hex numbers
    ๐Ÿ•’ASCII chars
    ๐Ÿ•’Bitmasks
    โ”StringsAlready fully implemented?
    \n

    Control Structures

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…FunctionsUser definable functions are inlined in compiled code
    โœ…Conditionals
    โœ…Conditional Branching
    ๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
    ๐Ÿ•’while(actions..., condition)
    โœ…while(condition) (actions...)
    \n

    Operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…!value
    โœ…-value
    โœ…+value
    โœ…base ^ exponentMath.pow(base, exponent) or **
    โœ…numerator % denominator
    โœ…value / divisor
    โœ…value * another_value
    โœ…value - another_value
    โœ…value + another_value
    โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 === value2
    โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 !== value2
    โœ…value1 < value2
    โœ…value1 > value2
    โœ…value1 <= value2
    โœ…value1 >= value2
    โœ…y || z
    โœ…y && z
    โœ…y ? z
    โœ…y ? z : x
    โœ…y = z
    โœ…y *= z
    โœ…y /= divisor
    โœ…y %= divisor
    ๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
    โœ…y += z
    โœ…y -= z
    \n

    Bitwise operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’value << shift_amt
    ๐Ÿ•’value >> shift_amt
    ๐Ÿ•’a | b
    ๐Ÿ•’a & b
    ๐Ÿ•’a ~ b
    ๐Ÿ•’y | = z
    ๐Ÿ•’y &= z
    ๐Ÿ•’y ~= z
    \n

    Math Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…sin(angle)
    โœ…cos(angle)
    โœ…tan(angle)
    โœ…asin(x)
    โœ…acos(x)
    โœ…atan(x)
    โœ…atan2(x, y)
    โœ…sqr(x)
    โœ…sqrt(x)
    โœ…pow(x, y)
    โœ…exp(x)
    โœ…log(x)
    โœ…log10(x)
    โœ…abs(x)
    โœ…min(x, y)
    โœ…max(x, y)
    โœ…sign(x)
    โœ…rand(x)
    โœ…floor(x)
    โœ…ceil(x)
    โœ…invsqrt(x)
    \n

    Time Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’time([v])
    ๐Ÿ•’time_precise([v])
    \n

    Midi Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’midisend(offset, msg1, msg2)
    ๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
    ๐Ÿ•’midisend(offset, msg1, msg2, msg3)
    ๐Ÿ•’midisend_buf(offset, buf, len)
    ๐Ÿ•’midisend_str(offset, string)
    ๐Ÿ•’midirecv(offset, msg1, msg23)
    ๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
    ๐Ÿ•’midirecv_buf(offset, buf, maxlen)
    ๐Ÿ•’midirecv_str(offset, string)
    ๐Ÿ•’midisyx(offset, msgptr, len)
    \n

    Memory/FFT/MDCT Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’mdct(start_index, size)
    ๐Ÿ•’imdct(start_index, size)
    โœ…fft(start_index, size)
    โœ…ifft(start_index, size)
    ๐Ÿ•’fft_real(start_index, size)
    ๐Ÿ•’ifft_real(start_index, size)
    ๐Ÿ•’fft_permute(index, size)
    ๐Ÿ•’fft_ipermute(index, size)
    โœ…convolve_c(dest, src, size)
    ๐Ÿ•’freembuf(top)
    ๐Ÿ•’memcpy(dest, source, length)
    โœ…memset(dest, value, length)
    ๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
    ๐Ÿ•’mem_insert_shuffle(buf, len, value)
    ๐Ÿ•’__memtop()
    ๐Ÿ•’stack_push(value)
    ๐Ÿ•’stack_pop(value)
    ๐Ÿ•’stack_peek(index)
    ๐Ÿ•’stack_exch(value)
    ๐Ÿ•’atomic_setifequal(dest, value, newvalue)
    ๐Ÿ•’atomic_exch(val1, val2)
    ๐Ÿ•’atomic_add(dest_val1, val2)
    ๐Ÿ•’atomic_set(dest_val1, val2)
    ๐Ÿ•’atomic_get(val)
    \n

    Host Interaction Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’sliderchange(mask | sliderX)
    ๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
    ๐Ÿ•’slider_show(mask or sliderX[, value])
    ๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
    ๐Ÿ•’get_host_numchan()
    ๐Ÿ•’set_host_numchan(numchan)
    ๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
    ๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
    ๐Ÿ•’get_pinmapper_flags(no parameters)
    ๐Ÿ•’set_pinmapper_flags(flags)
    ๐Ÿ•’get_host_placement([chain_pos, flags])
    \n

    String Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’strlen(str)
    ๐Ÿ•’strcpy(str, srcstr)
    ๐Ÿ•’strcat(str, srcstr)
    ๐Ÿ•’strcmp(str, str2)
    ๐Ÿ•’stricmp(str, str2)
    ๐Ÿ•’strncmp(str, str2, maxlen)
    ๐Ÿ•’strnicmp(str, str2, maxlen)
    ๐Ÿ•’strncpy(str, srcstr, maxlen)
    ๐Ÿ•’strncat(str, srcstr, maxlen)
    ๐Ÿ•’strcpy_from(str, srcstr, offset)
    ๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
    ๐Ÿ•’str_getchar(str, offset[, type])
    ๐Ÿ•’str_setchar(str, offset, value[, type])
    ๐Ÿ•’strcpy_fromslider(str, slider)
    ๐Ÿ•’sprintf(str, format, ...)
    ๐Ÿ•’match(needle, haystack, ...)
    ๐Ÿ•’matchi(needle, haystack, ...)
    \n

    GFX Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
    ๐Ÿ•’gfx_lineto(x, y, aa)
    ๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
    ๐Ÿ•’gfx_rectto(x, y)
    ๐Ÿ•’gfx_rect(x, y, w, h)
    ๐Ÿ•’gfx_setpixel(r, g, b)
    ๐Ÿ•’gfx_getpixel(r, g, b)
    ๐Ÿ•’gfx_drawnumber(n, ndigits)
    ๐Ÿ•’gfx_drawchar($'c')
    ๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
    ๐Ÿ•’gfx_measurestr(str, w, h)
    ๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
    ๐Ÿ•’gfx_getfont()
    ๐Ÿ•’gfx_printf(str, ...)
    ๐Ÿ•’gfx_blurto(x,y)
    ๐Ÿ•’gfx_blit(source, scale, rotation)
    ๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
    ๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
    ๐Ÿ•’gfx_getimgdim(image, w, h)
    ๐Ÿ•’gfx_setimgdim(image, w,h)
    ๐Ÿ•’gfx_loadimg(image, filename)
    ๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
    ๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
    ๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
    ๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
    ๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
    ๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
    ๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
    ๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
    ๐Ÿ•’gfx_getchar([char, unicodechar])
    ๐Ÿ•’gfx_showmenu("str")
    ๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
    \n

    GFX Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
    ๐Ÿ•’gfx_w, gfx_h
    ๐Ÿ•’gfx_x, gfx_y
    ๐Ÿ•’gfx_mode
    ๐Ÿ•’gfx_clear
    ๐Ÿ•’gfx_dest
    ๐Ÿ•’gfx_texth
    ๐Ÿ•’gfx_ext_retina
    ๐Ÿ•’gfx_ext_flags
    ๐Ÿ•’mouse_x, mouse_y
    ๐Ÿ•’mouse_cap
    ๐Ÿ•’mouse_wheel, mouse_hwheel
    \n

    Special Vars and Extended Functionality

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’trigger
    ๐Ÿ•’ext_noinit
    ๐Ÿ•’ext_nodenorm
    โœ…ext_tail_size
    ๐Ÿ•’reg00-reg99
    ๐Ÿ•’_global.*
    \n

    Delay Compensation Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’pdc_delay
    ๐Ÿ•’pdc_bot_ch
    ๐Ÿ•’pdc_top_ch
    ๐Ÿ•’pdc_midi
    \n", From 4201037b6e02bb7746891dd9200898987d79701a Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 18:30:25 +0200 Subject: [PATCH 38/42] Changelog --- docs/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.md b/docs/changelog.md index 7ef4ba4..0427e5d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -6,6 +6,7 @@ - @block section (`onBlock`) - `while` loops - Start location getter for `EelBuffer`: `EelBuffer.start()` + - Swap function for `EelBuffer`: `EelBuffer.swap(otherEelBuffer)` - New memory function: `memset()` - New file functions: `file_open()`, `file_close()`, `file_avail()`, `file_riff()`, `file_mem()` - FFT functions: `fft()`, `ifft()`, `convolve_c()` From 522cc3f94873ae23b969d7ca3157fd29ab1ef6b3 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 18:32:36 +0200 Subject: [PATCH 39/42] Make CI not fail on file removal --- compiler/package.json | 2 +- gui/src/docs/rendered-docs.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/package.json b/compiler/package.json index 5baab8c..3d3424c 100644 --- a/compiler/package.json +++ b/compiler/package.json @@ -20,7 +20,7 @@ "dev": "npm run parseTypeDocs && concurrently -n esm,cjs -c yellow,green \"npm run watch:esm\" \"npm run watch:cjs\"", "dist:esm": "tsc -p tsconfig.esm.json", "dist:cjs": "tsc -p tsconfig.cjs.json", - "removeTempFiles": "rm -r debug_tsoutput.json && rm -r coverage", + "removeTempFiles": "rm -rf debug_tsoutput.json && rm -rf coverage", "dist": "npm run parseTypeDocs && npm run removeTempFiles && rm -rf ./dist/* && npm run dist:esm && npm run dist:cjs && node ./scripts/setVersionConstant.mjs", "test": "npm run dist:cjs && c8 mocha './dist/cjs/**/*.spec.js' --reporter-option maxDiffSize=0", "test:single": "mocha './dist/esm/**/*.spec.js' --reporter-option maxDiffSize=0 --grep", diff --git a/gui/src/docs/rendered-docs.json b/gui/src/docs/rendered-docs.json index 205793e..37fa0f0 100644 --- a/gui/src/docs/rendered-docs.json +++ b/gui/src/docs/rendered-docs.json @@ -1,6 +1,6 @@ { "api-documentation": "

    API Documentation

    \n\n

    Configuration

    \n

    config()

    \n

    Configures the plugin.

    \n
    config({\n    description,\n    inChannels,\n    outChannels,\n    extTailSize\n}: {\n    description: number;\n    inChannels: number;\n    outChannels: number;\n    extTailSize?: number;\n}): void;\n
    \n

    Example:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    slider()

    \n

    Registers a slider and its bound variable to be displayed in the plugin.

    \n
    slider(\n    sliderNumber: number,\n    variable: number,\n    initialValue: number,\n    min: number,\n    max: number,\n    step: number,\n    label: string\n): void;\n
    \n

    Example:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    selectBox()

    \n

    Registers a select box and its bound variable to be displayed in the plugin.

    \n
    selectBox(\n    sliderNumber: number,\n    variable: string,\n    initialValue: string,\n    values: { name: string; label: string }[],\n    label: string\n): void;\n
    \n

    Example:

    \n
    selectBox(\n    3,\n    algorithm,\n    'sigmoid',\n    [\n        { name: 'sigmoid', label: 'Sigmoid' },\n        { name: 'htan', label: 'Hyperbolic Tangent' },\n        { name: 'hclip', label: 'Hard Clip' }\n    ],\n    'Algorithm'\n);\n
    \n

    fileSelector()

    \n

    Registers a file selector to be displayed in the plugin.

    \n

    The path is relative to /data.

    \n
    fileSelector(\n    sliderNumber: number,\n    variable: string,\n    path: string,\n    defaultValue: string,\n    label: string\n): void;\n
    \n

    Example:

    \n
    fileSelector(\n    5,\n    ampModel,\n    'amp_models',\n    'none',\n    'Impulse Response'\n);\n
    \n

    Debugging

    \n

    console

    \n

    JS2EEL only supports the .log() method.\nconsole.log() creates a debug variable to print the value of a variable in the JSFX dev environment.

    \n
    console: {\n    log: (someVar: number | string) => void;\n};\n
    \n

    Example:

    \n
    let myVal = 3;\nconsole.log(myVal);\n
    \n

    JSFX Computation Stages

    \n

    These functions correspond to JSFX's @sample etc.

    \n

    onInit()

    \n

    Init variables and functions here.

    \n
    onInit(callback: () => void): void;\n
    \n

    onSlider()

    \n

    What happens when a slider is moved.

    \n
    onSlider(callback: () => void): void;\n
    \n

    onBlock()

    \n

    Called for every audio block.

    \n
    onBlock(callback: () => void): void;\n
    \n

    onSample()

    \n

    Called for every single sample.

    \n
    onSample(callback: () => void): void;\n
    \n

    eachChannel()

    \n

    Iterates over each channel and provides the current sample for manipulation.

    \n
    eachChannel(callback: (sample: number, channel: number) => void): void;\n
    \n

    Data Structures

    \n

    EelBuffer

    \n

    A fixed-size, multi-dimensional container for audio samples.

    \n

    Access: buf[dimension][position]

    \n

    Translates to EEL2s memory objects. Is not inlined in the EEL source, so\nonly feasible for large data. For small data, use EelArray.

    \n
    EelBuffer {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n    start(): number;\n    swap(otherBuffer: EelBuffer): void;\n}\n
    \n

    EelArray

    \n

    A fixed-size, multi-dimensional container for numeric data.

    \n

    Access: arr[dimension][position]

    \n

    Is inlined in the EEL source, dimensions and size are restricted to 16 each. For large data,\nuse EelBuffer.

    \n
    EelArray {\n    constructor(dimensions: number, size: number);\n\n    dimensions(): number;\n    size(): number;\n}\n
    \n

    Audio Constants

    \n

    srate

    \n

    The sample rate of your project

    \n
    srate: number;\n
    \n

    num_ch

    \n

    Number of channels available

    \n
    num_ch: number;\n
    \n

    samplesblock

    \n

    How many samples will come before the next onBlock() call

    \n
    samplesblock: number;\n
    \n

    tempo

    \n

    The tempo of your project

    \n
    tempo: number;\n
    \n

    play_state

    \n

    The current playback state of REAPER (0=stopped, <0=error, 1=playing, 2=paused, 5=recording, 6=record paused)

    \n
    play_state: number;\n
    \n

    play_position

    \n

    The current playback position in REAPER (as of last @block), in seconds

    \n
    play_position: number;\n
    \n

    beat_position

    \n

    Read-only. The current playback position (as of last @block) in REAPER, in beats (beats = quarternotes in /4 time signatures).

    \n
    beat_position: number;\n
    \n

    ts_num

    \n

    Read-only. The current time signature numerator, i.e. 3.0 if using 3/4 time.

    \n
    ts_num: number;\n
    \n

    ts_denom

    \n

    Read-only. The current time signature denominator, i.e. 4.0 if using 3/4 time.

    \n
    ts_denom: number;\n
    \n

    spl<1-64>

    \n

    Channel 1 (L) sample variable

    \n
    spl0: number;\n
    \n

    Math Constants

    \n

    $pi

    \n

    Pi

    \n
    $pi: number;\n
    \n

    Math Functions

    \n

    These functions correspond exactly to their equivalents in JSFX/EEL2.

    \n

    sin()

    \n

    Returns the Sine of the angle specified (specified in radians).

    \n
    sin(angle: number): number;\n
    \n

    cos()

    \n

    Returns the Cosine of the angle specified (specified in radians).

    \n
    cos(angle: number): number;\n
    \n

    tan()

    \n

    Returns the Tangent of the angle specified (specified in radians).

    \n
    tan(angle: number): number;\n
    \n

    asin()

    \n

    Returns the Arc Sine of the value specified (return value is in radians).

    \n
    asin(x: number): number;\n
    \n

    acos()

    \n

    Returns the Arc Cosine of the value specified (return value is in radians).

    \n
    acos(x: number): number;\n
    \n

    atan()

    \n

    Returns the Arc Tangent of the value specified (return value is in radians).

    \n
    atan(x: number): number;\n
    \n

    atan2()

    \n

    Returns the Arc Tangent of x divided by y (return value is in radians).

    \n
    atan2(x: number, y: number): number;\n
    \n

    sqr()

    \n

    Returns the square of the parameter (similar to x*x, though only evaluating x once).

    \n
    sqr(x: number): number;\n
    \n

    sqrt()

    \n

    Returns the square root of the parameter.

    \n
    sqrt(x: number): number;\n
    \n

    pow()

    \n

    Returns the first parameter raised to the second parameter-th power.\nIdentical in behavior and performance to the ^ operator.

    \n
    pow(x: number, y: number): number;\n
    \n

    exp()

    \n

    Returns the number e (approx 2.718) raised to the parameter-th power.\nThis function is significantly faster than pow() or the ^ operator.

    \n
    exp(x: number): number;\n
    \n

    log()

    \n

    Returns the natural logarithm (base e) of the parameter.

    \n
    log(x: number): number;\n
    \n

    log10()

    \n

    Returns the logarithm (base 10) of the parameter.

    \n
    log10(x: number): number;\n
    \n

    abs()

    \n

    Returns the absolute value of the parameter.

    \n
    abs(x: number): number;\n
    \n

    min()

    \n

    Returns the minimum value of the two parameters.

    \n
    min(x: number, y: number): number;\n
    \n

    max()

    \n

    Returns the maximum value of the two parameters.

    \n
    max(x: number, y: number): number;\n
    \n

    sign()

    \n

    Returns the sign of the parameter (-1, 0, or 1).

    \n
    sign(x: number): number;\n
    \n

    rand()

    \n

    Returns a pseudo-random number between 0 and the parameter.

    \n
    rand(x: number): number;\n
    \n

    floor()

    \n

    Rounds the value to the lowest integer possible (floor(3.9)==3, floor(-3.1)==-4).

    \n
    floor(x: number): number;\n
    \n

    ceil()

    \n

    Rounds the value to the highest integer possible (ceil(3.1)==4, ceil(-3.9)==-3).

    \n
    ceil(x: number): number;\n
    \n

    invsqrt()

    \n

    Returns a fast inverse square root (1/sqrt(x)) approximation of the parameter.

    \n
    invsqrt(x: number): number;\n
    \n

    Memory Functions

    \n

    memset()

    \n
    memset(): void;\n
    \n

    File Functions

    \n

    file_open()

    \n

    Opens a file from a file slider. Once open, you may use all of the file functions available. Be sure to close the file handle when done with it, using file_close(). The search path for finding files depends on the method used, but generally speaking in 4.59+ it will look in the same path as the current effect, then in the JS Data/ directory.

    \n

    @param fileSelector A variable that is bound to the respective file selector. Will be compiled to sliderXY. FIXME types

    \n
    file_open(fileSelector: any): number;\n
    \n

    file_close()

    \n

    Closes a file opened with file_open().

    \n
    file_close(fileHandle: any): void;\n
    \n

    file_avail()

    \n

    Returns the number of items remaining in the file, if it is in read mode. Returns < 0 if in write mode. If the file is in text mode (file_text(handle) returns TRUE), then the return value is simply 0 if EOF, 1 if not EOF.

    \n
    file_avail(fileSelector: any): number;\n
    \n

    file_riff()

    \n

    If the file was a media file (.wav, .ogg, etc), this will set the first parameter to the number of channels, and the second to the samplerate.

    \n

    REAPER 6.29+: if the caller sets nch to 'rqsr' and samplerate to a valid samplerate, the file will be resampled to the desired samplerate (this must ONLY be called before any file_var() or file_mem() calls and will change the value returned by file_avail())

    \n
    file_riff(fileHandle: any, numberOfCh: number, sampleRate: number): void;\n
    \n

    file_mem()

    \n

    Reads (or writes) the block of local memory from(to) the current file. Returns the actual number of items read (or written).

    \n
    file_mem(fileHandle: any, offset: number, length: number): number;\n
    \n

    FFT & MDCT Functions

    \n

    fft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    fft(startIndex: number, size: number): void;\n
    \n

    ifft()

    \n

    Performs a FFT (or inverse in the case of ifft()) on the data in the local memory buffer at the offset specified by the first parameter. The size of the FFT is specified by the second parameter, which must be 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, or 32768. The outputs are permuted, so if you plan to use them in-order, call fft_permute(buffer, size) before and fft_ipermute(buffer,size) after your in-order use. Your inputs or outputs will need to be scaled down by 1/size, if used.

    \n

    Note that the FFT/IFFT require real/imaginary input pairs (so a 256 point FFT actually works with 512 items).

    \n

    Note that the FFT/IFFT must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n

    The fft_real()/ifft_real() variants operate on a set of size real inputs, and produce size/2 complex outputs. The first output pair is DC,nyquist. Normally this is used with fft_permute(buffer,size/2).

    \n
    ifft(startIndex: number, size: number): void;\n
    \n

    convolve_c()

    \n

    Used to convolve two buffers, typically after FFTing them. convolve_c works with complex numbers. The sizes specify number of items (the number of complex number pairs).

    \n

    Note that the convolution must NOT cross a 65,536 item boundary, so be sure to specify the offset accordingly.

    \n
    convolve_c(destination: number, source: number, size: number): void;\n
    \n", - "changelog": "

    Changelog

    \n
      \n
    • v0.11.0:
        \n
      • Allow configuration of ext_tail_size (config.extTailSize)
      • \n
      • File selector slider
      • \n
      • @block section (onBlock)
      • \n
      • while loops
      • \n
      • Start location getter for EelBuffer: EelBuffer.start()
      • \n
      • New memory function: memset()
      • \n
      • New file functions: file_open(), file_close(), file_avail(), file_riff(), file_mem()
      • \n
      • FFT functions: fft(), ifft(), convolve_c()
      • \n
      • Cab sim demo (very early stage)
      • \n
      \n
    • \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      • \n
      \n
    • \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • \n
      • Allow function declaration in block statement
      • \n
      • Allow member expression returns
      • \n
      \n
    • \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • \n
      • More documentation
      • \n
      \n
    • \n
    • v0.3.0: Initial release
    • \n
    \n", + "changelog": "

    Changelog

    \n
      \n
    • v0.11.0:
        \n
      • Allow configuration of ext_tail_size (config.extTailSize)
      • \n
      • File selector slider
      • \n
      • @block section (onBlock)
      • \n
      • while loops
      • \n
      • Start location getter for EelBuffer: EelBuffer.start()
      • \n
      • Swap function for EelBuffer: EelBuffer.swap(otherEelBuffer)
      • \n
      • New memory function: memset()
      • \n
      • New file functions: file_open(), file_close(), file_avail(), file_riff(), file_mem()
      • \n
      • FFT functions: fft(), ifft(), convolve_c()
      • \n
      • Cab sim demo (very early stage)
      • \n
      \n
    • \n
    • v0.9.1:
        \n
      • New example: 4-Band RBJ EQ
      • \n
      \n
    • \n
    • v0.7.0:
        \n
      • Allow simple plain objects
      • \n
      • Allow function declaration in block statement
      • \n
      • Allow member expression returns
      • \n
      \n
    • \n
    • v0.5.0:
        \n
      • MacOS App is signed now ๐Ÿ–‹๏ธ
      • \n
      • More documentation
      • \n
      \n
    • \n
    • v0.3.0: Initial release
    • \n
    \n", "development": "

    Development

    \n

    Requirements

    \n
      \n
    • Node.js 18 and higher
    • \n
    • Terminal emulator
        \n
      • Linux, MacOS: bash or zsh
      • \n
      • Windows: git bash (comes with git)
      • \n
      \n
    • \n
    • Reaper DAW, obviously
    • \n
    \n

    Setup

    \n
      \n
    • Install dependencies for all packages:
        \n
      • cd scripts
      • \n
      • ./install.sh
      • \n
      \n
    • \n
    • Open a different terminal session for each of the following steps
        \n
      • Go to compiler and do npm run dev
      • \n
      • Go to gui and do npm run dev
      • \n
      • Go to desktop and do npm run dev. Now, the electron build should open.
      • \n
      \n
    • \n
    \n

    Guidelines

    \n
      \n
    • We aim for 100% test coverage for the compiler package
    • \n
    \n

    Architecture

    \n

    TODO

    \n

    Recommended VSCode Extensions

    \n

    TODO

    \n", "feature-comparison": "

    Feature Comparison with JSFX

    \n

    JSFX Reference: https://www.reaper.fm/sdk/js/js.php

    \n

    Find the JS2EEL type declarations here. The API Docs are created from that file, as well as the code completion.

    \n

    โœ…: Implemented

    \n

    ๐Ÿ•’: Should be implemented

    \n

    โŒ: Won't be implemented

    \n

    โ”: Unknown if feasible, useful, or working properly

    \n

    Description Lines and Utility Features

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…descImplemented as part of config()
    ๐Ÿ•’tags
    ๐Ÿ•’options
    ๐Ÿ•’JSFX comments
    \n

    Code Sections

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…@initonInit()
    โœ…@slideronSlider()
    โœ…@block
    โœ…@sampleonSample()
    ๐Ÿ•’@serialize
    ๐Ÿ•’@gfxDeclarative with React-like syntax?
    \n

    File Handling

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’import
    ๐Ÿ•’filename
    โœ…file_open(index | slider)Slider variant implemented
    โœ…file_close(handle)
    ๐Ÿ•’file_rewind(handle)
    ๐Ÿ•’file_var(handle, variable)
    โœ…file_mem(handle, offset, length)
    โœ…file_avail(handle)
    โœ…file_riff(handle, nch, samplerate)
    ๐Ÿ•’file_text(handle, istext)
    ๐Ÿ•’file_string(handle,str)
    \n

    Routing and Input

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…in_pin, out_pinImplemented as part of config()
    \n

    UI

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Slider: Normalslider()
    โœ…Slider: SelectselectBox()
    โœ…Slider: File
    ๐Ÿ•’Hidden sliders
    ๐Ÿ•’Slider: shapes
    โŒslider(index)Might not be necessary as every slider is bound to a variable
    ๐Ÿ•’slider_next_chg(sliderindex,nextval)
    \n

    Sample Access

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…spl0 - spl63
    โœ…spl(index)
    \n

    Audio and Transport State Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…srate
    โœ…num_ch
    โœ…samplesblock
    โœ…tempo
    โœ…play_state
    โœ…play_position
    โœ…beat_position
    โœ…ts_num
    โœ…ts_denom
    \n

    Data Structures and Encodings

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…Local variableslet & const
    โœ…Local address space (buffers)EelBuffer (equivalent to JSFX buffers) & EelArray (inlined)
    โ”Local address space 8m word restriction
    ๐Ÿ•’Global address space (gmem[])
    ๐Ÿ•’Named global address space
    โ”Global named variables (_global. prefix)
    ๐Ÿ•’Hex numbers
    ๐Ÿ•’ASCII chars
    ๐Ÿ•’Bitmasks
    โ”StringsAlready fully implemented?
    \n

    Control Structures

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…FunctionsUser definable functions are inlined in compiled code
    โœ…Conditionals
    โœ…Conditional Branching
    ๐Ÿ•’loop(counter, actions...)We should have generic loops even if sample- and channel related iterations should be handled by eachChannel()
    ๐Ÿ•’while(actions..., condition)
    โœ…while(condition) (actions...)
    \n

    Operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…!value
    โœ…-value
    โœ…+value
    โœ…base ^ exponentMath.pow(base, exponent) or **
    โœ…numerator % denominator
    โœ…value / divisor
    โœ…value * another_value
    โœ…value - another_value
    โœ…value + another_value
    โŒvalue1 == value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 === value2
    โŒvalue1 != value2Has a tolerance of 0.00001. We only allow ===
    โœ…value1 !== value2
    โœ…value1 < value2
    โœ…value1 > value2
    โœ…value1 <= value2
    โœ…value1 >= value2
    โœ…y || z
    โœ…y && z
    โœ…y ? z
    โœ…y ? z : x
    โœ…y = z
    โœ…y *= z
    โœ…y /= divisor
    โœ…y %= divisor
    ๐Ÿ•’base ^= exponentShould be implemented as JavaScript's **=
    โœ…y += z
    โœ…y -= z
    \n

    Bitwise operators

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’value << shift_amt
    ๐Ÿ•’value >> shift_amt
    ๐Ÿ•’a | b
    ๐Ÿ•’a & b
    ๐Ÿ•’a ~ b
    ๐Ÿ•’y | = z
    ๐Ÿ•’y &= z
    ๐Ÿ•’y ~= z
    \n

    Math Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    โœ…sin(angle)
    โœ…cos(angle)
    โœ…tan(angle)
    โœ…asin(x)
    โœ…acos(x)
    โœ…atan(x)
    โœ…atan2(x, y)
    โœ…sqr(x)
    โœ…sqrt(x)
    โœ…pow(x, y)
    โœ…exp(x)
    โœ…log(x)
    โœ…log10(x)
    โœ…abs(x)
    โœ…min(x, y)
    โœ…max(x, y)
    โœ…sign(x)
    โœ…rand(x)
    โœ…floor(x)
    โœ…ceil(x)
    โœ…invsqrt(x)
    \n

    Time Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’time([v])
    ๐Ÿ•’time_precise([v])
    \n

    Midi Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’midisend(offset, msg1, msg2)
    ๐Ÿ•’midisend(offset, msg1, msg2 + (msg3 * 256))
    ๐Ÿ•’midisend(offset, msg1, msg2, msg3)
    ๐Ÿ•’midisend_buf(offset, buf, len)
    ๐Ÿ•’midisend_str(offset, string)
    ๐Ÿ•’midirecv(offset, msg1, msg23)
    ๐Ÿ•’midirecv(offset, msg1, msg2, msg3)
    ๐Ÿ•’midirecv_buf(offset, buf, maxlen)
    ๐Ÿ•’midirecv_str(offset, string)
    ๐Ÿ•’midisyx(offset, msgptr, len)
    \n

    Memory/FFT/MDCT Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’mdct(start_index, size)
    ๐Ÿ•’imdct(start_index, size)
    โœ…fft(start_index, size)
    โœ…ifft(start_index, size)
    ๐Ÿ•’fft_real(start_index, size)
    ๐Ÿ•’ifft_real(start_index, size)
    ๐Ÿ•’fft_permute(index, size)
    ๐Ÿ•’fft_ipermute(index, size)
    โœ…convolve_c(dest, src, size)
    ๐Ÿ•’freembuf(top)
    ๐Ÿ•’memcpy(dest, source, length)
    โœ…memset(dest, value, length)
    ๐Ÿ•’mem_multiply_sum(buf1, buf2, length)
    ๐Ÿ•’mem_insert_shuffle(buf, len, value)
    ๐Ÿ•’__memtop()
    ๐Ÿ•’stack_push(value)
    ๐Ÿ•’stack_pop(value)
    ๐Ÿ•’stack_peek(index)
    ๐Ÿ•’stack_exch(value)
    ๐Ÿ•’atomic_setifequal(dest, value, newvalue)
    ๐Ÿ•’atomic_exch(val1, val2)
    ๐Ÿ•’atomic_add(dest_val1, val2)
    ๐Ÿ•’atomic_set(dest_val1, val2)
    ๐Ÿ•’atomic_get(val)
    \n

    Host Interaction Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’sliderchange(mask | sliderX)
    ๐Ÿ•’slider_automate(mask or sliderX[, end_touch])
    ๐Ÿ•’slider_show(mask or sliderX[, value])
    ๐Ÿ•’export_buffer_to_project(buffer, length_samples, nch, srate, track_index[, flags, tempo, planar_pitch]) --
    ๐Ÿ•’get_host_numchan()
    ๐Ÿ•’set_host_numchan(numchan)
    ๐Ÿ•’get_pin_mapping(inout, pin, startchan, chanmask)
    ๐Ÿ•’set_pin_mapping(inout, pin, startchan, chanmask, mapping)
    ๐Ÿ•’get_pinmapper_flags(no parameters)
    ๐Ÿ•’set_pinmapper_flags(flags)
    ๐Ÿ•’get_host_placement([chain_pos, flags])
    \n

    String Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’strlen(str)
    ๐Ÿ•’strcpy(str, srcstr)
    ๐Ÿ•’strcat(str, srcstr)
    ๐Ÿ•’strcmp(str, str2)
    ๐Ÿ•’stricmp(str, str2)
    ๐Ÿ•’strncmp(str, str2, maxlen)
    ๐Ÿ•’strnicmp(str, str2, maxlen)
    ๐Ÿ•’strncpy(str, srcstr, maxlen)
    ๐Ÿ•’strncat(str, srcstr, maxlen)
    ๐Ÿ•’strcpy_from(str, srcstr, offset)
    ๐Ÿ•’strcpy_substr(str, srcstr, offset, maxlen)
    ๐Ÿ•’str_getchar(str, offset[, type])
    ๐Ÿ•’str_setchar(str, offset, value[, type])
    ๐Ÿ•’strcpy_fromslider(str, slider)
    ๐Ÿ•’sprintf(str, format, ...)
    ๐Ÿ•’match(needle, haystack, ...)
    ๐Ÿ•’matchi(needle, haystack, ...)
    \n

    GFX Functions

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_set(r[g, b, a, mode, dest])
    ๐Ÿ•’gfx_lineto(x, y, aa)
    ๐Ÿ•’gfx_line(x, y, x2, y2[, aa])
    ๐Ÿ•’gfx_rectto(x, y)
    ๐Ÿ•’gfx_rect(x, y, w, h)
    ๐Ÿ•’gfx_setpixel(r, g, b)
    ๐Ÿ•’gfx_getpixel(r, g, b)
    ๐Ÿ•’gfx_drawnumber(n, ndigits)
    ๐Ÿ•’gfx_drawchar($'c')
    ๐Ÿ•’gfx_drawstr(str[, flags, right, bottom])
    ๐Ÿ•’gfx_measurestr(str, w, h)
    ๐Ÿ•’gfx_setfont(idx[, fontface, sz, flags])
    ๐Ÿ•’gfx_getfont()
    ๐Ÿ•’gfx_printf(str, ...)
    ๐Ÿ•’gfx_blurto(x,y)
    ๐Ÿ•’gfx_blit(source, scale, rotation)
    ๐Ÿ•’gfx_blit(source, scale, rotation[, srcx, srcy, srcw, srch, destx, desty, destw, desth, rotxoffs, rotyoffs])
    ๐Ÿ•’gfx_blitext(source, coordinatelist, rotation)
    ๐Ÿ•’gfx_getimgdim(image, w, h)
    ๐Ÿ•’gfx_setimgdim(image, w,h)
    ๐Ÿ•’gfx_loadimg(image, filename)
    ๐Ÿ•’gfx_gradrect(x,y,w,h, r,g,b,a[, drdx, dgdx, dbdx, dadx, drdy, dgdy, dbdy, dady])
    ๐Ÿ•’gfx_muladdrect(x,y,w,h, mul_r, mul_g, mul_b[, mul_a, add_r, add_g, add_b, add_a])
    ๐Ÿ•’gfx_deltablit(srcimg,srcx,srcy,srcw,srch, destx, desty, destw, desth, dsdx, dtdx, dsdy, dtdy, dsdxdy, dtdxdy[, usecliprect=1] )
    ๐Ÿ•’gfx_transformblit(srcimg, destx, desty, destw, desth, div_w, div_h, table)
    ๐Ÿ•’gfx_circle(x,y,r[,fill,antialias])
    ๐Ÿ•’gfx_roundrect(x,y,w,h,radius[,antialias])
    ๐Ÿ•’gfx_arc(x,y,r, ang1, ang2[,antialias])
    ๐Ÿ•’gfx_triangle(x1,y1,x2,y2,x3,y3[,x4,y4,...])
    ๐Ÿ•’gfx_getchar([char, unicodechar])
    ๐Ÿ•’gfx_showmenu("str")
    ๐Ÿ•’gfx_setcursor(resource_id[,"custom cursor name"])
    \n

    GFX Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’gfx_r, gfx_g, gfx_b, gfx_a
    ๐Ÿ•’gfx_w, gfx_h
    ๐Ÿ•’gfx_x, gfx_y
    ๐Ÿ•’gfx_mode
    ๐Ÿ•’gfx_clear
    ๐Ÿ•’gfx_dest
    ๐Ÿ•’gfx_texth
    ๐Ÿ•’gfx_ext_retina
    ๐Ÿ•’gfx_ext_flags
    ๐Ÿ•’mouse_x, mouse_y
    ๐Ÿ•’mouse_cap
    ๐Ÿ•’mouse_wheel, mouse_hwheel
    \n

    Special Vars and Extended Functionality

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’trigger
    ๐Ÿ•’ext_noinit
    ๐Ÿ•’ext_nodenorm
    โœ…ext_tail_size
    ๐Ÿ•’reg00-reg99
    ๐Ÿ•’_global.*
    \n

    Delay Compensation Vars

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    StatusFeatureComment
    ๐Ÿ•’pdc_delay
    ๐Ÿ•’pdc_bot_ch
    ๐Ÿ•’pdc_top_ch
    ๐Ÿ•’pdc_midi
    \n", "getting-started": "

    Getting Started: Your First JS2EEL Plugin

    \n

    Let's create our first JS2EEL plugin. We'll write it in JavaScript. JS2EEL will compile it into a REAPER JSFX plugin that you can use instantly.

    \n

    Our plugin will take an input audio signal and modify its volume. If you'd like to see the finished plugin, feel free to load the example plugin volume.js.

    \n

    Step 1: Create a New File

    \n

    Click on the "New File" button in the upper left half of the window.

    \n

    A modal will appear where you have to enter a filename for the JavaScript code and a description that will be used to reference the JSFX plugin in REAPER. Let's start with the same value for both: volume.

    \n

    As you create the new file, the JS code tab will be pre-populated with a minimal template. There will be a call to the config() function, where the name and the channel configuration of the plugin is defined:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n
    \n

    Take a look at the resulting JSFX code on the right. If you're familiar with JSFX, you'll meet some old friends here: desc: and the in_pin and out_pin configuration for your plugin's channel routing.

    \n

    Additionally, a template for the onSample() function call is provided. This is a JS2EEL library function that iterates through every sample of the audio block and allows you to modify it. This corresponds to the @sample part in JSFX.

    \n

    Step 2: Declare Volume Adjustment Holder Variables

    \n

    Next, we will create variables to hold the current volume level and the target volume level. Between config() and onSample(), add the following code:

    \n
    let volume = 0;\nlet target = 0;\n
    \n

    volume represents the volume in dB, and target represents the target volume in linear scale.

    \n

    Step 3: Create a Slider for User Input

    \n

    To allow the user to adjust the volume, we'll use a slider. We'll bind that slider to the volume variable created above. After the variable declarations, add the following code to your file:

    \n
    slider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n
    \n

    As you might know, slider numbering is important in EEL. It starts at 1, and so our slider takes 1 as the first argument.

    \n

    The second argument is the variable to bind to: volume.

    \n

    The third argument is the default value: 0.

    \n

    The fourth and fifth arguments are the minimum and maximum values: -150 and 18 dB, respectively.

    \n

    The sixth argument is the step size: 0.1.

    \n

    The last argument is the label for the slider which will be displayed in the GUI: Volume [dB].

    \n

    Step 4: Handle Slider Value Changes

    \n

    Now, we need to update the target variable whenever the user adjusts the slider. We'll use the onSlider() library function to handle slider value changes. This corresponds to EEL's @slider. After the slider definition via slider(), add the following code to your file:

    \n
    onSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n
    \n

    Here we assign a linear target level to the target variable, which will be used later to adjust our sample amplitude. If the slider is at its lower boundary, we set the target to 0 to mute the audio.

    \n

    Step 5: Process Audio Samples

    \n

    The final step is to process audio samples based on the calculated target volume. We'll use the onSample() function to perform audio processing. This corresponds to EEL's @sample. In the callback arrow function parameter of onSample(), add the following code:

    \n
    eachChannel((sample, _ch) => {\n    sample *= target;\n});\n
    \n

    eachChannel() is another JS2EEL library function that makes it easy to manipulate samples per channel. It can only be called in onSample. It has no equivalent in EEL. We just multiply every sample in each of the two channels by the target volume to adjust its amplitude respectively.

    \n

    Finished Plugin

    \n

    Here is the complete code:

    \n
    config({ description: 'volume', inChannels: 2, outChannels: 2 });\n\nlet volume = 0;\nlet target = 0;\n\nslider(1, volume, 0, -150, 18, 0.1, 'Volume [dB]');\n\nonSlider(() => {\n    if (volume > -149.9) {\n        target = Math.pow(10, volume / 20);\n    } else {\n        target = 0;\n    }\n});\n\nonSample(() => {\n    eachChannel((sample, _ch) => {\n        sample *= target;\n    });\n});\n
    \n

    Conclusion

    \n

    That's it! You've successfully created a simple volume plugin using JS2EEL. If you're using the web app version of JS2EEL, copy the JSFX code into a new JSFX in REAPER to hear it in action. If you're using the desktop app and have configured the output path correctly, your volume JSFX should appear in the JS subdirectory of the FX selector.

    \n

    Feel free to take a look at the other examples. You'll be inspired to write your own JS2EEL plugin in no time!

    \n", From f58b05133c419cd9e9a1c738375cf54da125e155 Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 18:37:27 +0200 Subject: [PATCH 40/42] Cockos attribution --- examples/08_cab_sim.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/08_cab_sim.js b/examples/08_cab_sim.js index 48671ac..6f55347 100644 --- a/examples/08_cab_sim.js +++ b/examples/08_cab_sim.js @@ -1,3 +1,5 @@ +// Minimal JS2EEL version of Cockos' 'Convolution Amp/Cab Modeler' (Effects/guitar/amp-model) + config({ description: 'sd_amp_sim', inChannels: 2, outChannels: 2, extTailSize: 32768 }); let fftSize = -1; From e30036dbd0bf347b82bb1050096b276d60e4c54f Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 18:54:17 +0200 Subject: [PATCH 41/42] Test & fix init behavior --- .../js2eel/compiler/Js2EelCompiler.spec.ts | 32 +++++++++++++++++++ .../src/js2eel/compiler/Js2EelCompiler.ts | 13 ++++---- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts index 96c33f9..26f26aa 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.spec.ts @@ -383,4 +383,36 @@ out_pin:Out 1 expect(result.errors.length).to.equal(1); expect(result.errors[0].type).to.equal('BindingError'); }); + + it('compiles @init code', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'init', inChannels: 2, outChannels: 2 }); + +onInit(() => { + const myConst = 1; +});`); + + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL v0.11.0 */ + +desc:init + +in_pin:In 0 +in_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 + + +@init + +myConst__S2 = 1; + + +`) + ); + + expect(result.success).to.equal(true); + expect(result.warnings.length).to.equal(1); + }); }); diff --git a/compiler/src/js2eel/compiler/Js2EelCompiler.ts b/compiler/src/js2eel/compiler/Js2EelCompiler.ts index e067b22..b9267ca 100644 --- a/compiler/src/js2eel/compiler/Js2EelCompiler.ts +++ b/compiler/src/js2eel/compiler/Js2EelCompiler.ts @@ -302,14 +302,17 @@ export class Js2EelCompiler { } } + const initSrcText = this.getOnInitSrc(); + + if (initStageText || initSrcText) { + this.src.eelSrcFinal += initStageHeader; + } + if (initStageText) { - initStageText = initStageHeader + initStageText; this.src.eelSrcFinal += initStageText; this.src.eelSrcFinal += '\n\n'; } - const initSrcText = this.getOnInitSrc(); - if (initSrcText) { this.src.eelSrcFinal += initSrcText; this.src.eelSrcFinal += '\n\n'; @@ -538,10 +541,6 @@ export class Js2EelCompiler { this.pluginData.extTailSize = extTailSize; } - getExtTailSize(): number | null { - return this.pluginData.extTailSize; - } - setCurrentChannel(channel: number): void { this.pluginData.currentChannel = channel; } From 964e1701d6b6c6370ed109c80617ae8705cb4f3c Mon Sep 17 00:00:00 2001 From: Steeely Dan Date: Tue, 27 Aug 2024 20:57:42 +0200 Subject: [PATCH 42/42] Add remaining tests; 100% coverage again --- .../callExpression/js2EelLib/onBlock.spec.ts | 73 +++++++ .../js2EelLib/eelBufferMemberCall.spec.ts | 180 +++++++++++++++++- .../memberExpressionComputed.ts | 12 +- .../updateExpression/updateExpression.spec.ts | 77 ++++++++ .../whileStatement/whileStatement.spec.ts | 71 +++++++ .../whileStatement/whileStatement.ts | 4 +- gui/src/codemirror/esLintLintSource.ts | 6 +- gui/src/codemirror/jsCodeMirror.ts | 2 +- gui/src/components/js2eel/tabs/JsAst.tsx | 2 + 9 files changed, 407 insertions(+), 20 deletions(-) create mode 100644 compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onBlock.spec.ts create mode 100644 compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.spec.ts create mode 100644 compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.spec.ts diff --git a/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onBlock.spec.ts b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onBlock.spec.ts new file mode 100644 index 0000000..dd9b259 --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/callExpression/js2EelLib/onBlock.spec.ts @@ -0,0 +1,73 @@ +import { expect } from 'chai'; +import { Js2EelCompiler } from '../../../compiler/Js2EelCompiler.js'; + +describe('onBlock()', () => { + it('Error if called elsewhere than root scope', () => { + const compiler = new Js2EelCompiler(); + + const result = + compiler.compile(`config({ description: 'onBlock', inChannels: 2, outChannels: 2 }); + +onSample(function callback() { + onBlock(() => {}); +}); +`); + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('ScopeError'); + }); + + it('can only be called once', () => { + const compiler = new Js2EelCompiler(); + + const result = + compiler.compile(`config({ description: 'onBlock', inChannels: 2, outChannels: 2 }); + +onBlock(() => {}); +onBlock(() => {}); +`); + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('StageError'); + }); + + it('Error if no callback given', () => { + const compiler = new Js2EelCompiler(); + + const result = + compiler.compile(`config({ description: 'onBlock', inChannels: 2, outChannels: 2 }); + +onBlock(); +`); + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(2); + expect(result.errors[0].type).to.equal('ArgumentError'); + expect(result.errors[1].type).to.equal('ArgumentError'); + }); + + it('Error if callback has args', () => { + const compiler = new Js2EelCompiler(); + + const result = + compiler.compile(`config({ description: 'onBlock', inChannels: 2, outChannels: 2 }); + +onBlock((sample) => {}); +`); + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('ParameterError'); + }); + + it('Error if callback body is not a block statement', () => { + const compiler = new Js2EelCompiler(); + + const result = + compiler.compile(`config({ description: 'onBlock', inChannels: 2, outChannels: 2 }); + +onBlock(() => "nope"); +`); + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('TypeError'); + }); +}); diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts index 6d56d04..ef80531 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/js2EelLib/eelBufferMemberCall.spec.ts @@ -39,7 +39,7 @@ dim = 2; ); }); - it("Error if call to unknown member", () => { + it('Error if call to unknown member', () => { const compiler = new Js2EelCompiler(); const result = compiler.compile(`config({ description: 'eelBufferMemberCall', inChannels: 2, outChannels: 2 }); @@ -72,6 +72,184 @@ myBuf__size = 3; dim = ; +`) + ); + }); + + it('Error if swap called without arguments', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'swap - no args', inChannels: 2, outChannels: 2 }); + +const myBuf1 = new EelBuffer(1, 300); + +onBlock(() => { + myBuf1.swap(); +}); +`); + + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(2); + expect(result.errors[0].type).to.equal('ArgumentError'); + expect(result.errors[1].type).to.equal('ArgumentError'); + expect(result.warnings.length).to.equal(0); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL vTO_BE_REPLACED_COMPILER_VERSION */ + +desc:swap - no args + +in_pin:In 0 +in_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 + + +@init + +myBuf1__B0 = 0 * 300 + 0; +myBuf1__size = 300; + + +@block + +?รค__DENY_COMPILATION; + + +`) + ); + }); + + it('Error if swap called with argument that is no buffer / no buffer found', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'swap - wrong arg', inChannels: 2, outChannels: 2 }); + +const myBuf1 = new EelBuffer(1, 300); +const myBuf2 = "Hello"; + +onBlock(() => { + myBuf1.swap(myBuf2); +}); +`); + + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('TypeError'); + expect(result.warnings.length).to.equal(0); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL vTO_BE_REPLACED_COMPILER_VERSION */ + +desc:swap - wrong arg + +in_pin:In 0 +in_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 + + +@init + +myBuf2 = Hello; +myBuf1__B0 = 0 * 300 + 0; +myBuf1__size = 300; + + +@block + +?รค__DENY_COMPILATION; + + +`) + ); + }); + + it('Error if swap with buffer of different dimensions', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'swap - dimensions', inChannels: 2, outChannels: 2 }); + +const myBuf1 = new EelBuffer(1, 300); +const myBuf2 = new EelBuffer(2, 300); + +onBlock(() => { + myBuf1.swap(myBuf2); +}); +`); + + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('BoundaryError'); + expect(result.warnings.length).to.equal(0); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL vTO_BE_REPLACED_COMPILER_VERSION */ + +desc:swap - dimensions + +in_pin:In 0 +in_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 + + +@init + +myBuf1__B0 = 0 * 300 + 0; +myBuf1__size = 300; +myBuf2__B0 = 0 * 300 + 300; +myBuf2__B1 = 1 * 300 + 300; +myBuf2__size = 300; + + +@block + +?รค__DENY_COMPILATION; + + +`) + ); + }); + + it('Error if swap with buffer of different size', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'swap - size', inChannels: 2, outChannels: 2 }); + +const myBuf1 = new EelBuffer(1, 300); +const myBuf2 = new EelBuffer(1, 500); + +onBlock(() => { + myBuf1.swap(myBuf2); +}); +`); + + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('BoundaryError'); + expect(result.warnings.length).to.equal(0); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL vTO_BE_REPLACED_COMPILER_VERSION */ + +desc:swap - size + +in_pin:In 0 +in_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 + + +@init + +myBuf1__B0 = 0 * 300 + 0; +myBuf1__size = 300; +myBuf2__B0 = 0 * 500 + 300; +myBuf2__size = 500; + + +@block + +?รค__DENY_COMPILATION; + + `) ); }); diff --git a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.ts b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.ts index 6fda19e..9334628 100644 --- a/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.ts +++ b/compiler/src/js2eel/generatorNodes/memberExpression/memberExpressionComputed.ts @@ -223,17 +223,7 @@ export const memberExpressionComputed = ( break; } case 'BinaryExpression': { - if (potentialBuffer) { - positionText += binaryExpression(property, instance); - } else { - instance.error( - 'TypeError', - `Property access on array is not allowed with this type: ${property.type}`, - memberExpression.property - ); - - positionText += JSFX_DENY_COMPILATION; - } + positionText += binaryExpression(property, instance); break; } diff --git a/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.spec.ts b/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.spec.ts new file mode 100644 index 0000000..31f0300 --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/updateExpression/updateExpression.spec.ts @@ -0,0 +1,77 @@ +import { expect } from 'chai'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; + +describe('updateExpression()', () => { + it('decrements', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'update expression', inChannels: 2, outChannels: 2 }); + +let number = 1; + +onBlock(() => { + number--; +}); +`); + + expect(result.success).to.equal(true); + expect(result.errors.length).to.equal(0); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL vTO_BE_REPLACED_COMPILER_VERSION */ + +desc:update expression + +in_pin:In 0 +in_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 + + +@init + +number = 1; + + +@block + +number -= 1; + + +`) + ); + }); + + it('does not work with wrong type', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'update expression', inChannels: 2, outChannels: 2 }); + +onBlock(() => { + console.log++; +}); +`); + + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('TypeError'); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL vTO_BE_REPLACED_COMPILER_VERSION */ + +desc:update expression + +in_pin:In 0 +in_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 + + +@block + +?รค__DENY_COMPILATION; + + +`) + ); + }); +}); diff --git a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.spec.ts b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.spec.ts new file mode 100644 index 0000000..e10f15c --- /dev/null +++ b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.spec.ts @@ -0,0 +1,71 @@ +import { expect } from 'chai'; +import { Js2EelCompiler } from '../../compiler/Js2EelCompiler.js'; +import { testEelSrc } from '../../test/helpers.js'; + +describe('whileStatement()', () => { + it('does not work with wrong argument type', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'while statement', inChannels: 2, outChannels: 2 }); + +onBlock(() => { + while (new EelBuffer(2, 100)) { + // + } +}); +`); + + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('TypeError'); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL vTO_BE_REPLACED_COMPILER_VERSION */ + +desc:while statement + +in_pin:In 0 +in_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 + + +@block + +?รค__DENY_COMPILATION + +`) + ); + }); + + it('does not work with wrong body type', () => { + const compiler = new Js2EelCompiler(); + const result = + compiler.compile(`config({ description: 'while statement', inChannels: 2, outChannels: 2 }); + +onBlock(() => { + while (1 > 2) "Nothing" +}); +`); + + expect(result.success).to.equal(false); + expect(result.errors.length).to.equal(1); + expect(result.errors[0].type).to.equal('TypeError'); + expect(testEelSrc(result.src)).to.equal( + testEelSrc(`/* Compiled with JS2EEL v0.11.0 */ + +desc:while statement + +in_pin:In 0 +in_pin:In 1 +out_pin:Out 0 +out_pin:Out 1 + + +@block + +?รค__DENY_COMPILATION + +`) + ); + }); +}); diff --git a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts index d135302..4c45502 100644 --- a/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts +++ b/compiler/src/js2eel/generatorNodes/whileStatement/whileStatement.ts @@ -41,8 +41,8 @@ export const whileStatement = ( default: { instance.error( 'TypeError', - `While statement body type not allowed: ${whileStatement.test.type}`, - whileStatement.test + `While statement body type not allowed: ${whileStatement.body.type}`, + whileStatement.body ); return JSFX_DENY_COMPILATION; diff --git a/gui/src/codemirror/esLintLintSource.ts b/gui/src/codemirror/esLintLintSource.ts index ddee9d2..3b3b261 100644 --- a/gui/src/codemirror/esLintLintSource.ts +++ b/gui/src/codemirror/esLintLintSource.ts @@ -6,14 +6,10 @@ export const createEsLintLintSource = ( setEslintErrors: (errors: Diagnostic[]) => void ): LintSource => { const eslintConfig = { - parserOptions: { + languageOptions: { ecmaVersion: 2022, sourceType: 'module' }, - env: { - browser: true, - node: false - }, rules: { semi: "error" } diff --git a/gui/src/codemirror/jsCodeMirror.ts b/gui/src/codemirror/jsCodeMirror.ts index 9a813a7..42ce526 100644 --- a/gui/src/codemirror/jsCodeMirror.ts +++ b/gui/src/codemirror/jsCodeMirror.ts @@ -43,7 +43,7 @@ export const jsCodeMirror = ( javascript(), history(), lineNumbers(), - linter(createEsLintLintSource(setEslintErrors)), + // linter(createEsLintLintSource(setEslintErrors)), linter(createJs2EelLintSource(compileResultRef)), EditorView.lineWrapping, closeBrackets(), diff --git a/gui/src/components/js2eel/tabs/JsAst.tsx b/gui/src/components/js2eel/tabs/JsAst.tsx index 1007a6b..451a73b 100644 --- a/gui/src/components/js2eel/tabs/JsAst.tsx +++ b/gui/src/components/js2eel/tabs/JsAst.tsx @@ -7,6 +7,8 @@ import type { JSONData } from '../../../types'; export const JsAst = (): VNode | null => { const compileResult = useJs2EelStore((state) => state.compileResult); + console.log('compile result', compileResult); + return compileResult?.tree ? (