Compare commits

..

No commits in common. "main" and "reorg" have entirely different histories.
main ... reorg

202 changed files with 2540 additions and 11404 deletions

View File

@ -5,119 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [4.1.0]
### Added
- added suppression of system gang up calculation
- added correction for gang up for formation fighter
- added swat correction for scale penalty
### Changed
- updated roll modifiers for SWADE version 5.1.0
- updated pack tactics gang up to use same calculation as system
### Removed
- removed roll modifiers handled by the system:
- range check
- vulnerable target
- dodge check
## [4.0.0]
### Added
- Added example morphables and summonables actor compendia.
### Changed
- Updated for Foundry v13
- Updated for SWADE 5.0
- Updated powerEffect application and other dialogs to ApplicationV2
- BREAKING CHANGE: removed Portal dependency for summons
- BREAKING CHANGE: added Sequencer dependency for summons
### Fixed
- Fixed Darksight effect name.
- Summon Ally: Mirror Self improvements - remove changesets and grants from
copied items.
## [3.1.5] 2025-01-27
### Changed
- Added flying pace support to Fly power
- Added burrowing pace support to Burrow power
- Added additional icon choices to the list for maintain effects
## [3.1.4] 2025-01-26
### Fixed
- Fixed module loding with swade core module and swpf due to fear macro changes
- Fixed power effect creation for SWADE system 4.2
### Changed
- Clean up of requested roll GM chat card
- Make Deflection roll helper modifiers more descriptive (melee, ranged, all)
## [3.1.3] 2025-01-11
### Fixed
- Updated hurry/hinder and sloth/speed power effects to work with
`system.pace` for SWADE 4.2 compatibility.
### Changed
- updated settings for Blindsense to a more pleasing look.
## [3.1.2] 2024-08-11
### Fixed
- #44: protection effect and other default system effects still had duration
when added by the power effect, instead of maintaining their own effect.
- Since VAE did away with the collapsable extra description, moved the spell
description to the main 'description' field of active effects.
## [3.1.1] 2024-07-26
- Added: 'Shape Change Ability' power effect
## [3.1.0] 2024-07-14
- v12 compatibility
- bugfixes for v12
## [3.0.2] 2024-06-24
### Fixed
- Fixed bug in which effects would disappear on the target's next turn
### Added
- Eidolon summon effect and helper action
- Companion "summon" effect and helper action
## [3.0.1] 2024-06-18
### Added
- Added Inquisitor's Judgement power effect
## [3.0.0] 2024-06-12
### Added
- Optional Visual Active Effect integration for power descriptions
- Add VAE helper buttons for breaking free from Bound/Entangled
- Added Portal dependency
## [3.0.0] UNRELEASED
### Changed
@ -130,7 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Removed
- Removed warpgate dependency
- Began work to remove Warpgate dependency
## [2.4.3] 2024-04-21
@ -211,8 +99,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
table
- API: added requestFearRollFromTokens special helper
- Trait roll hooks for:
- Glow/Shroud
- Range modifiers
- Glow/Shroud
- Range modifiers
### Changed
@ -225,13 +113,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Trait and Damage Roll hooks to look for and apply modifiers for target
conditions:
- Vulnerable
- Deflection
- Arcane Protection
- Arcane Resistance
- Scale
- Gang Up
- Resistences and Weaknesses
- Vulnerable
- Deflection
- Arcane Protection
- Arcane Resistance
- Scale
- Gang Up
- Resistences and Weaknesses
- New Macro: Set token vision
- New Common Action: Illumination (for the darkness penalty effects)
- New macro: Quick Damage Roll
@ -253,10 +141,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Power Effect Macro for Havoc
- Power Effect Action for Havoc
- New Macro: Request Roll
- NEW DEPENDENCY: socketlib
- NEW DEPENDENCY: socketlib
- Documentation:
- API Documentation
- Request Roll macro documentation
- API Documentation
- Request Roll macro documentation
## [2.1.0]
@ -330,20 +218,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- DEPENDENCY: warpgate
- macro helpers for the following effects:
- Boost/Lower Trait
- Deflection
- Glow
- Hinder
- Hurry
- Lingering Damage
- Protection
- Shroud
- Smite
- Summon
- Boost/Lower Trait
- Deflection
- Glow
- Hinder
- Hurry
- Lingering Damage
- Protection
- Shroud
- Smite
- Summon
- API helpers:
- `createEffectDocument`
- `createMutationWithEffect`
- `defaultMutationOptions`
- `getActorFolderByPath`
- `getActorsInFolder`
- `runOnTargetOrSelectedTokens`
- `createEffectDocument`
- `createMutationWithEffect`
- `defaultMutationOptions`
- `getActorFolderByPath`
- `getActorsInFolder`
- `runOnTargetOrSelectedTokens`

View File

@ -4,9 +4,9 @@ curdir=$(realpath $(dirname $0))
package=$(basename ${curdir})
fvtt package workon ${package}
for p in ${curdir}/dist/swade-mb-helpers/packs/*; do
for p in ${curdir}/dist/packs/*; do
package=$(basename $p)
rm $p/*
fvtt package pack -n ${package} --inputDirectory ${curdir}/src/packsrc/${package} --clean
done
rsync -rpa ${curdir}/dist/swade-mb-helpers/packs/ ${curdir}/src/packs --delete
rsync -rpa ${curdir}/dist/packs/ ${curdir}/src/packs --delete

View File

@ -4,7 +4,7 @@ curdir=$(realpath $(dirname $0))
package=$(basename ${curdir})
fvtt package workon ${package}
for p in ${curdir}/dist/swade-mb-helpers/packs/*; do
for p in ${curdir}/dist/packs/*; do
package=$(basename $p)
mkdir -p ${curdir}/src/packsrc/${package}
fvtt package unpack -n ${package} --outputDirectory ${curdir}/src/packsrc/${package}

View File

@ -1,16 +1,21 @@
import fs from 'fs-extra';
import gulp from 'gulp';
import sass from 'gulp-dart-sass';
import sourcemaps from 'gulp-sourcemaps';
import path from 'node:path';
import buffer from 'vinyl-buffer';
import source from 'vinyl-source-stream';
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
// SPDX-FileCopyrightText: 2022 Johannes Loher
// SPDX-FileCopyrightText: 2022 David Archibald
//
// SPDX-License-Identifier: MIT
import rollupStream from '@rollup/stream';
import fs from 'fs-extra'
import gulp from 'gulp'
import sass from 'gulp-dart-sass'
import sourcemaps from 'gulp-sourcemaps'
import path from 'node:path'
import buffer from 'vinyl-buffer'
import source from 'vinyl-source-stream'
import yargs from 'yargs'
import { hideBin } from 'yargs/helpers'
import rollupConfig from './rollup.config.mjs';
import rollupStream from '@rollup/stream'
import rollupConfig from './rollup.config.mjs'
/********************/
/* CONFIGURATION */
@ -18,12 +23,12 @@ import rollupConfig from './rollup.config.mjs';
const packageId = 'swade-mb-helpers';
const sourceDirectory = './src';
const distDirectory = './dist/swade-mb-helpers';
const distDirectory = './dist';
const stylesDirectory = `${sourceDirectory}/styles`;
const stylesExtension = 'scss';
const sourceFileExtension = 'js';
const staticFiles = ['assets', 'config', 'fonts', 'lang', 'templates'];
const runtimeStaticFiles = ['packs', 'module.json'];
const staticFiles = ['assets', 'fonts', 'lang', 'templates'];
const runtimeStaticFiles = ['packs', 'module.json']
/********************/
/* BUILD */
@ -35,7 +40,7 @@ let cache;
* Build the distributable JavaScript code
*/
function buildCode() {
return rollupStream({ ...rollupConfig(), cache })
return rollupStream({...rollupConfig(), cache })
.on('bundle', (bundle) => {
cache = bundle;
})
@ -101,7 +106,7 @@ export const build = gulp.series(clean, gulp.parallel(buildCode, buildStyles, co
* Remove built files from `dist` folder while ignoring source files
*/
export async function clean() {
const files = [...runtimeStaticFiles, 'module'];
const files = [...staticFiles, 'module'];
if (fs.existsSync(`${stylesDirectory}/${packageId}.${stylesExtension}`)) {
files.push('styles');
@ -130,10 +135,8 @@ function getDataPaths() {
const dataPaths = Array.isArray(dataPath) ? dataPath : [dataPath];
return dataPaths.map((dataPath) => {
if (typeof dataPath !== 'string') {
throw new Error(
`Property dataPath in foundryconfig.json is expected to be a string or an array of strings, but found ${dataPath}`,
);
if(typeof dataPath !== 'string') {
throw new Error(`Property dataPath in foundryconfig.json is expected to be a string or an array of strings, but found ${dataPath}`);
}
if (!fs.existsSync(path.resolve(dataPath))) {
throw new Error(`The dataPath ${dataPath} does not exist on the file system`);

View File

@ -1,28 +0,0 @@
const tokens = canvas.tokens.controlled;
const actors = tokens.map((t) => t.actor);
const EFFECT_OBJECT = {
name: 'Effect',
type: 'macro',
dice: null,
resourcesUsed: null,
modifier: '',
override: '',
uuid: 'Compendium.swade-mb-helpers.helper-macros.Macro.AjuA11hQ48UJNwlH',
macroActor: 'self',
isHeavyWeapon: false,
};
for (const actor of actors) {
const updates = [];
for (const power of actor.items.filter((i) => i.type === 'power')) {
if (Object.values(power.system.actions.additional).find((action) => action.name === 'Effect')) {
continue;
}
const _id = power.id;
const additional = foundry.utils.deepClone(power.system.actions.additional);
additional[foundry.utils.randomID(8)] = foundry.utils.deepClone(EFFECT_OBJECT);
updates.push({ _id, 'system.actions.additional': additional });
}
if (updates.length > 0) {
actor.updateEmbeddedDocuments('Item', updates);
}
}

View File

@ -1,33 +1,33 @@
let tokens = [];
let tokens = []
if (canvas.tokens.controlled.length > 0) {
tokens = canvas.tokens.controlled;
tokens = canvas.tokens.controlled
}
if (tokens.length > 0) {
main(tokens);
main(tokens)
} else {
ui.notifications.error('Please select or target a token');
ui.notifications.error('Please select or target a token')
}
async function main(tokens) {
const currencies = ['Copper', 'Silver', 'Gold', 'Platinum'];
let template = '<div><table><thead><tr><th>Actor</th><th>Currency</th></tr></thead><tbody>';
async function main (tokens) {
const currencies = ['Copper', 'Silver', 'Gold', 'Platinum']
let template = '<div><table><thead><tr><th>Actor</th><th>Currency</th></tr></thead><tbody>'
const fmtOptions = {
minimumIntegerDigits: 1,
minimumFractionDigits: 2,
maximumFractionDigits: 2,
};
const fmt = Intl.NumberFormat('en-US', fmtOptions);
for (const token of tokens) {
const actor = token.actor;
let total = 0;
for (const item of actor.items.filter((i) => currencies.indexOf(i.name) > -1)) {
total += item.system.price * item.system.quantity;
}
template += `<tr><td>${actor.name}</td><td>${fmt.format(total)}</td></tr>`;
maximumFractionDigits: 2
}
template += '</thead></tbody>';
foundry.applications.api.DialogV2.prompt({
window: { title: 'Currency Totals' },
content: template,
});
const fmt = Intl.NumberFormat('en-US', fmtOptions)
for (const token of tokens) {
const actor = token.actor
let total = 0
for (const item of actor.items.filter(i => currencies.indexOf(i.name) > -1)) {
total += item.system.price * item.system.quantity
}
template += `<tr><td>${actor.name}</td><td>${fmt.format::(total)}</td></tr>`
}
template += '</thead></tbody>'
Dialog.prompt({
title: 'Currency Totals',
content: template
})
}

View File

@ -1,4 +0,0 @@
game.modules.get('swade-mb-helpers').api.powerEffectsMenu({
token,
targets: game.user.targets,
});

View File

@ -1,5 +1,5 @@
new foundry.applications.api.DialogV2({
window: { title: "Damage Roll Configuration" },
new Dialog({
title: 'Damage Roll Configuration',
content: `
<form>
<div class="form-group">
@ -16,28 +16,24 @@ new foundry.applications.api.DialogV2({
</div>
</form>
`,
buttons: [
{
action: "ok",
label: "Roll Damage",
callback: (event, button, dialog) => {
const form = new foundry.applications.ux.FormDataExtended(button.form);
console.log(form)
const damageRoll = form.object.damageRoll;
let flavor = form.object.flavor;
const ap = parseInt(form.object.ap) || 0;
const options = {};
buttons: {
ok: {
label: 'Roll Damage',
callback: (html) => {
const damageRoll = html.find('input[name="damageRoll"]').val()
let flavor = html.find('input[name="flavor"]').val()
const ap = parseInt(html.find('input[name="ap"]').val()) || 0
const options = {}
if (ap > 0) {
flavor = `${flavor ? flavor + " - " : ""}AP: ${ap}`
options.ap = ap;
flavor = `${flavor ? flavor + ' - ' : ''}AP: ${ap}`
options.ap = ap
}
// Perform the damage roll and send the message
new CONFIG.Dice.DamageRoll(damageRoll, null, options).toMessage({ flavor });
},
new CONFIG.Dice.DamageRoll(damageRoll, null, options).toMessage({ flavor })
}
},
{
action: "cancel",
label: "Cancel",
},
],
}).render(true);
cancel: {
label: 'Cancel'
}
}
}).render(true)

View File

@ -1,42 +1,39 @@
const requestFearRollFromTokens = game.modules.get('swade-mb-helpers').api.requestFearRollFromTokens;
const requestFearRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens
async function main() {
let tokens = Array.from(game.user.targets);
async function main () {
let tokens = Array.from(game.user.targets)
if (tokens.length < 1) {
tokens = canvas.tokens.controlled;
tokens = canvas.tokens.controlled
}
if (tokens.length < 1) {
ui.notifications.error('Please target or select some tokens');
return;
ui.notifications.error('Please target or select some tokens')
return
}
new foundry.applications.api.DialogV2({
window: { title: 'Request Fear roll...' },
content: `
<form>
<p>Requesting Fear roll from ${tokens.map((t) => t.name).join(', ')}.</p>
<div class="form-group">
<label>Fear Check Penalty
<input type="number" value="0" name="fear">
</label>
</div>
</form>`,
buttons: [
{
action: "submit",
label: 'Request Roll',
callback: (event, button, dialog) => {
formdata = new foundry.applications.ux.FormDataExtended(button.form).object
const fear = parseInt(formdata.fear) || 0;
const options = { targetNumber: 4, fear };
requestFearRollFromTokens(tokens, options);
},
},
{
action: "cancel", label: 'Cancel',
},
const menuData = {
inputs: [
{ type: 'info', label: `Requesting Fear roll from ${tokens.map(t => t.name).join(', ')}` },
{ type: 'number', label: 'Fear Check Penalty', options: 0 }
],
}).render(true);
buttons: [
{ label: 'Request roll', value: 'ok', default: true },
{ label: 'Cancel', value: 'cancel' }
]
}
const menuConfig = {
title: 'Request Fear roll...'
}
const result = await warpgate.menu(menuData, menuConfig)
if (result.buttons !== 'ok') {
return
}
console.log(result)
const fear = result.inputs[1] || 0
const targetNumber = 4
const options = { targetNumber, fear }
requestFearRollFromTokens(tokens, options)
}
main();
main()

View File

@ -1,95 +1,72 @@
const requestRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens;
const requestRollFromTokens = game.modules.get('swade-mb-helpers').api.requestRollFromTokens
async function main() {
let tokens = Array.from(game.user.targets);
async function main () {
let tokens = Array.from(game.user.targets)
if (tokens.length < 1) {
tokens = canvas.tokens.controlled;
tokens = canvas.tokens.controlled
}
if (tokens.length < 1) {
ui.notifications.error('Please target or select some tokens');
return;
ui.notifications.error('Please target or select some tokens')
return
}
const attributes = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'];
const skillSet = new Set();
const menuData = {
inputs: [
{ type: 'info', label: `Requesting roll from ${tokens.map(t => t.name).join(', ')}` },
{
type: 'select',
label: 'Trait to roll',
options: []
},
{ type: 'number', label: 'Roll Modifier', options: 0 },
{ type: 'text', label: 'Roll Modifier Description', options: 'Roll Modifier' },
{ type: 'number', label: 'Target Number', options: 4 }
],
buttons: [
{ label: 'Request roll', value: 'ok', default: true },
{ label: 'Cancel', value: 'cancel' }
]
}
const menuConfig = {
title: 'Request roll...'
}
for (const attribute of ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor']) {
menuData.inputs[1].options.push(
{ html: `Attribute | ${attribute}`, value: `a|${attribute}` }
)
}
const skillSet = new Set()
for (const token of tokens) {
const tokenSkills = token.actor.items.filter(
(i) => i.type === 'skill' && !['Untrained', 'Untrained Attempt'].includes(i.name),
);
for (const skill of tokenSkills) {
skillSet.add(skill.name);
const skills = token.actor.items.filter(i => i.type === 'skill' &&
!['Untrained', 'Unskilled Attempt'].includes(i.name))
for (const skill of skills) {
skillSet.add(skill.name)
}
}
const attributeOptions = attributes
.map(
(a) => `
<option ${a === 'Agility' ? 'selected ' : ''} value="a|${a}">${a}</option>`,
)
.join('');
const skillOptions = Array.from(skillSet)
.sort()
.map(
(s) => `
<option value="s|${s}">${s}</option>`,
)
.join('');
const content = `
<form>
<p>Requesting roll from ${tokens.map((t) => t.name).join(', ')}.</p>
<div class="form-group">
<label for="trait">Trait to roll</label>
<select name="trait">
<optgroup label="Attributes">${attributeOptions}</optgroup>
<optgroup label="Skills">
${skillOptions}
<option value="s|NOSKILL">Untrained</option>
</optgroup>
</select>
</div>
<div class="form-group">
<label for="mod">Roll Modifier:</label>
<input type="number" value="0" name="mod">
</div>
<div class="form-group">
<label for="modDesc">Roll Modifier Description:</label>
<input type="text" value="Roll Modifier" name="modDesc">
</div>
<div class="form-group">
<label for="tn">Target Number</label>
<input type="number" value="4" name="tn">
</div>
</form>
`;
const buttons = [
{
action: "submit",
label: 'Request Roll',
callback: (event, button, dialog) => {
const form = button.form;
const formDataObject = new foundry.applications.ux.FormDataExtended(form).object;
console.log(formDataObject);
const rollMod = parseInt(formDataObject.mod);
const rollModDesc = formDataObject.modDesc;
const rollParts = formDataObject.trait.split('|');
const rollType = rollParts[0] === 'a' ? 'attribute' : 'skill';
const rollDesc = rollParts[1];
const targetNumber = parseInt(formDataObject.tn);
const options = { targetNumber };
if (rollMod !== 0) {
options.mods = [{ label: rollModDesc, value: rollMod }];
}
requestRollFromTokens(tokens, rollType, rollDesc, options);
},
},
{
action: "cancel", label: 'Cancel',
},
];
new foundry.applications.api.DialogV2({
window { title: 'Request roll' },
content,
buttons,
}).render(true);
for (const skill of Array.from(skillSet).sort()) {
menuData.inputs[1].options.push(
{ html: `Skill | ${skill}`, value: `s|${skill}` })
}
menuData.inputs[1].options.push(
{ html: 'Skill | Untrained', value: 's|NOSKILL' })
const result = await warpgate.menu(menuData, menuConfig)
if (result.buttons !== 'ok') {
return
}
console.log(result)
const rollMod = result.inputs[2]
const rollModDesc = result.inputs[3]
const rollParts = result.inputs[1].split('|')
const rollType = (rollParts[0] === 'a' ? 'attribute' : 'skill')
const rollDesc = rollParts[1]
const targetNumber = result.inputs[4] || 4
const options = { targetNumber }
if (rollMod !== 0) {
options.mods = [{ label: rollModDesc, value: rollMod }]
}
requestRollFromTokens(tokens, rollType, rollDesc, options)
}
main();
main()

View File

@ -1,156 +1,123 @@
const argBright = typeof args === 'undefined' ? null : args.length > 0 ? args[0] : null;
const argBright = typeof args === 'undefined' ? null : args.length > 0 ? args[0] : null
// argument can be one of 'bright', 'dim', 'dark', 'pitchdark'. Other values
// will guess based on scene darkness
const BRIGHT_LEVELS = ['bright', 'dim', 'dark', 'pitchdark'];
const BRIGHT_LEVELS = ['bright', 'dim', 'dark', 'pitchdark']
const THRESHOLDS = {
dim: 0.4,
dark: 0.6,
pitchdark: 0.8,
};
pitchdark: 0.8
}
const RANGES = {
basic: {
bright: 25,
dim: 25,
dark: 10,
pitchdark: 0,
pitchdark: 0
},
lowlight: {
bright: 25,
dim: 25,
dark: 10,
pitchdark: 0,
pitchdark: 0
},
darkvision: {
bright: 25,
dim: 25,
dark: 10,
pitchdark: 10,
pitchdark: 10
},
nightvision: {
bright: 200,
dim: 200,
dark: 200,
pitchdark: 200,
pitchdark: 200
},
blindsense: {
bright: 5,
dim: 5,
dark: 5,
pitchdark: 5,
},
};
pitchdark: 5
}
}
const SIGHT_NAMES = {
lowlight: 'low-light-vision',
darkvision: 'darkvision',
nightvision: 'night-vision',
blindsense: 'blindsense',
};
blindsense: 'blindsense'
}
const SIGHT_MODES = {
lowlight: 'lowlight',
darkvision: 'darkvision',
nightvision: 'darkvision',
basic: 'basic',
blindsense: 'blindsense',
};
function findAbility(token, swid) {
return token.actor.items.find((i) => i.type === 'ability' && i.system.swid === swid);
blindsense: 'blindsense'
}
async function main() {
const scene = game.scenes.current;
let sceneBright = BRIGHT_LEVELS[0];
function findAbility (token, swid) {
return token.actor.items.find(i => i.type === 'ability' && i.system.swid === swid)
}
async function main () {
const scene = game.scenes.current
let sceneBright = BRIGHT_LEVELS[0]
if (scene.darkness > THRESHOLDS.pitchdark) {
sceneBright = BRIGHT_LEVELS[3];
sceneBright = BRIGHT_LEVELS[3]
} else if (scene.darkness > THRESHOLDS.dark) {
sceneBright = BRIGHT_LEVELS[2];
sceneBright = BRIGHT_LEVELS[2]
} else if (scene.darkness > THRESHOLDS.dim) {
sceneBright = BRIGHT_LEVELS[1];
sceneBright = BRIGHT_LEVELS[1]
}
let bright = sceneBright;
let bright = sceneBright
if (argBright && BRIGHT_LEVELS.includes(argBright)) {
bright = argBright;
bright = argBright
}
const menuData = {
inputs: [
{ type: 'radio', label: 'Bright Light', options: ['bright', bright === BRIGHT_LEVELS[0]] },
{ type: 'radio', label: 'Dim Light', options: ['bright', bright === BRIGHT_LEVELS[1]] },
{ type: 'radio', label: 'Dark', options: ['bright', bright === BRIGHT_LEVELS[2]] },
{ type: 'radio', label: 'Pitch Dark', options: ['bright', bright === BRIGHT_LEVELS[3]] }
],
buttons: [
{ label: 'Select Scene Brightness', value: 'ok', default: true },
{ label: 'Cancel', value: 'cancel' }
]
}
const menuConfig = { title: 'Select scene brightness' }
const result = await warpgate.menu(menuData, menuConfig)
if (result.buttons !== 'ok') { return }
for (let i = 0; i < 4; i++) {
if (result.inputs[i]) { bright = BRIGHT_LEVELS[i] }
}
new foundry.applications.api.DialogV2({
window: { title: 'Select scene brightness' },
content: `
<form>
<h2>Set token vision</h2>
<p>All tokens with vision will be adjusted</p>
<div class="form-group">
<label class="checkbox">
<input type="radio" name="bright" value="${BRIGHT_LEVELS[0]}"
${bright === BRIGHT_LEVELS[0] ? 'checked' : ''}/>
Bright Light
</label>
</div>
<div class="form-group">
<label class="checkbox">
<input type="radio" name="bright" value="${BRIGHT_LEVELS[1]}"
${bright === BRIGHT_LEVELS[1] ? 'checked' : ''}/>
Dim Light
</label>
</div>
<div class="form-group">
<label class="checkbox">
<input type="radio" name="bright" value="${BRIGHT_LEVELS[2]}"
${bright === BRIGHT_LEVELS[2] ? 'checked' : ''}/>
Dark
</label>
</div>
<div class="form-group">
<label class="checkbox">
<input type="radio" name="bright" value="${BRIGHT_LEVELS[3]}"
${bright === BRIGHT_LEVELS[3] ? 'checked' : ''}/>
Pitch Dark
</label>
</div>
</form>
`,
buttons: [
{
action: "submit",
label: 'Select scene Brightness',
value: 'ok',
callback: (event, button, dialog) => {
const form = button.form;
const formDataObject = new foundry.applications.ux.FormDataExtended(form).object;
console.log('form data', formDataObject, form);
bright = formDataObject.bright;
for (const tokenId of scene.tokens.map((t) => t.id)) {
const token = scene.tokens.get(tokenId);
if (!token.sight.enabled) {
console.log(`Skipping ${token.name}, vision not enabled`);
continue;
// don't set sight on a token where it's not enabled
}
let sightType = 'basic';
for (const sight in SIGHT_NAMES) {
if (findAbility(token, SIGHT_NAMES[sight])) {
sightType = sight;
}
}
const range = RANGES[sightType][bright];
const sightMode = SIGHT_MODES[sightType];
const visionModeData = CONFIG.Canvas.visionModes[sightMode].vision.defaults;
const data = {
'sight.range': range,
'sight.visionMode': sightMode,
'sight.attenuation': visionModeData.attenuation,
'sight.brightness': visionModeData.brightness,
'sight.saturation': visionModeData.saturation,
'sight.contrast': visionModeData.contrast,
};
console.log(`Updating ${token.name}:`, sightType, bright, data);
token.update(data);
}
},
},
{ action: "cancel", label: 'Cancel' },
],
}).render(true);
for (const tokenId of scene.tokens.map(t => t.id)) {
const token = scene.tokens.get(tokenId)
if (!token.sight.enabled) {
console.log(`Skipping ${token.name}, vision not enabled`)
continue
// don't set sight on a token where it's not enabled
}
let sightType = 'basic'
for (const sight in SIGHT_NAMES) {
if (findAbility(token, SIGHT_NAMES[sight])) {
sightType = sight
}
}
const range = RANGES[sightType][bright]
const sightMode = SIGHT_MODES[sightType]
const visionModeData = CONFIG.Canvas.visionModes[sightMode].vision.defaults
const data = {
'sight.range': range,
'sight.visionMode': sightMode,
'sight.attenuation': visionModeData.attenuation,
'sight.brightness': visionModeData.brightness,
'sight.saturation': visionModeData.saturation,
'sight.contrast': visionModeData.contrast
}
console.log(`Updating ${token.name}:`, sightType, bright, data)
await token.update(data)
}
}
main();
main()

3191
package-lock.json generated
View File

@ -14,41 +14,35 @@
"@rollup/stream": "^3.0.1",
"@typhonjs-fvtt/eslint-config-foundry.js": "^0.8.0",
"eslint": "^9.2.0",
"eslint-config-prettier": "^10.1.5",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3",
"fs-extra": "^11.2.0",
"gulp": "^5.0.0",
"gulp-dart-sass": "^1.1.0",
"gulp-sourcemaps": "^2.6.5",
"gulp-sourcemaps": "^3.0.0",
"husky": "^9.0.11",
"lint-staged": "^16.1.0",
"lint-staged": "^15.2.2",
"prettier": "^3.2.5",
"prettier-eslint": "^16.3.0",
"prettier-eslint-cli": "^8.0.1",
"rollup": "^2.79.2",
"typescript": "^5.7.3",
"typescript-language-server": "^4.3.3",
"rollup": "^2.79.1",
"typescript": "^5.4.5",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0",
"vscode-langservers-extracted": "^4.10.0",
"yargs": "^18.0.0"
"yargs": "^17.7.2"
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
"integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
"integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
"dev": true,
"license": "MIT",
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
"eslint-visitor-keys": "^3.3.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
},
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
@ -58,7 +52,6 @@
"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"
},
@ -67,59 +60,19 @@
}
},
"node_modules/@eslint-community/regexpp": {
"version": "4.12.1",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
"integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
"version": "4.10.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/config-array": {
"version": "0.20.0",
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
"integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@eslint/object-schema": "^2.1.6",
"debug": "^4.3.1",
"minimatch": "^3.1.2"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/config-helpers": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
"integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/core": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
"integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@types/json-schema": "^7.0.15"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
"integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz",
"integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==",
"dev": true,
"license": "MIT",
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
@ -139,65 +92,35 @@
}
},
"node_modules/@eslint/js": {
"version": "9.27.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz",
"integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==",
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz",
"integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://eslint.org/donate"
}
},
"node_modules/@eslint/object-schema": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
"integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/plugin-kit": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz",
"integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@eslint/core": "^0.14.0",
"levn": "^0.4.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@gulp-sourcemaps/identity-map": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz",
"integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz",
"integrity": "sha512-Tb+nSISZku+eQ4X1lAkevcQa+jknn/OVUgZ3XCxEKIsLsqYuPoJwJOPQeaOk75X3WPftb29GWY1eqE7GLsXb1Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"acorn": "^5.0.3",
"css": "^2.2.1",
"normalize-path": "^2.1.1",
"acorn": "^6.4.1",
"normalize-path": "^3.0.0",
"postcss": "^7.0.16",
"source-map": "^0.6.0",
"through2": "^2.0.3"
"through2": "^3.0.1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/@gulp-sourcemaps/identity-map/node_modules/acorn": {
"version": "5.7.4",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
"integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
"integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
"dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@ -205,17 +128,14 @@
"node": ">=0.4.0"
}
},
"node_modules/@gulp-sourcemaps/identity-map/node_modules/normalize-path": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
"node_modules/@gulp-sourcemaps/identity-map/node_modules/through2": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
"integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"remove-trailing-separator": "^1.0.1"
},
"engines": {
"node": ">=0.10.0"
"inherits": "^2.0.4",
"readable-stream": "2 || 3"
}
},
"node_modules/@gulp-sourcemaps/map-sources": {
@ -223,7 +143,6 @@
"resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz",
"integrity": "sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==",
"dev": true,
"license": "MIT",
"dependencies": {
"normalize-path": "^2.0.1",
"through2": "^2.0.3"
@ -237,7 +156,6 @@
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"remove-trailing-separator": "^1.0.1"
},
@ -250,7 +168,6 @@
"resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz",
"integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10.13.0"
}
@ -260,7 +177,6 @@
"resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz",
"integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-negated-glob": "^1.0.0"
},
@ -268,51 +184,11 @@
"node": ">=10.13.0"
}
},
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
"integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=18.18.0"
}
},
"node_modules/@humanfs/node": {
"version": "0.16.6",
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
"integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@humanfs/core": "^0.19.1",
"@humanwhocodes/retry": "^0.3.0"
},
"engines": {
"node": ">=18.18.0"
}
},
"node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
"integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=18.18"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/nzakas"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
"integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
"deprecated": "Use @eslint/config-array instead",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@humanwhocodes/object-schema": "^2.0.3",
"debug": "^4.3.1",
@ -327,7 +203,6 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=12.22"
},
@ -340,16 +215,13 @@
"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"
"dev": true
},
"node_modules/@humanwhocodes/retry": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
"integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz",
"integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=18.18"
},
@ -363,7 +235,6 @@
"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",
@ -377,11 +248,10 @@
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"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"
},
@ -394,7 +264,6 @@
"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"
},
@ -406,15 +275,13 @@
"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"
"dev": true
},
"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",
@ -432,7 +299,6 @@
"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"
},
@ -448,7 +314,6 @@
"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",
@ -466,7 +331,6 @@
"resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
"integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@sinclair/typebox": "^0.27.8"
},
@ -475,11 +339,10 @@
}
},
"node_modules/@messageformat/core": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.4.0.tgz",
"integrity": "sha512-NgCFubFFIdMWJGN5WuQhHCNmzk7QgiVfrViFxcS99j7F5dDS5EP6raR54I+2ydhe4+5/XTn/YIEppFaqqVWHsw==",
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.3.0.tgz",
"integrity": "sha512-YcXd3remTDdeMxAlbvW6oV9d/01/DZ8DHUFwSttO3LMzIZj3iO0NRw+u1xlsNNORFI+u0EQzD52ZX3+Udi0T3g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@messageformat/date-skeleton": "^1.0.0",
"@messageformat/number-skeleton": "^1.0.0",
@ -490,25 +353,22 @@
}
},
"node_modules/@messageformat/date-skeleton": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.1.0.tgz",
"integrity": "sha512-rmGAfB1tIPER+gh3p/RgA+PVeRE/gxuQ2w4snFWPF5xtb5mbWR7Cbw7wCOftcUypbD6HVoxrVdyyghPm3WzP5A==",
"dev": true,
"license": "MIT"
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.1.tgz",
"integrity": "sha512-jPXy8fg+WMPIgmGjxSlnGJn68h/2InfT0TNSkVx0IGXgp4ynnvYkbZ51dGWmGySEK+pBiYUttbQdu5XEqX5CRg==",
"dev": true
},
"node_modules/@messageformat/number-skeleton": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.2.0.tgz",
"integrity": "sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/@messageformat/parser": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.1.tgz",
"integrity": "sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==",
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.0.tgz",
"integrity": "sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"moo": "^0.5.1"
}
@ -518,7 +378,6 @@
"resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz",
"integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==",
"dev": true,
"license": "MIT",
"dependencies": {
"make-plural": "^7.0.0"
}
@ -528,7 +387,6 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
@ -542,7 +400,6 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
}
@ -552,7 +409,6 @@
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
@ -561,367 +417,51 @@
"node": ">= 8"
}
},
"node_modules/@parcel/watcher": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
"integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"dependencies": {
"detect-libc": "^1.0.3",
"is-glob": "^4.0.3",
"micromatch": "^4.0.5",
"node-addon-api": "^7.0.0"
},
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
"@parcel/watcher-android-arm64": "2.5.1",
"@parcel/watcher-darwin-arm64": "2.5.1",
"@parcel/watcher-darwin-x64": "2.5.1",
"@parcel/watcher-freebsd-x64": "2.5.1",
"@parcel/watcher-linux-arm-glibc": "2.5.1",
"@parcel/watcher-linux-arm-musl": "2.5.1",
"@parcel/watcher-linux-arm64-glibc": "2.5.1",
"@parcel/watcher-linux-arm64-musl": "2.5.1",
"@parcel/watcher-linux-x64-glibc": "2.5.1",
"@parcel/watcher-linux-x64-musl": "2.5.1",
"@parcel/watcher-win32-arm64": "2.5.1",
"@parcel/watcher-win32-ia32": "2.5.1",
"@parcel/watcher-win32-x64": "2.5.1"
}
},
"node_modules/@parcel/watcher-android-arm64": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
"integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-darwin-arm64": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
"integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-darwin-x64": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
"integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-freebsd-x64": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
"integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-linux-arm-glibc": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
"integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-linux-arm-musl": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
"integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-linux-arm64-glibc": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
"integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-linux-arm64-musl": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
"integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-linux-x64-glibc": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
"integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-linux-x64-musl": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
"integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-win32-arm64": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
"integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-win32-ia32": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
"integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/@parcel/watcher-win32-x64": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
"integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"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/@pkgr/core": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz",
"integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==",
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
"integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/pkgr"
"url": "https://opencollective.com/unts"
}
},
"node_modules/@prettier/eslint": {
"name": "prettier-eslint",
"version": "16.4.2",
"resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.4.2.tgz",
"integrity": "sha512-vtJAQEkaN8fW5QKl08t7A5KCjlZuDUNeIlr9hgolMS5s3+uzbfRHDwaRnzrdqnY2YpHDmeDS/8zY0MKQHXJtaA==",
"version": "16.3.0",
"resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz",
"integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/parser": "^6.21.0",
"common-tags": "^1.8.2",
"dlv": "^1.1.3",
"eslint": "^8.57.1",
"@typescript-eslint/parser": "^6.7.5",
"common-tags": "^1.4.0",
"dlv": "^1.1.0",
"eslint": "^8.7.0",
"indent-string": "^4.0.0",
"lodash.merge": "^4.6.2",
"lodash.merge": "^4.6.0",
"loglevel-colored-level-prefix": "^1.0.0",
"prettier": "^3.5.3",
"prettier": "^3.0.1",
"pretty-format": "^29.7.0",
"require-relative": "^0.8.7",
"tslib": "^2.8.1",
"vue-eslint-parser": "^9.4.3"
"typescript": "^5.2.2",
"vue-eslint-parser": "^9.1.0"
},
"engines": {
"node": ">=16.10.0"
},
"funding": {
"url": "https://opencollective.com/prettier-eslint"
},
"peerDependencies": {
"prettier-plugin-svelte": "^3.0.0",
"svelte-eslint-parser": "*"
@ -940,7 +480,6 @@
"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",
@ -960,21 +499,33 @@
}
},
"node_modules/@prettier/eslint/node_modules/@eslint/js": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"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/@prettier/eslint/node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
"dev": true,
"dependencies": {
"@humanwhocodes/object-schema": "^2.0.2",
"debug": "^4.3.1",
"minimatch": "^3.0.5"
},
"engines": {
"node": ">=10.10.0"
}
},
"node_modules/@prettier/eslint/node_modules/@typescript-eslint/parser": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
"integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@typescript-eslint/scope-manager": "6.21.0",
"@typescript-eslint/types": "6.21.0",
@ -998,29 +549,17 @@
}
}
},
"node_modules/@prettier/eslint/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@prettier/eslint/node_modules/eslint": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"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.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.57.1",
"@humanwhocodes/config-array": "^0.13.0",
"@eslint/js": "8.57.0",
"@humanwhocodes/config-array": "^0.11.14",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
@ -1070,7 +609,6 @@
"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"
@ -1087,7 +625,6 @@
"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"
},
@ -1100,7 +637,6 @@
"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",
@ -1118,7 +654,6 @@
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"license": "MIT",
"dependencies": {
"flat-cache": "^3.0.4"
},
@ -1131,7 +666,6 @@
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
"integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
"license": "MIT",
"dependencies": {
"flatted": "^3.2.9",
"keyv": "^4.5.3",
@ -1146,7 +680,6 @@
"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"
},
@ -1157,25 +690,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@prettier/eslint/node_modules/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/@prettier/eslint/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"
},
@ -1184,15 +703,15 @@
}
},
"node_modules/@rollup/plugin-node-resolve": {
"version": "15.3.1",
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz",
"integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==",
"version": "15.2.3",
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz",
"integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^5.0.1",
"@types/resolve": "1.20.2",
"deepmerge": "^4.2.2",
"is-builtin-module": "^3.2.1",
"is-module": "^1.0.0",
"resolve": "^1.22.1"
},
@ -1209,15 +728,14 @@
}
},
"node_modules/@rollup/pluginutils": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
"integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
"integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
"estree-walker": "^2.0.2",
"picomatch": "^4.0.2"
"picomatch": "^2.3.1"
},
"engines": {
"node": ">=14.0.0"
@ -1236,7 +754,6 @@
"resolved": "https://registry.npmjs.org/@rollup/stream/-/stream-3.0.1.tgz",
"integrity": "sha512-wdzoakLc9UiPOFa1k17ukfEtvQ0p7JuNFvOZT1DhO5Z5CrTf71An01U9+v+aebYcaLCwy3tLwpCSUF7K7xVN0A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 14.0.0"
},
@ -1248,36 +765,25 @@
"version": "0.27.8",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
"integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/@types/estree": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
"integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true,
"license": "MIT"
"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
},
"node_modules/@types/resolve": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
"integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "6.21.0",
"@typescript-eslint/visitor-keys": "6.21.0"
@ -1295,7 +801,6 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
"integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^16.0.0 || >=18.0.0"
},
@ -1309,7 +814,6 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
"integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@typescript-eslint/types": "6.21.0",
"@typescript-eslint/visitor-keys": "6.21.0",
@ -1338,7 +842,6 @@
"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"
}
@ -1348,7 +851,6 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@ -1360,11 +862,10 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"version": "7.6.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
"integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@ -1377,7 +878,6 @@
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
"integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "6.21.0",
"eslint-visitor-keys": "^3.4.1"
@ -1395,7 +895,6 @@
"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"
},
@ -1407,29 +906,19 @@
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/@typhonjs-fvtt/eslint-config-foundry.js/-/eslint-config-foundry.js-0.8.0.tgz",
"integrity": "sha512-Fu1XDS747exX5zVwty4VSwlOwkuzdnnN15C5w66uG4hOpJnPCZU/jcyEOCf9bazRPp06Smimn+mKd9OjrCvuuw==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/@ungap/structured-clone": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
"dev": true,
"license": "ISC"
},
"node_modules/@vscode/l10n": {
"version": "0.0.18",
"resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz",
"integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==",
"dev": true,
"license": "MIT"
"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
},
"node_modules/acorn": {
"version": "8.14.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
"integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
"version": "8.11.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
"dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@ -1442,7 +931,6 @@
"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"
}
@ -1452,7 +940,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",
@ -1469,7 +956,6 @@
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
"integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-wrap": "^0.1.0"
},
@ -1478,29 +964,24 @@
}
},
"node_modules/ansi-escapes": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
"integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
"integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
"dev": true,
"license": "MIT",
"dependencies": {
"environment": "^1.0.0"
},
"engines": {
"node": ">=18"
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ansi-regex": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
"integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
"node": ">=8"
}
},
"node_modules/ansi-styles": {
@ -1508,7 +989,6 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
@ -1524,7 +1004,6 @@
"resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
"integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -1534,7 +1013,6 @@
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@ -1543,32 +1021,17 @@
"node": ">= 8"
}
},
"node_modules/anymatch/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"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"
"dev": true
},
"node_modules/arr-diff": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
"integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -1578,7 +1041,6 @@
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
"integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -1588,7 +1050,6 @@
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
"integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -1598,7 +1059,6 @@
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
"integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -1608,7 +1068,6 @@
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -1618,7 +1077,6 @@
"resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
"integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -1628,7 +1086,6 @@
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
"integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -1638,7 +1095,6 @@
"resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz",
"integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==",
"dev": true,
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.4.4",
"once": "^1.4.0",
@ -1653,7 +1109,6 @@
"resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz",
"integrity": "sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==",
"dev": true,
"license": "MIT",
"dependencies": {
"async-done": "^2.0.0"
},
@ -1666,7 +1121,6 @@
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
"dev": true,
"license": "(MIT OR Apache-2.0)",
"bin": {
"atob": "bin/atob.js"
},
@ -1674,19 +1128,11 @@
"node": ">= 4.5.0"
}
},
"node_modules/b4a": {
"version": "1.6.7",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
"integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/bach": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz",
"integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==",
"dev": true,
"license": "MIT",
"dependencies": {
"async-done": "^2.0.0",
"async-settle": "^2.0.0",
@ -1700,15 +1146,13 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/bare-events": {
"version": "2.5.4",
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz",
"integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==",
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz",
"integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==",
"dev": true,
"license": "Apache-2.0",
"optional": true
},
"node_modules/base64-js": {
@ -1729,15 +1173,13 @@
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
]
},
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
},
@ -1750,45 +1192,34 @@
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
"integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
"dev": true,
"license": "MIT",
"dependencies": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
}
},
"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,
"license": "ISC"
},
"node_modules/boolify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/boolify/-/boolify-1.0.1.tgz",
"integrity": "sha512-ma2q0Tc760dW54CdOyJjhrg/a54317o1zYADQJFgperNGKIKgAUGIcKnuMiff8z57+yGlrGNEt4lPgZfCgTJgA==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.1.1"
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
@ -1813,18 +1244,28 @@
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
}
},
"node_modules/builtin-modules": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
"integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
"dev": true,
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"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"
}
@ -1834,7 +1275,6 @@
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz",
"integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=16"
},
@ -1847,7 +1287,6 @@
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-9.1.3.tgz",
"integrity": "sha512-Rircqi9ch8AnZscQcsA1C47NFdaO3wukpmIRzYcDOrmvgt78hM/sj5pZhZNec2NM12uk5vTwRHZ4anGcrC4ZTg==",
"dev": true,
"license": "MIT",
"dependencies": {
"camelcase": "^8.0.0",
"map-obj": "5.0.0",
@ -1866,7 +1305,6 @@
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@ -1883,7 +1321,6 @@
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@ -1908,7 +1345,6 @@
"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"
},
@ -1917,16 +1353,15 @@
}
},
"node_modules/cli-cursor": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
"integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
"integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
"dev": true,
"license": "MIT",
"dependencies": {
"restore-cursor": "^5.0.0"
"restore-cursor": "^4.0.0"
},
"engines": {
"node": ">=18"
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@ -1937,7 +1372,6 @@
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
"integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
"dev": true,
"license": "MIT",
"dependencies": {
"slice-ansi": "^5.0.0",
"string-width": "^7.0.0"
@ -1950,11 +1384,10 @@
}
},
"node_modules/cli-truncate/node_modules/ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"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"
},
@ -1963,18 +1396,16 @@
}
},
"node_modules/cli-truncate/node_modules/emoji-regex": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
"integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
"dev": true,
"license": "MIT"
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
"integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
"dev": true
},
"node_modules/cli-truncate/node_modules/string-width": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
"integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
"get-east-asian-width": "^1.0.0",
@ -1992,7 +1423,6 @@
"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"
},
@ -2004,72 +1434,34 @@
}
},
"node_modules/cliui": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
"integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
"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": "^7.2.0",
"strip-ansi": "^7.1.0",
"wrap-ansi": "^9.0.0"
},
"engines": {
"node": ">=20"
}
},
"node_modules/cliui/node_modules/ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/cliui/node_modules/emoji-regex": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
"integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
"dev": true,
"license": "MIT"
},
"node_modules/cliui/node_modules/string-width": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
"get-east-asian-width": "^1.0.0",
"strip-ansi": "^7.1.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/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"
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/cliui/node_modules/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,
"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/strip-ansi?sponsor=1"
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/clone": {
@ -2077,7 +1469,6 @@
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8"
}
@ -2087,7 +1478,6 @@
"resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
"integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.10"
}
@ -2096,15 +1486,13 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
"integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/cloneable-readable": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
"integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"inherits": "^2.0.1",
"process-nextick-args": "^2.0.0",
@ -2116,7 +1504,6 @@
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
@ -2128,24 +1515,21 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/colorette": {
"version": "2.0.20",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/commander": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz",
"integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==",
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
"integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20"
"node": ">=16"
}
},
"node_modules/common-tags": {
@ -2153,7 +1537,6 @@
"resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
"integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4.0.0"
}
@ -2162,22 +1545,19 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true,
"license": "MIT"
"dev": true
},
"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,
"license": "MIT"
"dev": true
},
"node_modules/copy-props": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz",
"integrity": "sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==",
"dev": true,
"license": "MIT",
"dependencies": {
"each-props": "^3.0.0",
"is-plain-object": "^5.0.0"
@ -2187,12 +1567,11 @@
}
},
"node_modules/core-js": {
"version": "3.42.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz",
"integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==",
"version": "3.37.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz",
"integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
@ -2202,15 +1581,13 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@ -2221,46 +1598,14 @@
}
},
"node_modules/css": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
"integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz",
"integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"inherits": "^2.0.4",
"source-map": "^0.6.1",
"source-map-resolve": "^0.5.2",
"urix": "^0.1.0"
}
},
"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"
"source-map-resolve": "^0.6.0"
}
},
"node_modules/d": {
@ -2268,7 +1613,6 @@
"resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
"integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
"dev": true,
"license": "ISC",
"dependencies": {
"es5-ext": "^0.10.64",
"type": "^2.7.2"
@ -2278,13 +1622,12 @@
}
},
"node_modules/debug": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
@ -2300,7 +1643,6 @@
"resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz",
"integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "3.X",
"memoizee": "0.4.X",
@ -2312,7 +1654,6 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.1"
}
@ -2322,7 +1663,6 @@
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
"integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10"
}
@ -2331,15 +1671,13 @@
"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,
"license": "MIT"
"dev": true
},
"node_modules/deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -2349,31 +1687,15 @@
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
"integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/detect-libc": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
"bin": {
"detect-libc": "bin/detect-libc.js"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/detect-newline": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
"integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -2383,7 +1705,6 @@
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-type": "^4.0.0"
},
@ -2395,15 +1716,13 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"esutils": "^2.0.2"
},
@ -2411,71 +1730,11 @@
"node": ">=6.0.0"
}
},
"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,
"license": "MIT",
"dependencies": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
"entities": "^4.2.0"
},
"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": ">= 4"
},
"funding": {
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/domutils": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
"integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
"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/each-props": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz",
"integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-plain-object": "^5.0.0",
"object.defaults": "^1.1.0"
@ -2488,59 +1747,29 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"dev": true,
"license": "MIT"
"dev": true
},
"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,
"license": "MIT"
"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==",
"dev": true,
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
}
},
"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/environment": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
"integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/es5-ext": {
"version": "0.10.64",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
"integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
"dev": true,
"hasInstallScript": true,
"license": "ISC",
"dependencies": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
@ -2556,7 +1785,6 @@
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"dev": true,
"license": "MIT",
"dependencies": {
"d": "1",
"es5-ext": "^0.10.35",
@ -2568,7 +1796,6 @@
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
"integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
"dev": true,
"license": "ISC",
"dependencies": {
"d": "^1.0.2",
"ext": "^1.7.0"
@ -2582,7 +1809,6 @@
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
"integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
"dev": true,
"license": "ISC",
"dependencies": {
"d": "1",
"es5-ext": "^0.10.46",
@ -2591,11 +1817,10 @@
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"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"
}
@ -2605,7 +1830,6 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
@ -2614,34 +1838,28 @@
}
},
"node_modules/eslint": {
"version": "9.27.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz",
"integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==",
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz",
"integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.20.0",
"@eslint/config-helpers": "^0.2.1",
"@eslint/core": "^0.14.0",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.27.0",
"@eslint/plugin-kit": "^0.3.1",
"@humanfs/node": "^0.16.6",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^3.0.2",
"@eslint/js": "9.2.0",
"@humanwhocodes/config-array": "^0.13.0",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
"@types/estree": "^1.0.6",
"@types/json-schema": "^7.0.15",
"@humanwhocodes/retry": "^0.2.3",
"@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.6",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^8.3.0",
"eslint-visitor-keys": "^4.2.0",
"espree": "^10.3.0",
"esquery": "^1.5.0",
"eslint-scope": "^8.0.1",
"eslint-visitor-keys": "^4.0.0",
"espree": "^10.0.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^8.0.0",
@ -2650,11 +1868,15 @@
"ignore": "^5.2.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"is-path-inside": "^3.0.3",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.3"
"optionator": "^0.9.3",
"strip-ansi": "^6.0.1",
"text-table": "^0.2.0"
},
"bin": {
"eslint": "bin/eslint.js"
@ -2663,42 +1885,29 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://eslint.org/donate"
},
"peerDependencies": {
"jiti": "*"
},
"peerDependenciesMeta": {
"jiti": {
"optional": true
}
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-config-prettier": {
"version": "10.1.5",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz",
"integrity": "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==",
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
"integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
"dev": true,
"license": "MIT",
"bin": {
"eslint-config-prettier": "bin/cli.js"
},
"funding": {
"url": "https://opencollective.com/eslint-config-prettier"
},
"peerDependencies": {
"eslint": ">=7.0.0"
}
},
"node_modules/eslint-plugin-prettier": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz",
"integrity": "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==",
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz",
"integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==",
"dev": true,
"license": "MIT",
"dependencies": {
"prettier-linter-helpers": "^1.0.0",
"synckit": "^0.11.0"
"synckit": "^0.8.6"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@ -2709,7 +1918,7 @@
"peerDependencies": {
"@types/eslint": ">=8.0.0",
"eslint": ">=8.0.0",
"eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0",
"eslint-config-prettier": "*",
"prettier": ">=3.0.0"
},
"peerDependenciesMeta": {
@ -2722,11 +1931,10 @@
}
},
"node_modules/eslint-scope": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
"integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz",
"integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
@ -2739,11 +1947,10 @@
}
},
"node_modules/eslint-visitor-keys": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
"integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
"integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@ -2756,7 +1963,6 @@
"resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
"integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
"dev": true,
"license": "ISC",
"dependencies": {
"d": "^1.0.1",
"es5-ext": "^0.10.62",
@ -2768,15 +1974,14 @@
}
},
"node_modules/espree": {
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
"integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
"integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"acorn": "^8.14.0",
"acorn": "^8.11.3",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^4.2.0"
"eslint-visitor-keys": "^4.0.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -2786,11 +1991,10 @@
}
},
"node_modules/esquery": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"estraverse": "^5.1.0"
},
@ -2803,7 +2007,6 @@
"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"
},
@ -2816,7 +2019,6 @@
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
@ -2825,15 +2027,13 @@
"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,
"license": "MIT"
"dev": true
},
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.10.0"
}
@ -2843,7 +2043,6 @@
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
"dev": true,
"license": "MIT",
"dependencies": {
"d": "1",
"es5-ext": "~0.10.14"
@ -2853,15 +2052,36 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
"dev": true
},
"node_modules/execa": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
"integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
"dev": true,
"license": "MIT"
"dependencies": {
"cross-spawn": "^7.0.3",
"get-stream": "^8.0.1",
"human-signals": "^5.0.0",
"is-stream": "^3.0.0",
"merge-stream": "^2.0.0",
"npm-run-path": "^5.1.0",
"onetime": "^6.0.0",
"signal-exit": "^4.1.0",
"strip-final-newline": "^3.0.0"
},
"engines": {
"node": ">=16.17"
},
"funding": {
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/expand-tilde": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
"integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==",
"dev": true,
"license": "MIT",
"dependencies": {
"homedir-polyfill": "^1.0.1"
},
@ -2874,7 +2094,6 @@
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"dev": true,
"license": "ISC",
"dependencies": {
"type": "^2.7.2"
}
@ -2883,15 +2102,13 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/extend-shallow": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
"integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"assign-symbols": "^1.0.0",
"is-extendable": "^1.0.1"
@ -2904,35 +2121,31 @@
"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,
"license": "MIT"
"dev": true
},
"node_modules/fast-diff": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
"integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
"dev": true,
"license": "Apache-2.0"
"dev": true
},
"node_modules/fast-fifo": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
"integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/fast-glob": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"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",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.8"
"micromatch": "^4.0.4"
},
"engines": {
"node": ">=8.6.0"
@ -2943,7 +2156,6 @@
"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"
},
@ -2955,32 +2167,28 @@
"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,
"license": "MIT"
"dev": true
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/fastest-levenshtein": {
"version": "1.0.16",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
"integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4.9.1"
}
},
"node_modules/fastq": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
"integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
"dev": true,
"license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
}
@ -2990,7 +2198,6 @@
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"flat-cache": "^4.0.0"
},
@ -2999,11 +2206,10 @@
}
},
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
@ -3016,7 +2222,6 @@
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"license": "MIT",
"dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
@ -3033,7 +2238,6 @@
"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz",
"integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"detect-file": "^1.0.0",
"is-glob": "^4.0.3",
@ -3049,7 +2253,6 @@
"resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz",
"integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==",
"dev": true,
"license": "MIT",
"dependencies": {
"expand-tilde": "^2.0.2",
"is-plain-object": "^5.0.0",
@ -3066,7 +2269,6 @@
"resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz",
"integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.13.0"
}
@ -3076,7 +2278,6 @@
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"dev": true,
"license": "MIT",
"dependencies": {
"flatted": "^3.2.9",
"keyv": "^4.5.4"
@ -3086,18 +2287,16 @@
}
},
"node_modules/flatted": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
"integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
"dev": true,
"license": "ISC"
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
"dev": true
},
"node_modules/for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
"integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -3107,7 +2306,6 @@
"resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
"integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==",
"dev": true,
"license": "MIT",
"dependencies": {
"for-in": "^1.0.1"
},
@ -3116,13 +2314,12 @@
}
},
"node_modules/foreground-child": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
"integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
"dev": true,
"license": "ISC",
"dependencies": {
"cross-spawn": "^7.0.6",
"cross-spawn": "^7.0.0",
"signal-exit": "^4.0.1"
},
"engines": {
@ -3133,11 +2330,10 @@
}
},
"node_modules/fs-extra": {
"version": "11.3.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
"integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
"integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
@ -3152,7 +2348,6 @@
"resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz",
"integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.8",
"streamx": "^2.12.0"
@ -3165,8 +2360,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true,
"license": "ISC"
"dev": true
},
"node_modules/fsevents": {
"version": "2.3.3",
@ -3174,7 +2368,6 @@
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
@ -3188,7 +2381,6 @@
"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"
}
@ -3198,17 +2390,15 @@
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true,
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-east-asian-width": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
"integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz",
"integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
@ -3221,7 +2411,6 @@
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
"integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
@ -3229,23 +2418,36 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"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==",
"node_modules/get-stream": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
"integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
"dev": true,
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/glob": {
"version": "10.3.15",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz",
"integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==",
"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"
"jackspeak": "^2.3.6",
"minimatch": "^9.0.1",
"minipass": "^7.0.4",
"path-scurry": "^1.11.0"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
"node": ">=16 || 14 >=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
@ -3255,7 +2457,6 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.3"
},
@ -3268,7 +2469,6 @@
"resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz",
"integrity": "sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@gulpjs/to-absolute-glob": "^4.0.0",
"anymatch": "^3.1.3",
@ -3288,7 +2488,6 @@
"resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz",
"integrity": "sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==",
"dev": true,
"license": "MIT",
"dependencies": {
"async-done": "^2.0.0",
"chokidar": "^3.5.3"
@ -3302,17 +2501,15 @@
"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/glob/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"version": "9.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@ -3328,7 +2525,6 @@
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
"integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
"dev": true,
"license": "MIT",
"dependencies": {
"global-prefix": "^1.0.1",
"is-windows": "^1.0.1",
@ -3343,7 +2539,6 @@
"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
"integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
"dev": true,
"license": "MIT",
"dependencies": {
"expand-tilde": "^2.0.2",
"homedir-polyfill": "^1.0.1",
@ -3360,7 +2555,6 @@
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
@ -3373,7 +2567,6 @@
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
},
@ -3386,7 +2579,6 @@
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
"dev": true,
"license": "MIT",
"dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
@ -3407,7 +2599,6 @@
"resolved": "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz",
"integrity": "sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==",
"dev": true,
"license": "MIT",
"dependencies": {
"sparkles": "^2.1.0"
},
@ -3419,22 +2610,19 @@
"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,
"license": "ISC"
"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,
"license": "MIT"
"dev": true
},
"node_modules/gulp": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz",
"integrity": "sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg==",
"dev": true,
"license": "MIT",
"dependencies": {
"glob-watcher": "^6.0.0",
"gulp-cli": "^3.0.0",
@ -3453,7 +2641,6 @@
"resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.0.0.tgz",
"integrity": "sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@gulpjs/messages": "^1.1.0",
"chalk": "^4.1.2",
@ -3475,47 +2662,22 @@
"node": ">=10.13.0"
}
},
"node_modules/gulp-cli/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/gulp-cli/node_modules/cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"node_modules/gulp-cli/node_modules/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/gulp-cli/node_modules/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",
@ -3533,7 +2695,6 @@
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
@ -3552,7 +2713,6 @@
"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"
}
@ -3562,7 +2722,6 @@
"resolved": "https://registry.npmjs.org/gulp-dart-sass/-/gulp-dart-sass-1.1.0.tgz",
"integrity": "sha512-wc04rAk3ycBk4Z+vTVh5tPxgKNjtlfjqC7BiVG4ZvU8JswdzZs17Hn141RYTu+e7J8FivbL3VOhL5+Z+wvU0Ww==",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^2.3.0",
"lodash.clonedeep": "^4.3.2",
@ -3577,12 +2736,20 @@
"node": ">=14"
}
},
"node_modules/gulp-dart-sass/node_modules/ansi-regex": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
"integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/gulp-dart-sass/node_modules/ansi-styles": {
"version": "3.2.1",
"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"
},
@ -3595,7 +2762,6 @@
"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",
@ -3610,7 +2776,6 @@
"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"
}
@ -3619,15 +2784,13 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/gulp-dart-sass/node_modules/escape-string-regexp": {
"version": "1.0.5",
"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"
}
@ -3637,7 +2800,18 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/gulp-dart-sass/node_modules/strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
"dev": true,
"dependencies": {
"ansi-regex": "^3.0.0"
},
"engines": {
"node": ">=4"
}
@ -3647,7 +2821,6 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^3.0.0"
},
@ -3656,34 +2829,32 @@
}
},
"node_modules/gulp-sourcemaps": {
"version": "2.6.5",
"resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz",
"integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-3.0.0.tgz",
"integrity": "sha512-RqvUckJkuYqy4VaIH60RMal4ZtG0IbQ6PXMNkNsshEGJ9cldUPRb/YCgboYae+CLAs1HQNb4ADTKCx65HInquQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"@gulp-sourcemaps/identity-map": "1.X",
"@gulp-sourcemaps/map-sources": "1.X",
"acorn": "5.X",
"convert-source-map": "1.X",
"css": "2.X",
"debug-fabulous": "1.X",
"detect-newline": "2.X",
"graceful-fs": "4.X",
"source-map": "~0.6.0",
"strip-bom-string": "1.X",
"through2": "2.X"
"@gulp-sourcemaps/identity-map": "^2.0.1",
"@gulp-sourcemaps/map-sources": "^1.0.0",
"acorn": "^6.4.1",
"convert-source-map": "^1.0.0",
"css": "^3.0.0",
"debug-fabulous": "^1.0.0",
"detect-newline": "^2.0.0",
"graceful-fs": "^4.0.0",
"source-map": "^0.6.0",
"strip-bom-string": "^1.0.0",
"through2": "^2.0.0"
},
"engines": {
"node": ">=4"
"node": ">= 6"
}
},
"node_modules/gulp-sourcemaps/node_modules/acorn": {
"version": "5.7.4",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
"integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
"integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
"dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@ -3696,7 +2867,6 @@
"resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz",
"integrity": "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==",
"dev": true,
"license": "MIT",
"dependencies": {
"glogg": "^2.2.0"
},
@ -3709,7 +2879,6 @@
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^2.0.0"
},
@ -3722,7 +2891,6 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -3732,7 +2900,6 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -3742,7 +2909,6 @@
"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"
},
@ -3750,22 +2916,11 @@
"node": ">= 0.4"
}
},
"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/homedir-polyfill": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
"integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
"dev": true,
"license": "MIT",
"dependencies": {
"parse-passwd": "^1.0.0"
},
@ -3773,14 +2928,22 @@
"node": ">=0.10.0"
}
},
"node_modules/husky": {
"version": "9.1.7",
"resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
"integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
"node_modules/human-signals": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
"integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
"dev": true,
"engines": {
"node": ">=16.17.0"
}
},
"node_modules/husky": {
"version": "9.0.11",
"resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz",
"integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==",
"dev": true,
"license": "MIT",
"bin": {
"husky": "bin.js"
"husky": "bin.mjs"
},
"engines": {
"node": ">=18"
@ -3794,7 +2957,6 @@
"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"
},
@ -3820,32 +2982,28 @@
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
]
},
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/immutable": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz",
"integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==",
"dev": true,
"license": "MIT"
"version": "4.3.5",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz",
"integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==",
"dev": true
},
"node_modules/import-fresh": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
"version": "3.3.0",
"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"
@ -3862,7 +3020,6 @@
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.19"
}
@ -3872,7 +3029,6 @@
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -3881,9 +3037,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
"dev": true,
"license": "ISC",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@ -3893,22 +3047,19 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true,
"license": "ISC"
"dev": true
},
"node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true,
"license": "ISC"
"dev": true
},
"node_modules/interpret": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
"integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10.13.0"
}
@ -3918,7 +3069,6 @@
"resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
"integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-relative": "^1.0.0",
"is-windows": "^1.0.1"
@ -3932,7 +3082,6 @@
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
@ -3940,17 +3089,28 @@
"node": ">=8"
}
},
"node_modules/is-core-module": {
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
"node_modules/is-builtin-module": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
"integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
"dev": true,
"license": "MIT",
"dependencies": {
"hasown": "^2.0.2"
"builtin-modules": "^3.3.0"
},
"engines": {
"node": ">= 0.4"
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-core-module": {
"version": "2.13.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
"integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
"dev": true,
"dependencies": {
"hasown": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@ -3961,7 +3121,6 @@
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-plain-object": "^2.0.4"
},
@ -3974,7 +3133,6 @@
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"dev": true,
"license": "MIT",
"dependencies": {
"isobject": "^3.0.1"
},
@ -3987,7 +3145,6 @@
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -3997,7 +3154,6 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
"integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
@ -4010,7 +3166,6 @@
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
@ -4022,15 +3177,13 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
"integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/is-negated-glob": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
"integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4040,7 +3193,6 @@
"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"
}
@ -4050,7 +3202,6 @@
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -4060,7 +3211,6 @@
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4069,15 +3219,13 @@
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/is-relative": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-unc-path": "^1.0.0"
},
@ -4085,12 +3233,23 @@
"node": ">=0.10.0"
}
},
"node_modules/is-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
"integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
"dev": true,
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-unc-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
"integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"unc-path-regex": "^0.1.2"
},
@ -4103,7 +3262,6 @@
"resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
"integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4113,7 +3271,6 @@
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4122,35 +3279,34 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
"license": "ISC"
"dev": true
},
"node_modules/isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"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==",
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
"integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
},
@ -4163,7 +3319,6 @@
"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"
},
@ -4175,36 +3330,25 @@
"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,
"license": "MIT"
"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,
"license": "MIT"
"dev": true
},
"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,
"license": "MIT"
},
"node_modules/jsonc-parser": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
"integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
"dev": true,
"license": "MIT"
"dev": true
},
"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"
},
@ -4217,7 +3361,6 @@
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
"license": "MIT",
"dependencies": {
"json-buffer": "3.0.1"
}
@ -4227,7 +3370,6 @@
"resolved": "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz",
"integrity": "sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.13.0"
}
@ -4237,7 +3379,6 @@
"resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz",
"integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10.13.0"
}
@ -4247,7 +3388,6 @@
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
@ -4261,7 +3401,6 @@
"resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.0.tgz",
"integrity": "sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==",
"dev": true,
"license": "MIT",
"dependencies": {
"extend": "^3.0.2",
"findup-sync": "^5.0.0",
@ -4276,52 +3415,46 @@
}
},
"node_modules/lilconfig": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
"integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz",
"integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/antonk52"
}
},
"node_modules/lint-staged": {
"version": "16.1.0",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.0.tgz",
"integrity": "sha512-HkpQh69XHxgCjObjejBT3s2ILwNjFx8M3nw+tJ/ssBauDlIpkx2RpqWSi1fBgkXLSSXnbR3iEq1NkVtpvV+FLQ==",
"version": "15.2.2",
"resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz",
"integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^5.4.1",
"commander": "^14.0.0",
"debug": "^4.4.1",
"lilconfig": "^3.1.3",
"listr2": "^8.3.3",
"micromatch": "^4.0.8",
"nano-spawn": "^1.0.2",
"pidtree": "^0.6.0",
"string-argv": "^0.3.2",
"yaml": "^2.8.0"
"chalk": "5.3.0",
"commander": "11.1.0",
"debug": "4.3.4",
"execa": "8.0.1",
"lilconfig": "3.0.0",
"listr2": "8.0.1",
"micromatch": "4.0.5",
"pidtree": "0.6.0",
"string-argv": "0.3.2",
"yaml": "2.3.4"
},
"bin": {
"lint-staged": "bin/lint-staged.js"
},
"engines": {
"node": ">=20.17"
"node": ">=18.12.0"
},
"funding": {
"url": "https://opencollective.com/lint-staged"
}
},
"node_modules/lint-staged/node_modules/chalk": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
"integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
@ -4330,17 +3463,16 @@
}
},
"node_modules/listr2": {
"version": "8.3.3",
"resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz",
"integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==",
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz",
"integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==",
"dev": true,
"license": "MIT",
"dependencies": {
"cli-truncate": "^4.0.0",
"colorette": "^2.0.20",
"eventemitter3": "^5.0.1",
"log-update": "^6.1.0",
"rfdc": "^1.4.1",
"log-update": "^6.0.0",
"rfdc": "^1.3.0",
"wrap-ansi": "^9.0.0"
},
"engines": {
@ -4352,7 +3484,6 @@
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-locate": "^5.0.0"
},
@ -4367,40 +3498,35 @@
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
"dev": true,
"license": "MIT"
"dev": 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,
"license": "MIT"
"dev": true
},
"node_modules/log-update": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
"integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz",
"integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-escapes": "^7.0.0",
"cli-cursor": "^5.0.0",
"slice-ansi": "^7.1.0",
"ansi-escapes": "^6.2.0",
"cli-cursor": "^4.0.0",
"slice-ansi": "^7.0.0",
"strip-ansi": "^7.1.0",
"wrap-ansi": "^9.0.0"
},
@ -4412,11 +3538,10 @@
}
},
"node_modules/log-update/node_modules/ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"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"
},
@ -4429,7 +3554,6 @@
"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"
},
@ -4442,7 +3566,6 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
"integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
"dev": true,
"license": "MIT",
"dependencies": {
"get-east-asian-width": "^1.0.0"
},
@ -4458,7 +3581,6 @@
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
"integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.2.1",
"is-fullwidth-code-point": "^5.0.0"
@ -4475,7 +3597,6 @@
"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"
},
@ -4487,11 +3608,10 @@
}
},
"node_modules/loglevel": {
"version": "1.9.2",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz",
"integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==",
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz",
"integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6.0"
},
@ -4505,7 +3625,6 @@
"resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz",
"integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^1.1.3",
"loglevel": "^1.4.1"
@ -4516,7 +3635,6 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4526,7 +3644,6 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4536,7 +3653,6 @@
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^2.2.1",
"escape-string-regexp": "^1.0.2",
@ -4553,7 +3669,6 @@
"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"
}
@ -4563,7 +3678,6 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^2.0.0"
},
@ -4576,24 +3690,24 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.0"
}
},
"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==",
"version": "10.2.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
"integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
"dev": true,
"license": "ISC"
"engines": {
"node": "14 || >=16.14"
}
},
"node_modules/lru-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
"integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"es5-ext": "~0.10.2"
}
@ -4602,15 +3716,13 @@
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.4.0.tgz",
"integrity": "sha512-4/gC9KVNTV6pvYg2gFeQYTW3mWaoJt7WZE5vrp1KnQDgW92JtYZnzmZT81oj/dUTqAIu0ufI2x3dkgu3bB1tYg==",
"dev": true,
"license": "Unicode-DFS-2016"
"dev": true
},
"node_modules/map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
"integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4620,7 +3732,6 @@
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.0.tgz",
"integrity": "sha512-2L3MIgJynYrZ3TYMriLDLWocz15okFakV6J12HXvMXDHui2x/zgChzg1u9mFFGbbGWE+GsLpQByt4POb9Or+uA==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
@ -4629,70 +3740,56 @@
}
},
"node_modules/memoizee": {
"version": "0.4.17",
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz",
"integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==",
"version": "0.4.15",
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
"integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"d": "^1.0.2",
"es5-ext": "^0.10.64",
"d": "^1.0.1",
"es5-ext": "^0.10.53",
"es6-weak-map": "^2.0.3",
"event-emitter": "^0.3.5",
"is-promise": "^2.2.2",
"lru-queue": "^0.1.0",
"next-tick": "^1.1.0",
"timers-ext": "^0.1.7"
},
"engines": {
"node": ">=0.12"
}
},
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
"node_modules/merge2": {
"version": "1.4.1",
"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.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.3",
"braces": "^3.0.2",
"picomatch": "^2.3.1"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/micromatch/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"node_modules/mimic-fn": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
"integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/mimic-function": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
"integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@ -4703,7 +3800,6 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
@ -4712,11 +3808,10 @@
}
},
"node_modules/minipass": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz",
"integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
}
@ -4725,78 +3820,40 @@
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
"integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==",
"dev": true,
"license": "BSD-3-Clause"
"dev": true
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true,
"license": "MIT"
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"node_modules/mute-stdout": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz",
"integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/nano-spawn": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz",
"integrity": "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20.17"
},
"funding": {
"url": "https://github.com/sindresorhus/nano-spawn?sponsor=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,
"license": "MIT"
"dev": true
},
"node_modules/next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
"dev": true,
"license": "ISC"
},
"node_modules/node-addon-api": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
"integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
"dev": true,
"license": "MIT",
"optional": 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"
}
"dev": true
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4806,7 +3863,6 @@
"resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz",
"integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==",
"dev": true,
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
},
@ -4814,17 +3870,31 @@
"node": ">= 10.13.0"
}
},
"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==",
"node_modules/npm-run-path": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
"integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0"
"path-key": "^4.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/fb55/nth-check?sponsor=1"
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/npm-run-path/node_modules/path-key": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
"integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
"dev": true,
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/object-assign": {
@ -4832,7 +3902,6 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4842,7 +3911,6 @@
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
"integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==",
"dev": true,
"license": "MIT",
"dependencies": {
"array-each": "^1.0.1",
"array-slice": "^1.0.0",
@ -4858,7 +3926,6 @@
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
"integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"isobject": "^3.0.1"
},
@ -4871,17 +3938,30 @@
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/onetime": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
"integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
"dev": true,
"dependencies": {
"mimic-fn": "^4.0.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
"license": "MIT",
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
@ -4899,7 +3979,6 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"yocto-queue": "^0.1.0"
},
@ -4915,7 +3994,6 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-limit": "^3.0.2"
},
@ -4926,19 +4004,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"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"
},
@ -4951,7 +4021,6 @@
"resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
"integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-absolute": "^1.0.0",
"map-cache": "^0.2.0",
@ -4966,7 +4035,6 @@
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
"integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4976,7 +4044,6 @@
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -4986,7 +4053,6 @@
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -4996,7 +4062,6 @@
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -5005,15 +4070,13 @@
"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"
"dev": true
},
"node_modules/path-root": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
"integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-root-regex": "^0.1.0"
},
@ -5026,7 +4089,6 @@
"resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
"integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -5036,7 +4098,6 @@
"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"
@ -5053,19 +4114,23 @@
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/picocolors": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
"dev": true
},
"node_modules/picomatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
@ -5076,7 +4141,6 @@
"resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
"integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
"dev": true,
"license": "MIT",
"bin": {
"pidtree": "bin/pidtree.js"
},
@ -5089,7 +4153,6 @@
"resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
"integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-colors": "^1.0.1",
"arr-diff": "^4.0.0",
@ -5100,22 +4163,37 @@
"node": ">= 0.10"
}
},
"node_modules/postcss": {
"version": "7.0.39",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
"dev": true,
"dependencies": {
"picocolors": "^0.2.1",
"source-map": "^0.6.1"
},
"engines": {
"node": ">=6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
}
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/prettier": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
"integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
"dev": true,
"license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
@ -5127,31 +4205,27 @@
}
},
"node_modules/prettier-eslint": {
"version": "16.4.2",
"resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.4.2.tgz",
"integrity": "sha512-vtJAQEkaN8fW5QKl08t7A5KCjlZuDUNeIlr9hgolMS5s3+uzbfRHDwaRnzrdqnY2YpHDmeDS/8zY0MKQHXJtaA==",
"version": "16.3.0",
"resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.3.0.tgz",
"integrity": "sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/parser": "^6.21.0",
"common-tags": "^1.8.2",
"dlv": "^1.1.3",
"eslint": "^8.57.1",
"@typescript-eslint/parser": "^6.7.5",
"common-tags": "^1.4.0",
"dlv": "^1.1.0",
"eslint": "^8.7.0",
"indent-string": "^4.0.0",
"lodash.merge": "^4.6.2",
"lodash.merge": "^4.6.0",
"loglevel-colored-level-prefix": "^1.0.0",
"prettier": "^3.5.3",
"prettier": "^3.0.1",
"pretty-format": "^29.7.0",
"require-relative": "^0.8.7",
"tslib": "^2.8.1",
"vue-eslint-parser": "^9.4.3"
"typescript": "^5.2.2",
"vue-eslint-parser": "^9.1.0"
},
"engines": {
"node": ">=16.10.0"
},
"funding": {
"url": "https://opencollective.com/prettier-eslint"
},
"peerDependencies": {
"prettier-plugin-svelte": "^3.0.0",
"svelte-eslint-parser": "*"
@ -5170,7 +4244,6 @@
"resolved": "https://registry.npmjs.org/prettier-eslint-cli/-/prettier-eslint-cli-8.0.1.tgz",
"integrity": "sha512-jru4JUDHzWEtM/SOxqagU7hQTVP8BVrxO2J0qNauWZuPRld6Ea2eyNaEzIGx6I+yjmOLCsjNM+vU1AJgaW1ZSQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@messageformat/core": "^3.2.0",
"@prettier/eslint": "npm:prettier-eslint@^16.1.0",
@ -5211,7 +4284,6 @@
"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",
@ -5231,53 +4303,39 @@
}
},
"node_modules/prettier-eslint-cli/node_modules/@eslint/js": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"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/prettier-eslint-cli/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"node_modules/prettier-eslint-cli/node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/prettier-eslint-cli/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"
"@humanwhocodes/object-schema": "^2.0.2",
"debug": "^4.3.1",
"minimatch": "^3.0.5"
},
"engines": {
"node": ">=12"
"node": ">=10.10.0"
}
},
"node_modules/prettier-eslint-cli/node_modules/eslint": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"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.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.57.1",
"@humanwhocodes/config-array": "^0.13.0",
"@eslint/js": "8.57.0",
"@humanwhocodes/config-array": "^0.11.14",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
@ -5327,7 +4385,6 @@
"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"
@ -5344,7 +4401,6 @@
"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"
},
@ -5357,7 +4413,6 @@
"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",
@ -5375,7 +4430,6 @@
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"license": "MIT",
"dependencies": {
"flat-cache": "^3.0.4"
},
@ -5388,7 +4442,6 @@
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
"integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
"license": "MIT",
"dependencies": {
"flatted": "^3.2.9",
"keyv": "^4.5.3",
@ -5403,7 +4456,6 @@
"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"
},
@ -5414,25 +4466,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/prettier-eslint-cli/node_modules/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/prettier-eslint-cli/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"
},
@ -5440,59 +4478,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/prettier-eslint-cli/node_modules/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/prettier-eslint-cli/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,
"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/prettier-eslint-cli/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/prettier-eslint/node_modules/@eslint/eslintrc": {
"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",
@ -5512,21 +4502,33 @@
}
},
"node_modules/prettier-eslint/node_modules/@eslint/js": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"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/prettier-eslint/node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
"dev": true,
"dependencies": {
"@humanwhocodes/object-schema": "^2.0.2",
"debug": "^4.3.1",
"minimatch": "^3.0.5"
},
"engines": {
"node": ">=10.10.0"
}
},
"node_modules/prettier-eslint/node_modules/@typescript-eslint/parser": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
"integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@typescript-eslint/scope-manager": "6.21.0",
"@typescript-eslint/types": "6.21.0",
@ -5550,29 +4552,17 @@
}
}
},
"node_modules/prettier-eslint/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/prettier-eslint/node_modules/eslint": {
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"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.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.57.1",
"@humanwhocodes/config-array": "^0.13.0",
"@eslint/js": "8.57.0",
"@humanwhocodes/config-array": "^0.11.14",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
@ -5622,7 +4612,6 @@
"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"
@ -5639,7 +4628,6 @@
"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"
},
@ -5652,7 +4640,6 @@
"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",
@ -5670,7 +4657,6 @@
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
"license": "MIT",
"dependencies": {
"flat-cache": "^3.0.4"
},
@ -5683,7 +4669,6 @@
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
"integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
"license": "MIT",
"dependencies": {
"flatted": "^3.2.9",
"keyv": "^4.5.3",
@ -5698,7 +4683,6 @@
"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"
},
@ -5709,25 +4693,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/prettier-eslint/node_modules/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/prettier-eslint/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"
},
@ -5740,7 +4710,6 @@
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-diff": "^1.1.2"
},
@ -5753,7 +4722,6 @@
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
"integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
@ -5768,7 +4736,6 @@
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
@ -5780,15 +4747,13 @@
"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"
"dev": true
},
"node_modules/punycode": {
"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"
}
@ -5811,15 +4776,19 @@
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
]
},
"node_modules/queue-tick": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
"integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
"dev": true
},
"node_modules/quick-lru": {
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz",
"integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
@ -5831,15 +4800,13 @@
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"dev": true,
"license": "MIT"
"dev": true
},
"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",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@ -5855,7 +4822,6 @@
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
@ -5863,25 +4829,11 @@
"node": ">=8.10.0"
}
},
"node_modules/readdirp/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/rechoir": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
"integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"resolve": "^1.20.0"
},
@ -5889,26 +4841,17 @@
"node": ">= 10.13.0"
}
},
"node_modules/regenerator-runtime": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
"dev": true,
"license": "MIT"
},
"node_modules/remove-trailing-separator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
"integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
"dev": true,
"license": "ISC"
"dev": true
},
"node_modules/replace-ext": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
"integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.10"
}
@ -5918,24 +4861,15 @@
"resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz",
"integrity": "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/request-light": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz",
"integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==",
"dev": true,
"license": "MIT"
},
"node_modules/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,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -5944,26 +4878,21 @@
"version": "0.8.7",
"resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
"integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/resolve": {
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
"integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
"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.16.0",
"is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@ -5973,7 +4902,6 @@
"resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
"integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
"dev": true,
"license": "MIT",
"dependencies": {
"expand-tilde": "^2.0.0",
"global-modules": "^1.0.0"
@ -5987,7 +4915,6 @@
"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"
}
@ -5997,7 +4924,6 @@
"resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz",
"integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==",
"dev": true,
"license": "MIT",
"dependencies": {
"value-or-function": "^4.0.0"
},
@ -6005,72 +4931,73 @@
"node": ">= 10.13.0"
}
},
"node_modules/resolve-url": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
"integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
"deprecated": "https://github.com/lydell/resolve-url#deprecated",
"dev": true,
"license": "MIT"
},
"node_modules/restore-cursor": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
"integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
"integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
"dev": true,
"license": "MIT",
"dependencies": {
"onetime": "^7.0.0",
"signal-exit": "^4.1.0"
"onetime": "^5.1.0",
"signal-exit": "^3.0.2"
},
"engines": {
"node": ">=18"
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/restore-cursor/node_modules/mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/restore-cursor/node_modules/onetime": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
"integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"mimic-function": "^5.0.0"
"mimic-fn": "^2.1.0"
},
"engines": {
"node": ">=18"
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/restore-cursor/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/reusify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true,
"license": "MIT",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
}
},
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
"dev": true,
"license": "MIT"
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
"integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
"dev": true
},
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
"license": "ISC",
"dependencies": {
"glob": "^7.1.3"
},
@ -6085,9 +5012,7 @@
"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",
@ -6104,11 +5029,10 @@
}
},
"node_modules/rollup": {
"version": "2.79.2",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
"integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
"version": "2.79.1",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
"integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
"dev": true,
"license": "MIT",
"bin": {
"rollup": "dist/bin/rollup"
},
@ -6138,17 +5062,15 @@
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/rxjs": {
"version": "7.8.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
"integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.1.0"
}
@ -6157,32 +5079,28 @@
"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"
"dev": true
},
"node_modules/safe-identifier": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
"integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==",
"dev": true,
"license": "ISC"
"dev": 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,
"license": "MIT"
"dev": true
},
"node_modules/sass": {
"version": "1.89.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.89.0.tgz",
"integrity": "sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==",
"version": "1.77.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.77.1.tgz",
"integrity": "sha512-OMEyfirt9XEfyvocduUIOlUSkWOXS/LAt6oblR/ISXCTukyavjex+zQNm51pPCOiFKY1QpWvEH1EeCkgyV3I6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"chokidar": "^4.0.0",
"immutable": "^5.0.2",
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
"source-map-js": ">=0.6.2 <2.0.0"
},
"bin": {
@ -6190,39 +5108,6 @@
},
"engines": {
"node": ">=14.0.0"
},
"optionalDependencies": {
"@parcel/watcher": "^2.4.1"
}
},
"node_modules/sass/node_modules/chokidar": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
"dev": true,
"license": "MIT",
"dependencies": {
"readdirp": "^4.0.1"
},
"engines": {
"node": ">= 14.16.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/sass/node_modules/readdirp": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 14.18.0"
},
"funding": {
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/semver": {
@ -6230,7 +5115,6 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"license": "ISC",
"optional": true,
"bin": {
"semver": "bin/semver.js"
@ -6241,7 +5125,6 @@
"resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz",
"integrity": "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==",
"dev": true,
"license": "MIT",
"dependencies": {
"sver": "^1.8.3"
},
@ -6254,7 +5137,6 @@
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
@ -6267,7 +5149,6 @@
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -6277,7 +5158,6 @@
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=14"
},
@ -6290,7 +5170,6 @@
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -6300,7 +5179,6 @@
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
"integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.0.0",
"is-fullwidth-code-point": "^4.0.0"
@ -6317,7 +5195,6 @@
"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"
},
@ -6330,50 +5207,35 @@
"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"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"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"
}
},
"node_modules/source-map-resolve": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
"integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz",
"integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==",
"deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
"dev": true,
"license": "MIT",
"dependencies": {
"atob": "^2.1.2",
"decode-uri-component": "^0.2.0",
"resolve-url": "^0.2.1",
"source-map-url": "^0.4.0",
"urix": "^0.1.0"
"decode-uri-component": "^0.2.0"
}
},
"node_modules/source-map-url": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
"integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
"deprecated": "See https://github.com/lydell/source-map-url#deprecated",
"dev": true,
"license": "MIT"
},
"node_modules/sparkles": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz",
"integrity": "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.13.0"
}
@ -6383,7 +5245,6 @@
"resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz",
"integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==",
"dev": true,
"license": "MIT",
"dependencies": {
"streamx": "^2.13.2"
}
@ -6392,18 +5253,16 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
"integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/streamx": {
"version": "2.22.0",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz",
"integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==",
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz",
"integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-fifo": "^1.3.2",
"text-decoder": "^1.1.0"
"fast-fifo": "^1.1.0",
"queue-tick": "^1.0.1"
},
"optionalDependencies": {
"bare-events": "^2.2.0"
@ -6414,7 +5273,6 @@
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.1.0"
}
@ -6424,7 +5282,6 @@
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
"integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.6.19"
}
@ -6434,7 +5291,6 @@
"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",
@ -6450,7 +5306,6 @@
"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",
@ -6460,45 +5315,11 @@
"node": ">=8"
}
},
"node_modules/string-width-cjs/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/string-width-cjs/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",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/string-width-cjs/node_modules/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/string-width/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -6508,35 +5329,20 @@
"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,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/string-width/node_modules/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-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
"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": "^3.0.0"
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=4"
"node": ">=8"
}
},
"node_modules/strip-ansi-cjs": {
@ -6545,7 +5351,6 @@
"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"
},
@ -6553,32 +5358,32 @@
"node": ">=8"
}
},
"node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/strip-bom-string": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
"integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/strip-final-newline": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
"integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
"dev": true,
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"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"
},
@ -6591,7 +5396,6 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
@ -6604,7 +5408,6 @@
"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"
},
@ -6617,25 +5420,24 @@
"resolved": "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz",
"integrity": "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==",
"dev": true,
"license": "MIT",
"optionalDependencies": {
"semver": "^6.3.0"
}
},
"node_modules/synckit": {
"version": "0.11.6",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.6.tgz",
"integrity": "sha512-2pR2ubZSV64f/vqm9eLPz/KOvR9Dm+Co/5ChLgeHl0yEDRc6h5hXHoxEQH8Y5Ljycozd3p1k5TTSVdzYGkPvLw==",
"version": "0.8.8",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
"integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@pkgr/core": "^0.2.4"
"@pkgr/core": "^0.1.0",
"tslib": "^2.6.2"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/synckit"
"url": "https://opencollective.com/unts"
}
},
"node_modules/teex": {
@ -6643,51 +5445,34 @@
"resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
"integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"streamx": "^2.12.5"
}
},
"node_modules/text-decoder": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
"integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"b4a": "^1.6.4"
}
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/through2": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"readable-stream": "~2.3.6",
"xtend": "~4.0.1"
}
},
"node_modules/timers-ext": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz",
"integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==",
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
"integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"es5-ext": "^0.10.64",
"next-tick": "^1.1.0"
},
"engines": {
"node": ">=0.12"
"es5-ext": "~0.10.46",
"next-tick": "1"
}
},
"node_modules/to-regex-range": {
@ -6695,7 +5480,6 @@
"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"
},
@ -6708,7 +5492,6 @@
"resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz",
"integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==",
"dev": true,
"license": "MIT",
"dependencies": {
"streamx": "^2.12.5"
},
@ -6717,11 +5500,10 @@
}
},
"node_modules/ts-api-utils": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
"integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==",
"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"
},
@ -6730,25 +5512,22 @@
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true,
"license": "0BSD"
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
"dev": true
},
"node_modules/type": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz",
"integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==",
"dev": true,
"license": "ISC"
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==",
"dev": true
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1"
},
@ -6757,11 +5536,10 @@
}
},
"node_modules/type-fest": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz",
"integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=16"
},
@ -6770,11 +5548,10 @@
}
},
"node_modules/typescript": {
"version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -6783,25 +5560,11 @@
"node": ">=14.17"
}
},
"node_modules/typescript-language-server": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/typescript-language-server/-/typescript-language-server-4.3.4.tgz",
"integrity": "sha512-0pQ4ffAarsf10VwFhyyyqNJhuDd4r6f4dSsQN38WdbQ3WVxqi08p/bI//v1VnOV5CSVd4AeOUY/jfJYheHTQPQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"typescript-language-server": "lib/cli.mjs"
},
"engines": {
"node": ">=18"
}
},
"node_modules/unc-path-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
"integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -6811,7 +5574,6 @@
"resolved": "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz",
"integrity": "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"bach": "^2.0.1",
"fast-levenshtein": "^3.0.0",
@ -6827,7 +5589,6 @@
"resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz",
"integrity": "sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.13.0"
}
@ -6837,7 +5598,6 @@
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz",
"integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"fastest-levenshtein": "^1.0.7"
}
@ -6847,7 +5607,6 @@
"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"
}
@ -6857,32 +5616,21 @@
"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/urix": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
"integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
"deprecated": "Please see https://github.com/lydell/urix#deprecated",
"dev": true,
"license": "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"
"dev": true
},
"node_modules/v8flags": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz",
"integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.13.0"
}
@ -6892,7 +5640,6 @@
"resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz",
"integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.13.0"
}
@ -6902,7 +5649,6 @@
"resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz",
"integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==",
"dev": true,
"license": "MIT",
"dependencies": {
"clone": "^2.1.2",
"clone-stats": "^1.0.0",
@ -6919,7 +5665,6 @@
"resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz",
"integrity": "sha512-LRBE2/g3C1hSHL2k/FynSZcVTRhEw8sb08oKGt/0hukZXwrh2m8nfy+r5yLhGEk7eFFuclhyIuPct/Bxlxk6rg==",
"dev": true,
"license": "MIT",
"dependencies": {
"bl": "^1.2.1",
"through2": "^2.0.3"
@ -6930,7 +5675,6 @@
"resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz",
"integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"bl": "^5.0.0",
"vinyl": "^3.0.0"
@ -6944,7 +5688,6 @@
"resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
"integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer": "^6.0.3",
"inherits": "^2.0.4",
@ -6956,7 +5699,6 @@
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@ -6971,7 +5713,6 @@
"resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz",
"integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==",
"dev": true,
"license": "MIT",
"dependencies": {
"fs-mkdirp-stream": "^2.0.1",
"glob-stream": "^8.0.0",
@ -6997,7 +5738,6 @@
"resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz",
"integrity": "sha512-Y5f1wRGajOfYukhv8biIGA7iZiY8UOIc3zJ6zcUNIbRG1BVuXzBsfSfe7MUJTttVkuy64k/pGQtJdd/aIt+hbw==",
"dev": true,
"license": "MIT",
"dependencies": {
"through2": "^2.0.3",
"vinyl": "^2.1.0"
@ -7008,7 +5748,6 @@
"resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
"integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
"dev": true,
"license": "MIT",
"dependencies": {
"clone": "^2.1.1",
"clone-buffer": "^1.0.0",
@ -7026,7 +5765,6 @@
"resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz",
"integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"convert-source-map": "^2.0.0",
"graceful-fs": "^4.2.10",
@ -7043,15 +5781,13 @@
"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"
"dev": true
},
"node_modules/vinyl-sourcemaps-apply": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
"integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==",
"dev": true,
"license": "ISC",
"dependencies": {
"source-map": "^0.5.1"
}
@ -7061,7 +5797,6 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
@ -7071,244 +5806,15 @@
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz",
"integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10"
}
},
"node_modules/vscode-css-languageservice": {
"version": "6.3.5",
"resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.5.tgz",
"integrity": "sha512-ehEIMXYPYEz/5Svi2raL9OKLpBt5dSAdoCFoLpo0TVFKrVpDemyuQwS3c3D552z/qQCg3pMp8oOLMObY6M3ajQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vscode/l10n": "^0.0.18",
"vscode-languageserver-textdocument": "^1.0.12",
"vscode-languageserver-types": "3.17.5",
"vscode-uri": "^3.1.0"
}
},
"node_modules/vscode-html-languageservice": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.4.0.tgz",
"integrity": "sha512-9/cbc90BSYCghmHI7/VbWettHZdC7WYpz2g5gBK6UDUI1MkZbM773Q12uAYJx9jzAiNHPpyo6KzcwmcnugncAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vscode/l10n": "^0.0.18",
"vscode-languageserver-textdocument": "^1.0.12",
"vscode-languageserver-types": "^3.17.5",
"vscode-uri": "^3.1.0"
}
},
"node_modules/vscode-json-languageservice": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.5.0.tgz",
"integrity": "sha512-JchBzp8ArzhCVpRS/LT4wzEEvwHXIUEdZD064cGTI4RVs34rNCZXPUguIYSfGBcHH1GV79ufPcfy3Pd8+ukbKw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vscode/l10n": "^0.0.18",
"jsonc-parser": "^3.3.1",
"vscode-languageserver-textdocument": "^1.0.12",
"vscode-languageserver-types": "^3.17.5",
"vscode-uri": "^3.1.0"
}
},
"node_modules/vscode-jsonrpc": {
"version": "9.0.0-next.8",
"resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.8.tgz",
"integrity": "sha512-pN6L5eiNBvUpNFBJvudaZ83klir0T/wLFCDpYhpOEsKXyhsWyYsNMzoG7BK6zJoZLHGSSsaTJDjCcPwnLgUyPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/vscode-langservers-extracted": {
"version": "4.10.0",
"resolved": "https://registry.npmjs.org/vscode-langservers-extracted/-/vscode-langservers-extracted-4.10.0.tgz",
"integrity": "sha512-EFf9uQI4dAKbzMQFjDvVm1xJq1DXAQvBEuEfPGrK/xzfsL5xWTfIuRr90NgfmqwO+IEt6vLZm9EOj6R66xIifg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vscode/l10n": "^0.0.18",
"core-js": "^3.20.1",
"jsonc-parser": "^3.2.1",
"regenerator-runtime": "^0.13.9",
"request-light": "^0.7.0",
"semver": "^7.6.1",
"typescript": "^4.0.5",
"vscode-css-languageservice": "^6.2.14",
"vscode-html-languageservice": "^5.2.0",
"vscode-json-languageservice": "^5.3.11",
"vscode-languageserver": "^10.0.0-next.3",
"vscode-languageserver-textdocument": "^1.0.11",
"vscode-languageserver-types": "^3.17.5",
"vscode-markdown-languageservice": "^0.5.0-alpha.6",
"vscode-nls": "^5.2.0",
"vscode-uri": "^3.0.8"
},
"bin": {
"vscode-css-language-server": "bin/vscode-css-language-server",
"vscode-eslint-language-server": "bin/vscode-eslint-language-server",
"vscode-html-language-server": "bin/vscode-html-language-server",
"vscode-json-language-server": "bin/vscode-json-language-server",
"vscode-markdown-language-server": "bin/vscode-markdown-language-server"
}
},
"node_modules/vscode-langservers-extracted/node_modules/semver": {
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/vscode-langservers-extracted/node_modules/typescript": {
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
},
"node_modules/vscode-languageserver": {
"version": "10.0.0-next.13",
"resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.13.tgz",
"integrity": "sha512-4tSufM2XrNrrzBUGPcYh62qBYhm41yFwFZBgJ63I1dPHRh1aZPK65+TcVa3nG0/K62Q9phhk87TWdQFp+UnYFA==",
"dev": true,
"license": "MIT",
"dependencies": {
"vscode-languageserver-protocol": "3.17.6-next.13"
},
"bin": {
"installServerIntoExtension": "bin/installServerIntoExtension"
}
},
"node_modules/vscode-languageserver-protocol": {
"version": "3.17.6-next.13",
"resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.13.tgz",
"integrity": "sha512-IE+/j+OOqJ392KMhcexIGt9MVqcTZ4n7DVyaSp5txuC1kNUnfzxlkPzzDwo0p7hdINLCfWjbcjuW5tGYLof4Vw==",
"dev": true,
"license": "MIT",
"dependencies": {
"vscode-jsonrpc": "9.0.0-next.8",
"vscode-languageserver-types": "3.17.6-next.6"
}
},
"node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": {
"version": "3.17.6-next.6",
"resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.6.tgz",
"integrity": "sha512-aiJY5/yW+xzw7KPNlwi3gQtddq/3EIn5z8X8nCgJfaiAij2R1APKePngv+MUdLdYJBVTLu+Qa0ODsT+pHgYguQ==",
"dev": true,
"license": "MIT"
},
"node_modules/vscode-languageserver-textdocument": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
"integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==",
"dev": true,
"license": "MIT"
},
"node_modules/vscode-languageserver-types": {
"version": "3.17.5",
"resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
"integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
"dev": true,
"license": "MIT"
},
"node_modules/vscode-markdown-languageservice": {
"version": "0.5.0-alpha.10",
"resolved": "https://registry.npmjs.org/vscode-markdown-languageservice/-/vscode-markdown-languageservice-0.5.0-alpha.10.tgz",
"integrity": "sha512-hbDNktPfJZyFCVhpBewfYc5VczVTyxRutqoylNgAeyjWkNZls1Q5LuFIsrsEwVEToP6Tx2riaU7s+/fk6RtYZA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vscode/l10n": "^0.0.10",
"node-html-parser": "^6.1.5",
"picomatch": "^2.3.1",
"vscode-languageserver-protocol": "^3.17.1",
"vscode-languageserver-textdocument": "^1.0.11",
"vscode-uri": "^3.0.7"
},
"engines": {
"node": "*"
}
},
"node_modules/vscode-markdown-languageservice/node_modules/@vscode/l10n": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.10.tgz",
"integrity": "sha512-E1OCmDcDWa0Ya7vtSjp/XfHFGqYJfh+YPC1RkATU71fTac+j1JjCcB3qwSzmlKAighx2WxhLlfhS0RwAN++PFQ==",
"dev": true,
"license": "MIT"
},
"node_modules/vscode-markdown-languageservice/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/vscode-markdown-languageservice/node_modules/vscode-jsonrpc": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
"integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/vscode-markdown-languageservice/node_modules/vscode-languageserver-protocol": {
"version": "3.17.5",
"resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
"integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
"dev": true,
"license": "MIT",
"dependencies": {
"vscode-jsonrpc": "8.2.0",
"vscode-languageserver-types": "3.17.5"
}
},
"node_modules/vscode-nls": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz",
"integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==",
"dev": true,
"license": "MIT"
},
"node_modules/vscode-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
"integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
"dev": true,
"license": "MIT"
},
"node_modules/vue-eslint-parser": {
"version": "9.4.3",
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
"integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
"version": "9.4.2",
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.3.4",
"eslint-scope": "^7.1.1",
@ -7333,7 +5839,6 @@
"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"
@ -7350,7 +5855,6 @@
"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"
},
@ -7363,7 +5867,6 @@
"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",
@ -7377,11 +5880,10 @@
}
},
"node_modules/vue-eslint-parser/node_modules/semver": {
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"version": "7.6.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
"integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@ -7394,7 +5896,6 @@
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
@ -7410,7 +5911,6 @@
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@ -7420,7 +5920,6 @@
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
"integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.2.1",
"string-width": "^7.0.0",
@ -7439,7 +5938,6 @@
"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",
@ -7452,35 +5950,11 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/wrap-ansi-cjs/node_modules/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/wrap-ansi/node_modules/ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"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"
},
@ -7493,7 +5967,6 @@
"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"
},
@ -7502,18 +5975,16 @@
}
},
"node_modules/wrap-ansi/node_modules/emoji-regex": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
"integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
"dev": true,
"license": "MIT"
"version": "10.3.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz",
"integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==",
"dev": true
},
"node_modules/wrap-ansi/node_modules/string-width": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz",
"integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
"get-east-asian-width": "^1.0.0",
@ -7531,7 +6002,6 @@
"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"
},
@ -7546,15 +6016,13 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true,
"license": "ISC"
"dev": true
},
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.4"
}
@ -7564,104 +6032,44 @@
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/yaml": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
"integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
"dev": true,
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
"node": ">= 14.6"
"node": ">= 14"
}
},
"node_modules/yargs": {
"version": "18.0.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
"integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^9.0.1",
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"string-width": "^7.2.0",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^22.0.0"
"yargs-parser": "^21.1.1"
},
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=23"
"node": ">=12"
}
},
"node_modules/yargs-parser": {
"version": "22.0.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
"integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
"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": "^20.19.0 || ^22.12.0 || >=23"
}
},
"node_modules/yargs/node_modules/ansi-regex": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/yargs/node_modules/emoji-regex": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
"integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
"dev": true,
"license": "MIT"
},
"node_modules/yargs/node_modules/string-width": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
"integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
"get-east-asian-width": "^1.0.0",
"strip-ansi": "^7.1.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/yargs/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/yocto-queue": {
@ -7669,7 +6077,6 @@
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},

View File

@ -27,24 +27,22 @@
"@rollup/stream": "^3.0.1",
"@typhonjs-fvtt/eslint-config-foundry.js": "^0.8.0",
"eslint": "^9.2.0",
"eslint-config-prettier": "^10.1.5",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3",
"fs-extra": "^11.2.0",
"gulp": "^5.0.0",
"gulp-dart-sass": "^1.1.0",
"gulp-sourcemaps": "^2.6.5",
"gulp-sourcemaps": "^3.0.0",
"husky": "^9.0.11",
"lint-staged": "^16.1.0",
"lint-staged": "^15.2.2",
"prettier": "^3.2.5",
"prettier-eslint": "^16.3.0",
"prettier-eslint-cli": "^8.0.1",
"rollup": "^2.79.2",
"typescript": "^5.7.3",
"typescript-language-server": "^4.3.3",
"rollup": "^2.79.1",
"typescript": "^5.4.5",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0",
"vscode-langservers-extracted": "^4.10.0",
"yargs": "^18.0.0"
"yargs": "^17.7.2"
},
"lint-staged": {
"*.(js|cjs|mjs)": "eslint --fix",

View File

@ -1,80 +0,0 @@
#!/bin/bash
curdir=$(realpath $(dirname $0))
version=$1
echo $version
if [ -z "$version" ]; then
echo "must give a version specification."
exit 1
fi
echo Tagging git release...
git tag -a -m $version $version
git push origin ${version}
echo Tagged git release $(git describe)
read -r -d '' release_body <<EOF
{
"body": "${version}",
"draft": true,
"name": "${version}",
"prerelease": false,
"tag_name": "${version}",
"target_commitish": "${version}"
}
EOF
releaseId=$(curl -n -X 'POST' \
'https://git.bloy.org/api/v1/repos/foundryvtt/swade-mb-helpers/releases' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d "${release_body}" \
| jq '.id')
(cd $curdir/dist; rm -f swade-mb-helpers.zip; zip -r swade-mb-helpers.zip swade-mb-helpers)
# curl -n -X 'POST' \
# "https://git.bloy.org/api/v1/repos/foundryvtt/swade-mb-helpers/releases/${releaseId}/assets?name=module.json" \
# -H 'accept: application/json' \
# -T ./dist/swade-mb-helpers/module.json
# curl -n -X 'POST' \
# "https://git.bloy.org/api/v1/repos/foundryvtt/swade-mb-helpers/releases/${releaseId}/assets?name=swade-mb-helpers.zip" \
# -H 'accept: application/json' \
# -T ./dist/swade-mb-helpers.zip
echo
echo "Updating module.json"
curl -n -X 'POST' \
"https://git.bloy.org/api/v1/repos/foundryvtt/swade-mb-helpers/releases/${releaseId}/assets?name=module.json" \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'attachment=@dist/swade-mb-helpers/module.json;type=application/json'
echo
echo "Updating swade-mb-helpers.zip"
curl -n -X 'POST' \
"https://git.bloy.org/api/v1/repos/foundryvtt/swade-mb-helpers/releases/${releaseId}/assets?name=swade-mb-helpers.zip" \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'attachment=@dist/swade-mb-helpers.zip;type=application/x-zip-compressed'
read -r -d '' patch_body <<EOF
{
"body": "${version}",
"draft": false,
"name": "${version}",
"prerelease": false,
"tag_name": "${version}",
"target_commitish": "${version}"
}
EOF
echo
echo "setting to not draft"
curl -n -X 'PATCH' \
"https://git.bloy.org/api/v1/repos/foundryvtt/swade-mb-helpers/releases/${releaseId}" \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d "${patch_body}" \

View File

@ -8,7 +8,7 @@ import { nodeResolve } from '@rollup/plugin-node-resolve';
export default () => ({
input: 'src/module/swade-mb-helpers.js',
output: {
dir: 'dist/swade-mb-helpers/module',
dir: 'dist/module',
format: 'es',
sourcemap: true,
},

View File

@ -1,6 +1 @@
{
"mbhelpers.settings.powerActorsCompendiumName": "Power Actors Compendium",
"mbhelpers.settings.powerActorsCompendiumHint": "Identifier of a compendium that holds all the actor helpers for powers. See the documentation for details on the structure of this compendium.",
"mbhelpers.settings.powersJournalName": "Powers Journal",
"mbhelpers.settings.powersJournalHint": "UUID of a helper journal for actor-based powers (summonables and morphables)."
}
{}

View File

@ -4,16 +4,16 @@
"description": "Mike's collection of SWADE helpers",
"authors": [
{
"name": "Mike",
"flags": {}
"name": "Mike"
}
],
"url": "https://git.bloy.org/foundryvtt/swade-mb-helpers",
"version": "4.1.0",
"version": "2.4.3",
"compatibility": {
"minimum": "13",
"verified": "13"
"minimum": "11",
"verified": "11"
},
"scripts": [],
"esmodules": [
"module/swade-mb-helpers.js"
],
@ -44,7 +44,7 @@
}
},
{
"name": "CommonActions",
"name": "Common Actions",
"label": "SWADE MB Common Actions",
"path": "packs/common-actions",
"type": "Item",
@ -65,17 +65,6 @@
"ASSISTANT": "OWNER"
}
},
{
"name": "power-actors",
"label": "SWADE MB Example Power Actors",
"path": "packs/power-actors",
"type": "Actor",
"system": "swade",
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"name": "swade-mb-gear",
"label": "SWADE MB Gear",
@ -99,8 +88,7 @@
"helper-macros",
"helper-actors",
"Common Actions",
"swade-mb-gear",
"power-actors"
"swade-mb-gear"
]
}
],
@ -111,29 +99,31 @@
"type": "system",
"manifest": "https://gitlab.com/api/v4/projects/16269883/packages/generic/swade/latest/system.json",
"compatibility": {
"minimum": "5.1.0",
"verified": "5.1.0"
"verified": "2.2.5"
}
}
],
"requires": [
{
"id": "warpgate",
"type": "module",
"manifest": "https://github.com/trioderegion/warpgate/releases/latest/download/module.json",
"compatibility": {
"verified": "1.16.2"
}
},
{
"id": "socketlib",
"type": "module",
"compatibility": {}
},
{
"id": "tcal",
"type": "module",
"compatibility": {}
},
{
"id": "sequencer",
"type": "module",
"compatibility": {}
}
],
"recommends": [
{
"id": "token-variants",
"type": "module",
"compatibility": {}
},
{
"id": "torch",
"type": "module",
@ -141,13 +131,7 @@
},
{
"id": "JB2A_DnD5e",
"type": "module",
"compatibility": {}
},
{
"id": "visual-active-effects",
"type": "module",
"compatibility": {}
"type": "module"
}
]
},
@ -155,11 +139,11 @@
{
"lang": "en",
"name": "English",
"path": "lang/en.json",
"flags": {}
"path": "lang/en.json"
}
],
"socket": true,
"manifest": "https://git.bloy.org/foundryvtt/swade-mb-helpers/releases/download/latest/module.json",
"download": "https://git.bloy.org/foundryvtt/swade-mb-helpers/releases/download/latest/swade-mb-helpers.zip"
"manifest": "https://git.bloy.org/foundryvtt/swade-mb-helpers/raw/branch/main/module.json",
"download": "https://host/path/to/0.0.0.zip",
"library": false
}

View File

@ -1,23 +1,21 @@
import { log, moduleHelpers } from './globals.js';
import { requestFearRollFromTokens, requestRollFromTokens } from './helpers.js';
import { powers, PowerClasses, powerEffectsMenu } from './powers/powers.js';
import { setSummonCosts } from './powers/summonSupport.js';
import { powers } from './powers/powers.js';
export class api {
static registerFunctions() {
log('SWADE MB Helpers initialized');
api.globals();
}
static globals() {
const moduleName = 'swade-mb-helpers';
const mbSwadeApi = {
game.modules.get(moduleName).api = {
rulesVersion: moduleHelpers.rulesVersion,
fearTable: moduleHelpers.fearTableHelper,
powerEffects: powers,
PowerClasses,
powerEffectsMenu,
requestFearRollFromTokens,
requestRollFromTokens,
rulesVersion: moduleHelpers.rulesVersion,
setSummonCosts,
requestFearRollFromTokens,
};
game.modules.get(moduleName).api = mbSwadeApi;
game.mbSwade = mbSwadeApi;
}
}

View File

@ -1,9 +1,7 @@
/* globals coreFearDialog */
/* globals swpfFearDialog */
export const moduleName = 'swade-mb-helpers';
export const settingKeys = {
powerActorsCompendium: 'powerActorsCompendium',
};
export function log(...args) {
console.log('SWADE MB HELPERS |', ...args);
}
@ -15,18 +13,6 @@ export class moduleHelpers {
return moduleHelpers._socket;
}
static getSetting(key) {
return game.settings.get(moduleName, key);
}
static async setSetting(key, value) {
return game.settings.get(moduleName, key, value);
}
static async registerSetting(key, metadata) {
return game.settings.register(moduleName, key, metadata);
}
static get rulesVersion() {
if (game.modules.get('swpf-core-rules')?.active) {
return 'swpf';
@ -37,10 +23,6 @@ export class moduleHelpers {
return 'system';
}
static get useVAE() {
return !!game.modules.get('visual-active-effects')?.active;
}
static getActorFolderByPath(path) {
const names = path.split('/');
if (names[0] === '') {
@ -86,9 +68,9 @@ export class moduleHelpers {
static get fearTableHelper() {
switch (moduleHelpers.rulesVersion) {
case 'swade':
return game.swadeCore.macros.coreFearDialog; // defined as global by the swade module
return coreFearDialog; // defined as global by the swade module
case 'swpf':
return game.swpfCore.macros.coreFearDialog; // defined as global by the swpf module
return swpfFearDialog; // defined as global by the swpf module
}
throw new ReferenceError('No premium module active. No fear table found');
}

View File

@ -22,13 +22,8 @@ export function firstOwner(doc) {
// lifted from warpgate
// https://github.com/trioderegion/warpgate/blob/master/src/scripts/module.js
if (!doc) return undefined;
const corrected =
doc instanceof TokenDocument
? doc.actor
: doc instanceof foundry.canvas.placeables.Token
? doc.document.actor
: doc;
const permissionObject = foundry.utils.getProperty(corrected ?? {}, 'ownership');
const corrected = doc instanceof TokenDocument ? doc.actor : doc instanceof Token ? doc.document.actor : doc;
const permissionObject = getProperty(corrected ?? {}, 'ownership');
const playerOwners = Object.entries(permissionObject)
.filter(([id, level]) => !game.users.get(id)?.isGM && game.users.get(id)?.active && level === 3)
.map(([id]) => id);
@ -103,6 +98,7 @@ export async function requestRollFromTokens(tokens, rollType, rollDesc, options
whisper: [...ChatMessage.getWhisperRecipients('GM'), requestingUser],
content: `<p>Results of ${rollDesc[0].toUpperCase()}${rollDesc.slice(1)} roll${contentExtra}:</p>
<table><thead><tr><th>Token</th><th>Roll</th><th>Result</th></tr></thead><tbody>`,
rolls: [],
};
for (const result of results) {
const token = game.scenes.get(result.sceneId).tokens.get(result.tokenId);
@ -127,6 +123,9 @@ export async function requestRollFromTokens(tokens, rollType, rollDesc, options
`<td>${roll ? roll.total : '<i>Canceled</i>'}</td>` +
`<td>${textResult}</td>` +
'</tr>';
if (roll) {
messageData.rolls.unshift(roll);
}
}
messageData.content += '</tbody></table>';
ChatMessage.create(messageData, {});
@ -148,59 +147,14 @@ export async function requestTokenRoll(sceneId, tokenId, rollType, rollDesc, opt
return { sceneId, tokenId, result };
}
function _getSceneToken(sceneId, tokenId) {
export async function addActiveEffectsToToken(sceneId, tokenId, effectDocuments) {
const scene = game.scenes.get(sceneId);
const token = scene.tokens.get(tokenId);
return token;
}
export async function addActiveEffectsToToken(sceneId, tokenId, effectDocuments) {
const token = _getSceneToken(sceneId, tokenId);
await token.actor.createEmbeddedDocuments('ActiveEffect', effectDocuments);
}
export async function deleteActiveEffectsFromToken(sceneId, tokenId, effectIds) {
const token = _getSceneToken(sceneId, tokenId);
const scene = game.scenes.get(sceneId);
const token = scene.tokens.get(tokenId);
await token.actor.deleteEmbeddedDocuments('ActiveEffect', effectIds);
}
export async function addItemsToToken(sceneId, tokenId, itemDocuments) {
const token = _getSceneToken(sceneId, tokenId);
await token.actor.createEmbeddedDocuments('Item', itemDocuments, { renderSheet: false });
}
export async function deleteItemsFromActor(actorUuid, itemIds) {
const actor = await fromUuid(actorUuid);
await actor.deleteEmbeddedDocuments('Item', itemIds);
}
export async function updateOwnedToken(sceneId, tokenId, updates, options = {}) {
const token = _getSceneToken(sceneId, tokenId);
return token.update(updates, options);
}
export async function deleteToken(sceneId, tokenId) {
const token = _getSceneToken(sceneId, tokenId);
return token.delete();
}
export function SwadeVAEbuttons(effect, buttons) {
if (['Bound', 'Entangled'].includes(effect?.name)) {
buttons.push({
label: 'Break Free (Athletics)',
callback: function () {
const skillId = effect.parent.items.find((i) => i.type === 'skill' && i.system.swid === 'athletics')?.id;
effect.parent.rollSkill(skillId, { flavor: 'Breaking Free' });
},
});
buttons.push({
label: 'Break Free (Strength -2)',
callback: function () {
effect.parent.rollAttribute('strength', {
flavor: 'Breaking Free',
additionalMods: [{ label: 'Breaking Free with Strength', value: -2 }],
});
},
});
}
}

View File

@ -5,10 +5,6 @@ export class ArcaneProtectionEffect extends PowerEffect {
return 'Arcane Protection';
}
get basePowerPoints() {
return 1;
}
get duration() {
return 5;
}

View File

@ -1,196 +0,0 @@
import { moduleHelpers, moduleName } from '../globals.js';
import { firstOwner, updateOwnedToken } from '../helpers.js';
import { ActorFolderEffect } from './basePowers.js';
export class BalefulPolymorphEffect extends ActorFolderEffect {
get actorFolderBase() {
return 'Morphables';
}
get name() {
return 'Baleful Polymorph';
}
get icon() {
return 'icons/magic/control/silhouette-hold-change-blue.webp';
}
get duration() {
return this.data.duration ? 50 : 5;
}
get isTargeted() {
return true;
}
get oneTarget() {
return true;
}
get isRaisable() {
return true;
}
get basePowerPoints() {
return 3;
}
get hasRange() {
return false;
}
actorValue(actor) {
const size = actor.system.stats.size;
const targetSize = this.targets[0].actor.system.stats.size;
return Math.abs(targetSize - size);
}
get modifiers() {
return [
...super.modifiers,
{
name: 'Duration',
type: 'checkbox',
value: 2,
id: 'duration',
epic: true,
effect: false,
},
{
name: 'Victim critical failure',
type: 'checkbox',
default: false,
id: 'critfail',
epic: false,
value: 0,
effect: false,
},
];
}
async parseValues() {
await super.parseValues();
this.target = this?.targets?.[0];
this.data.actorUpdates = {
name: `${this.target.actor.name} (${this.targetActor.name} form)`,
system: {
wildcard: this.target.actor.system.wildcard,
attributes: {},
},
};
const attrList = ['spirit'];
if (!this.data.critfail) {
attrList.push('smarts');
}
for (const stat of attrList) {
this.data.actorUpdates.system.attributes[stat] = {
die: this.target.actor.system.attributes[stat].die,
'wild-die': this.target.actor.system.attributes[stat]['wild-die'],
};
}
this.data.tokenUpdates = {
flags: {
[moduleName]: {
'shapeChange.srcTokenUuid': this.target.document.uuid,
'shapeChange.srcTokenId': this.target.document.id,
'shapeChange.srcTokenSceneId': this.target.scene.id,
},
},
actorLink: false,
name: `${this.target.name} (${this.targetActor.prototypeToken.name} form)`,
disposition: this.target.document.disposition,
sight: {
enabled: true,
},
};
this.data.embeddedUpdates = {
ActiveEffect: {},
Item: {},
};
for (const effect of this.target.actor.effects) {
const doc = foundry.utils.deepClone(await this.target.actor.getEmbeddedDocument('ActiveEffect', effect.id));
this.data.embeddedUpdates.ActiveEffect[effect.name] = doc;
}
}
async spawn() {
const target = this.target.document;
const size = target.parent.dimensions.size;
const protoWidth = this.targetActor.prototypeToken.width;
const protoHeight = this.targetActor.prototypeToken.height;
this.targetTokenDoc.updateSource({
x: target.x - ((protoWidth - target.width) * size) / 2,
y: target.y - ((protoHeight - target.height) * size) / 2,
elevation: target.elevation,
hidden: target.hidden,
});
return this.source.scene.createEmbeddedDocuments('Token', [this.targetTokenDoc]);
}
async apply() {
await super.apply();
const maintainDoc = await this.createMaintainEffect(this.data.maintId);
maintainDoc.flags[moduleName].targetIds = this.data.spawned.map((t) => t.id);
maintainDoc.flags[moduleName].shapeChangeSourceId = this.target.id;
maintainDoc.flags[moduleName].shapeChangeTempTokenId = this.data.spawned[0].id;
let maintainer = this.source;
if (this.source.id === this.target.id) {
maintainer = this.data.spawned[0];
}
await this.applyActiveEffects(maintainer, [maintainDoc]);
}
get effectName() {
return `Baleful Polymorph into ${this.targetActor.prototypeToken.name}`;
}
get spawnUpdates() {
const updates = super.spawnUpdates;
foundry.utils.mergeObject(updates.actor, this.data.actorUpdates);
foundry.utils.mergeObject(updates.token, this.data.tokenUpdates);
foundry.utils.mergeObject(updates.embedded, this.data.embeddedUpdates);
return updates;
}
async sideEffects() {
const owner = firstOwner(this.target);
moduleHelpers.socket.executeAsUser(
updateOwnedToken,
owner.id,
this.target.document.parent.id,
this.target.document.id,
{ hidden: true, x: 0, y: 0 },
{ animate: false },
);
}
get description() {
let desc = super.description;
desc += `<p>On losing an opposed roll vs the victim's Spirit, the victim
is transformed, taking the form and abilities of a <em>${this.targetActor.name}</em>
but retaining their ${this.data.critfail ? '' : 'Smarts and '}Spirit. `;
if (this.data.critfail) {
desc += `The victim believes they <strong>are</strong> the animal for
the duration of the power.`;
}
desc += `</p><p>The victim may attempt to shake off the effect with a Spirit
roll at ${this.data.raise ? -4 : -2} at the end of subsequent turns.`;
return desc;
}
get primaryEffectButtons() {
const buttons = super.primaryEffectButtons;
const modvalue = this.data.raise ? -4 : -2;
const mods = [];
mods.push({ label: 'Strong', value: modvalue });
buttons.push({
label: `Shake off (Spirit ${modvalue})`,
type: 'trait',
rollType: 'attribute',
rollDesc: 'Spirit',
flavor: 'Success shakes off the effects of sloth',
mods,
});
return buttons;
}
}

View File

@ -1,5 +1,6 @@
import { PowerEffect } from './basePowers.js';
import { requestRollFromTokens } from '../helpers.js';
import { getPowerModifiers } from '../rollHelpers.js';
export class BanishEffect extends PowerEffect {
get name() {
@ -10,10 +11,6 @@ export class BanishEffect extends PowerEffect {
return 0;
}
get icon() {
return 'icons/magic/control/sihouette-hold-beam-green.webp';
}
get basePowerPoints() {
return 3;
}
@ -68,6 +65,7 @@ export class BanishEffect extends PowerEffect {
const rollOpts = {
title: 'Spirit roll to resist banishment',
flavor: 'Roll Spirit to resist banishment!',
modCallback: getPowerModifiers,
targetNumber: this.data.tn,
};
await requestRollFromTokens(this.targets, 'ability', 'spirit', rollOpts);

View File

@ -90,19 +90,6 @@ export class BarrierEffect extends PowerEffect {
return (this.data.raise ? 12 : 10) + (this.data.hardened ? 2 : 0);
}
get maintEffectButtons() {
const buttons = super.primaryEffectButtons;
if (this.data.damage != 'none') {
const damage = this.data.damage === 'deadly' ? '2d6' : '2d4';
buttons.push({
label: `Damage (${damage})`,
type: 'damage',
formula: damage + 'x',
});
}
return buttons;
}
get description() {
let text = super.description;
text += `<p>A barrier ${this._height} tall and ${this._length} long, of hardness ${this._hardness}. `;

View File

@ -1,84 +1,25 @@
import { moduleName, moduleHelpers, log, settingKeys } from '../globals.js';
import { moduleName, moduleHelpers } from '../globals.js';
import { firstOwner, addActiveEffectsToToken } from '../helpers.js';
import { templates } from '../preloadTemplates.js';
const MAINTAIN_ICONS = [
'icons/magic/symbols/rune-sigil-black-pink.webp',
'icons/magic/symbols/rune-sigil-green-purple.webp',
'icons/magic/symbols/rune-sigil-hook-white-red.webp',
'icons/magic/symbols/rune-sigil-red-orange.webp',
'icons/magic/symbols/rune-sigil-rough-white-teal.webp',
'icons/magic/symbols/rune-sigil-white-pink.webp',
'icons/magic/symbols/runes-star-blue.webp',
'icons/magic/symbols/runes-star-magenta.webp',
'icons/magic/symbols/runes-star-orange-purple.webp',
'icons/magic/symbols/runes-star-orange.webp',
'icons/magic/symbols/runes-star-pentagon-blue.webp',
'icons/magic/symbols/runes-star-pentagon-magenta.webp',
'icons/magic/symbols/runes-star-pentagon-orange-purple.webp',
'icons/magic/symbols/runes-star-pentagon-orange.webp',
'icons/magic/symbols/runes-triangle-blue.webp',
'icons/magic/symbols/runes-triangle-magenta.webp',
'icons/magic/symbols/runes-triangle-orange-purple.webp',
'icons/magic/symbols/runes-triangle-orange.webp',
'icons/magic/symbols/triangle-glow-purple.webp',
'icons/magic/symbols/triangle-glowing-green.webp',
];
const MAINTAIN_ICON = 'icons/magic/symbols/runes-star-blue.webp';
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
function _hashCode(str) {
let hash = 0;
if (str.length === 0) {
return hash;
}
for (let i = 0; i < str.length; i++) {
const c = str.charCodeAt(i);
hash = (hash << 5) - hash + c;
hash |= 0;
}
return Math.abs(hash);
}
export class PowerFormApplication extends HandlebarsApplicationMixin(ApplicationV2) {
export class PowerFormApplication extends FormApplication {
constructor(powerEffect) {
const name = powerEffect.name.replaceAll(/[^a-zA-Z]/g, '');
const id = `${PowerFormApplication.DEFAULT_OPTIONS.id}${name}`;
super({ id });
super();
this.powerEffect = powerEffect;
}
static DEFAULT_OPTIONS = {
id: 'mbSwadePowerEffectsApplicationV2',
form: {
handler: PowerFormApplication.#onSubmit,
closeOnSubmit: true,
},
tag: 'form',
position: {
width: 600,
height: 'auto',
},
classes: ['mbSwade', 'mbSwadeForm', 'mbSwadePowerEffectsForm'],
window: {
icon: 'fa-solid fa-hand-sparkles',
title: 'Apply Effect',
},
};
static PARTS = {
header: {
template: templates['dialogHeader.html'],
classes: ['mbSwade', 'mbSwadeDialogHeader', 'mbSwadePowerEffectsHeader'],
},
body: {
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
classes: ['sheet', 'mbSwadeForm', 'mbSwadePowerEffectsForm'],
popOut: true,
template: templates['powerDialog.html'],
classes: ['mbSwade', 'mbSwadePowerEffectsBody', 'scrollable'],
},
footer: {
template: 'templates/generic/form-footer.hbs',
},
};
id: ['mbSwadePowerEffectsApplication'],
title: 'Power Effects',
width: 400,
});
}
static sortMods(a, b) {
if (a.isGlobal !== b.isGlobal) {
@ -93,9 +34,8 @@ export class PowerFormApplication extends HandlebarsApplicationMixin(Application
return a.name === b.name ? 0 : a.name < b.name ? -1 : 1;
}
async _prepareContext() {
await this.powerEffect.init();
let modifiers = foundry.utils.deepClone(this.powerEffect.modifiers);
getData() {
let modifiers = deepClone(this.powerEffect.modifiers);
modifiers.sort(PowerFormApplication.sortMods);
for (const modifier of modifiers) {
modifier.isCheckbox = modifier.type === 'checkbox';
@ -103,9 +43,6 @@ export class PowerFormApplication extends HandlebarsApplicationMixin(Application
modifier.isRadio = modifier.type === 'radio';
modifier.isNumber = modifier.type === 'number';
modifier.isText = modifier.type === 'text';
if (modifier.isNumber) {
modifier.step = modifier?.step ?? 1;
}
if (modifier.isSelect || modifier.isRadio) {
for (const choice in modifier.choices) {
let val = '';
@ -115,18 +52,9 @@ export class PowerFormApplication extends HandlebarsApplicationMixin(Application
modifier.choices[choice] = `${modifier.choices[choice]}${val}`;
}
}
if (modifier.isRadio) {
for (const choice in modifier.choices) {
let val = modifier.choices[choice];
modifier.choices[choice] = { text: val, checked: choice == modifier.default };
}
}
}
const data = {
name: this.powerEffect.name,
formId: foundry.utils.randomID(),
headerTitle: `${this.powerEffect.name} Effect`,
headerSubtitle: `Apply the effects from ${this.powerEffect.name}`,
icon: this.powerEffect.icon,
basePowerPoints: this.powerEffect.basePowerPoints,
modifiers,
@ -135,67 +63,49 @@ export class PowerFormApplication extends HandlebarsApplicationMixin(Application
number: 0,
total: 0,
},
extraDescription: this.powerEffect.extraDescription,
targets: [],
buttons: this.powerEffect.menuButtons,
};
for (let button of data.buttons) {
button.action = button.value;
button.type = button.value === 'cancel' ? 'cancel' : 'submit';
}
if (this.powerEffect.isTargeted) {
if (this.powerEffect.oneTarget) {
data.targets = [this.powerEffect.targets?.[0]?.name ?? '<em>No Target Selected!</em>'];
} else {
data.targets = this.powerEffect.targets.map((t) => t.name);
}
data.targets = this.powerEffect.targets.map((t) => t.name);
}
if (this.powerEffect.hasAdditionalRecipients && this.powerEffect.targets.length > 1) {
data.recipients.cost = this.powerEffect.additionalRecipientCost;
data.recipients.count = this.powerEffect.additionalRecipientCount;
data.recipients.count = this.powerEffect.targets.length - 1;
data.recipients.total = data.recipients.cost * data.recipients.count;
data.recipients.epic = this.powerEffect.additionalRecipientsIsEpic;
data.recipients.text = this.powerEffect.additionalRecipientText;
}
log('DATA', data);
return data;
}
static async #onSubmit(event, form, formData) {
log(this.formData);
formData.object.submit = event?.submitter?.dataset?.action ?? 'cancel';
if (formData.object.submit !== 'cancel') {
this.powerEffect.formData = formData.object;
this.powerEffect.applyEffect();
async _updateObject(ev, formData) {
formData.submit = ev?.submitter?.value ?? 'cancel';
if (formData.submit !== 'cancel') {
this.powerEffect.formData = formData;
await this.powerEffect.applyEffect();
}
}
}
export class PowerEffect {
constructor(token, targets, item) {
constructor(token, targets) {
this.source = token;
this.targets = targets;
this.item = item;
this.data = {};
}
async init() {
log('Power Effect', this.name, 'Init');
}
static async getStatus(label, name, favorite = true) {
const effect = foundry.utils.deepClone(CONFIG.statusEffects.find((se) => se.label === label || se.name === label));
const effect = deepClone(CONFIG.statusEffects.find((se) => se.label === label));
effect.name = 'name' in effect ? effect.name : effect.label;
effect.duration = {};
if (!('flags' in effect)) {
effect.flags = {};
}
effect.flags.swade = {};
if (favorite) {
if (!('swade' in effect.flags)) {
effect.flags.swade = {};
}
effect.flags.swade.favorite = true;
}
effect.statuses ??= [];
effect.statuses.push(effect.id);
effect.flags.core = { statusId: effect.id };
return effect;
}
@ -208,18 +118,14 @@ export class PowerEffect {
name,
changes,
description: `<p>From <strong>${this.source.name}</strong> casting <em>${this.name}</em></p>`,
duration: {},
system: {
loseTurnOnHold: false,
expiration: null,
},
duration: { rounds: 99 },
flags: {
[moduleName]: {
powerEffect: true,
},
swade: {
loseTurnOnHold: false,
expiration: null,
expiration: CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.StartOfTurnAuto,
},
},
};
@ -230,7 +136,7 @@ export class PowerEffect {
await moduleHelpers.socket.executeAsUser(
addActiveEffectsToToken,
owner.id,
token?.scene?.id ?? token.parent.id,
token.scene.id,
token.id,
effectDocuments,
);
@ -244,10 +150,6 @@ export class PowerEffect {
return this.name;
}
get extraDescription() {
return '';
}
get icon() {
return 'icons/magic/symbols/question-stone-yellow.webp';
}
@ -264,29 +166,14 @@ export class PowerEffect {
return true;
}
get isDamaging() {
return false;
}
get hasAdditionalRecipients() {
return false;
}
get additionalRecipientsIsEpic() {
get isDamaging() {
return false;
}
get additionalRecipientText() {
return 'Additional Recipients';
}
get additionalRecipientCount() {
if (!this.hasAdditionalRecipients) {
return 0;
}
return Math.max(0, this.targets.length - 1);
}
get additionalRecipientCost() {
return 0;
}
@ -299,10 +186,6 @@ export class PowerEffect {
return false;
}
get hasRange() {
return true;
}
get isRaisable() {
return true;
}
@ -420,7 +303,7 @@ export class PowerEffect {
icon: 'icons/magic/control/debuff-chains-shackle-movement-red.webp',
changes: [
{
key: 'system.pace',
key: 'system.stats.speed.value',
value: -2,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
@ -432,7 +315,7 @@ export class PowerEffect {
icon: 'icons/skills/movement/feet-winged-sandals-tan.webp',
changes: [
{
key: 'system.pace',
key: 'system.stats.speed.value',
value: 2,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
@ -453,26 +336,24 @@ export class PowerEffect {
isGlobal: true,
});
}
if (this.hasRange) {
mods.push({
type: 'select',
default: 0,
name: 'Range',
id: 'range',
choices: {
normal: 'Normal Range',
x2: 'Range ×2',
x3: 'Range ×3',
},
values: {
normal: 0,
x2: 1,
x3: 2,
},
isGlobal: true,
effects: { normal: null, x2: null, x3: null },
});
}
mods.push({
type: 'select',
default: 0,
name: 'Range',
id: 'range',
choices: {
normal: 'Normal Range',
x2: 'Range ×2',
x3: 'Range ×3',
},
values: {
normal: 0,
x2: 1,
x3: 2,
},
isGlobal: true,
effects: { normal: null, x2: null, x3: null },
});
return mods;
}
@ -500,36 +381,11 @@ export class PowerEffect {
async parseValues() {
this.data.raise = this.formData.submit === 'raise';
this.data.button = this.formData.submit;
this.data.maintId = foundry.utils.randomID();
for (const mod of this.modifiers) {
this.data[mod.id] = this.formData[mod.id];
}
}
enhanceSecondaryEffect(maintId, doc) {
doc.statuses = doc.statuses ?? [];
doc.statuses.push('powerEffect');
if (this.duration === 0 && !this.usePrimaryEffect) {
// set secondary effects of instant spells to expire on victim's next
// turn
doc.duration.rounds = 1;
doc.flags.swade.expiration = CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.EndOfTurnAuto;
doc.system.expiration = doc.flags.swade.expiration;
} else {
doc.flags[moduleName].maintId = maintId;
if (moduleHelpers.useVAE) {
doc.flags['visual-active-effects'] = {
data: {
inclusion: 1,
},
};
} else {
doc.duration.seconds = 594;
}
}
return doc;
}
async createSecondaryEffects(maintId) {
const docs = [];
for (const mod of this.modifiers) {
@ -538,10 +394,15 @@ export class PowerEffect {
const icon = 'effects' in mod ? mod.effects[modValue].icon : mod.icon;
const name = 'effects' in mod ? mod.effects[modValue].name : mod.name;
const changes = 'effects' in mod ? mod.effects[modValue].changes : mod.changes;
const doc = this.enhanceSecondaryEffect(maintId, this.createEffectDocument(icon, name, changes));
const desc = 'effects' in mod ? mod.effects?.[modValue]?.description : mod.description;
if (desc) {
doc.description += desc;
const doc = this.createEffectDocument(icon, name, changes);
if (this.duration === 0 && !this.usePrimaryEffect) {
// set secondary effects of instant spells to expire on victim's next
// turn
doc.duration.rounds = 1;
doc.flags.swade.expiration = CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.EndOfTurnAuto;
} else {
doc.duration.seconds = 594;
doc.flags[moduleName].maintId = maintId;
}
docs.push(doc);
}
@ -561,113 +422,47 @@ export class PowerEffect {
return changes;
}
getMaintainEffectChanges() {
const changes = [
{
key: 'flags.swade-mb-helpers.powerMaintained',
value: 1,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
},
];
return changes;
}
get description() {
return '';
}
get primaryEffectButtons() {
// button objects should have a label and a type.
// type should have one of the following, with the associated additional
// fields:
// roll:
// formula: dice formula eg '3d6 + 3'
// flavor: flavor text (optional)
// trait:
// rollType: 'attribute' or 'skill
// rollDesc: name or swid of the attribute or skill
// flavor: flavor text (optional)
// mods: list of mods { label, value, ignore }
// damage:
// formula: dice formula for example '1d4x[Blades]'
// ap: optional, a positive integer or 0, armor piercing
// flavor: flavor text (optional)
// callback:
// callback: the function callback to run, takes a token as an argument
return [];
}
get maintEffectButtons() {
// see the comment for primaryEffectButtons
return [];
}
get basePrimaryEffect() {
return this.createEffectDocument(this.icon, this.effectName, this.getPrimaryEffectChanges());
}
async createPrimaryEffect(maintId) {
const doc = this.basePrimaryEffect;
if (moduleHelpers.useVAE) {
doc.flags['visual-active-effects'] = {
data: {
inclusion: 1,
},
};
}
const doc = this.createEffectDocument(this.icon, this.effectName, this.getPrimaryEffectChanges());
doc.description += this.description;
doc.statuses = doc.statuses ?? [];
doc.statuses.push('powerEffect');
doc.flags[moduleName].maintId = maintId;
const effectButtons = this.primaryEffectButtons;
if (effectButtons.length > 0) {
doc.flags[moduleName].buttons = effectButtons;
}
doc.duration.seconds = 594;
return doc;
}
async createMaintainEffect(maintId) {
let icon = MAINTAIN_ICONS[_hashCode(this.name) % MAINTAIN_ICONS.length];
let icon = MAINTAIN_ICON;
if (!this.usePrimaryEffect) {
icon = this.icon;
}
const doc = this.createEffectDocument(icon, `Maintaining ${this.effectName}`, this.getMaintainEffectChanges());
const doc = this.createEffectDocument(icon, `Maintaining ${this.effectName}`, []);
doc.duration.rounds = this.duration;
doc.description += this.description;
doc.flags.swade.expiration = CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.EndOfTurnPrompt;
doc.flags.swade.loseTurnOnHold = true;
doc.system.expiration = doc.flags.swade.expiration;
doc.system.loseTurnOnHold = true;
doc.flags[moduleName].maintainingId = maintId;
if (this.isTargeted) {
doc.flags[moduleName].targetIds = this.targets.map((t) => t.id);
} else {
doc.flags[moduleName].targetIds = [this.source.id];
}
doc.statuses = doc.statuses ?? [];
doc.statuses.push('powerMaintainEffect');
const effectButtons = this.maintEffectButtons;
if (effectButtons.length > 0) {
doc.flags[moduleName].buttons = effectButtons;
}
doc.flags[moduleName].targetIds = this.targets.map((t) => t.id);
return doc;
}
// eslint-disable-next-line no-unused-vars
async secondaryDocsForTarget(docs, target) {
return foundry.utils.deepClone(docs);
return deepClone(docs);
}
async primaryDocForTarget(doc, target) {
const newDoc = foundry.utils.deepClone(doc);
const newDoc = deepClone(doc);
newDoc.flags[moduleName].maintainingId = doc.flags[moduleName].maintId;
newDoc.flags[moduleName].targetIds = [target.id];
return newDoc;
}
async apply() {
const maintId = this.data.maintId;
const maintId = randomID();
const secondaryDocs = await this.createSecondaryEffects(maintId);
const primaryDoc = await this.createPrimaryEffect(maintId);
const maintainDoc = await this.createMaintainEffect(maintId);
@ -681,11 +476,6 @@ export class PowerEffect {
await this.applyActiveEffects(target, targetDocs);
}
}
} else {
const targetDocs = await this.secondaryDocsForTarget(secondaryDocs, this.source);
if (targetDocs.length > 0) {
await this.applyActiveEffects(this.source, targetDocs);
}
}
if (this.duration > 0) {
await this.applyActiveEffects(this.source, [maintainDoc]);
@ -722,7 +512,9 @@ export class PowerEffect {
}
}
}
total += this.additionalRecipientCost * this.additionalRecipientCount;
if (this.targets.length > 1 && this.hasAdditionalRecipients) {
total += (this.targets.length - 1) * this.additionalRecipientCost;
}
return total;
}
@ -749,7 +541,7 @@ export class PowerEffect {
if (this.isDamaging && this.data.ap > 0) {
list.push(`AP ${this.data.ap}`);
}
if (this.data.range ?? 'none' != 'none') {
if (this.data.range != 'none') {
list.push(`Range ${this.data.range}`);
}
return list;
@ -784,293 +576,3 @@ export class PowerEffect {
);
}
}
export class ActorFolderEffect extends PowerEffect {
async init() {
await super.init();
const extraFields = ['system.stats.size', 'flags.swade-mb-helpers.summonData'];
this.packActors = await ActorFolderEffect.actorFolderPack.getIndex({ fields: extraFields });
this.data.actors = this.prepActors();
}
get actorFolderBase() {
return '';
}
static get actorFolderPack() {
const packId = moduleHelpers.getSetting(settingKeys.powerActorsCompendium);
const pack = game.packs.get(packId);
if (!pack) {
return undefined;
}
return game.user.isGM || pack.testUserPermission(game.user, CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER)
? pack
: undefined;
}
get actorFolder() {
return `${this.actorFolderBase}/${this.name}`;
}
static getPackFolderByPath(path) {
const names = path.split('/');
if (names[0] === '') {
names.shift();
}
let name = names.shift();
if (!ActorFolderEffect.actorFolderPack) {
return undefined;
}
let folder = ActorFolderEffect.actorFolderPack.folders
.filter((f) => f.type === 'Actor' && !f.folder)
.find((f) => f.name === name);
if (!folder) {
return undefined;
}
while (names.length > 0) {
name = names.shift();
folder = folder.children.find((c) => c.folder.name === name);
if (!folder) {
return undefined;
}
folder = folder.folder;
}
return folder;
}
static getPackActorsInFolder(inFolder) {
const prefixStack = [''];
const actors = {};
const folderStack = [inFolder];
while (folderStack.length > 0) {
const prefix = prefixStack.shift();
const folder = folderStack.shift();
for (const actor of folder.contents) {
actors[`${prefix}${actor.name}`] = actor;
}
for (const child of folder.children) {
const newPrefix = `${prefix}${child.folder.name} | `;
prefixStack.push(newPrefix);
folderStack.push(child.folder);
}
}
return actors;
}
prepFolders() {
const folders = [];
const folderNames = [
this.actorFolder,
`${this.actorFolder} - Default`,
`${this.actorFolder}/Default`,
`${this.actorFolder} - ${this.source.name}`,
`${this.actorFolder} - ${this.source.actor.name}`,
`${this.actorFolder}/${this.source.name}`,
`${this.actorFolder}/${this.source.actor.name}`,
];
for (const folderName of folderNames) {
const folder = ActorFolderEffect.getPackFolderByPath(folderName);
if (folder) {
log(`Found actor folder ${folderName}`);
folders.push(folder);
}
}
if (folders.length > 1) {
folders.shift();
}
return folders;
}
prepActors() {
const folders = this.prepFolders();
const actors = {};
for (const folder of folders) {
const folderActors = ActorFolderEffect.getPackActorsInFolder(folder);
for (const key in folderActors) {
actors[key] = folderActors[key];
}
}
return actors;
}
// eslint-disable-next-line no-unused-vars
actorValue(actor) {
return 0;
}
getActors() {
const choices = {};
const effects = {};
const values = {};
Object.keys(this.data.actors)
.filter((k) => !k.includes('_template'))
.sort()
.forEach((key) => {
const id = this.data.actors[key].uuid;
choices[id] = key;
effects[id] = null;
values[id] = this.actorValue(this.data.actors[key]);
});
return { choices, effects, values };
}
get modifiers() {
const { choices, effects, values } = this.getActors();
return [
...super.modifiers,
{
name: 'Select Creature',
id: 'actorId',
type: 'select',
choices,
effects,
values,
epic: false,
effect: false,
},
];
}
get spawnUpdates() {
const updates = {
actor: {},
token: {
actorLink: false,
},
embedded: {
ActiveEffect: {},
Item: {},
},
};
return updates;
}
#documentFinder(documentType, oldDoc, newDoc) {
if (documentType === 'Item') {
return oldDoc.name.toLowerCase() === newDoc.name.toLowerCase() && oldDoc.type === newDoc.type;
}
return oldDoc.name.toLowerCase() === newDoc.name.toLowerCase();
}
async updateEmbedded(actor, newDocs) {
const adds = {};
const updates = {};
for (const documentType of Object.keys(newDocs ?? {})) {
const collection = actor.getEmbeddedCollection(documentType);
adds[documentType] = [];
updates[documentType] = [];
log('docType', documentType);
for (const newDocKey in newDocs[documentType]) {
log('newDocKey', newDocKey);
const newDoc = newDocs[documentType][newDocKey].toObject();
const oldDoc = collection.find((doc) => this.#documentFinder(documentType, doc, newDoc));
if (newDoc.type === 'power' && newDoc?.system?.choiceSets?.length > 0) {
newDoc.system.choiceSets = [];
}
if (oldDoc) {
const _id = oldDoc.id;
updates[documentType].push({ ...newDoc, _id });
} else {
adds[documentType].push(newDoc);
}
}
const updateOpts = {};
updateOpts.mbItemCreationSource = moduleName;
if (documentType === 'Item') {
updateOpts.renderSheet = false;
}
try {
if (adds[documentType].length > 0) {
actor.createEmbeddedDocuments(documentType, adds[documentType], updateOpts);
}
} catch (e) {
log('ERROR', e);
}
try {
if (updates[documentType].length > 0) {
actor.updateEmbeddedDocuments(documentType, updates[documentType], updateOpts);
}
} catch (e) {
log('ERROR', e);
}
}
}
async parseValues() {
await super.parseValues();
this.data.maintId = foundry.utils.randomID();
this.targetActor = await game.tcal.importTransientActor(this.data.actorId, { preferExisting: true });
this.targetTokenDoc = await this.targetActor.getTokenDocument();
const perm = CONST?.DOCUMENT_PERMISSION_LEVELS?.OWNER ?? CONST?.DOCUMENT_OWNERSHIP_LEVELS?.OWNER;
const sourceUpdates = {
delta: {
ownership: {
[game.user.id]: perm,
},
},
};
this.targetTokenDoc.updateSource(sourceUpdates);
}
async spawn() {
this.targetTokenDoc.updateSource({
x: this.source.x,
y: this.source.y,
elevation: this.source.elevation,
});
return this.source.scene.createEmbeddedDocuments('Token', [this.targetTokenDoc]);
}
async apply() {
this.data.spawned = await this.spawn();
const updates = this.spawnUpdates;
const secondaryDocs = await this.createSecondaryEffects(this.data.maintId);
const primaryDoc = await this.createPrimaryEffect(this.data.maintId);
const promises = [];
for (const token of this.data.spawned) {
if (updates?.token) {
promises.push(token.update(updates.token));
}
if (updates?.actor) {
promises.push(token.actor.update(updates.actor));
}
if (updates?.embedded) {
promises.push(this.updateEmbedded(token.actor, updates.embedded));
}
const activeEffects = await this.secondaryDocsForTarget(secondaryDocs, token);
activeEffects.push(await this.primaryDocForTarget(primaryDoc, token));
promises.push(this.applyActiveEffects(token, activeEffects));
}
await Promise.all(promises);
}
async createPrimaryEffect(maintId) {
const doc = await super.createPrimaryEffect(maintId);
doc.flags[moduleName].spawnedTempToken = true;
return doc;
}
async sideEffects() {
if (this.data.fatigue) {
for (const target of this.data.spawned) {
const actor = target.actor;
const update = {
system: {
fatigue: {
value: actor.system.fatigue.value + 1,
},
},
};
if (actor.system.fatigue.value < actor.system.fatigue.max) {
await actor.update(update);
}
}
}
}
}
export function embeddedHelperHook(item, data, options) {
if (options?.mbItemCreationSource === moduleName) {
options.renderSheet = false;
}
}

View File

@ -48,28 +48,11 @@ export class BlindEffect extends PowerEffect {
);
}
get primaryEffectButtons() {
const buttons = super.primaryEffectButtons;
const mods = [];
if (this.data.strong) {
mods.push({ label: 'Strong', value: -2 });
}
buttons.push({
label: `Shake off (Vigor${this.data.strong ? ' -2' : ''})`,
type: 'trait',
rollType: 'attribute',
rollDesc: 'Vigor',
flavor: 'Success shakes off one level, Raise shakes off two',
mods,
});
return buttons;
}
async createSecondaryEffects(maintId) {
const docs = await super.createSecondaryEffects(maintId);
if (this.data.raise) {
const strong = this.data.strong;
let doc = this.createEffectDocument(this.icon, `Blinded (${strong ? 'Strong, ' : ''}Raise)`, [
const doc = this.createEffectDocument(this.icon, `Blinded (${strong ? 'Strong, ' : ''}Raise)`, [
{
key: 'system.stats.globalMods.trait',
value: -2,
@ -77,8 +60,9 @@ export class BlindEffect extends PowerEffect {
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
},
]);
doc = this.enhanceSecondaryEffect(maintId, doc);
doc.duration.seconds = 594;
doc.description = this.description + '<p>This is the raise effect which can be shaken off separately.</p>';
doc.flags[moduleName].maintId = maintId;
docs.push(doc);
}
return docs;

View File

@ -70,8 +70,10 @@ export class BoostLowerTraitEffect extends PowerEffect {
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
},
];
const doc = this.enhanceSecondaryEffect(maintId, this.createEffectDocument(this.icon, name, changes));
const doc = this.createEffectDocument(this.icon, name, changes);
doc.duration.seconds = 594;
doc.description = this.description + '<p>This is the raise effect which can be shaken off separately.</p>';
doc.flags[moduleName].maintId = maintId;
docs.push(doc);
}
return docs;
@ -116,25 +118,6 @@ export class BoostLowerTraitEffect extends PowerEffect {
return desc;
}
get primaryEffectButtons() {
const buttons = super.primaryEffectButtons;
if (this.data.direction === 'Lower') {
const mods = [];
if (this.data.strong) {
mods.push({ label: 'Strong', value: -2 });
}
buttons.push({
label: `Shake off (Spirit${this.data.strong ? ' -2' : ''})`,
type: 'trait',
rollType: 'attribute',
rollDesc: 'Spirit',
flavor: 'Success shakes off one level, Raise shakes off two',
mods,
});
}
return buttons;
}
get modifiers() {
const mods = super.modifiers;
let traitOptions = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'];

View File

@ -42,26 +42,6 @@ export class BurrowEffect extends PowerEffect {
return mods;
}
getPrimaryEffectChanges() {
return [
...super.getPrimaryEffectChanges(),
{
key: 'system.pace.burrow',
value: 6,
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
priority: 0,
},
];
}
async primaryDocForTarget(doc, target) {
const newDoc = await super.primaryDocForTarget(doc, target);
var pace = target.actor.system.pace[target.actor.system.pace.base];
pace = this.data.raise ? pace : pace / 2;
newDoc.changes[newDoc.changes.length - 1].value = pace;
return newDoc;
}
get effectName() {
return `${this.name} ${this.data.power ? '[Power] ' : ''}` + `(${this.data.raise ? 'full' : 'half'} pace)`;
}

View File

@ -1,100 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class ConjureItemEffect extends PowerEffect {
get name() {
return 'Conjure Item';
}
get icon() {
return 'icons/commodities/tech/cog-steel-grey.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return false;
}
get isRaisable() {
return true;
}
get basePowerPoints() {
return 2;
}
get modifiers() {
return [
{
name: 'Weight in pounds OR daily rations',
type: 'number',
default: 1,
value: 0,
id: 'weight',
epic: false,
effect: false,
},
{
name: 'Complete Set',
type: 'checkbox',
default: false,
value: 1,
id: 'complete',
epic: false,
effect: false,
},
{
name: 'Create Food and Water (Special)',
type: 'checkbox',
default: false,
value: 0,
id: 'rations',
epic: false,
effect: false,
},
{
name: 'Durable (+1 per pound)',
type: 'checkbox',
default: false,
value: 0,
id: 'durable',
epic: false,
effect: false,
},
];
}
get powerPoints() {
if (this.data.rations) {
return this.data.weight;
}
return this.data.weight * (this.data.durable ? 3 : 2) + (this.data.complete ? 1 : 0);
}
get description() {
if (this.data.rations) {
return (
super.description +
`<p>Conjure enough food and drink to feed ${this.data.weight} size 0
humanoid${this.data.weight > 1 ? 's' : ''} for 1 day. The food decays
and is inedible after 24 hours if not consumed.</p>`
);
}
let desc = super.description + `<p>Conjure an item up to ${this.data.weight} in pounds. `;
if (this.data.raise) {
desc += 'It is a more durable item than usual for its type. ';
}
if (this.data.complete) {
desc += 'Whatever is conjured is a complete set. ';
}
if (this.data.durable) {
desc += 'The item remains until it is dispelled or dismissed by the caster. ';
} else {
desc += 'The item lasts for one hour. ';
}
desc += 'Once it is dismissed or expires, the item fades from existance.</p>';
return desc;
}
}

View File

@ -1,109 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class CreatePitEffect extends PowerEffect {
get name() {
return 'Create Pit';
}
get duration() {
return 5;
}
get icon() {
return 'icons/environment/traps/spike-skull-white-brown.webp';
}
get isTargeted() {
return false;
}
get basePowerPoints() {
return 2;
}
get usePrimaryEffect() {
return false;
}
get modifiers() {
return [
...super.modifiers,
{
name: 'Soft Ground',
id: 'soft',
type: 'checkbox',
default: false,
value: 1,
epic: false,
effect: false,
},
{
name: 'Spiked',
id: 'spiked',
type: 'checkbox',
default: false,
value: 1,
epic: false,
effect: false,
},
{
name: 'Deep',
id: 'deep',
type: 'checkbox',
default: false,
value: 2,
epic: false,
effect: false,
},
];
}
get damage() {
let dice = 2;
let mod = 2;
if (this.data.deep) {
dice += 2;
mod = 4;
}
if (this.data.spiked) {
dice += 1;
}
return { dice, mod };
}
get description() {
let text = super.description;
const deep = this.data.deep ? '8" (16 yards)' : '4" (8 yards)';
const damage = this.damage;
text += `<p>An extradimension pit appears as a hole the size of an MBT,
${deep} deep.
`;
if (this.data.spiked) {
text += 'The bottom is covered in spikes.';
}
text += `</p>
<p>Anyone in or adjacent to the area must make an Evasion roll
${this.data.raise ? '(at -2 from the raise)' : ''} or fall in.
`;
if (this.data.soft) {
text += 'The bottom is soft and does no damage.';
} else {
text += `Those who fall in take ${damage.dice}d6+${damage.mod} damage.`;
}
return text;
}
get maintEffectButtons() {
const damage = this.damage;
const buttons = super.maintEffectButtons;
if (!this.data.soft) {
buttons.push({
label: `Falling Damage (${damage.dice}d6+${damage.mod})`,
type: 'damage',
flavor: `Falling Damage${this.data.spiked ? ' with spikes!' : ''}`,
formula: `${damage.dice}d6x+${damage.mod}`,
});
}
return buttons;
}
}

View File

@ -66,22 +66,6 @@ export class DamageFieldEffect extends PowerEffect {
return mods;
}
get primaryEffectButtons() {
const buttons = super.primaryEffectButtons;
let damage = '2d4';
if (this.data.greater) {
damage = '3d6';
} else if (this.data.damage) {
damage = '2d6';
}
buttons.push({
label: `Damage (${damage})`,
type: 'damage',
formula: `${damage}x`,
});
return buttons;
}
get description() {
let desc = super.description;
let area = 'all adjacent creatures';

View File

@ -63,7 +63,7 @@ export class DarksightEffect extends PowerEffect {
} else if (this.data.raise) {
return 'Major Darksight';
} else {
return 'Darksight';
return 'Darksignt';
}
}
}

View File

@ -1,133 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class DispelEffect extends PowerEffect {
get name() {
return 'Dispel';
}
get icon() {
return 'icons/magic/symbols/triangle-glowing-green.webp';
}
get duration() {
return this?.data?.antiMagic ? 5 : 0;
}
get usePrimaryEffect() {
return !!this?.data?.antiMagic;
}
get basePowerPoints() {
return 1;
}
get isTargeted() {
return true;
}
get hasAoe() {
return true;
}
get modifiers() {
return [
...super.modifiers,
{
name: 'Anti-Magic Field',
type: 'checkbox',
value: 8,
id: 'antiMagic',
epic: true,
effect: false,
},
{
type: 'select',
default: 'none',
name: 'Area of Effect',
id: 'aoe',
epic: false,
choices: {
none: 'None',
sbt: 'Small Blast Template',
mbt: 'Medium Blast Template',
lbt: 'Large Blast Template',
},
effects: { none: null, sbt: null, mbt: null, lbt: null },
values: { none: 0, sbt: 1, mbt: 2, lbt: 3 },
},
{
name: 'Disenchant',
type: 'checkbox',
value: 1,
id: 'disenchant',
epic: true,
effect: false,
},
{
name: 'Multiple Powers',
type: 'checkbox',
value: 8,
id: 'multiple',
epic: false,
effect: false,
},
{
name: 'Remove Curse',
type: 'checkbox',
value: 2,
id: 'removeCurse',
epic: true,
effect: false,
},
];
}
get effectName() {
return this.data.antiMagic ? 'Anti-Magic Field' : super.effectName;
}
getPrimaryEffectChanges() {
if (this.data.antiMagic) {
const base = 'flags.swade.auras.antiMagicField';
const priority = 0;
const mode = foundry.CONST.ACTIVE_EFFECT_MODES.OVERRIDE;
return [
{ key: `${base}.enabled`, value: true, priority, mode },
{ key: `${base}.walls`, value: true, priority, mode },
{ key: `${base}.color`, value: '#ff00cc', priority, mode },
{ key: `${base}.alpha`, value: 0.1, priority, mode },
{ key: `${base}.radius`, value: 1.5, priority, mode },
{ key: `${base}.visibleTo`, value: [-1, 0, 1], priority, mode },
];
}
return super.getPrimaryEffectChanges();
}
get description() {
let text = super.description;
if (this.data.antiMagic) {
text += `<p>Magic items, effects, and powers within the anti magic field
have no effect. Summoned creatures must make a Spirit roll each round or
or take a wound.</p>`;
return text;
}
const multi = this.data.multiple || this.data.aoe;
const affected = `${multi ? 'all' : 'a single'}
${this.data.disenchant ? 'magic item' : 'power'}${multi ? 's' : ''}
${this.data.aoe === 'none' ? 'cast by or on the recipient' : 'within a ' + this.data.aoe.toUpperCase()}`;
text += `<p>Attempt to dispel ${affected}. `;
if (this.data.disenchant) {
text += `The item(s) magical abilities are negated for ${this.data.raise ? 'two rounds' : 'one round'}`;
} else {
text += `Each target must make an opposed arcane skill (spirit for Mystic Powers)
roll or have the power(s) end immediately.`;
}
if (this.data.removeCurse) {
text += `The normal -2 penalty to remove a curse is ignored.`;
} else {
text += `If the effect is a Curse, there is a -2 penalty to the dispeller's roll`;
}
text += '</p>';
return text;
}
}

View File

@ -1,70 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class DivinationEffect extends PowerEffect {
get name() {
return 'Divination';
}
get icon() {
return 'icons/magic/perception/orb-crystal-ball-scrying.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return false;
}
get isRaisable() {
return true;
}
get basePowerPoints() {
return 5;
}
get modifiers() {
return [
{
name: 'Power (sacred ground only)',
type: 'checkbox',
value: 5,
id: 'power',
epic: true,
effect: false,
},
{
name: 'Sacred Ground',
type: 'checkbox',
value: 0,
id: 'sacred',
epic: false,
effect: false,
},
];
}
get description() {
let desc = super.description;
desc += `<p>A brief conversation with a summoned spirit or entity. `;
if (this.data.sacred) {
desc += `There is a +2 to the roll due to being on sacred ground for the
summoned entity. `;
}
if (this.data.raise) {
desc += `The entity will be generally helpful and more direct than usual
in answering questions.i `;
} else {
desc += `The entity will answer questions to the best of its ability, but
usually in a vague or symbolic manner.i `;
}
if (this.data.sacred && this.data.power) {
desc += `The entity will also offer unsolicted advice or information,
according to its nature.`;
}
desc += '</p>';
return desc;
}
}

View File

@ -1,83 +0,0 @@
import { requestRollFromTokens } from '../helpers.js';
import { PowerEffect } from './basePowers.js';
export class DrainPowerPointsEffect extends PowerEffect {
get name() {
return 'Drain Power Points';
}
get icon() {
return 'icons/magic/control/debuff-energy-hold-teal-blue.webp';
}
get duration() {
return 0;
}
get basePowerPoints() {
return 2;
}
get usePrimaryEffect() {
return false;
}
get isTargeted() {
return true;
}
get isRaisable() {
return false;
}
get oneTarget() {
return true;
}
get modifiers() {
return [
...super.modifiers,
{
type: 'checkbox',
name: 'Power',
id: 'power',
epic: false,
effect: false,
value: 2,
},
{
type: 'number',
default: 4,
name: 'Opposed Target Number',
id: 'tn',
epic: false,
effect: false,
value: 0,
},
];
}
async sideEffects() {
await super.sideEffects();
const rollOpts = {
title: 'Resist Drain Power Points',
flavor: 'Resist the energy drain!',
mods: [{ label: 'Different Arcane Background', value: 2, ignore: true }],
targetNumber: this.data.tn,
};
await requestRollFromTokens(this.targets, 'ability', 'spirit', rollOpts);
}
get description() {
return (
super.description +
`
<p>An opposed roll of the caster's arcane activation roll vs the target's
Spirit. Caster's success means the victim loses
[[/r ${this.data.power ? '2' : '1'}d6]] power points. If the caster gets
a raise over the opponent, the stolen power points augment the caster's
own total.</p>
`
);
}
}

View File

@ -1,97 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class ElementalManipulationEffect extends PowerEffect {
get name() {
return 'Elemental Manipulation';
}
get icon() {
return 'icons/magic/symbols/elements-air-earth-fire-water.webp';
}
get duration() {
return this.data?.weather ? 0 : 5;
}
get isTargeted() {
return this.data?.weather ? false : true;
}
get isRaisable() {
return true;
}
get usePrimaryEffect() {
return this.data?.weather ? false : true;
}
get oneTarget() {
return true;
}
get basePowerPoints() {
return 5;
}
get modifiers() {
return [
{
name: 'Power',
type: 'checkbox',
value: 3,
id: 'power',
epic: true,
effect: false,
},
{
name: 'Weather',
type: 'checkbox',
value: 5,
id: 'weather',
epic: true,
effect: false,
},
];
}
get primaryEffectButtons() {
const dmg = `${this.data.raise ? 3 : 2}d${this.data.power ? 6 : 4}`;
return [
...super.primaryEffectButtons,
{
type: 'damage',
label: `Damage (${dmg})`,
formula: `${dmg}x`,
},
];
}
get description() {
if (this.data.weather) {
return (
super.description +
`Bring or disperse rain, snow, sun, and wind in about a five mile radius.
This takes 10 minutes and lasts an hour.
`
);
}
let damage = `${this.data.raise ? 3 : 2}d${this.data.power ? 6 : 4}x`;
return (
super.description +
`
<p>Use the activation roll for:</p>
<ul>
<li><strong>Attack:</strong> activation roll is the attack roll,
[[/r ${damage}]] damage within Range.</li>
<li><strong>Move:</strong> move a cubic foot of air, earth, fire or water
(half that of stone) up to the caster's Smarts as a limited action.</li>
<li><strong>Push:</strong> Use the activation roll in place of Strength
for a Push.</li>
<li><strong>Special Effects:</strong> eg. purify a gallon of water,
or conjure a quart, fix breaks in stone, conjure a flame or spread
existing flame.</li>
</ul>
`
);
}
}

View File

@ -1,105 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class EmpathyEffect extends PowerEffect {
get name() {
return 'Empathy';
}
get duration() {
return 5 * (this?.data?.duration ?? false ? 10 : 1);
}
get icon() {
return 'icons/skills/social/diplomacy-handshake-yellow.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get basePowerPoints() {
return 1;
}
get isTargeted() {
return true;
}
get modifiers() {
return [
...super.modifiers,
{
name: 'Charm',
type: 'checkbox',
id: 'charm',
value: 2,
epic: false,
effect: false,
},
{
name: 'Duration',
type: 'checkbox',
id: 'duration',
value: 1,
epic: false,
effect: false,
},
{
name: 'Truth',
type: 'checkbox',
id: 'truth',
value: 2,
epic: true,
effect: false,
},
];
}
get effectName() {
const extra = [];
if (this.data.charm) {
extra.push('Charm');
}
if (this.data.truth) {
extra.push('Truth');
}
const extraText = extra.length ? ` (${extra.join(', ')})` : '';
return this.name + extraText;
}
getMaintainEffectChanges() {
const mode = foundry.CONST.ACTIVE_EFFECT_MODES.ADD;
const value = this.data.raise ? 2 : 1;
return ['Intimidation', 'Persuasion', 'Performance', 'Taunt', 'Riding'].map(function (skill) {
return {
key: `@Skill{${skill}}[system.die.modifier]`,
priority: 0,
mode,
value,
};
});
}
get description() {
let text = super.description;
text += `
<p>Opposed by Spirit. If the target fails, caster gets
+${this.data.raise ? 2 : 1} to Intimidation, Persuasion, Performance,
Taunt or Riding (if target is an animal) rolls vs the target, except for
rolls to activate powers.</p>`;
if (this.data.charm) {
text += `<p>an Uncooperative target is made
${this.data.raise ? 'Friendly' : 'Cooperative'}.
The spell ends instantly if the caster's group attacks the victim's group.</p>`;
}
if (this.data.truth) {
text += '<p>The caster knows if the targets believe they are telling the truth.</p>';
}
return text;
}
}

View File

@ -1,115 +0,0 @@
import { moduleName } from '../globals.js';
import { PowerEffect } from './basePowers.js';
export class EntangleEffect extends PowerEffect {
get name() {
return 'Entangle';
}
get duration() {
return 0;
}
get icon() {
return 'icons/magic/nature/root-vine-entangled-humanoid.webp';
}
get isDamaging() {
return true;
}
get basePowerPoints() {
return 2;
}
get usePrimaryEffect() {
return false;
}
get isTargeted() {
return true;
}
get modifiers() {
return [
...super.modifiers,
{
type: 'select',
name: 'Damage',
id: 'damage',
epic: false,
default: 'none',
choices: {
none: 'None',
damage: 'Damage',
deadly: '⭐ Deadly',
},
effects: { none: null, damage: null, deadly: null },
values: { none: 0, damage: 2, deadly: 4 },
},
{
type: 'checkbox',
default: false,
name: 'Tough',
id: 'tough',
value: 1,
epic: false,
effect: false,
},
{
type: 'select',
default: 'none',
name: 'Area of Effect',
id: 'aoe',
epic: true,
choices: {
none: 'None',
mbt: 'Medium Blast Template',
lbt: 'Large Blast Template',
},
effects: { none: null, mbt: null, lbt: null },
values: { none: 0, mbt: 2, lbt: 3 },
},
];
}
async createSecondaryEffects(maintId) {
const docs = await super.createSecondaryEffects(maintId);
const docLabel = this.data.raise ? 'SWADE.Bound' : 'SWADE.Entangled';
const docName = this.data.raise ? 'Bound' : 'Entangled';
const doc = await PowerEffect.getStatus(docLabel, docName, false);
doc.flags = foundry.utils.mergeObject(doc.flags ?? {}, {
[moduleName]: {
powerEffect: true,
maintId,
},
});
if (this.data.damage !== 'none') {
const dmg = this.data.damage === 'deadly' ? '2d6' : '2d4';
doc.flags[moduleName].buttons = [
{
label: `Damage (${dmg})`,
type: 'damage',
formula: `${dmg}x`,
},
];
}
docs.push(doc);
return docs;
}
get description() {
let text = `
<p>Target(s) are restrained by something trapping-appropriate of Hardness
${this.data.tough ? 10 : 8}, and are ${this.data.raise ? 'Bound' : 'Entangled'}.
`;
if (this.data.damage !== 'none') {
text += `While restrained, victims take
${this.data.damage === 'deadly' ? '2d6' : '2d4'} damage at the end of
their turn.
`;
}
text += '</p>';
return super.description + text;
}
}

View File

@ -1,84 +0,0 @@
import { moduleName } from '../globals.js';
import { PowerEffect } from './basePowers.js';
export class EnvironmentalProtectionEffect extends PowerEffect {
get name() {
return 'Environmental Protection';
}
get duration() {
return 600 * (this.data?.raise ? 8 : 1);
}
get icon() {
return 'icons/magic/defensive/barrier-shield-dome-pink.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get isTargeted() {
return true;
}
get basePowerPoints() {
return 2;
}
get modifiers() {
return [
...super.modifiers,
{
name: 'Environmental Resistance',
id: 'resist',
value: 1,
type: 'checkbox',
default: false,
epic: false,
effect: true,
icon: 'icons/magic/defensive/barrier-shield-dome-blue-purple.webp',
changes: [
{
key: `flags.${moduleName}.environmentalResistance`,
value: true,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
},
],
},
{
name: 'Planar Adaptation',
id: 'planar',
value: 2,
type: 'checkbox',
default: false,
epic: false,
effect: false,
},
];
}
get description() {
let text = super.description;
text += `<p>Breathe, speak, and move at normal pace in an otherwise fatal
environment.
`;
if (this.data.resist) {
text += `Gain resistances to one energy source, reducing damage by
${this.data.raise ? 6 : 4}.
`;
}
if (this.data.planar) {
text += `This also protects against the extreme conditions that on other
planes of existance.
`;
}
text += '</p>';
return text;
}
}

View File

@ -1,61 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class FarsightEffect extends PowerEffect {
get name() {
return 'Farsight';
}
get duration() {
return 5;
}
get icon() {
return 'icons/magic/perception/eye-ringed-green.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get isTargeted() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
name: 'Greater Farsight',
id: 'greater',
value: 2,
type: 'checkbox',
default: false,
epic: true,
effect: false,
});
return mods;
}
get description() {
let text = super.description;
text += `<p>See in detail up to
${this.data.raise && this.data.greater ? 'two miles' : 'a mile'}.
`;
if (this.data.greater) {
text += 'Ignore all Range penalties.';
} else if (this.data.raise) {
text += 'Halve all Range penalties.';
}
text += '</p>';
return text;
}
get effectName() {
const greater = this.data.greater;
const raise = this.data.raise;
return `${greater ? 'Greater ' : ''}Faright ${raise ? '(major)' : ''}`;
}
}

View File

@ -1,97 +0,0 @@
import { PowerEffect } from './basePowers.js';
import { requestFearRollFromTokens } from '../helpers.js';
export class FearEffect extends PowerEffect {
get name() {
return 'Fear';
}
get icon() {
return 'icons/magic/control/fear-fright-monster-grin-green.webp';
}
get duration() {
return 0;
}
get basePowerPoints() {
return 2;
}
get usePrimaryEffect() {
return false;
}
get isTargeted() {
return true;
}
get isRaisable() {
return true;
}
get hasAoe() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
type: 'checkbox',
default: false,
name: 'Greater Fear',
id: 'greater',
epic: true,
effect: false,
value: 2,
});
mods.push({
type: 'select',
default: 'none',
name: 'Area of Effect',
id: 'aoe',
epic: false,
choices: {
none: 'None',
sbt: 'Small Blast Template',
mbt: 'Medium Blast Template',
lbt: 'Large Blast Template',
},
effects: { none: null, sbt: null, mbt: null, lbt: null },
values: { none: 0, sbt: 2, mbt: 2, lbt: 3 },
});
return mods;
}
async sideEffects() {
await super.sideEffects();
const penalty = (this.data.raise ? -2 : 0) + (this.data.greater ? -2 : 0);
const rollOpts = {
title: 'Fear Check',
flavor: 'Roll Spirit for a Fear Check',
};
if (penalty !== 0) {
rollOpts.fear = penalty;
}
await requestFearRollFromTokens(this.targets, rollOpts);
}
get description() {
const penalty = (this.data.raise ? -2 : 0) + (this.data.greater ? -2 : 0);
return (
super.description +
`<p>Target makes a Fear Check${penalty !== 0 ? ` at ${penalty}` : ''}.
Extras who fail are Panicked. Wild Cards who fail roll on the
Fear Table${penalty !== 0 ? ` adding ${penalty * -1} to the result` : ''}.
</p>`
);
}
get chatMessageEffects() {
const list = super.chatMessageEffects;
if (this.data.aoe !== 'none') {
list.push(this.data.aoe.toUpperCase());
}
return list;
}
}

View File

@ -1,78 +0,0 @@
import { moduleName } from '../globals.js';
import { PowerEffect } from './basePowers.js';
export class FlyEffect extends PowerEffect {
get name() {
return 'Fly';
}
get duration() {
return 5;
}
get basePowerPoints() {
return 3;
}
get icon() {
return 'icons/creatures/birds/songbird-yellow-flying.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 2;
}
get isTargeted() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
name: 'Swift Flight',
id: 'swift',
value: 2,
type: 'checkbox',
default: false,
epic: false,
effect: false,
});
return mods;
}
async parseValues() {
await super.parseValues();
}
getPrimaryEffectChanges() {
return [
...super.getPrimaryEffectChanges(),
{
key: 'system.pace.fly',
value: this._pace,
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
priority: 0,
},
];
}
get basePrimaryEffect() {
const doc = super.basePrimaryEffect;
doc.statuses = ['flying'];
return doc;
}
get _pace() {
return (this.data.raise ? 24 : 12) + (this.data.swift ? 24 : 12);
}
get description() {
let text = super.description;
text += `<p>Target may fly at pace ${this._pace}.</p>`;
return text;
}
}

View File

@ -1,141 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class GrowthShrinkEffect extends PowerEffect {
get name() {
return 'Growth/Shrink';
}
get icon() {
return 'icons/magic/control/silhouette-grow-shrink-tan.webp';
}
get basePowerPoints() {
return 0;
}
get duration() {
return this?.data?.duration ? 50 : 5;
}
get extraDescription() {
const target = this.targets?.[0];
let text = super.extraDescription + '<p>Minimum Size is -2. ';
if (target) {
text += `${target.name} is of Size ${target.actor.system.stats.size}. `;
}
text += `Select the number of Size steps to change the target. 2 points per
step. Negative is shrink, positive is growth.</p>`;
return text;
}
get isTargeted() {
return true;
}
get oneTarget() {
return true;
}
get isRaisable() {
return false;
}
get modifiers() {
const curSize = this.targets?.[0]?.actor?.system?.stats?.size ?? 0;
const minSteps = -2 - curSize;
return [
...super.modifiers,
{
name: 'Size Steps',
default: 1,
type: 'number',
min: minSteps,
value: 0,
id: 'steps',
epic: false,
effect: false,
},
{
name: 'Duration',
id: 'duration',
value: 2,
type: 'checkbox',
default: false,
epic: true,
effect: false,
},
{
name: 'Power',
id: 'power',
value: 2,
type: 'checkbox',
default: false,
epic: true,
effect: false,
},
];
}
async parseValues() {
await super.parseValues();
const steps = this.data.steps;
const curSize = this.targets?.[0]?.actor?.system?.stats?.size ?? 0;
const minSteps = -2 - curSize;
this.data.steps = Math.max(steps, minSteps);
}
get powerPoints() {
return super.powerPoints + Math.abs(this.data.steps) * 2;
}
getPrimaryEffectChanges() {
const steps = this.data.steps;
const changes = super.getPrimaryEffectChanges();
if (steps === 0) {
return changes;
}
changes.push({
key: 'system.stats.size',
value: steps,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
});
if (steps < 0 && this.data.power) {
changes.push({
key: 'system.stats.toughness.value',
value: steps * -1,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
});
} else {
changes.push({
key: 'system.attributes.strength.die.sides',
value: steps * 2,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
});
}
return changes;
}
get effectName() {
if (this.data.steps >= 0) {
return 'Growth';
}
return 'Shrink';
}
get description() {
let text = super.description;
if (this.data.steps >= 0) {
text += `<p>Grow the target by ${this.data.steps} steps.</p>`;
} else {
text += `<p>Shrink the target by ${this.data.steps} steps`;
if (this.data.power) {
text += ' while retaining Strength and Toughness';
}
text += '.</p>';
}
return text;
}
}

View File

@ -1,108 +0,0 @@
import { requestRollFromTokens } from '../helpers.js';
import { PowerEffect } from './basePowers.js';
export class HavocEffect extends PowerEffect {
get name() {
return 'Havoc';
}
get icon() {
return 'icons/magic/air/wind-vortex-swirl-blue-purple.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return true;
}
get usePrimaryEffect() {
return false;
}
get isDamaging() {
return true;
}
get basePowerPoints() {
return 3;
}
get hasAoe() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push(
{
name: 'Area of Effect',
id: 'aoe',
type: 'select',
default: 'mbt',
choices: {
mbt: 'Medium Blast Template',
cone: 'Cone Template',
lbt: 'Large Blast Template',
},
effects: { cone: null, mbt: null, lbt: null },
values: { cone: 0, mbt: 0, lbt: 1 },
epic: false,
},
{
name: 'Greater Havoc',
value: 2,
id: 'greater',
epic: true,
type: 'checkbox',
effect: false,
},
);
return mods;
}
get description() {
const pushBack = this.data.greater ? '3d6' : '2d6';
const dmg = this.data.greater ? '2d4' : '2d6';
const size = this.data.aoe === 'cone' ? 'Cone template originating from the caster' : this.data.aoe.toUpperCase();
return (
super.description +
`<p>The vortex covers a ${size}. Creatures
caught inside are Distracted, then must make a
Strength${this.data.raise ? ' -2' : ''} check or be flung
[[/r ${pushBack}]]". If they strike a hard surface, they take ${dmg} damage.
</p>`
);
}
async createSecondaryEffects() {
const docs = await super.createSecondaryEffects();
docs.push(await PowerEffect.getStatus('SWADE.Distr', 'Distracted', false));
return docs;
}
async sideEffects() {
await super.sideEffects();
const resistMods = function (token) {
const mods = [];
if (token.actor.effects.find((e) => e.name === 'Flying')) {
mods.push({ label: 'Flying', value: -2 });
}
return mods;
};
const options = {
title: 'Resisting Havoc',
flavor: 'Havoc!',
mods: [],
modCallback: resistMods,
};
if (this.data.raise) {
options.mods.push({ label: 'vs Raise', value: -2 });
}
await requestRollFromTokens(this.targets, 'attribute', 'strength', options);
}
}

View File

@ -1,105 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class HealingEffect extends PowerEffect {
get name() {
return 'Healing';
}
get icon() {
return 'icons/magic/life/heart-cross-strong-flame-purple-orange.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return true;
}
get usePrimaryEffect() {
return false;
}
get isDamaging() {
return false;
}
get basePowerPoints() {
return 3;
}
get hasAoe() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push(
{
name: 'Area of Effect',
id: 'aoe',
type: 'select',
default: 'none',
choices: {
none: 'None',
mbt: '⭐ Medium Blast Template',
lbt: '⭐ Large Blast Template',
},
effects: { none: null, mbt: null, lbt: null },
values: { none: 0, mbt: 2, lbt: 3 },
epic: false,
},
{
name: 'Neutralize Poison or Disease',
value: 1,
id: 'poison',
epic: false,
type: 'checkbox',
effect: false,
},
{
name: 'Crippling Injuries',
value: 15,
id: 'crippling',
epic: false,
type: 'checkbox',
effect: false,
},
{
name: 'Greater Healing',
value: 10,
id: 'greater',
epic: false,
type: 'checkbox',
effect: false,
},
);
return mods;
}
get description() {
const size =
this.data.aoe !== 'none'
? `all allies within a ${this.data.aoe.toUpperCase()} centered on the caster`
: 'a single subject';
let text =
super.description +
`
<p>Heal ${size} of ${this.data.raise ? '2 Wounds' : '1 Wound'}
${this.data.greater ? 'of any age' : 'sustained in the last hour'}.
`;
if (this.data.crippling) {
text += `This casting is the only one possible for this Crippling Injury by this
caster, and preparation took an hour. If successful, the subject is
Exhausted for 24 hours.
`;
}
if (this.data.poison) {
text += `Negate any poison or disease, taking into account the affects of
any penalty from the poison or disease on the arcane skill roll.`;
}
text += '</p>';
return text;
}
}

View File

@ -1,113 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class IllusionEffect extends PowerEffect {
get name() {
return 'Illusion';
}
get icon() {
return 'icons/magic/defensive/illusion-evasion-echo-purple.webp';
}
get duration() {
return this.data.duration ? 50 : 5;
}
get isTargeted() {
return false;
}
get isRaisable() {
return true;
}
get usePrimaryEffect() {
return false;
}
get basePowerPoints() {
return 5;
}
get modifiers() {
return [
{
name: 'Area of Effect',
type: 'checkbox',
value: 1,
id: 'aoe',
epic: false,
effect: false,
},
{
name: 'Deadly Illusion',
type: 'checkbox',
value: 3,
id: 'deadly',
epic: true,
effect: false,
},
{
name: 'Duration',
type: 'checkbox',
value: 2,
id: 'duration',
epic: true,
effect: false,
},
{
name: 'Mobility',
type: 'select',
default: 'none',
id: 'mobility',
choices: {
none: 'None',
12: 'Move and fly at Pace 12',
24: 'Move and fly at Pace 24',
},
values: { none: 0, 12: 1, 24: 2 },
effects: { none: null, 12: null, 24: null },
epic: false,
},
{
name: 'Sound',
id: 'sound',
type: 'checkbox',
epic: false,
effect: false,
value: 1,
},
{
name: 'Strong',
id: 'strong',
type: 'checkbox',
epic: false,
effect: false,
value: 2,
},
];
}
get description() {
const size = this.data.aoe ? 'LBT' : 'MBT';
const penalty = (this.data.raise ? -2 : 0) + (this.data.strong ? -2 : 0);
const motion = this.data.mobility === 'none' ? '(stationary)' : `that can move at pace ${this.data.mobility}`;
let text =
super.description +
`<p>
Create an illusion ${motion} ${this.data.sound ? 'with sound' : ''}.
Its effects must remain within a sphere the size of a ${size}. </p>
<p>Creatures can actively disbelieve in the illusion with a Smarts roll
${penalty === 0 ? '' : `at ${penalty}`}.</p>
`;
if (this.data.deadly) {
text += `<p>The caster can 'attack' targets while the illusion is active
with an opposed roll of the caster's arcane skill versus the target's
Smarts${penalty === 0 ? '' : ` at ${penalty}`}. If the caster wins the
target is Shaken (cannot incapacitate). With a raise, the target suffers
a Wound.</p>.
`;
}
return text;
}
}

View File

@ -1,47 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class InquisitorJudgementEffect extends PowerEffect {
get name() {
return 'Judgement';
}
get duration() {
return 0;
}
get icon() {
return 'icons/skills/social/trading-justice-scale-yellow.webp';
}
get isTargeted() {
return true;
}
get oneTarget() {
return true;
}
get modifiers() {
return [];
}
get effectName() {
return `${this.source.name}'s Judgement`;
}
get isRaisable() {
return false;
}
get description() {
return `${super.description}
<p>
Once per encounter as a free action, the inquisitor can pronounce judgment
on an enemy to gain five Judgment Tokens. A single token may be spent to
add +2 to a Trait or damage roll she makes against the judged, or 2 to one
of the foe's Trait or damage rolls. Judgment Tokens may be spent after the
roll, and remain in effect if the original total is rerolled.
</p>
`;
}
}

View File

@ -1,70 +0,0 @@
import { moduleName } from '../globals.js';
import { PowerEffect } from './basePowers.js';
export class IntangibilityEffect extends PowerEffect {
get name() {
return 'Intangility';
}
get duration() {
return 5;
}
get icon() {
return 'icons/magic/control/debuff-energy-hold-levitate-blue-yellow.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 3;
}
get additionalRecipientsIsEpic() {
return true;
}
get basePowerPoints() {
return 5;
}
get isTargeted() {
return true;
}
get isRaisable() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
name: 'Duration',
type: 'checkbox',
id: 'Duration',
value: 3,
epic: true,
effect: false,
});
return mods;
}
get description() {
let text =
super.description +
`<p>
The subject becomes incorporeal. Non magical weapons and walls can't
affect him. The character may affect other incorporeal beings, and is still
susceptible to supernatural attacks. Unwilling targets resist with Spirit,
and shake off the effect with a Spirit roll at the end of following turns.</p>
<p>The being is Stunned and shunted to an open space if it is within
something solid when the power ends.</p>
`;
if (this.data.raise) {
text += '<p>Reduce damage taken from supernatural effects and magic weapons by 4.</p>';
}
return text;
}
}

View File

@ -1,79 +0,0 @@
import { moduleName } from '../globals.js';
import { PowerEffect } from './basePowers.js';
export class InvisibliltyEffect extends PowerEffect {
get name() {
return 'Invisibility';
}
get duration() {
return 5;
}
get icon() {
return 'icons/svg/invisible.svg';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 3;
}
get basePowerPoints() {
return 5;
}
get isTargeted() {
return true;
}
get isRaisable() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
name: 'Duration',
type: 'checkbox',
id: 'Duration',
value: 2,
epic: true,
effect: false,
});
return mods;
}
get description() {
let text =
super.description +
`
<p>The subject is invisible, except for a vague blur or outline.
Any action taken against it that requires sight is made at
${this.data.raise ? -6 : -4}, including Notice rolls. This penalty is
reduced by 2 if the invisible character's position is given away by some
environmental circumstance.</p>
`;
if (this.data.duration) {
text += `<p>This long-duration invisibility ends immediately if the subject
attempts a damage-causing attack or targets an unwilling character with a
power.</p>`;
}
return text;
}
async parseValues() {
await super.parseValues();
const doc = await PowerEffect.getStatus('EFFECT.StatusInvisible', 'Invisible');
doc.description = `<p>From <strong>${this.source.name}</strong> casting <em>${this.name}</em></p>`;
doc.flags = foundry.utils.mergeObject(doc.flags ?? {}, { [moduleName]: { powerEffect: true } });
this.basePrimaryEffectDoc = doc;
}
get basePrimaryEffect() {
return this.basePrimaryEffectDoc;
}
}

View File

@ -1,98 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class LightDarknessEffect extends PowerEffect {
get name() {
return 'Light/Darkness';
}
get duration() {
return 100;
}
get icon() {
return this?.data?.direction === 'Darkness'
? 'icons/commodities/gems/pearl-purple-dark.webp'
: 'icons/magic/light/light-lantern-lit-white.webp';
}
get isTargeted() {
return false;
}
get basePowerPoints() {
return 2;
}
get usePrimaryEffect() {
return false;
}
get modifiers() {
return [
...super.modifiers,
{
sortOrder: -2,
name: 'Light or Darkness?',
id: 'direction',
type: 'radio',
default: 'Light',
epic: false,
choices: { Light: 'Light', Darkness: 'Darkness' },
effects: { Light: null, Darkness: null },
values: { Light: 0, Darkness: 0 },
},
{
name: 'Area Effect (Light only)',
id: 'area',
type: 'checkbox',
default: false,
value: 2,
epic: true,
effect: false,
},
{
name: 'True Darkness (Darkness only)',
id: 'truedark',
type: 'checkbox',
default: false,
value: 2,
epic: true,
effect: false,
},
{
name: 'Mobile',
id: 'mobile',
type: 'checkbox',
default: false,
value: 1,
epic: false,
effect: false,
},
];
}
get effectName() {
return this.data.direction;
}
get description() {
let text = super.description;
if (this.data.direction === 'Light') {
const size = this.data.area ? "with a radius of the caster's Smarts ×2" : 'in a LBT';
text += `<p>Bright illumination ${size}.
${this.data.raise ? 'Optionally with a raise, light is focused into a 5" beam.' : ''}`;
} else {
text += `<p>Block illumination
${this.data.truedark ? ', Infravision, Low Light Vision, and Darkvision' : ''}
in an area the size of a LBT, making the area ${this.data.raise ? 'Pitch Dark' : 'Dark'}`;
}
if (this.data.mobile) {
text += ` The power can move as a limited free action at a pace of the
caster's arcane skill die. Alternately, it may be attached to an
inanimate object`;
}
text += '</p>';
return text;
}
}

View File

@ -1,61 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class LocateEffect extends PowerEffect {
get name() {
return 'Locate';
}
get icon() {
return 'icons/tools/navigation/compass-plain-blue.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return false;
}
get isRaisable() {
return true;
}
get basePowerPoints() {
return 5;
}
get modifiers() {
return [
{
name: 'Find the Path',
type: 'checkbox',
value: 1,
id: 'path',
epic: false,
effect: false,
},
];
}
get description() {
let desc =
super.description +
`<p>
If the target has never been seen by the caster, the activation roll is at -2.
Get a sense of general direction and distance to the target, unless blocked by
running water.
`;
if (this.data.raise) {
desc += `The caster also gets an idea of general state of the target (eg
asleep, in a small room, behind a bookshelf).
`;
}
if (this.data.path) {
desc += `The caster gets a supernatural sense of the best way to navigate
to the target's general area.`;
}
desc += '</p>';
return desc;
}
}

View File

@ -1,71 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class LockUnlockEffect extends PowerEffect {
get name() {
return 'Lock/Unlock';
}
get duration() {
return 0;
}
get icon() {
return 'icons/sundries/misc/lock-open-yellow.webp';
}
get isTargeted() {
return false;
}
get basePowerPoints() {
return 1;
}
get usePrimaryEffect() {
return false;
}
get modifiers() {
return [
...super.modifiers,
{
sortOrder: -2,
name: 'Lock or Unlock?',
id: 'direction',
type: 'radio',
default: 'Lock',
epic: false,
choices: { Lock: 'Lock', Unlock: 'Unlock' },
effects: { Lock: null, Unlock: null },
values: { Lock: 0, Unlock: 0 },
},
];
}
get effectName() {
return this.data.direction;
}
get description() {
let text = super.description;
if (this.data.direction === 'Lock') {
text += `<p>Magically seal a door, window, container, envelope, etc. Any
attempt to open it suffers a -4 penalty, with a failure meaning that
character can't try again until they update their skill level.</p>`;
if (this.data.raise) {
text += `<p>With the raise, the item can only be opwned with the <em>unlock</em>
version of this power (with the above -4 penalty.</p>`;
}
text += `<p>The caster may set a passphrase. The portal opens for anyone
who speaks the passphrase, until the passphrase is spoken again.</p>`;
} else {
text += `<p>Unlock in place of Repair or Thievery, ignoring up to 4
points of penalties. `;
if (this.data.raise) {
text += `With a raise, it disarms any traps or alarms as well.`;
}
text += '</p>';
}
return text;
}
}

View File

@ -1,38 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class MagicJarEffect extends PowerEffect {
get name() {
return 'MagicJar';
}
get duration() {
return 3000;
}
get icon() {
return 'icons/consumables/drinks/clay-jar-glowing-orange-blue.webp';
}
get isTargeted() {
return false;
}
get isDamaging() {
return false;
}
get basePowerPoints() {
return 5;
}
get usePrimaryEffect() {
return false;
}
get description() {
let text = super.description;
text += `<p>Transfer the caster's soul into an enchanted vessel. They may
move back and forth from the body to the jar if the body is within range.</p>`;
return text;
}
}

View File

@ -1,81 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class MindLinkEffect extends PowerEffect {
get name() {
return 'Mind Link';
}
get duration() {
return 50;
}
get icon() {
return 'icons/skills/social/diplomacy-unity-alliance.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get isTargeted() {
return true;
}
get basePowerPoints() {
return 1;
}
get modifiers() {
return [
...super.modifiers,
{
name: 'Broadcast',
id: 'broadcast',
value: 2,
type: 'checkbox',
default: false,
epic: true,
effect: false,
},
{
name: 'Long Distance Link',
id: 'longlink',
value: 3,
type: 'checkbox',
default: false,
epic: true,
effect: false,
},
];
}
get additionalRecipientCount() {
return Math.max(0, this.targets.length - 2);
}
get description() {
let text = super.description;
if (this.data.broadcast) {
text += `<p>The caster can broadcast a short message to everyone within
Smarts ${this.data.raise ? 8 : 4}.</p>`;
} else {
text += `<p>Create a telepathic link that functions like speach between
two minds.
`;
if (this.data.longlink) {
text += `The ends of the link may be anywhere on the same plane. `;
} else {
text += `Once activated, Range between linked minds is
${this.data.raise ? 'five miles' : 'one mile'}. `;
}
text += `</p><p>
If a linked character suffers a Wound, all others in the link must make
a Smarts roll or be Shaken (this can't cause a Wound).</p>`;
}
return text;
}
}

View File

@ -1,76 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class MindReadingEffect extends PowerEffect {
get name() {
return 'Mind Reading';
}
get icon() {
return 'icons/magic/control/hypnosis-mesmerism-eye-tan.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return true;
}
get isDamaging() {
return false;
}
get oneTarget() {
return true;
}
get basePowerPoints() {
return 2;
}
get usePrimaryEffect() {
return false;
}
get isRaisable() {
return false;
}
get modifiers() {
return [
...super.modifiers,
{
type: 'checkbox',
default: false,
name: 'Mind Walk',
value: 2,
epic: true,
effect: false,
id: 'mindWalk',
},
];
}
get description() {
let text = super.description;
text += `<p>Mind Reading is an opposed roll vs the subjet's Spirit. The
target is aware of the mental intrusion unless the caster gets a Raise.</p>`;
if (this.data.mindWalk) {
return (
text +
`
<p>On success the caster can unlock and read an entire scene or chain or related
memories.</p>
`
);
} else {
return (
text +
`
<p>On success the caster can gain one truthful answer from the subject.</p>
`
);
}
}
}

View File

@ -1,81 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class MindWipeEffect extends PowerEffect {
get name() {
return 'Mind Wipe';
}
get icon() {
return 'icons/magic/control/hypnosis-mesmerism-eye.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return true;
}
get isDamaging() {
return false;
}
get oneTarget() {
return true;
}
get basePowerPoints() {
return 3;
}
get usePrimaryEffect() {
return false;
}
get isRaisable() {
return false;
}
get modifiers() {
return [
...super.modifiers,
{
type: 'checkbox',
name: 'Edit',
id: 'edit',
value: 1,
epic: false,
effect: false,
},
{
type: 'checkbox',
name: 'Fast Cast',
id: 'fast',
value: 2,
epic: false,
effect: false,
},
{
type: 'checkbox',
default: false,
name: 'Greater Mind Wipe',
value: 2,
epic: true,
effect: false,
id: 'greater',
},
];
}
get description() {
let text = super.description;
text += `<p>Opposed roll vs victim's Smarts. Mind Wipe takes
${this.data.fast ? 'a single action' : 'a full minute of concentration'}
to complete. On success by the caster, the caster may
${this.data.edit ? 'edit or alter' : 'remove'} the subject's memory of
${this.data.greater ? 'a single event, person, place or thing' : 'about 30 minutes of time, or several hours with a raise'}.
`;
return text;
}
}

View File

@ -1,66 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class ObjectReadingEffect extends PowerEffect {
get name() {
return 'Object Reading';
}
get icon() {
return 'icons/skills/trades/academics-investigation-study-blue.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return false;
}
get basePowerPoints() {
return 2;
}
get usePrimaryEffect() {
return false;
}
get isRaisable() {
return true;
}
get modifiers() {
return [
...super.modifiers,
{
type: 'checkbox',
default: false,
name: 'Projection',
value: 2,
epic: true,
effect: false,
id: 'projection',
},
];
}
get description() {
let text = super.description;
text += `<p>Get visions of the past from an object.
`;
if (this.data.raise) {
text += `With a raise, the object yields specific and more actionable
information related to the caster's investigation.`;
} else {
text += `On success, the caster gets a vague impression of whatever
information they're looking for.`;
}
text += '</p>';
if (this.data.projection) {
text += `<p>The caster projects the vision out into a space the size of a
small room, allowing anyone present to see and hear the events and examine
the projection.</p>`;
}
return text;
}
}

View File

@ -1,41 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class PlanarBindingEffect extends PowerEffect {
get name() {
return 'Planar Binding';
}
get icon() {
return 'icons/magic/control/debuff-chains-orb-movement-blue.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return false;
}
get basePowerPoints() {
return 8;
}
get usePrimaryEffect() {
return false;
}
get isRaisable() {
return false;
}
get description() {
let text =
super.description +
`
<p>Opposed roll vs the entity's Spirit. The entity is bound until it breaks
free or agrees to complete a task.</p>
`;
return text;
}
}

View File

@ -1,77 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class PlaneShiftEffect extends PowerEffect {
get name() {
return 'Plane Shift';
}
get icon() {
return 'icons/magic/movement/trail-streak-zigzag-yellow.webp';
}
get duration() {
return this.data.foe ? (this.data.raise ? 5 : 3) : 0;
}
get isTargeted() {
return true;
}
get usePrimaryEffect() {
return this.data.foe;
}
get isDamaging() {
return true;
}
get basePowerPoints() {
return 4;
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get modifiers() {
return [
...super.modifiers,
{
name: 'Extra-Dimensional Space',
value: 2,
id: 'extra',
epic: true,
type: 'checkbox',
effect: false,
},
{
name: 'Transport Foe',
value: 2,
id: 'foe',
epic: true,
type: 'checkbox',
effect: false,
},
];
}
get description() {
let text = super.description;
if (this.data.foe) {
text += `<p>Opposed roll vs Spirit to transport the foe to another plane for
${this.duration} rounds, before it returns.</p>`;
} else if (this.data.extra) {
text += `<p>Transport the recipient to the caster's semi-permanant
extra-dimensional space, with basic necessities for 5 people.</p>`;
} else {
text += `<p>Transport the recipient to another dimension. If the desired
location is known, the recipient arrives within
[[/r ${this.data.raise ? 5 : 10}d10]] of the location.</p>`;
}
return text;
}
}

View File

@ -1,7 +1,6 @@
import { moduleName, moduleHelpers, log } from '../globals.js';
import { firstOwner, deleteActiveEffectsFromToken, deleteToken, deleteItemsFromActor } from '../helpers.js';
import { moduleName, moduleHelpers } from '../globals.js';
import { firstOwner, deleteActiveEffectsFromToken } from '../helpers.js';
import { ArcaneProtectionEffect } from './arcaneProtection.js';
import { BalefulPolymorphEffect } from './balefulPolymorph.js';
import { BanishEffect } from './banish.js';
import { BarrierEffect } from './barrier.js';
import { BeastFriendEffect } from './beastFriend.js';
@ -12,244 +11,41 @@ import { BurrowEffect } from './burrow.js';
import { BoostLowerTraitEffect } from './boostLowerTrait.js';
import { BurstEffect } from './burst.js';
import { ConfusionEffect } from './confusion.js';
import { ConjureItemEffect } from './conjureItem.js';
import { CreatePitEffect } from './createPit';
import { CurseEffect } from './curse.js';
import { DamageFieldEffect } from './damageField.js';
import { DarksightEffect } from './darksight.js';
import { DeflectionEffect } from './deflection.js';
import { DetectConcealArcanaEffect } from './detectConcealArcana.js';
import { DisguiseEffect } from './disguise.js';
import { DispelEffect } from './dispel.js';
import { DivinationEffect } from './divination.js';
import { DrainPowerPointsEffect } from './drainPowerPoints.js';
import { ElementalManipulationEffect } from './elementalManipulation.js';
import { EmpathyEffect } from './empathy.js';
import { EntangleEffect } from './entangle.js';
import { EnvironmentalProtectionEffect } from './environmentalProtection.js';
import { FarsightEffect } from './farsight.js';
import { FearEffect } from './fear.js';
import { FlyEffect } from './fly.js';
import { GrowthShrinkEffect } from './growthShrink.js';
import { HavocEffect } from './havoc.js';
import { HealingEffect } from './healing.js';
import { IllusionEffect } from './illusion.js';
import { IntangibilityEffect } from './intangibility.js';
import { InvisibliltyEffect } from './invisibility.js';
import { LightDarknessEffect } from './lightdarkness.js';
import { LocateEffect } from './locate.js';
import { LockUnlockEffect } from './lockUnlock.js';
import { MagicJarEffect } from './magicJar.js';
import { MindLinkEffect } from './mindLink.js';
import { MindReadingEffect } from './mindReading.js';
import { MindWipeEffect } from './mindWipe.js';
import { ObjectReadingEffect } from './objectReading.js';
import { PlanarBindingEffect } from './planarBinding.js';
import { PlaneShiftEffect } from './planeShift.js';
import { ProtectionEffect } from './protection.js';
import { PuppetEffect } from './puppet.js';
import { ReliefEffect } from './relief.js';
import { ResurrectionEffect } from './resurrection.js';
import { SanctuaryEffect } from './sanctuary.js';
import { ScryingEffect } from './scrying.js';
import { ShapeChangeEffect, ShapeChangeAbilityEffect } from './shapeChange.js';
import { SlothSpeedEffect } from './slothSpeed.js';
import { SlumberEffect } from './slumber.js';
import { SmiteEffect } from './smite.js';
import { SoundSilenceEffect } from './soundSilence.js';
import { SpeakLanguageEffect } from './speakLanguage.js';
import { StunEffect } from './stun.js';
import {
SummonAllyEffect,
SummonMonsterEffect,
SummonNaturesAllyEffect,
SummonPlanarAllyEffect,
SummonAnimalEffect,
SummonUndeadEffect,
SummonEidolonEffect,
SummonCompanionEffect,
} from './summon.js';
import { TelekinesisEffect } from './telekinesis.js';
import { TeleportEffect } from './teleport.js';
import { TimeStopEffect } from './timeStop.js';
import { WallWalkerEffect } from './wallWalker.js';
import { MartialFlexibilityEffect, WarriorsGiftEffect } from './warriorsGift.js';
import { WishEffect } from './wish.js';
import { ZombieEffect } from './zombie.js';
import { InquisitorJudgementEffect } from './inquisitor.js';
const { DialogV2 } = foundry.applications.api;
export const PowerClasses = {
'animal-companion': SummonCompanionEffect,
const PowerClasses = {
'arcane-protection': ArcaneProtectionEffect,
'baleful-polymorph': BalefulPolymorphEffect,
banish: BanishEffect,
barrier: BarrierEffect,
'beast-friend': BeastFriendEffect,
blast: BlastEffect,
blind: BlindEffect,
bolt: BoltEffect,
'boost-lower-trait': BoostLowerTraitEffect,
'boostlower-trait': BoostLowerTraitEffect,
'boost-lower-trait': BoostLowerTraitEffect,
'boost-trait': BoostLowerTraitEffect,
burrow: BurrowEffect,
burst: BurstEffect,
companion: SummonCompanionEffect,
'conceal-arcana': DetectConcealArcanaEffect,
confusion: ConfusionEffect,
'conjure-item': ConjureItemEffect,
'create-pit': CreatePitEffect,
curse: CurseEffect,
'damage-field': DamageFieldEffect,
darkness: LightDarknessEffect,
darksight: DarksightEffect,
deflection: DeflectionEffect,
'detect-arcana': DetectConcealArcanaEffect,
'detect-conceal-arcana': DetectConcealArcanaEffect,
'detectconceal-arcana': DetectConcealArcanaEffect,
disguise: DisguiseEffect,
dispel: DispelEffect,
divination: DivinationEffect,
'drain-power-points': DrainPowerPointsEffect,
eidolon: SummonEidolonEffect,
'elemental-manipulation': ElementalManipulationEffect,
empathy: EmpathyEffect,
entangle: EntangleEffect,
'environmental-protection': EnvironmentalProtectionEffect,
farsight: FarsightEffect,
fear: FearEffect,
fly: FlyEffect,
growth: GrowthShrinkEffect,
'growth-shrink': GrowthShrinkEffect,
growthshrink: GrowthShrinkEffect,
havoc: HavocEffect,
healing: HealingEffect,
illusion: IllusionEffect,
intangibility: IntangibilityEffect,
invisibility: InvisibliltyEffect,
judgement: InquisitorJudgementEffect,
'light-darkness': LightDarknessEffect,
lightdarkness: LightDarknessEffect,
light: LightDarknessEffect,
locate: LocateEffect,
lock: LockUnlockEffect,
lockunlock: LockUnlockEffect,
'lock-unlock': LockUnlockEffect,
'lower-trait': BoostLowerTraitEffect,
'magic-jar': MagicJarEffect,
'martial-flexibility': MartialFlexibilityEffect,
'mind-link': MindLinkEffect,
'mind-reading': MindReadingEffect,
'mind-wipe': MindWipeEffect,
'object-reading': ObjectReadingEffect,
'planar-binding': PlanarBindingEffect,
'plane-shift': PlaneShiftEffect,
protection: ProtectionEffect,
puppet: PuppetEffect,
relief: ReliefEffect,
resurrection: ResurrectionEffect,
sanctuary: SanctuaryEffect,
scrying: ScryingEffect,
'shape-change': ShapeChangeEffect,
'shape-change-ability': ShapeChangeAbilityEffect,
'shape-change-action': ShapeChangeAbilityEffect,
shrink: GrowthShrinkEffect,
silence: SoundSilenceEffect,
slothspeed: SlothSpeedEffect,
'sloth-speed': SlothSpeedEffect,
sloth: SlothSpeedEffect,
speed: SlothSpeedEffect,
slumber: SlumberEffect,
smite: SmiteEffect,
soundsilence: SoundSilenceEffect,
'sound-silence': SoundSilenceEffect,
sound: SoundSilenceEffect,
'speak-language': SpeakLanguageEffect,
stun: StunEffect,
summoner: SummonEidolonEffect,
'summon-eidolon': SummonEidolonEffect,
'summon-ally': SummonAllyEffect,
'summon-animal': SummonAnimalEffect,
'summon-monster': SummonMonsterEffect,
'summon-natures-ally': SummonNaturesAllyEffect,
'summon-planar-ally': SummonPlanarAllyEffect,
'summon-undead': SummonUndeadEffect,
telekinesis: TelekinesisEffect,
teleport: TeleportEffect,
'time-stop': TimeStopEffect,
unlock: LockUnlockEffect,
'wall-walker': WallWalkerEffect,
'warriors-gift': WarriorsGiftEffect,
wish: WishEffect,
zombie: ZombieEffect,
};
/* ---------------------------------------------------------------- */
export function visualActiveEffectPowerButtons(effect, buttons) {
if (!effect.flags?.[moduleName]?.buttons) {
return;
}
for (const button of effect.flags[moduleName].buttons) {
let callback = null;
switch (button.type) {
case 'roll':
callback = function () {
new CONFIG.Dice.SwadeRoll(button.formula ?? '3d6', null, {}).toMessage({
flavor: button.flavor ?? `${effect.name} roll`,
});
};
break;
case 'trait':
callback = function () {
let rollFunc = 'rollAttribute';
const rollType = button?.rollType ?? 'attribute';
const rollDesc = button?.rollDesc ?? 'agility';
let rollId = rollDesc.toLowerCase();
if (rollType === 'skill') {
rollFunc = 'rollSkill';
rollId = effect.parent.items
.filter((i) => i.type === 'skill')
.find(
(i) => i.system.swid === rollDesc.toLowerCase() || i.name.toLowerCase() === rollDesc.toLowerCase(),
)?.id;
}
const options = {
flavor: button?.flavor ?? `${effect.name} ${rollDesc} roll`,
};
if (button?.mods) {
options.additionalMods = button.mods;
}
effect.parent[rollFunc](rollId, options);
};
break;
case 'damage':
callback = function () {
const formula = button?.formula ?? '2d6x';
const ap = button?.ap ?? 0;
const flavor = button?.flavor ?? `${effect.name} damage roll`;
const options = {};
if (ap > 0) {
options.ap = ap;
}
new CONFIG.Dice.DamageRoll(formula, null, options).toMessage({ flavor });
};
break;
case 'callback':
callback =
button?.callback ||
function () {
console.log('not implemented');
};
break;
}
if (button?.label && callback) {
buttons.push({ label: button.label, callback });
}
}
}
export async function powerEffectManagementHook(effect, data, userId) {
if (game.user.id !== userId) {
return;
@ -258,17 +54,6 @@ export async function powerEffectManagementHook(effect, data, userId) {
if (!maintId) {
return;
}
if (effect.getFlag(moduleName, 'attachedItems') ?? false) {
const itemIds = effect.parent.items.filter((i) => i.flags?.[moduleName]?.maintId === maintId).map((i) => i.id);
if (itemIds.length > 0) {
await moduleHelpers.socket.executeAsGM(deleteItemsFromActor, effect.parent.uuid, itemIds);
}
}
const isSpawned = effect.getFlag(moduleName, 'spawnedTempToken') ?? false;
if (isSpawned) {
const token = effect.parent.token;
await moduleHelpers.socket.executeAsGM(deleteToken, token.parent.id, token.id);
}
const targetIds = effect.getFlag(moduleName, 'targetIds') || [];
for (const targetId of targetIds) {
const target = canvas.tokens.get(targetId);
@ -302,66 +87,9 @@ export async function powers(options = {}) {
const swid = options?.name || item?.system.swid || null;
if (swid in PowerClasses) {
const runner = new PowerClasses[swid](token, targets, item);
log('initialized power class', runner);
const runner = new PowerClasses[swid](token, targets);
runner.render();
return;
}
ui.notifications.error(`No power effect found for ${swid}`);
}
export async function powerEffectsMenu(options = {}) {
const powers = {};
for (const powerClass of new Set(Object.values(PowerClasses))) {
const powerInst = new powerClass();
powers[powerInst.name] = powerClass;
}
let form = `
<p>Select a power.</p>
<div class="form-group">
<label>Power:</label>
<select name="power">`;
let letter = '';
let first = true;
for (const powerName of Object.keys(powers).sort()) {
const newLetter = powerName[0].toUpperCase();
if (newLetter !== letter) {
letter = newLetter;
if (!first) {
form += '</optgroup>';
}
first = false;
form += `<optgroup label="${newLetter}">`;
}
form += `<option>${powerName}</option>`;
}
form += `</optgroup></select></div>`;
const formResult = await DialogV2.wait({
window: {
title: 'Select a power',
icon: 'fa-solid fa-wand-magic-sparkles',
},
content: form,
buttons: [
{
action: 'submit',
label: 'Choose Power',
default: true,
callback: (event, button, dialog) => new foundry.applications.ux.FormDataExtended(button.form),
},
{ action: 'cancel', label: 'Cancel' },
],
});
console.log(formResult);
const powerName = formResult.get('power');
const token = 'token' in options ? options.token : null;
if (token === undefined || token === null) {
ui.notifications.error('Please select one token to be the caster');
return;
}
const targets = 'targets' in options ? Array.from(options.targets) : [];
const runner = new powers[powerName](token, targets);
runner.render();
return;
}

View File

@ -1,81 +0,0 @@
import { moduleName } from '../globals.js';
import { PowerEffect } from './basePowers.js';
export class ProtectionEffect extends PowerEffect {
get name() {
return 'Protection';
}
get duration() {
return 5;
}
get icon() {
return 'systems/swade/assets/icons/status/status_protection.svg';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get basePowerPoints() {
return 1;
}
get isTargeted() {
return true;
}
async parseValues() {
await super.parseValues();
const doc = await PowerEffect.getStatus('SWADE.Protection', 'Protection', false);
doc.flags = foundry.utils.mergeObject(doc.flags ?? {}, { [moduleName]: { powerEffect: true } });
this.data.effect = doc;
}
get modifiers() {
return [
...super.modifiers,
{
type: 'checkbox',
name: 'Shield Other',
id: 'other',
value: 1,
effect: true,
epic: false,
icon: 'icons/magic/defensive/shield-barrier-flaming-diamond-blue-yellow.webp',
changes: '',
},
];
}
get basePrimaryEffect() {
this.data.effect.changes = this.getPrimaryEffectChanges();
return this.data.effect;
}
getPrimaryEffectChanges() {
const mode = CONST.ACTIVE_EFFECT_MODES.ADD;
const key = `system.stats.toughness.${this.data.raise ? 'value' : 'armor'}`;
return [...super.getPrimaryEffectChanges(), { key, mode, value: 2, priority: 0 }];
}
get description() {
let text =
super.description +
`
<p>Grant the recipients 2 points of ${this.data.raise ? 'toughness' : 'armor'}
</p>
`;
if (this.data.other) {
text += `<p>If the protected creature is not the caster, and the protected
creature suffers wounds, the caster can take those wounds instead. If the
caster does this, they get a free reroll on the Soak roll, if one is attempted.</p>`;
}
return text;
}
}

View File

@ -1,87 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class PuppetEffect extends PowerEffect {
get name() {
return 'Puppet';
}
get duration() {
return 5;
}
get icon() {
return 'icons/magic/control/control-influence-puppet.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 2;
}
get basePowerPoints() {
return 3;
}
get isTargeted() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
name: 'Strong',
type: 'checkbox',
id: 'strong',
value: 2,
epic: false,
effect: false,
});
return mods;
}
get isRaisable() {
return false;
}
get primaryEffectButtons() {
const mods = [];
if (this.data.strong) {
mods.push({ label: 'Strong', value: -2 });
}
return [
...super.primaryEffectButtons,
{
label: `Resist (Spirit${this.data.strong ? ' -2' : ''})`,
type: 'trait',
rollType: 'attribute',
rollDesc: 'Spirit',
flavor: 'Resist Puppet after unreasonable command',
mods,
},
];
}
get description() {
let text =
super.description +
`
<p>
Opposed roll vs the caster's Spirit. Success means the victim obeys
commands, but won't harm himself or those he cares about, including by
inaction. With a raise, the target will do so, but gets a free action
Spirit roll ${this.data.strong ? '(at -2)' : ''} to resist that
particular command, with a raise meaning he breaks the controller's hold
and the power ends.
</p>
`;
if (this.data.strong) {
text += `<p>Spirit rolls to resist are at -2. The caster may also use
<em>mind link</em> on the target to extend controll to any distance,
even out of sight.</p>`;
}
return text;
}
}

View File

@ -1,104 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class ReliefEffect extends PowerEffect {
get name() {
return 'Relief';
}
get icon() {
return 'icons/magic/nature/root-vine-caduceus-healing.webp';
}
get duration() {
return this.data.effect === 'numb' ? 600 : 0;
}
get isTargeted() {
return true;
}
get usePrimaryEffect() {
return this.data.effect === 'numb';
}
get isDamaging() {
return false;
}
get basePowerPoints() {
return 1;
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get modifiers() {
return [
...super.modifiers,
{
name: 'Restoration',
id: 'restoration',
value: 3,
type: 'checkbox',
epic: false,
effect: false,
},
{
name: 'Stunned',
id: 'stunned',
value: 1,
type: 'checkbox',
epic: false,
effect: false,
},
{
name: 'Recover or Numb?',
id: 'effect',
type: 'radio',
epic: false,
default: 'recover',
choices: { recover: 'Recover', numb: 'Numb' },
effects: { recover: null, numb: null },
values: { recover: 0, numb: 0 },
},
];
}
get effectName() {
return 'Numb';
}
getPrimaryEffectChanges() {
if (this.data.effect === 'recover') {
return super.getPrimaryEffectChanges();
}
return [
...super.getPrimaryEffectChanges(),
{
key: 'system.woundsOrFatigue.ignored',
value: this.data.raise ? 2 : 1,
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
priority: 0,
},
];
}
get description() {
let text = super.description;
if (this.data.effect === 'recover') {
text += `<p><strong>Recover</strong>: Remove ${this.data.raise ? 'two' : 'one'}
of Shaken, ${this.data.stunned ? 'Stunned, ' : ''}Distracted, or Vulnerable
from each target (not caused by circumstance like Bound, Entangled, etc).
</p>`;
} else {
text += `<p><strong>Numb</strong>: Reduce the penalty from Wounds or
Fatigue by ${this.data.raise ? 2 : 1}.</p>`;
}
return text;
}
}

View File

@ -1,69 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class ResurrectionEffect extends PowerEffect {
get name() {
return 'Resurrection';
}
get icon() {
return 'icons/magic/holy/barrier-shield-winged-cross.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return false;
}
get isRaisable() {
return true;
}
get basePowerPoints() {
return 5;
}
get modifiers() {
return [
{
name: 'Greater Resurrection',
type: 'checkbox',
value: 10,
id: 'greater',
epic: true,
effect: false,
},
{
name: 'Power',
type: 'checkbox',
value: 5,
id: 'power',
epic: false,
effect: false,
},
];
}
get description() {
let desc = super.description;
let time = 'a body no more than a year old';
if (this.data.power) {
time = 'a body no more than 10 years old';
}
if (this.data.greater) {
('a dead spirit of any age willing to return');
}
desc += `<p>This power requires ${time}.
After a ${this.data.greater ? 'twelve' : 'four'}-hour ritual,
the caster makes an arcane skill roll at -4. If successful the subject
returns to life ${this.data.raise ? '' : 'with three wounds and '}Exhausted.
`;
if (this.data.greater) {
desc += `The caster ends the ritual Exhausted.`;
}
desc += '</p>';
return desc;
}
}

View File

@ -1,74 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class SanctuaryEffect extends PowerEffect {
get name() {
return 'Sanctuary';
}
get icon() {
return 'icons/magic/defensive/shield-barrier-flaming-diamond-blue-yellow.webp';
}
get duration() {
return 5;
}
get isTargeted() {
return true;
}
get hasAoe() {
return true;
}
get basePowerPoints() {
return 2;
}
get description() {
const penalty =
this.data.raise || this.data.strong ? '' : ` at ${(this.data.raise ? -2 : 0) + (this.data.strong ? -2 : 0)}`;
return (
super.description +
`<p>
Any evil creature attempting a damaging attack that targets or affects
the recipient must make a Spirit roll${penalty} or lose the action to
no effect.</p>
<p>Anyone under the affects of <em>sanctuary</em> who attempts to harm
another creature immediately loses the benefit.
</p>`
);
}
get modifiers() {
const mods = super.modifiers;
mods.push({
name: 'Strong',
type: 'checkbox',
value: 1,
id: 'strong',
epic: true,
effect: false,
});
mods.push({
type: 'select',
default: 'none',
name: 'Area of Effect',
id: 'aoe',
epic: true,
choices: {
none: 'None',
mbt: 'Medium Blast Template',
lbt: 'Large Blast Template',
},
effects: { none: null, mbt: null, lbt: null },
values: { none: 0, mbt: 2, lbt: 3 },
});
return mods;
}
get effectName() {
const penalty = (this.data.raise ? -2 : 0) + (this.data.strong ? -2 : 0);
return `Sanctuary${penalty === 0 ? '' : ` (${penalty} penalty)`}`;
}
}

View File

@ -1,47 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class ScryingEffect extends PowerEffect {
get name() {
return 'Scrying';
}
get basePowerPoints() {
return 3;
}
get duration() {
return 5;
}
get icon() {
return 'icons/magic/perception/orb-crystal-ball-scrying.webp';
}
get modifiers() {
const mods = super.modifiers;
mods.push({
name: 'Group Sight',
id: 'group',
value: 2,
type: 'checkbox',
default: false,
epic: false,
effect: false,
});
return mods;
}
get description() {
let text = super.description;
text += `<p>Opposed by the subject's spirit. If the target wins, he knows
he is being spied upon. If the caster wins, he can see and hear the target
and the area around it. With a raise, he can move his perspective as well.
</p>${this.data.group ? '<p>The caster may share perception with nearby allies.</p>' : ''}
`;
return text;
}
get effectName() {
return `${this.name}${this.data.group ? ' (Group Sight)' : ''}`;
}
}

View File

@ -1,275 +0,0 @@
import { log, moduleHelpers, moduleName } from '../globals.js';
import { firstOwner, updateOwnedToken } from '../helpers.js';
import { ActorFolderEffect } from './basePowers.js';
export class ShapeChangeEffect extends ActorFolderEffect {
get actorFolderBase() {
return 'Morphables';
}
get name() {
return 'Shape Change';
}
get icon() {
return 'icons/magic/control/silhouette-hold-change-blue.webp';
}
get duration() {
return (this.data.duration ? 50 : 5) * (this.data.wildShape ? 2 : 1);
}
get isTargeted() {
return true;
}
get oneTarget() {
return true;
}
get isRaisable() {
return true;
}
get basePowerPoints() {
return 0;
}
get hasRange() {
return false;
}
actorValue(actor) {
const size = actor.system.stats.size;
let value = 3;
if (size >= 5) {
value = 15;
} else if (size >= 3) {
value = 11;
} else if (size >= 1) {
value = 8;
} else if (size >= 0) {
value = 5;
}
return value;
}
get modifiers() {
const wildShape = !!this.source.actor.items.find((i) => i.type === 'edge' && i.system.swid === 'wild-shape');
return [
...super.modifiers,
{
name: 'Duration',
type: 'checkbox',
value: 1,
default: false,
id: 'duration',
epic: false,
effect: false,
},
{
name: 'Wild Shape (Druid)',
type: 'checkbox',
value: 0,
default: wildShape,
id: 'wildShape',
epic: false,
effect: false,
},
{
name: 'Transform Other?',
type: 'select',
default: 'none',
id: 'transform',
epic: true,
choices: {
none: 'None',
touch: '⭐ Transform (touch)',
smarts: '⭐ Transform (smarts)',
},
effects: { none: null, touch: null, smarts: null },
values: { none: 0, touch: 2, smarts: 3 },
},
];
}
async parseValues() {
await super.parseValues();
this.target = this?.targets?.[0] ?? this.source;
this.data.actorUpdates = {
name: `${this.target.actor.name} (${this.targetActor.name} form)`,
system: {
wildcard: this.target.actor.system.wildcard,
attributes: {},
},
};
for (const stat of ['smarts', 'spirit']) {
this.data.actorUpdates.system.attributes[stat] = {
die: this.target.actor.system.attributes[stat].die,
'wild-die': this.target.actor.system.attributes[stat]['wild-die'],
};
}
this.data.tokenUpdates = {
flags: {
[moduleName]: {
'shapeChange.srcTokenUuid': this.target.document.uuid,
'shapeChange.srcTokenId': this.target.document.id,
'shapeChange.srcTokenSceneId': this.target.scene.id,
},
},
actorLink: false,
name: `${this.target.name} (${this.targetActor.prototypeToken.name} form)`,
disposition: this.target.document.disposition,
sight: {
enabled: true,
},
};
this.data.embeddedUpdates = {
ActiveEffect: {},
Item: {},
};
for (const effect of this.target.actor.effects) {
const doc = foundry.utils.deepClone(await this.target.actor.getEmbeddedDocument('ActiveEffect', effect.id));
this.data.embeddedUpdates.ActiveEffect[effect.name] = doc;
}
for (const item of this.target.actor.items.filter(
(i) =>
(i.type === 'skill' && ['smarts', 'spirit'].includes(i.system.attribute)) ||
['power', 'edge', 'hindrance', 'action'].includes(i.type),
)) {
const doc = await this.target.actor.getEmbeddedDocument('Item', item.id);
this.data.embeddedUpdates.Item[item.name] = doc;
}
}
async spawn() {
const target = this.target.document;
const size = target.parent.dimensions.size;
const protoWidth = this.targetActor.prototypeToken.width;
const protoHeight = this.targetActor.prototypeToken.height;
this.targetTokenDoc.updateSource({
x: target.x - ((protoWidth - target.width) * size) / 2,
y: target.y - ((protoHeight - target.height) * size) / 2,
elevation: target.elevation,
hidden: target.hidden,
});
return this.source.scene.createEmbeddedDocuments('Token', [this.targetTokenDoc]);
}
async apply() {
await super.apply();
const maintainDoc = await this.createMaintainEffect(this.data.maintId);
maintainDoc.flags[moduleName].targetIds = this.data.spawned.map((t) => t.id);
maintainDoc.flags[moduleName].shapeChangeSourceId = this.target.id;
maintainDoc.flags[moduleName].shapeChangeTempTokenId = this.data.spawned[0].id;
let maintainer = this.source;
if (this.source.id === this.target.id) {
maintainer = this.data.spawned[0];
}
await this.applyActiveEffects(maintainer, [maintainDoc]);
}
get effectName() {
return `Shape Change into ${this.targetActor.prototypeToken.name}`;
}
getPrimaryEffectChanges() {
const changes = super.getPrimaryEffectChanges();
if (this.data.raise) {
for (const stat of ['vigor', 'strength']) {
changes.push({
key: `system.attributes.${stat}.die.sides`,
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: 2,
priority: 0,
});
}
}
return changes;
}
get spawnUpdates() {
const updates = super.spawnUpdates;
foundry.utils.mergeObject(updates.actor, this.data.actorUpdates);
foundry.utils.mergeObject(updates.token, this.data.tokenUpdates);
foundry.utils.mergeObject(updates.embedded, this.data.embeddedUpdates);
return updates;
}
async sideEffects() {
const owner = firstOwner(this.target);
moduleHelpers.socket.executeAsUser(
updateOwnedToken,
owner.id,
this.target.document.parent.id,
this.target.document.id,
{ hidden: true, x: 0, y: 0 },
{ animate: false },
);
}
get description() {
let desc = super.description;
desc += `<p>The caster ${this.data.transform === 'none' ? 'transforms' : 'causes the target to transform'}
into a <em>${this.targetActor.name}</em>.</p>`;
return desc;
}
}
export class ShapeChangeAbilityEffect extends ShapeChangeEffect {
get name() {
return 'Shape Change Ability';
}
get duration() {
return 500;
}
get isTargeted() {
return false;
}
get isRaisable() {
return false;
}
actorValue(actor) {
return 0;
}
get modifiers() {
return super.modifiers.filter((m) => m.id === 'actorId');
}
async parseValues() {
this.targets = [this.source];
await super.parseValues();
}
}
export async function shapeChangeTokenDeleteHandler(token, options, userId) {
if (token.flags?.['multilevel-tokens']?.stoken) {
// if the deleted token is a dummy token from multilevel-tokens, ignore it
return;
}
log('TOKEN DELETED |', token, options, userId);
const sourceInfo = token.getFlag(moduleName, 'shapeChange');
if (!sourceInfo?.srcTokenId) {
return;
}
if (sourceInfo.srcTokenSceneId !== token.parent.id) {
return;
}
const srcToken = await fromUuid(sourceInfo.srcTokenUuid);
const size = token.parent.dimensions.size;
const owner = firstOwner(srcToken);
const updates = {
x: token.x - ((srcToken.width - token.width) * size) / 2,
y: token.y - ((srcToken.height - token.height) * size) / 2,
elevation: token.elevation,
hidden: token.hidden,
};
moduleHelpers.socket.executeAsUser(updateOwnedToken, owner.id, srcToken.parent.id, srcToken.id, updates, {
animate: false,
});
}

View File

@ -1,175 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class SlothSpeedEffect extends PowerEffect {
get name() {
return 'Sloth/Speed';
}
get hasAdditionalRecipients() {
return (this?.data?.direction ?? 'Speed') == 'Speed';
}
get additionalRecipientCost() {
return 1;
}
get additionalRecipientText() {
return `${super.additionalRecipientText} (speed only)`;
}
get icon() {
return this?.data?.direction === 'Sloth'
? 'icons/magic/control/debuff-energy-snare-brown.webp'
: 'icons/skills/movement/figure-running-gray.webp';
}
get duration() {
return this?.data?.direction === 'Sloth' ? 0 : 5;
}
get isTargeted() {
return true;
}
get basePowerPoints() {
return 2;
}
get hasAoe() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
sortOrder: -2,
name: 'Sloth or Speed?',
id: 'direction',
type: 'radio',
default: 'Sloth',
epic: false,
choices: { Sloth: 'Sloth', Speed: 'Speed' },
effects: { Sloth: null, Speed: null },
values: { Sloth: 0, Speed: 0 },
});
mods.push({
type: 'select',
default: 'none',
name: 'Area of Effect (Sloth Only)',
id: 'aoe',
epic: false,
choices: {
none: 'None',
mbt: 'Medium Blast Template',
lbt: 'Large Blast Template',
},
effects: { none: null, mbt: null, lbt: null },
values: { none: 0, mbt: 2, lbt: 3 },
});
mods.push({
name: 'Dash (Speed only)',
id: 'dash',
type: 'checkbox',
default: false,
epic: false,
effect: false,
value: 2,
});
mods.push({
name: 'Quickness (Speed only)',
id: 'quickness',
type: 'checkbox',
default: false,
epic: false,
effect: false,
value: 2,
});
mods.push({
name: 'Strong (Sloth only)',
id: 'strong',
type: 'checkbox',
default: false,
value: 1,
epic: false,
effect: false,
});
return mods;
}
getPrimaryEffectChanges() {
const changes = [
{
key: 'system.pace',
value: this.data.direction === 'Sloth' ? 0.5 : 2,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.MULTIPLY,
},
];
return [...super.getPrimaryEffectChanges(), ...changes];
}
get effectName() {
let name = `${this.data.raise ? 'major' : 'minor'} ${this.data.direction}`;
const parts = [];
if (this.data.direction === 'Sloth' && this.data.strong) {
parts.push('strong');
}
if (this.data.direction === 'Speed') {
if (this.data.dash) {
parts.push('dash');
}
if (this.data.quickness) {
parts.push('quickness');
}
}
if (parts.length > 0) {
name = `${name} (${parts.join(', ')})`;
}
return name;
}
get description() {
let desc = super.description;
if (this.data.direction === 'Sloth') {
desc += `<p>Target's pace is reduced by half (round up). `;
if (this.data.raise) {
desc += `For the target, movement is also an action. `;
}
desc += `</p><p>The target tries to shake off the effects at the end of
subsequent turns with a Spirit roll${this.data.strong ? ' at -2' : ''}.</p>`;
} else {
desc += `<p>Target's pace is doubled. `;
if (this.data.raise) {
desc += `The target also ignores the -2 running penalty. `;
}
if (this.data.dash) {
desc += `When running, the target runs as if they rolled the maximum on
their running die. `;
}
if (this.data.quickness) {
desc += `The target's total Multi-Action penalty each turn is reduced by 2.`;
}
desc += '</p>';
}
return desc;
}
get primaryEffectButtons() {
const buttons = super.primaryEffectButtons;
if (this.data.direction === 'Sloth') {
const mods = [];
if (this.data.strong) {
mods.push({ label: 'Strong', value: -2 });
}
buttons.push({
label: `Shake off (Spirit${this.data.strong ? ' -2' : ''})`,
type: 'trait',
rollType: 'attribute',
rollDesc: 'Spirit',
flavor: 'Success shakes off the effects of sloth',
mods,
});
}
return buttons;
}
}

View File

@ -1,73 +0,0 @@
import { moduleName } from '../globals.js';
import { PowerEffect } from './basePowers.js';
export class SlumberEffect extends PowerEffect {
get name() {
return 'Slumber';
}
get icon() {
return 'icons/magic/control/sleep-bubble-purple.webp';
}
get duration() {
return 600;
}
get isTargeted() {
return true;
}
get hasAoe() {
return true;
}
get basePowerPoints() {
return 2;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
type: 'select',
default: 'none',
name: 'Area of Effect',
id: 'aoe',
epic: false,
choices: {
none: 'None',
mbt: 'Medium Blast Template',
lbt: 'Large Blast Template',
},
effects: { none: null, mbt: null, lbt: null },
values: { none: 0, mbt: 2, lbt: 3 },
});
return mods;
}
get description() {
return (
super.description +
`<p>The subject(s) fall into a deep and restful sleep if they fail a
Spirit${this.data.raise ? ' -2' : ''} roll. Very loud noises or attempts
to physically wake a sleeper grant another roll.</p>`
);
}
get primaryEffectButtons() {
const buttons = super.primaryEffectButtons;
const mods = [];
if (this.data.raise) {
mods.push({ label: 'Raise on the arcane roll', value: -2 });
}
buttons.push({
label: `Shake off (Spirit${this.data.raise ? ' -2' : ''})`,
type: 'trait',
rollType: 'attribute',
rollDesc: 'Spirit',
flavor: 'Wake up if successful',
mods,
});
return buttons;
}
}

View File

@ -1,250 +0,0 @@
import { moduleName } from '../globals.js';
import { PowerEffect } from './basePowers.js';
import { BaseSummonEffect } from './summonSupport.js';
class SpiritualWeaponEffect extends BaseSummonEffect {
get name() {
return 'Spiritual Weapon';
}
get icon() {
return 'icons/weapons/hammers/hammer-double-glowing-yellow.webp';
}
get duration() {
return 5;
}
get basePowerPoints() {
return 4;
}
get modifiers() {
const arcaneSkillSwids = ['faith', 'spellcasting', 'performance', 'alchemy'];
const choices = {};
const values = {};
const effects = {};
const skillList = this.source.actor.items.filter(
(i) => i.type === 'skill' && arcaneSkillSwids.includes(i.system.swid),
);
for (const skill of skillList.map((s) => s.name)) {
choices[skill] = skill;
values[skill] = 0;
effects[skill] = null;
}
return [
...super.modifiers,
{
type: 'select',
name: 'Arcane Skill',
id: 'arcaneSkill',
choices,
values,
effects,
epic: false,
},
];
}
// eslint-disable-next-line no-unused-vars
actorValue(actor) {
return 0;
}
async parseValuesPre() {
await super.parseValuesPre();
this.data.primaryEffectChanges = [];
this.data.actorUpdates = {
name: `${this.source.actor.name}'s ${this.targetActor.name}`,
system: {
wildcard: this.source.actor.system.wildcard,
attributes: {
spirit: {
die: {
sides: this.source.actor.system.attributes.spirit.die.sides,
modifier: this.source.actor.system.attributes.spirit.die.modifier,
},
'wild-die': {
sides: this.source.actor.system.attributes.spirit['wild-die'].sides,
},
},
},
},
};
this.data.tokenUpdates = {
disposition: this.source.document.disposition,
sight: { enabled: false },
actorLink: false,
name: `${this.source.name}'s ${this.targetActor.name}`,
};
const weaponId = this.targetActor.items.find((i) => i.type === 'weapon' && i.system.swid === 'spiritual-weapon').id;
const weaponDoc = await this.targetActor.getEmbeddedDocument('Item', weaponId).clone();
const arcaneSkillId = this.source.actor.items.find(
(i) => i.type === 'skill' && i.name === this.data.arcaneSkill,
).id;
const arcaneDoc = await this.source.actor.getEmbeddedDocument('Item', arcaneSkillId).clone();
weaponDoc.updateSource({
system: {
damage: this.data.raise ? '@spi+d6' : '@spi+d4',
actions: {
trait: arcaneDoc.name,
},
},
});
this.data.embeddedUpdates = {
ActiveEffect: {},
Item: {
[weaponDoc.name]: weaponDoc,
[arcaneDoc.name]: arcaneDoc,
},
};
}
get summonCount() {
return 1;
}
getPrimaryEffectChanges() {
return [...super.getPrimaryEffectChanges(), ...this.data.primaryEffectChanges];
}
get spawnUpdates() {
const updates = super.spawnUpdates;
foundry.utils.mergeObject(updates.actor, this.data.actorUpdates);
foundry.utils.mergeObject(updates.token, this.data.tokenUpdates);
foundry.utils.mergeObject(updates.embedded, this.data.embeddedUpdates);
return updates;
}
get description() {
let text = super.description;
text += `<p>This version of <em>smite</em> summons an enchanted weapon made
of energy within Smarts. The caster can move the spiritual weapon up to 5"
and attack with it as a free action, using their ${this.data.arcaneSkill}
in place of fighting. The weapon does ${this.data.raise ? 'Spr+d6' : 'Spr+d4'}
damage.</p>`;
return text;
}
}
export class SmiteEffect extends PowerEffect {
get name() {
return 'Smite';
}
get duration() {
return 5;
}
get icon() {
return 'systems/swade/assets/icons/status/status_smite.svg';
}
get isDamaging() {
return true;
}
get basePowerPoints() {
return 2;
}
get isTargeted() {
return true;
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get modifiers() {
return [
...super.modifiers,
{
type: 'checkbox',
default: false,
name: 'Greater Smite',
id: 'greater',
value: 2,
epic: true,
effect: false,
},
{
type: 'checkbox',
default: false,
name: 'Spiritual Weapon',
id: 'spiritualWeapon',
value: 2,
epic: true,
effect: false,
},
];
}
async parseValues() {
await super.parseValues();
this.baseDoc = await PowerEffect.getStatus('SWADE.Smite', 'Smite', false);
this.baseDoc.flags = foundry.utils.mergeObject(this.baseDoc.flags ?? {}, {
[moduleName]: { powerEffect: true },
});
this.data.bonus = (this.data.raise ? 4 : 2) + (this.data.greater ? 2 : 0);
this.baseDoc.changes = [...this.getPrimaryEffectChanges()];
}
get basePrimaryEffect() {
return this.baseDoc;
}
getPrimaryEffectChanges() {
return [
...super.getPrimaryEffectChanges(),
{
key: 'system.stats.globalMods.damage',
value: this.data.bonus,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
},
];
}
async applySpiritualWeapon() {
const runner = new SpiritualWeaponEffect(this.source, [], this.item);
runner.render();
}
async apply() {
if (this.data.spiritualWeapon) {
await this.applySpiritualWeapon();
} else {
super.apply();
}
}
async chatMessage() {
if (this.data.spiritualWeapon) {
return;
}
await super.chatMessage();
}
async sideEffects() {
if (this.data.spiritualWeapon) {
return;
}
await super.sideEffects();
}
get description() {
let text = `
<p>Increase damage by ${this.data.bonus} on one weapon or load of ammunition.
`;
if (this.data.greater) {
text += 'The weapon is considered a Heavy Weapon.';
}
text += '</p>';
return super.description + text;
}
}

View File

@ -1,123 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class SoundSilenceEffect extends PowerEffect {
get name() {
return 'Sound/Silence';
}
get hasAdditionalRecipients() {
return false;
}
get icon() {
return (this?.data?.direction ?? 'Sound') === 'Sound'
? 'icons/magic/sonic/bell-alarm-red-purple.webp'
: 'icons/svg/silenced.svg';
}
get duration() {
return this?.data?.direction === 'Sound' ? (this.data.alarm === 'none' ? 0 : 6000) : 5;
}
get isTargeted() {
return this.data?.targeted && this?.data?.direction === 'Silence';
}
get basePowerPoints() {
return 1;
}
get hasAoe() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
sortOrder: -2,
name: 'Sound or Silence',
id: 'direction',
type: 'radio',
default: 'Sound',
epic: false,
choices: { Sound: 'Sound', Silence: 'Silence' },
effects: { Sound: null, Silence: null },
values: { Sound: 0, Silence: 0 },
});
mods.push({
name: 'Greater Sound/Silence',
id: 'greater',
default: false,
type: 'checkbox',
effect: false,
value: 1,
epic: true,
});
mods.push({
name: 'Mobile',
id: 'mobile',
default: false,
type: 'checkbox',
effect: false,
value: 1,
epic: false,
});
mods.push({
name: 'Targeted',
id: 'targeted',
default: false,
type: 'checkbox',
effect: false,
value: 0,
epic: false,
});
mods.push({
name: 'Alarm (Sound only)',
type: 'select',
id: 'alarm',
epic: false,
default: 'none',
choices: { none: 'No alarm', object: 'On Object', area: '10 yard area' },
effects: { none: null, object: null, area: null },
values: { none: 0, object: 1, area: 2 },
});
return mods;
}
get effectName() {
if (this.data.direction === 'Sound' && this.data.alarm !== 'none') {
return 'Alarm';
}
let name = `${this.data.raise ? 'major' : 'minor'} ${this.data.direction}`;
return name;
}
get description() {
let desc = super.description;
if (this.data.direction === 'Sound') {
desc += `<p>Mimic any known sound from a point within ranage. If used as
a test, resist with Smarts${this.data.greater ? ' -2' : ''}.</p>`;
if (this.data.alarm !== 'none') {
desc += `<p>A subtle ward is created on
${this.data.alarm === 'object' ? 'an object' : 'an area 10 yards in diameter'}
which will sound an alarm (to the caster only or audibly, caster's choice)
if the ward is disturbed. This lasts 10 hours. The caster may choose to
set a password that, if spoken, will allow the ward to be disturbed by
the speaking entity.</p>`;
}
} else if (this.data.targeted) {
desc += `<p>Silence an individual, causing
${this.data.raise ? 'complete silence' : '-4 to auditory Notice rolls'}
for that individual. Resisted with Spirit, -2 if a raise and -2 if Greater.</p>`;
} else {
desc += `<p>Silence a Large Blast Template, causing
${this.data.raise ? 'complete silence' : '-4 t auditory Notice rolls'}
within the area.</p>`;
}
if (!this.data.targete && this.data.mobile) {
desc += `<p>The caster can move the area up to his arcane skill die
type each round.</p>`;
}
return desc;
}
}

View File

@ -1,66 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class SpeakLanguageEffect extends PowerEffect {
get name() {
return 'Speak Language';
}
get duration() {
return 100;
}
get icon() {
return 'icons/magic/sonic/scream-wail-shout-teal.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get basePowerPoints() {
return 1;
}
get isTargeted() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
name: 'Greater Speak Language',
type: 'checkbox',
id: 'greater',
value: 2,
epic: true,
effect: false,
});
mods.push({
name: 'Mass Understanding',
type: 'checkbox',
id: 'mass',
value: 5,
epic: true,
effect: false,
});
return mods;
}
get effectName() {
return `${this.data.raise ? 'major' : 'minor'} ${this.name}${this.data.mass ? ' [Mass Understanding]' : this.data.greater ? ' [Greater]' : ''}`;
}
get description() {
let text = super.description;
if (this.data.mass) {
text += `<p>All creatures within Smarts ×2 of the recipient can understand one another.</p>`;
} else {
text += `<p>Speak, read, and write ${this.data.greater ? 'all sapient languages' : 'a sapient language other than your own'}. ${this.data.raise ? 'Understand and use dialect and slang as well.' : ''}</p>`;
}
return text;
}
}

View File

@ -1,65 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class StunEffect extends PowerEffect {
get name() {
return 'Confusion';
}
get icon() {
return 'icons/magic/control/hypnosis-mesmerism-swirl.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return true;
}
get usePrimaryEffect() {
return false;
}
get basePowerPoints() {
return 2;
}
get hasAoe() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
type: 'select',
default: 'none',
name: 'Area of Effect',
id: 'aoe',
epic: false,
choices: {
none: 'None',
mbt: 'Medium Blast Template',
lbt: 'Large Blast Template',
},
effects: { none: null, mbt: null, lbt: null },
values: { none: 0, mbt: 2, lbt: 3 },
});
return mods;
}
get description() {
return (
super.description +
`
<p>The target(s) must make a Vigor roll${this.data.raise ? ' at -2' : ''}
or be Stunned.</p>`
);
}
async createSecondaryEffects(maintId) {
const docs = await super.createSecondaryEffects(maintId);
docs.push(await PowerEffect.getStatus('SWADE.Stunned', 'Stunned', false));
return docs;
}
}

View File

@ -1,555 +0,0 @@
import { moduleName } from '../globals.js';
import { BaseSummonEffect } from './summonSupport.js';
class BaseAllyEffect extends BaseSummonEffect {
get actorFolder() {
return `${this.actorFolderBase}/Creatures`;
}
get basePowerPoints() {
return 0;
}
get duration() {
return 5;
}
get isTargeted() {
return false;
}
get isRaisable() {
return false;
}
get summonCount() {
return 1 + (this?.data?.additionalAllies ?? 0);
}
get additionalName() {
return 'Additional Allies';
}
get additionalDesc() {
return '(half base cost (round up))';
}
get additionalEpic() {
return true;
}
get commonActorPool() {
return true;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
type: 'checkbox',
name: 'Increased Trait (+1 per trait)',
id: 'increasedTrait',
value: 0,
effect: false,
epic: false,
default: false,
});
mods.push({
type: 'number',
name: `${this.additionalName} ${this.additionalDesc}`,
value: 0,
id: 'additionalAllies',
default: 0,
epic: this.additionalEpic,
effect: false,
});
mods.push({
type: 'checkbox',
name: 'Mind Rider',
id: 'mindRider',
value: 1,
effect: true,
icon: 'icons/magic/control/hypnosis-mesmerism-eye.webp',
changes: [],
description: 'The caster can communicate and sense through the ally.',
epic: false,
default: false,
});
return mods;
}
prepActors() {
const actors = super.prepActors();
if (!this.commonActorPool) {
return actors;
}
const newActors = {};
for (const key of Object.keys(actors)) {
const actor = actors[key];
const summon = actor.flags?.['swade-mb-helpers']?.summonData;
if (summon?.powers?.[this.name]) {
newActors[key] = actor;
}
}
return newActors;
}
actorValue(actor) {
const summon = actor.flags?.['swade-mb-helpers']?.summonData;
return summon?.cost ?? 0;
}
get powerPoints() {
let value = super.powerPoints;
value += this.data.increasedTraitCount;
let halfValue = Math.ceil(value / 2);
return value + (this.data.additionalAllies ?? 0) * halfValue;
}
async parseValuesPre() {
await super.parseValuesPre();
this.data.actorUpdates = {
name: `${this.source.actor.name}'s summoned ${this.targetActor.name}`,
};
this.data.tokenUpdates = {
actorLink: false,
name: `${this.source.name}'s ${this.targetActor.prototypeToken.name}`,
disposition: this.source.document.disposition,
sight: {
enabled: true,
},
};
this.data.embeddedUpdates = {
ActiveEffect: {},
Item: {},
};
this.data.primaryEffectChanges = [];
}
async parseValuesPost() {
await super.parseValuesPost();
if (!this?.data?.increasedTrait) {
this.data.increasedTraitCount = 0;
return;
}
const skillSet = new Set();
for (const skill of this.targetActor.items.filter((i) => i.type === 'skill')) {
skillSet.add(skill.name);
}
for (const item of Object.values(this.data.embeddedUpdates.Item).filter((i) => i.type === 'skill')) {
skillSet.add(item.name);
}
const skillList = Array.from(skillSet);
skillList.sort();
const attrList = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'];
let html = `<div><h2>Increase Attributes</h2><p>(+1 pp each)</p>`;
html += attrList
.map(
(name) => `<div class="form-group">
<label><input type="checkbox" name="${name}">${name}</label>
</div>`,
)
.join('');
html += `<h2>Increase Skills</h2><p>(+1 pp each)</p>`;
html += skillList
.map(
(name) => `<div class="form-group">
<label><input type="checkbox" name="${name}">${name}</label>
</div>`,
)
.join('');
html += '</div>';
const formData = await foundry.applications.api.DialogV2.wait({
window: {
title: 'Select Trait increases',
icon: 'fa-solid fa-person-arrow-up-from-line',
},
content: html,
buttons: [
{
action: 'submit',
label: 'Submit',
callback: (event, button, dialog) => new foundry.applications.ux.FormDataExtended(button.form).object,
},
{ action: 'cancel', label: 'Cancel' },
],
});
const mode = CONST.ACTIVE_EFFECT_MODES.ADD;
const value = 2;
const priority = 0;
let count = 0;
this.data.increasedTraitChanges = [];
for (const attr of attrList) {
if (formData[attr]) {
this.data.increasedTraitChanges.push({
key: `system.attributes.${attr.toLowerCase()}.die.sides`,
value,
mode,
priority,
});
count++;
}
}
for (const skill of skillList) {
if (formData[skill]) {
this.data.increasedTraitChanges.push({
key: `@Skill{${skill}}[system.die.sides]`,
value,
mode,
priority,
});
count++;
}
}
this.data.increasedTraitCount = count;
}
getPrimaryEffectChanges() {
return [...super.getPrimaryEffectChanges(), ...this.data.primaryEffectChanges];
}
async createSecondaryEffects(maintId) {
const effects = await super.createSecondaryEffects(maintId);
if ((this.data?.increasedTraitChanges?.length ?? 0) > 0) {
const doc = this.enhanceSecondaryEffect(
maintId,
this.createEffectDocument(this.icon, 'Increased Trait', this.data.increasedTraitChanges),
);
effects.push(doc);
}
return effects;
}
get spawnUpdates() {
const updates = super.spawnUpdates;
foundry.utils.mergeObject(updates.actor, this.data.actorUpdates);
foundry.utils.mergeObject(updates.token, this.data.tokenUpdates);
foundry.utils.mergeObject(updates.embedded, this.data.embeddedUpdates);
return updates;
}
get description() {
let desc = super.description;
desc += `<p>Summon a ${this.targetActor.prototypeToken.name} ally to serve
the caster. The Ally acts on the caster's action card, and follows commands
to the best of its ability.</p>`;
if (this.data.mindRider) {
desc += `<p>The caster can sense and communicate through the ally.</p>`;
}
return desc;
}
}
export class SummonAllyEffect extends BaseAllyEffect {
async init() {
await super.init();
this.data.templates = {};
for (let tplName of ['combat-edge_template', 'flight_template', 'raise_template']) {
if (tplName in this.data.actors) {
this.data.templates[tplName] = await foundry.utils.fromUuid(this.data.actors[tplName].uuid);
}
}
}
get name() {
return 'Summon Ally';
}
get commonActorPool() {
return false;
}
get actorFolder() {
return `${this.actorFolderBase}/${this.name}`;
}
get icon() {
return 'icons/magic/control/silhouette-hold-beam-blue.webp';
}
get isRaisable() {
return true;
}
actorValue(actor) {
const values = {
attendant: 1,
bodyguard: 3,
sentinel: 5,
'mirror self': 7,
};
if (actor.name.toLowerCase() in values) {
return values[actor.name.toLowerCase()];
}
return 0;
}
get _edges() {
const template = this.data.templates['combat-edge_template'];
if (!template) {
return [];
}
const edges = template.items.filter((i) => i.type === 'edge').map((i) => i.name);
edges.sort();
edges.unshift('None');
const choices = {};
const effects = {};
const values = {};
edges.forEach((edge) => {
choices[edge] = edge;
effects[edge] = null;
values[edge] = edge === 'None' ? 0 : 1;
});
return { choices, effects, values };
}
get modifiers() {
const mods = super.modifiers;
if ('flight_template' in this.data.templates) {
mods.push({
type: 'checkbox',
default: false,
name: 'Flight',
id: 'flight',
value: 2,
epic: false,
effect: false,
});
}
if ('combat-edge_template' in this.data.templates) {
const { choices, effects, values } = this._edges;
for (let i = 1; i <= 3; i++) {
mods.push({
sortOrder: i,
type: 'select',
name: `Combat Edge #${i}`,
id: `combatEdge${i}`,
default: 'None',
epic: false,
choices,
effects,
values,
});
}
}
return mods;
}
async parseValuesMid() {
await super.parseValuesMid();
if (this.data.raise && this.data.templates['raise_template']) {
const raiseTemplate = this.data.templates.raise_template;
for (const item of raiseTemplate.items) {
const raiseItemDoc = await raiseTemplate.getEmbeddedDocument('Item', item.id);
this.data.embeddedUpdates.Item[item.name] = raiseItemDoc;
}
}
if (this.targetActor.name !== 'Mirror Self') {
return;
}
const mirrorActor = this.source.actor;
foundry.utils.mergeObject(this.data.actorUpdates, {
system: mirrorActor.system
.clone({
'fatigue.value': 0,
'wounds.value': 0,
'wounds.max': 0,
'bennies.max': 0,
'bennies.value': 0,
})
.toObject(),
name: `Mirror ${mirrorActor.name}`,
img: mirrorActor.img,
});
this.data.actorUpdates.system.wildcard = false;
foundry.utils.mergeObject(this.data.tokenUpdates, {
name: `Mirror ${this.source.name}`,
texture: {
src: this.source.document.texture.src,
scaleX: this.source.document.texture.scaleX * -1,
scaleY: this.source.document.texture.scaleY,
},
ring: {
enabled: this.source.document.ring.enabled,
colors: {
ring: this.source.document.ring.colors.ring,
background: this.source.document.ring.colors.background,
},
},
});
this.data.mirrorChanges = [];
for (const mirrorItem of mirrorActor.items) {
if (
mirrorItem.type === 'power' &&
(mirrorItem.system?.swid === 'summon-ally' || mirrorItem.name === 'Summon Ally')
) {
continue;
}
if (['weapon', 'armor', 'consumable', 'gear'].includes(mirrorItem.type)) {
continue;
}
this.data.embeddedUpdates.Item[mirrorItem.name] = await mirrorActor
.getEmbeddedDocument('Item', mirrorItem.id)
.clone({
'system.choiceSets': {},
'system.grants': [],
});
if (mirrorItem.type === 'skill') {
this.data.mirrorChanges.push({
key: `@Skill{${mirrorItem.name}}[system.die.sides]`,
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: -2,
priority: 0,
});
}
}
}
async parseValues() {
await super.parseValues();
const template = this.data.templates['combat-edge_template'];
for (let i = 1; i <= 3; i++) {
const edgeName = this.data[`combatEdge${i}`];
if (edgeName === 'None') {
continue;
}
const edgeId = template.items.find((i) => i.type === 'edge' && i.name === edgeName).id;
const edge = await template.getEmbeddedDocument('Item', edgeId);
this.data.embeddedUpdates.Item[edgeName] = edge;
}
if (this.data.flight && 'flight_template' in this.data.templates) {
const flightTemplate = this.data.templates.flight_template;
for (const item of flightTemplate.items) {
const doc = await flightTemplate.getEmbeddedDocument('Item', item.id);
this.data.embeddedUpdates.Item[item.name] = doc;
}
for (const effect of flightTemplate.effects.values()) {
const doc = ActiveEffect.fromSource(effect);
this.data.embeddedUpdates.ActiveEffect[effect.name] = doc;
}
}
}
async createSecondaryEffects(maintId) {
const effects = await super.createSecondaryEffects(maintId);
if ((this.data?.mirrorChanges?.length ?? 0) > 0) {
const doc = this.enhanceSecondaryEffect(
maintId,
this.createEffectDocument(
'icons/magic/control/mouth-smile-deception-purple.webp',
'Mirror Self',
this.data.mirrorChanges,
),
);
doc.description = 'A mirror self ally has skills 1 die type worse than the caster';
effects.push(doc);
}
return effects;
}
get description() {
let desc = super.description;
if (this.targetActor.prototypeToken.name === 'Mirror Self') {
desc = `<p>Summon a clone of ${this.source.name} with the same number of
Power Points (after casting), but lowered skills, an Extra, and mundane
equipment.</p>`;
if (this.data.mindRider) {
desc += `<p>The caster can sense and communicate through the ally.</p>`;
}
}
return desc;
}
}
export class SummonMonsterEffect extends BaseAllyEffect {
get name() {
return 'Summon Monster';
}
get icon() {
return 'icons/magic/symbols/mask-metal-silver-white.webp';
}
}
export class SummonNaturesAllyEffect extends BaseAllyEffect {
get name() {
return "Summon Nature's Ally";
}
get icon() {
return 'icons/magic/symbols/mask-yellow-orange.webp';
}
}
export class SummonAnimalEffect extends BaseAllyEffect {
get name() {
return 'Summon Animal';
}
get icon() {
return 'icons/magic/symbols/mask-yellow-orange.webp';
}
}
export class SummonPlanarAllyEffect extends BaseAllyEffect {
get name() {
return 'Summon Planar Ally';
}
get icon() {
return 'icons/magic/symbols/rune-sigil-horned-blue.webp';
}
}
export class SummonUndeadEffect extends BaseAllyEffect {
get name() {
return 'Summon Undead';
}
get icon() {
return 'icons/magic/death/skeleton-glow-yellow-black.webp';
}
}
export class SummonEidolonEffect extends BaseSummonEffect {
get name() {
return 'Eidolon';
}
get icon() {
return 'icons/environment/creatures/monster-barbed-carapace-purple.webp';
}
get basePowerPoints() {
return 0;
}
get duration() {
return 0;
}
get isTargeted() {
return false;
}
get isRaisable() {
return false;
}
get summonCount() {
return 1;
}
get modifiers() {
return super.modifiers.filter((m) => m.id === 'actorId');
}
}
export class SummonCompanionEffect extends SummonEidolonEffect {
get name() {
return 'Companion';
}
get icon() {
return 'icons/creatures/mammals/dog-husky-white-blue.webp';
}
}

View File

@ -1,198 +0,0 @@
/* globals Sequencer */
import { log, moduleName } from '../globals.js';
import { templates } from '../preloadTemplates.js';
import { ActorFolderEffect } from './basePowers.js';
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
export class BaseSummonEffect extends ActorFolderEffect {
get name() {
return 'Base Summon';
}
get actorFolderBase() {
return 'Summonables';
}
get summonCount() {
return 0;
}
async parseValuesPre() {}
async parseValuesMid() {}
async parseValuesPost() {}
async parseValues() {
await super.parseValues();
await this.parseValuesPre();
await this.parseValuesMid();
await this.parseValuesPost();
}
async spawn() {
const location = await Sequencer.Crosshair.show({
distance: this.targetTokenDoc.height / 2,
texture: this.targetTokenDoc.texture.src,
snap: {
position: CONST.GRID_SNAPPING_MODES.VERTEX | CONST.GRID_SNAPPING_MODES.CENTER,
},
label: { text: this.targetTokenDoc.name },
});
const tokenDocs = [];
for (let i = 0; i < this.summonCount; i++) {
tokenDocs[i] = this.targetTokenDoc.clone({
x: location.token.x + i * 5,
y: location.token.y + i * 5,
elevation: this.source.elevation,
});
}
log('token docs', tokenDocs);
const spawned = await this.source.scene.createEmbeddedDocuments('Token', tokenDocs);
log('Spawned', spawned);
return spawned;
}
async apply() {
await super.apply();
const maintainDoc = await this.createMaintainEffect(this.data.maintId);
maintainDoc.flags[moduleName].targetIds = this.data.spawned.map((t) => t.id);
if (this.duration > 0) {
await this.applyActiveEffects(this.source, [maintainDoc]);
}
}
}
export class SummonCostApplication extends HandlebarsApplicationMixin(ApplicationV2) {
constructor(actors, powers) {
super();
this.actors = actors;
this.powers = powers;
this.object = {};
}
static DEFAULT_OPTIONS = {
id: 'mbSwadeSummonCostApplication',
form: {
handler: SummonCostApplication.#onSubmit,
closeOnSubmit: true,
},
tag: 'form',
position: {
width: 800,
height: 'auto',
},
classes: ['mbSwade', 'mbSwadeForm', 'mbSwadeSummonCostForm'],
window: {
title: 'Set Summoning Costs',
},
};
static PARTS = {
header: {
template: templates['dialogHeader.html'],
classes: ['mbSwade', 'mbSwadeDialogHeader', 'mbSwadeSummonCostsHeader'],
},
body: {
template: templates['summonCosts.html'],
classes: ['mbSwade', 'mbSwadePowerEffectsBody', 'scrollable'],
},
footer: {
template: 'templates/generic/form-footer.hbs',
},
};
async _prepareContext() {
const actorNames = Object.keys(this.actors).map((k) => {
let splitName = k.split(' | ');
splitName.pop();
let folder = splitName.length ? splitName.join(' | ') : '';
return { name: this.actors[k].name, folder, fullName: k };
});
actorNames.sort((a, b) => {
if (a.name < b.name) {
return -1;
} else if (a.name > b.name) {
return 1;
}
return 0;
});
const data = {
name: 'Set Summon Costs',
formId: foundry.utils.randomID(),
headerTitle: 'Set Summon Costs',
powers: this.powers,
actors: [],
buttons: [
{ type: 'submit', icon: 'fa-solid fa-save', label: 'SETTINGS.Save' },
{ type: 'cancel', icon: 'fa-solid fa-ban', label: 'SETTINGS.Cancel' },
],
};
for (const actor of actorNames) {
const summon = this.actors[actor.fullName].getFlag(moduleName, 'summonData') ?? {
cost: 0,
powers: {},
};
const hbSummon = {
cost: summon.cost,
powers: [],
};
for (const power of this.powers) {
hbSummon.powers.push({ power, value: summon.powers?.[power] ?? false });
}
data.actors.push({ actor, summon: hbSummon });
}
log('summon data');
log(data);
return data;
}
static async #onSubmit(event, form, formData) {
const submit = event?.submitter?.value ?? 'cancel';
if (submit === 'cancel') {
return;
}
log('FORMDATA |', formData);
formData = formData.object;
const updates = {};
for (const key of Object.keys(formData)) {
const value = formData[key];
const [name, subKey] = key.split(':;:');
if (!(name in updates)) {
updates[name] = { powers: {} };
}
if (subKey === 'cost') {
updates[name].cost = value;
} else {
updates[name].powers[subKey] = value;
}
}
log('FORMUPDATES |', updates);
for (const key of Object.keys(updates)) {
const update = updates[key];
const flagValue = this.actors[key].getFlag(moduleName, 'summonData') ?? {};
foundry.utils.mergeObject(flagValue, update);
const result = this.actors[key].setFlag(moduleName, 'summonData', flagValue);
console.log('update', key, result);
}
}
}
export async function setSummonCosts(powers = [], folderName = null) {
if (!folderName) {
folderName = 'Summonables/Creatures';
}
const folder = ActorFolderEffect.getPackFolderByPath(folderName);
if (!folder) {
log(`ERROR: Could not find folder ${folderName}`);
}
const indexActors = ActorFolderEffect.getPackActorsInFolder(folder);
const actors = {};
const promises = [];
for (const actorName in indexActors) {
promises.push(foundry.utils.fromUuid(indexActors[actorName].uuid).then((result) => (actors[actorName] = result)));
}
await Promise.all(promises);
new SummonCostApplication(actors, powers).render(true);
}

View File

@ -1,97 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class TelekinesisEffect extends PowerEffect {
get name() {
return 'Telekinesis';
}
get duration() {
return 5;
}
get icon() {
return 'icons/magic/movement/trail-streak-zigzag-yellow.webp';
}
get basePowerPoints() {
return 5;
}
get isTargeted() {
return false;
}
get usePrimaryEffect() {
return false;
}
get modifiers() {
const mods = super.modifiers;
mods.push({
name: 'Power',
type: 'checkbox',
id: 'power',
value: 3,
epic: false,
effect: false,
});
return mods;
}
get effectName() {
return `${this.data.raise ? 'major' : 'minor'} ${this.name} ${this.data.power ? '[Power] ' : ''}`;
}
get description() {
let desc = super.description;
let str = 'd10';
if (this.data.power && this.data.raise) {
str = 'd12+2';
} else if (this.data.power || this.data.raise) {
str = 'd12';
}
desc += `<p>Move objects with will alone. The power has a Strength of ${str}.
Resisted by an opposed arcane roll vs the target's Spirit when first targeted
and at the start of each of the target's turns thereafter.</p>
<h3>Uses:</h3>
<ul>
<li><strong>Bash</strong>: Bash the target into the floor, ceiling, or walls
for Str+d6 damage.</li>
<li><strong>Change Targets</strong>: Switch victim or tool as a free action.
Selecting an unwilling target is an action and is resisted as above.</li>
<li><strong>Manipulate</strong>: Use tool or weapon, using the caster's
arcane skill.</li>
<li><strong>Move</strong>: The target or tool may be moved up to the caster's
Smarts.</li>
</ul>`;
return desc;
}
get maintEffectButtons() {
let str = 'd10x';
if (this.data.power && this.data.raise) {
str = 'd12x+2';
} else if (this.data.power || this.data.raise) {
str = 'd12x';
}
let traitFormula = `1${str}[Strength]`;
if (this.source.actor.system.wildcard) {
traitFormula = `{${traitFormula},1d6x[Wild Die]}kh`;
}
return [
...super.primaryEffectButtons,
{
label: `Strength (${str.replace('x', '')})`,
type: 'roll',
formula: traitFormula,
flavor: 'Telekinesis Strength',
},
{
label: 'Damage (Str+d6)',
type: 'damage',
formula: `1${str}[Strength]+1d6x`,
flavor: 'Telekinesis Bash Damage',
},
];
}
}

View File

@ -1,98 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class TeleportEffect extends PowerEffect {
get name() {
return 'Teleport';
}
get icon() {
return 'icons/magic/movement/portal-vortex-orange.webp';
}
get duration() {
return this?.data?.gate ? 5 : 0;
}
get isTargeted() {
return true;
}
get isRaisable() {
return true;
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get usePrimaryEffect() {
return false;
}
get basePowerPoints() {
return 2;
}
get modifiers() {
return [
{
name: 'Gate',
type: 'checkbox',
value: 5,
id: 'gate',
epic: true,
effect: false,
},
{
name: 'Greater Teleport',
type: 'checkbox',
value: 5,
id: 'greater',
epic: true,
effect: false,
},
{
name: 'Teleport Foe',
type: 'checkbox',
value: 2,
id: 'foe',
epic: false,
effect: false,
},
];
}
get description() {
let desc = super.description;
if (this.data.gate) {
desc += `<p>The caster opens a gate between locations that stays open for
5 rounds.</p>`;
} else {
desc += `<p>The caster instantly moves the subject(s) to a new location
${this.data.greater && !this.data.foe ? 'elsewhere on the planet' : `within ${this.data.raise ? 48 : 24} yards`}.</p>
`;
if (this.data.foe) {
desc += `<p>Unwilling foes may be targeted by a Multi-Action sequence of a Touch
attack followed by casting this spell. This is resisted by an opposed Spirit roll.</p>`;
}
}
if (this.data.greater & !this.data.foe) {
desc += `<p>A greater teleport may arrive anywhere on the planet with three
rounds of concentration. How close the subjects arrive is dependent on the
caster's knowledge of the destination:</p>
<ul>
<li>Physically experienced the place: ${this.data.raise ? 'on target' : '[[/r 2d6*10]] feet away'}
and no penalty to the roll.</li>
<li>Detailed map or seen through remote viewing means: -2 penalty and
${this.data.raise ? 'on target' : '[[/r 2d6*100]] feet away'}.</li>
<li>Crude map or general idea of the location: -4 penalty and
${this.data.raise ? '[[/r 2d10]] miles' : '[[/r 2d6*100]] feet'} away.</li>
</ul>`;
}
return desc;
}
}

View File

@ -1,42 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class TimeStopEffect extends PowerEffect {
get name() {
return 'Time Stop';
}
get icon() {
return 'icons/magic/time/hourglass-tilted-gray.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return false;
}
get isRaisable() {
return true;
}
get basePowerPoints() {
return 10;
}
get description() {
let desc = super.description;
desc += `<p>Stop time for all but the caster, granting [[/r 1d4+1]] new turns
immediately after this one. During these turns the caster may act as normal
on their current Action Card.
`;
if (this.data.raise) {
desc += `With the raise, the caster may choose to draw a new Action Card each turn.
`;
}
desc += `</p><p><em>Time stop</em> ends if any of the caster's action affect
another character or creature.</p>`;
return desc;
}
}

View File

@ -1,60 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class WallWalkerEffect extends PowerEffect {
get name() {
return 'Wall Walker';
}
get duration() {
return 5;
}
get icon() {
return 'icons/creatures/invertebrates/bug-sixlegged-gray.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get basePowerPoints() {
return 2;
}
get isTargeted() {
return true;
}
get effectName() {
return `${this.name} (${this.data.raise ? 'full' : 'half'} pace)`;
}
get description() {
let text =
super.description +
`<p>Walk along vertical or horizontal surfaces. Move at ${this.data.raise ? 'full' : 'half'}
pace. May${this.data.raise ? '' : ' not'} run.
</p><p>If an athletics check is needed to climb or stay on the surface, it is at +4.
</p>`;
return text;
}
get primaryEffectButtons() {
const mods = [{ label: 'Wall Walker', value: 4 }];
return [
...super.primaryEffectButtons,
{
label: 'Athletics +4 (to climb or stay on a surface)',
type: 'trait',
rollType: 'skill',
rollDesc: 'Athletics',
flavor: 'Hanging on to the surface',
mods,
},
];
}
}

View File

@ -1,219 +0,0 @@
import { moduleHelpers, moduleName, settingKeys } from '../globals.js';
import { addItemsToToken } from '../helpers.js';
import { PowerEffect } from './basePowers.js';
export class WarriorsGiftEffect extends PowerEffect {
async init() {
await super.init();
this.edges = [];
const pack = game.packs.get(moduleHelpers.getSetting(settingKeys.powerActorsCompendium));
const templateUUID = pack?.index?.find((a) => a.name === 'warriors-edge_template').uuid;
if (!templateUUID) {
return;
}
const template = await foundry.utils.fromUuid(templateUUID);
if (template) {
this.edges = template.items
.filter((i) => i.type === 'edge')
.map((i) => template.getEmbeddedDocument('Item', i.id));
}
}
get name() {
return "Warrior's Gift";
}
get duration() {
return 5;
}
get icon() {
return 'icons/magic/control/buff-strength-muscle-damage-orange.webp';
}
get hasAdditionalRecipients() {
return true;
}
get additionalRecipientCost() {
return 1;
}
get basePowerPoints() {
return 4;
}
get isTargeted() {
return true;
}
get modifiers() {
const mods = super.modifiers;
const choices = {};
const powerChoices = {};
const effects = {};
const powerValues = {};
const values = {};
for (const edge of this.edges) {
powerChoices[edge.id] = edge.name;
choices[edge.id] = edge.name;
powerValues[edge.id] = 4;
values[edge.id] = 0;
effects[edge.id] = null;
}
powerChoices.none = 'None';
powerValues.none = 0;
effects.none = null;
mods.push({
sortOrder: -1,
name: 'Edge',
type: 'select',
id: 'edge',
epic: false,
choices,
values,
effects,
});
mods.push({
name: 'Power (2nd edge)',
type: 'select',
id: 'power',
epic: true,
choices: powerChoices,
default: 'none',
values: powerValues,
effects,
});
return mods;
}
async parseValues() {
await super.parseValues();
this.data.appliedEdge = this.edges.find((e) => e.id === this.data.edge);
this.data.powerEdge = this.data.power === 'none' ? null : this.edges.find((e) => e.id === this.data.power);
if (this.data.raise) {
const newApplied = this.edges.find((e) => e.name === `Improved ${this.data.appliedEdge.name}`);
this.data.appliedEdge = newApplied ? newApplied : this.data.appliedEdge;
if (this.data.powerEdge) {
const newPowerEdge = this.edges.find((e) => e.name === `Improved ${this.data.powerEdge.name}`);
this.data.powerEdge = newPowerEdge ? newPowerEdge : this.data.powerEdge;
}
}
}
async createPrimaryEffect(maintId) {
const doc = await super.createPrimaryEffect(maintId);
doc.flags[moduleName].attachedItems = true;
return doc;
}
get effectName() {
return `${this.name} (${this.data.appliedEdge.name}${this.data.powerEdge ? `, ${this.data.powerEdge.name}` : ''})`;
}
get description() {
let text = super.description + `<p>Add the Edge ${this.data.appliedEdge.name} `;
if (this.data.power) {
text += `and the Edge ${this.data.powerEdge.name} `;
}
text += 'to the recipient(s)';
return text;
}
async sideEffects() {
await super.sideEffects();
const candidateEdges = [this.data.appliedEdge];
if (this.data.powerEdge !== 'none') {
candidateEdges.push(this.data.powerEdge);
}
for (const target of this.targets) {
const targetEdges = [];
for (const edge of candidateEdges) {
if (target.actor.items.find((i) => i.type === 'edge' && i.system.swid === edge.system.swid)) {
continue;
}
const edgeDoc = edge.toObject();
foundry.utils.mergeObject(edgeDoc, {
name: `${edge.name} (from ${this.name})`,
flags: { [moduleName]: { maintId: this.data.maintId } },
});
targetEdges.push(edgeDoc);
}
if (targetEdges.length > 0) {
moduleHelpers.socket.executeAsGM(addItemsToToken, target.scene.id, target.id, targetEdges);
}
}
}
}
export class MartialFlexibilityEffect extends WarriorsGiftEffect {
constructor(...args) {
super(...args);
this.targets = [this.source];
}
get name() {
return 'Martial Flexibility';
}
get hasAdditionalRecipients() {
return false;
}
get basePowerPoints() {
return 0;
}
get isTargeted() {
return false;
}
get isRaisable() {
return false;
}
get usePrimaryEffect() {
return false;
}
get modifiers() {
const mods = [];
const choices = {};
const powerChoices = {};
const effects = {};
const powerValues = {};
const values = {};
for (const edge of this.edges) {
powerChoices[edge.id] = edge.name;
choices[edge.id] = edge.name;
powerValues[edge.id] = 4;
values[edge.id] = 0;
effects[edge.id] = null;
}
powerChoices.none = 'None';
powerValues.none = 0;
effects.none = null;
mods.push({
sortOrder: -1,
name: 'Edge',
type: 'select',
id: 'edge',
epic: false,
choices,
values,
effects,
});
return mods;
}
async parseValues() {
await super.parseValues();
this.data.powerEdge = 'none';
}
async createMaintainEffect(maintId) {
const doc = await super.createMaintainEffect(maintId);
doc.flags[moduleName].attachedItems = true;
return doc;
}
}

View File

@ -1,58 +0,0 @@
import { PowerEffect } from './basePowers.js';
export class WishEffect extends PowerEffect {
get name() {
return 'Wish';
}
get icon() {
return 'icons/magic/symbols/rune-sigil-green-purple.webp';
}
get duration() {
return 0;
}
get isTargeted() {
return false;
}
get isRaisable() {
return true;
}
get basePowerPoints() {
return 20;
}
get modifiers() {
return [];
}
get description() {
let desc = super.description;
desc += `<p>Bend reality to your will.
${this.data.raise ? 'With a raise there is no permanant cost' : 'The caster sacrifices 3 power points permanently'}.</p>
<p>Choose one of the following effects before casting.</p>
<ul>
<li><strong>Activate a power</strong>: cast any other available power, including modifiers.
Pay any difference in power points. Opposed rolls have an additional -2 penalty.</li>
<li><strong>Intercession</strong>: Wish for some sort of aid.</li>
<li><strong>Gain an edge</strong>: Grant someone a new permanent Edge.
Any given creature can only benefit from this type of wish once.</li>
<li><strong>Wealth</strong>: Wish for up to 10,000 gp worth of goods.</li>
<li><strong>Travel through time</strong>: Travel one minute back outside of combat or to the
start of the current round in combat.</li>
<li><strong>See the future</strong>: A look into the near future grants the
caster 3 conviction tokens that must be used by the caster or allies in
the next five rounds. A look into the far future lets the caster ask the GM
one question about the future and get as accurate an answer as possible.</li>
<li><strong>Raise a trait.</strong>: Raise a trait one die type. Any given
receipient can only benefit from this sort of wish once.</li>
<li><strong>Restore Fate:</strong> Caster and all Wild Cards in range may refill their Bennies.</li>
<li><strong>Special</strong>: GM and player work out 'relatively minor' non-retroactive changes.</li>
</ul>
`;
return desc;
}
}

View File

@ -1,272 +0,0 @@
import { BaseSummonEffect } from './summonSupport.js';
export class ZombieEffect extends BaseSummonEffect {
async init() {
await super.init();
this.data.templates = {};
for (let tplName of ['armed_template']) {
if (tplName in this.data.actors) {
this.data.templates[tplName] = await foundry.utils.fromUuid(this.data.actors[tplName].uuid);
}
}
}
get name() {
return 'Zombie';
}
get icon() {
return 'icons/magic/death/hand-dirt-undead-zombie.webp';
}
get duration() {
return 600;
}
get modifiers() {
const mods = super.modifiers;
mods.push(
{
type: 'number',
name: 'Additional Zombies (+1 per zombie)',
id: 'additionalAllies',
value: 0,
default: 0,
epic: false,
effect: false,
},
{
type: 'checkbox',
name: 'Armed (+1 per zombie)',
id: 'armed',
value: 0,
default: false,
epic: false,
effect: false,
},
{
type: 'checkbox',
name: 'Armor (+1 per zombie)',
id: 'armor',
default: false,
value: 0,
epic: false,
effect: true,
icon: 'icons/equipment/chest/breastplate-leather-brown-belted.webp',
changes: [
{
key: 'system.stats.toughness.armor',
value: 2,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
},
],
},
{
type: 'checkbox',
name: 'Skeletal (+1 per zombie)',
value: 0,
id: 'skeletal',
epic: false,
default: false,
effect: true,
icon: 'icons/magic/death/hand-undead-skeleton-fire-pink.webp',
changes: [
{
key: 'system.attributes.agility.die.sides',
value: 2,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
},
{
key: '@Skill{Athletics}[system.die.sides]',
value: 2,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
},
{
key: '@Skill{Fighting}[system.die.sides]',
value: 2,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
},
{
key: '@Skill{Shooting}[system.die.sides]',
value: 2,
priority: 0,
mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,
},
],
},
{
type: 'radio',
name: 'Mind Rider',
id: 'mindRider',
default: 'none',
epic: false,
choices: { none: 'None', single: 'Single', all: 'All' },
values: { none: 0, single: 1, all: 3 },
effects: {
none: null,
single: {
name: 'Mind Rider (single)',
icon: 'icons/magic/control/hypnosis-mesmerism-eye.webp',
changes: [],
description: 'The caster can communicate and sense through the ally.',
},
all: {
name: 'Mind Rider (all)',
icon: 'icons/magic/control/hypnosis-mesmerism-eye.webp',
changes: [],
description: 'The caster can communicate and sense through the ally.',
},
},
},
{
type: 'checkbox',
name: 'Permanent',
id: 'permanent',
default: false,
epic: false,
value: 0,
effect: true,
icon: 'icons/magic/death/skeleton-worn-skull-tan.webp',
changes: [],
description: 'This zombie is permanant until dismissed.',
},
);
return mods;
}
actorValue(actor) {
const size = actor.system.stats.size;
if (size <= -1) {
return 2;
}
return 3 + size;
}
async parseValuesRaise() {
const attrList = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'];
const skillSet = new Set();
for (const skill of this.targetActor.items.filter((i) => i.type === 'skill')) {
skillSet.add(skill.name);
}
const skillList = Array.from(skillSet);
skillList.sort();
const html = `<form><h2>Raise Effect - raise one trait a die type</h2>
<p>All raised zombies will have the chosen trait raised one die type.</p>
<div class="form-group">
<label>Trait: <select name="trait">
<optgroup label="Attributes">
${attrList.map((attr) => `<option value="system.attributes.${attr.toLowerCase()}.die.sides">${attr}</option>`).join('')}
</optgroup>
<optgroup label="Skills">
${skillList.map((skill) => `<option value="@Skill{${skill}}[system.die.sides]">${skill}</option>`).join('')}
</optgroup>
</select>
</label>
</div>
</form>
`;
const formData = await foundry.applications.api.DialogV2.wait({
window: {
title: 'Select trait for raise increase',
icon: 'fa-solid fa-biohazard',
},
content: html,
buttons: [
{
action: 'submit',
label: 'Submit',
callback: (event, button, dialog) => new foundry.applications.ux.FormDataExtended(button.form),
},
{ action: 'cancel', label: 'cancel' },
],
});
const key = formData.object.trait;
this.data.primaryEffectChanges.push({
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: 2,
key,
priority: 0,
});
}
async parseValuesPre() {
await super.parseValuesPre();
this.data.primaryEffectChanges = [];
this.data.actorUpdates = { name: `${this.source.actor.name}'s raised ${this.targetActor.name}` };
this.data.tokenUpdates = { name: `${this.source.name}'s raised ${this.targetActor.name}` };
this.data.embeddedUpdates = {
ActiveEffect: {},
Item: {},
};
if (this.data.armed && this.data.actors['armed_template']) {
const armedTemplate = this.data.actors.armed_template;
for (const item of armedTemplate.items) {
const armedItemDoc = armedTemplate.getEmbeddedDocument('Item', item.id);
this.data.embeddedUpdates.Item[item.name] = armedItemDoc;
}
}
if (this.data.raise) {
await this.parseValuesRaise();
}
}
get summonCount() {
return 1 + this.data.additionalAllies;
}
getPrimaryEffectChanges() {
return [...super.getPrimaryEffectChanges(), ...this.data.primaryEffectChanges];
}
get powerPoints() {
const basicZombieNames = ['zombie', 'human zombie', 'zombie, human'];
let total = super.powerPoints;
const base = this.actorValue(this.targetActor);
let additional = basicZombieNames.includes(this.targetActor.name.toLowerCase())
? 1
: Math.max(1, Math.ceil(base / 2));
total += (this.summonCount - 1) * additional;
const mods = [this.data.armed, this.data.armor, this.data.skeletal];
total += mods.map((v) => (v ? 1 : 0)).reduce((a, b) => a + b) * this.summonCount;
return total;
}
get spawnUpdates() {
const updates = super.spawnUpdates;
foundry.utils.mergeObject(updates.actor, this.data.actorUpdates);
foundry.utils.mergeObject(updates.token, this.data.tokenUpdates);
foundry.utils.mergeObject(updates.embedded, this.data.embeddedUpdates);
return updates;
}
get description() {
let desc = super.description;
const summonCount = this.summonCount;
const plural = summonCount > 1 ? 's' : '';
desc += `<p>Summon ${summonCount} ${this.targetActor.name}${plural}.
`;
if (this.data.armed || this.data.armor) {
desc += `The zombie${plural} are `;
if (this.data.armed) {
desc += 'armed ';
}
if (this.data.armed && this.data.armor) {
desc += 'and ';
}
if (this.data.armor) {
desc += 'armored ';
}
desc += 'with rotting but working equipment. ';
}
if (this.data.skeletal) {
desc += `These particlar zombies have shed the bulk of their flesh, becoming
stronger but more skeletal in the process.`;
}
desc += '</p>';
return desc;
}
}

View File

@ -1,4 +1,4 @@
const _templatePaths = ['dialogHeader.html', 'powerDialog.html', 'summonCosts.html'];
const _templatePaths = ['powerDialog.html'];
export async function preloadTemplates() {
return loadTemplates(_templatePaths.map((f) => `modules/swade-mb-helpers/templates/${f}`));

View File

@ -1,152 +1,67 @@
import { log } from './globals.js';
function targetHasEffect(target, effectName) {
return target.actor.effects.filter((e) => !e.disabled && e.name.toLowerCase().includes(effectName)).length > 0;
}
function hasDeflection(target, type) {
return (
target.actor.effects.filter(
(e) => !e.disabled && e.name.toLowerCase().includes('deflection') && e.name.toLowerCase().includes(type),
).length > 0
);
}
function getEdgeToEdgeDistance(tokenA, tokenB) {
const scene = tokenA.parent;
if (!scene) return 0;
const conversionFactor = scene.grid.distance / scene.grid.size;
const combinedRadii = (tokenA?.object?.externalRadius ?? 0) + (tokenB?.object?.externalRadius ?? 0);
const distance = scene.grid.measurePath([tokenA.getCenterPoint(), tokenB.getCenterPoint()]).distance;
return distance - combinedRadii * conversionFactor;
}
function calcGangupBonus(sourceToken, targetToken) {
const targetActor = targetToken.actor;
const sourceActor = sourceToken.actor;
const scene = targetToken.parent;
const ignoreStatuses = ['defeated', 'incapacitated', 'stunned'];
const attackerAllies = scene.tokens.filter((t) => {
if (t.disposition !== sourceToken.disposition) return false;
if (ignoreStatuses.some((status) => t.hasStatusEffect(status))) return false;
return getEdgeToEdgeDistance(targetToken, t) < 1;
});
let formationFighterBonus = attackerAllies.filter((t) =>
t.actor.getSingleItemBySwid('formation-fighter', 'edge'),
).length;
if (sourceActor.getSingleItemBySwid('formation-fighter', 'edge')) {
formationFighterBonus++;
export async function preTraitRollModifiers(actor, trait, roll, modifiers, options) {
const targets = Array.from(game.user.targets);
const token = game.canvas.tokens.controlled.length > 0 ? game.canvas.tokens.controlled[0] : null;
if (targets.some((target) => target.actor.system.status.isVulnerable)) {
modifiers.push({ label: 'Target is Vulnerable', value: '+2', ignore: false });
}
let numAttackerAllies = attackerAllies.length;
const numDefenderAllies = scene.tokens.filter((t) => {
if (t.disposition !== targetToken.disposition) return false;
if (ignoreStatuses.some((status) => t.hasStatusEffect(status))) return false;
if (getEdgeToEdgeDistance(targetToken, t) >= 1) return false;
return getEdgeToEdgeDistance(sourceToken, t) < 1;
}).length;
if (numAttackerAllies > 0) {
numAttackerAllies += formationFighterBonus;
if (
targets.some(
(target) =>
target.actor.effects.filter((e) => !e.disabled && e.name.toLowerCase().includes('deflection')).length > 0,
)
) {
modifiers.push({ label: 'Target has Deflection', value: '-2', ignore: false });
}
let gangUpBonus = Math.min(4, numAttackerAllies - numDefenderAllies);
if (targetActor?.getSingleItemBySwid('improved-block', 'edge')) {
gangUpBonus -= 2;
} else if (targetActor?.getSingleItemBySwid('block', 'edge')) {
gangUpBonus -= 1;
}
return gangUpBonus;
}
export async function preAttackRollModifiers(
sourceToken,
targetToken,
skill,
item,
isRangedAttack,
isMeleeAttack,
additionalMods,
bestNonStackingMods,
) {
log('preAttackRollModifiers');
log('sourceToken', sourceToken);
log('targetToken', targetToken);
log('skill', skill);
log('item', item);
log('additionalMods', additionalMods);
log('bestNonStackingMods', bestNonStackingMods);
log('isRangedAttack', isRangedAttack, 'isMeleeAttack', isMeleeAttack);
// Deflection
if (isMeleeAttack && hasDeflection(targetToken, 'melee')) {
additionalMods.push({ label: 'Target has melee deflection', value: -2 });
}
if (isMeleeAttack && hasDeflection(targetToken, 'range')) {
additionalMods.push({ label: 'Target has ranged deflection', value: -2 });
}
if (hasDeflection(targetToken, 'all')) {
additionalMods.push({ label: 'Target has deflection', value: -2 });
}
// Glow/Shroud
if (targetHasEffect(targetToken, 'glow')) {
additionalMods.push({
if (
targets.some(
(target) => target.actor.effects.filter((e) => !e.disabled && e.name.toLowerCase().includes('glow')).length > 0,
)
) {
modifiers.push({
label: 'Glowing target (negate 1 point of illumination penalty)',
value: 1,
value: '+1',
ignore: true,
});
}
if (targetHasEffect(targetToken, 'shroud')) {
additionalMods.push({
if (
targets.some(
(target) => target.actor.effects.filter((e) => !e.disabled && e.name.toLowerCase().includes('shroud')).length > 0,
)
) {
modifiers.push({
label: 'Shrouded target',
value: '-1',
ignore: false,
});
}
// Swat correction
const scaleMod = additionalMods.find((m) => m.label === 'SWADE.ScaleDifference');
if (scaleMod && scaleMod.value < 0 && sourceToken.actor.getSingleItemBySwid('swat', 'ability')) {
const swatMod = Math.min(4, scaleMod.value * -1);
if (swatMod > 0) {
additionalMods.push({
label: 'Using Swat attack',
value: swatMod,
ignore: true,
});
}
}
// Gang Up correction
if (isMeleeAttack) {
const gangUpBonus = calcGangupBonus(sourceToken, targetToken);
const gangUpModIndex = additionalMods.findIndex((m) => m.label === 'SWADE.GangUp');
if (gangUpModIndex > -1) {
additionalMods.splice(gangUpModIndex, 1);
}
if (gangUpBonus && gangUpBonus > 0) {
additionalMods.push({
label: 'SWADE.GangUp',
value: gangUpBonus,
});
}
}
}
// eslint-disable-next-line no-unused-vars
export async function preTraitRollModifiers(actor, trait, roll, modifiers, options) {
const targets = Array.from(game.user.targets);
const token = game.canvas.tokens.controlled.length > 0 ? game.canvas.tokens.controlled[0]?.document : null;
if (targets.length === 1 && token) {
const target = targets[0];
_addArcaneModifiers(target, modifiers);
_addRangeModifiers(token, target, options, modifiers);
const scaleMod = calcScaleMod(token, target);
if (scaleMod !== 0) {
modifiers.push({ label: 'Scale', value: scaleMod, ignore: false });
}
if (target.actor.items.find((e) => e.type === 'edge' && e.system.swid === 'dodge')) {
modifiers.push({ label: 'Dodge', value: -2, ignore: true });
}
if (trait?.type === 'skill' && trait?.system?.swid === 'fighting') {
const gangUpBonus = calcGangup(token, target);
if (gangUpBonus > 0) {
modifiers.push({ label: 'Gang Up', value: gangUpBonus, ignore: false });
}
}
}
}
// eslint-disable-next-line no-unused-vars
export async function preDamageRollModifiers(actor, item, roll, modifiers, options) {
const targets = Array.from(game.user.targets);
const token = game.canvas.tokens.controlled.length > 0 ? game.canvas.tokens.controlled[0].document : null;
const token = game.canvas.tokens.controlled.length > 0 ? game.canvas.tokens.controlled[0] : null;
if (targets.length === 1 && token) {
const target = targets[0].scene.tokens.get(targets[0].id);
const target = targets[0];
_addArcaneModifiers(target, modifiers);
const weaknesses = target.actor.items.filter(
(i) => i.type === 'ability' && i.system.swid.toLowerCase().includes('environmental-weakness'),
@ -168,8 +83,8 @@ export async function preDamageRollModifiers(actor, item, roll, modifiers, optio
}),
);
}
if (token.actor.getSingleItemBySwid('pack-tactics', 'ability')) {
const gangupBonus = calcGangupBonus(token, target);
if (_findItem(token.actor, 'ability', 'pack-tactics')) {
const gangupBonus = calcGangup(token, target);
if (gangupBonus > 0) {
modifiers.push({ label: 'Gang Up (Pack Tactics)', value: gangupBonus, ignore: false });
}
@ -177,11 +92,36 @@ export async function preDamageRollModifiers(actor, item, roll, modifiers, optio
}
}
export async function getPowerModifiers(token) {
const modifiers = [];
_addArcaneModifiers(token, modifiers);
return modifiers;
}
function _addRangeModifiers(token, target, options, modifiers) {
if (options?.item?.type !== 'weapon' || !options?.item?.system?.range.includes('/')) {
return;
}
const ranges = options.item.system.range.split('/').map((x) => parseInt(x));
const distance = getDistance(token, target);
const rollmods = CONFIG.SWADE.prototypeRollGroups.find((g) => g.name === 'Range').modifiers;
log('ITEM RANGES:', ranges);
if (distance <= ranges[0]) {
// nothing here
} else if (ranges.length >= 2 && distance <= ranges[1]) {
modifiers.push(rollmods[0]);
} else if (ranges.length >= 3 && distance <= ranges[2]) {
modifiers.push(rollmods[1]);
} else {
modifiers.push(rollmods[2]); // extreme range
}
}
function _addArcaneModifiers(target, modifiers) {
if (target.actor.getSingleItemBySwid('improved-arcane-resistance', 'edge')) {
modifiers.push({ label: 'Arcane Resistance', value: -4, ignore: true });
} else if (target.actor.getSingleItemBySwid('arcane-resistance', 'edge')) {
modifiers.push({ label: 'Arcane Resistance', value: -2, ignore: true });
if (_findItem(target.actor, 'edge', 'improved-arcane-resistance')) {
modifiers.push({ label: 'Arcane Resistance', value: '-4', ignore: true });
} else if (_findItem(target.actor, 'edge', 'arcane-resistance')) {
modifiers.push({ label: 'Arcane Resistance', value: '-2', ignore: true });
}
const effect = target.actor.effects.find((e) => !e.disabled && e.name.toLowerCase().includes('arcane protection'));
if (effect) {
@ -190,3 +130,81 @@ function _addArcaneModifiers(target, modifiers) {
modifiers.push({ label: 'Target Arcane Protection', value: effectMod, ignore: true });
}
}
function getScaleDistanceMod(token) {
const scale = token.actor.system.stats.scale;
return scale > 0 ? scale / 2 : 0;
}
function getDistance(origin, target) {
const ray = new Ray(origin, target);
const originScale = getScaleDistanceMod(origin);
const targetScale = getScaleDistanceMod(target);
const flatDistance = game.canvas.grid.measureDistances([{ ray }], { gridSpaces: true })[0];
const elevation = Math.abs(origin.document.elevation - target.document.elevation);
const distance = Math.sqrt(elevation * elevation + flatDistance * flatDistance);
return distance - (originScale + targetScale);
}
function withinRange(origin, target, range) {
const distance = getDistance(origin, target);
return range >= distance;
}
function _findItem(actor, type, swid) {
return actor.items.find((i) => i.type === type && i.system.swid === swid);
}
function calcScaleMod(attacker, target) {
const attackerScale = attacker.actor.system.stats.scale;
const targetScale = target.actor.system.stats.scale;
const attackerHasSwat = !!_findItem(attacker.actor, 'ability', 'swat');
let modifier = targetScale - attackerScale;
if (attackerHasSwat && modifier < 0) {
modifier = Math.min(modifier + 4, 0);
}
return modifier;
}
function calcGangup(attacker, target, debug) {
debug = typeof debug === 'undefined' ? false : debug;
const range = 1.2;
let modifier = 0;
if (_findItem(target.actor, 'edge', 'improved-block')) {
modifier = -2;
} else if (_findItem(target.actor, 'edge', 'block')) {
modifier = -1;
}
const attackerHasFormationFighter = !!_findItem(attacker.actor, 'edge', 'formation-fighter');
const withinRangeOfToken = game.canvas.tokens.placeables.filter(
(t) =>
t.id !== attacker.id &&
t.id !== target.id &&
t.actor.system.status.isStunned === false &&
t.visible &&
withinRange(target, t, range) &&
!t.actor.effects.find((c) => c.name === 'Incapacitated' || c.name === 'Defeated'),
);
const attackerAllies = withinRangeOfToken.filter((t) => t.document.disposition === attacker.document.disposition);
const targetAllies = withinRangeOfToken.filter(
(t) => t.document.disposition === target.document.disposition && withinRange(attacker, t, range),
);
const attackersWithFormationFighter = attackerAllies.filter((t) => !!_findItem(t.actor, 'edge', 'formation-fighter'));
const attackerCount = attackerAllies.length;
const attackerFormationBonus =
(attackerCount > 0 && attackerHasFormationFighter ? 1 : 0) + attackersWithFormationFighter.length;
const defenderCount = targetAllies.length;
const gangUp = Math.max(0, Math.min(4, attackerCount + attackerFormationBonus - defenderCount + modifier));
if (debug) {
log('GANG UP | Attacker:', attacker);
log('GANG UP | Target:', target);
log('GANG UP | Others within range:', withinRangeOfToken);
log('GANG UP | Attacker Allies:', attackerCount);
log('GANG UP | Attacker Formation Bonus:', attackerFormationBonus);
log('GANG UP | Effective Defender Allies:', defenderCount);
log('GANG UP | Target Block Modifier:', modifier);
log('GANG UP | Total Bonus:', gangUp);
}
return gangUp;
}

View File

@ -1,20 +1,7 @@
import { moduleHelpers, settingKeys, log } from './globals.js';
// SPDX-FileCopyrightText: 2022 Johannes Loher
//
// SPDX-License-Identifier: MIT
export function registerSettings() {
const choices = {};
const packs = game.packs.filter((p) => p.documentName === 'Actor');
for (const pack of packs) {
choices[pack.metadata.id] = pack.metadata.label;
}
log('found packs', packs);
log('found choices', choices);
moduleHelpers.registerSetting(settingKeys.powerActorsCompendium, {
name: 'mbhelpers.settings.powerActorsCompendiumName',
hint: 'mbhelpers.settings.powerActorsCompendiumHint',
scope: 'world',
config: true,
choices,
requiresReload: false,
type: String,
});
// Register any custom module settings here
}

View File

@ -4,21 +4,10 @@ import { registerSettings } from './settings.js';
import { preloadTemplates } from './preloadTemplates.js';
import { api } from './api.js';
import { initVisionModes } from './visionModes.js';
import {
addActiveEffectsToToken,
addItemsToToken,
deleteActiveEffectsFromToken,
deleteItemsFromActor,
deleteToken,
requestTokenRoll,
SwadeVAEbuttons,
updateOwnedToken,
} from './helpers.js';
import { preAttackRollModifiers, preDamageRollModifiers, preTraitRollModifiers } from './rollHelpers.js';
import { requestTokenRoll, addActiveEffectsToToken, deleteActiveEffectsFromToken } from './helpers.js';
import { preDamageRollModifiers, preTraitRollModifiers } from './rollHelpers.js';
import { log, moduleHelpers } from './globals.js';
import { powerEffectManagementHook, visualActiveEffectPowerButtons } from './powers/powers.js';
import { embeddedHelperHook } from './powers/basePowers.js';
import { shapeChangeTokenDeleteHandler } from './powers/shapeChange.js';
import { powerEffectManagementHook } from './powers/powers.js';
// Initialize module
Hooks.once('init', async () => {
@ -26,6 +15,9 @@ Hooks.once('init', async () => {
initVisionModes();
// Assign custom classes and constants here
// Register custom module settings
registerSettings();
// Preload Handlebars templates
await preloadTemplates();
});
@ -33,11 +25,10 @@ Hooks.once('init', async () => {
// Setup module
Hooks.once('setup', async () => {
api.registerFunctions();
// Register custom module settings
registerSettings();
});
Hooks.once('ready', async () => {
_checkModule('warpgate');
_checkModule('socketlib');
log('Initialized SWADE MB Helpers');
});
@ -50,24 +41,15 @@ function _checkModule(name) {
}
}
Hooks.on('preCreateItem', embeddedHelperHook);
Hooks.on('swadePreRollAttribute', preTraitRollModifiers);
Hooks.on('swadePreRollSkill', preTraitRollModifiers);
Hooks.on('swadeCalculateDefaultAttackMods', preAttackRollModifiers);
Hooks.on('swadeRollDamage', preDamageRollModifiers);
Hooks.on('deleteActiveEffect', powerEffectManagementHook);
Hooks.on('deleteToken', shapeChangeTokenDeleteHandler);
Hooks.on('visual-active-effects.createEffectButtons', visualActiveEffectPowerButtons);
Hooks.on('visual-active-effects.createEffectButtons', SwadeVAEbuttons);
Hooks.once('socketlib.ready', () => {
const _socket = socketlib.registerModule('swade-mb-helpers');
_socket.register('requestTokenRoll', requestTokenRoll);
_socket.register('updateOwnedToken', updateOwnedToken);
_socket.register('deleteToken', deleteToken);
_socket.register('addActiveEffectsToToken', addActiveEffectsToToken);
_socket.register('deleteActiveEffectsFromToken', deleteActiveEffectsFromToken);
_socket.register('addItemsToToken', addItemsToToken);
_socket.register('deleteItemsFromActor', deleteItemsFromActor);
moduleHelpers._socket = _socket;
});

View File

@ -67,7 +67,7 @@ export function initVisionModes() {
},
vision: {
darkness: { adaptive: false },
defaults: { attenuation: 0.3, contrast: -0.25, saturation: 0.75, brightness: 0.5 },
defaults: { attenuation: 0.3, contrast: -0.5, saturation: 0.75, brightness: 0.5 },
preferred: false,
},
});

Binary file not shown.

View File

@ -1,5 +1,5 @@
2025/12/13-10:56:36.890974 789368bf9640 Delete type=3 #1
2025/12/13-10:56:36.893164 789342bff640 Level-0 table #5: started
2025/12/13-10:56:36.895680 789342bff640 Level-0 table #5: 19401 bytes OK
2025/12/13-10:56:36.897643 789342bff640 Delete type=0 #3
2025/12/13-10:56:36.897764 789342bff640 Manual compaction at level-0 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items.effects!RC1Nz6iph8wPPK1B.g9W5hJisq3MsCpZW' @ 0 : 0; will stop at (end)
2024/05/11-22:30:06.794747 7f284b7fe700 Delete type=3 #1
2024/05/11-22:30:06.796933 7f284a7fc700 Level-0 table #5: started
2024/05/11-22:30:06.799703 7f284a7fc700 Level-0 table #5: 17097 bytes OK
2024/05/11-22:30:06.802321 7f284a7fc700 Delete type=0 #3
2024/05/11-22:30:06.802396 7f284a7fc700 Manual compaction at level-0 from '!folders!0nDRFmMBs5DBJU9M' @ 72057594037927935 : 1 .. '!items.effects!RC1Nz6iph8wPPK1B.g9W5hJisq3MsCpZW' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1,5 +1,5 @@
2025/12/13-10:56:37.002991 77a3f17bd640 Delete type=3 #1
2025/12/13-10:56:37.005092 77a3d3fff640 Level-0 table #5: started
2025/12/13-10:56:37.007369 77a3d3fff640 Level-0 table #5: 6870 bytes OK
2025/12/13-10:56:37.009363 77a3d3fff640 Delete type=0 #3
2025/12/13-10:56:37.009463 77a3d3fff640 Manual compaction at level-0 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end)
2024/05/11-22:30:06.919608 7f7785fbc700 Delete type=3 #1
2024/05/11-22:30:06.921651 7f7785540700 Level-0 table #5: started
2024/05/11-22:30:06.924491 7f7785540700 Level-0 table #5: 6787 bytes OK
2024/05/11-22:30:06.927162 7f7785540700 Delete type=0 #3
2024/05/11-22:30:06.927239 7f7785540700 Manual compaction at level-0 from '!items!JWyBQe4tnOYljFAF' @ 72057594037927935 : 1 .. '!items!tWWSfEMmLmws6Yb1' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,5 @@
2025/12/13-10:56:37.145827 783f797bd640 Delete type=3 #1
2025/12/13-10:56:37.147790 783f5bfff640 Level-0 table #5: started
2025/12/13-10:56:37.150066 783f5bfff640 Level-0 table #5: 2017 bytes OK
2025/12/13-10:56:37.152111 783f5bfff640 Delete type=0 #3
2025/12/13-10:56:37.152211 783f5bfff640 Manual compaction at level-0 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end)
2024/05/11-22:30:07.047674 7ff91d7bd700 Delete type=3 #1
2024/05/11-22:30:07.050100 7ff67ffff700 Level-0 table #5: started
2024/05/11-22:30:07.052851 7ff67ffff700 Level-0 table #5: 1751 bytes OK
2024/05/11-22:30:07.055441 7ff67ffff700 Delete type=0 #3
2024/05/11-22:30:07.055515 7ff67ffff700 Manual compaction at level-0 from '!actors!U5v4gFHquo0Y1SAq' @ 72057594037927935 : 1 .. '!actors!U5v4gFHquo0Y1SAq' @ 0 : 0; will stop at (end)

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More