From fae05c24a8bbd1f8d921f596e8a438b5708b5e30 Mon Sep 17 00:00:00 2001
From: WBHarry <89362246+WBHarry@users.noreply.github.com>
Date: Thu, 23 Apr 2026 00:22:08 +0200
Subject: [PATCH 001/134] 1794 - Include Item Damage (#1827)
* Went ahead and made IncludeItemDamage work again, smashing the formulas together
* .
* Lint fix
---
lang/en.json | 5 +-
.../dialogs/actionSelectionDialog.mjs | 4 +-
.../sheets-configs/action-base-config.mjs | 4 +-
module/data/action/attackAction.mjs | 28 ++++----
templates/actionTypes/damage.hbs | 66 +++++++++----------
5 files changed, 52 insertions(+), 55 deletions(-)
diff --git a/lang/en.json b/lang/en.json
index 2efd6d7b..99a75f83 100755
--- a/lang/en.json
+++ b/lang/en.json
@@ -119,8 +119,7 @@
"deleteTriggerContent": "Are you sure you want to delete the {trigger} trigger?",
"advantageState": "Advantage State",
"damageOnSave": "Damage on Save",
- "useDefaultItemValues": "Use default Item values",
- "itemDamageIsUsed": "Item Damage Is Used"
+ "useDefaultItemValues": "Use default Item values"
},
"RollField": {
"diceRolling": {
@@ -135,7 +134,7 @@
"attackModifier": "Attack Modifier",
"attackName": "Attack Name",
"criticalThreshold": "Critical Threshold",
- "includeBase": { "label": "Use Item Damage" },
+ "includeBase": { "label": "Include Item Damage" },
"groupAttack": { "label": "Group Attack" },
"multiplier": "Multiplier",
"saveHint": "Set a default Trait to enable Reaction Roll. It can be changed later in Reaction Roll Dialog.",
diff --git a/module/applications/dialogs/actionSelectionDialog.mjs b/module/applications/dialogs/actionSelectionDialog.mjs
index 995c4894..6123c970 100644
--- a/module/applications/dialogs/actionSelectionDialog.mjs
+++ b/module/applications/dialogs/actionSelectionDialog.mjs
@@ -72,8 +72,8 @@ export default class ActionSelectionDialog extends HandlebarsApplicationMixin(Ap
static async #onChooseAction(event, button) {
const { actionId } = button.dataset;
- this.action = this.item.system.actionsList.find(a => a._id === actionId);
- Object.defineProperty(this.event, 'shiftKey', {
+ this.#action = this.item.system.actionsList.find(a => a._id === actionId);
+ Object.defineProperty(this.#event, 'shiftKey', {
get() {
return event.shiftKey;
}
diff --git a/module/applications/sheets-configs/action-base-config.mjs b/module/applications/sheets-configs/action-base-config.mjs
index a94abb26..7406b084 100644
--- a/module/applications/sheets-configs/action-base-config.mjs
+++ b/module/applications/sheets-configs/action-base-config.mjs
@@ -156,7 +156,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2)
context.openSection = this.openSection;
context.tabs = this._getTabs(this.constructor.TABS);
context.config = CONFIG.DH;
- if (this.action.hasDamage) {
+ if (this.action.damage) {
context.allDamageTypesUsed = !getUnusedDamageTypes(this.action.damage.parts).length;
if (this.action.damage.hasOwnProperty('includeBase') && this.action.type === 'attack')
@@ -302,7 +302,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2)
static addDamage(_event) {
if (!this.action.damage.parts) return;
- const choices = getUnusedDamageTypes(this.action.damage.parts);
+ const choices = getUnusedDamageTypes(this.action._source.damage.parts);
const content = new foundry.data.fields.StringField({
label: game.i18n.localize('Damage Type'),
choices,
diff --git a/module/data/action/attackAction.mjs b/module/data/action/attackAction.mjs
index 15cc1696..c4d07c25 100644
--- a/module/data/action/attackAction.mjs
+++ b/module/data/action/attackAction.mjs
@@ -1,4 +1,3 @@
-import { DHDamageData } from '../fields/action/damageField.mjs';
import DHDamageAction from './damageAction.mjs';
export default class DHAttackAction extends DHDamageAction {
@@ -12,8 +11,19 @@ export default class DHAttackAction extends DHDamageAction {
super.prepareData();
if (!!this.item?.system?.attack) {
if (this.damage.includeBase) {
- const baseDamage = this.getParentDamage();
- this.damage.parts.hitPoints = new DHDamageData(baseDamage);
+ const baseDamage = this.getParentHitPointDamage();
+ if (baseDamage) {
+ if (!this.damage.parts.hitPoints) {
+ this.damage.parts.hitPoints = baseDamage;
+ } else {
+ for (const type of baseDamage.type) this.damage.parts.hitPoints.type.add(type);
+
+ this.damage.parts.hitPoints.value.custom = {
+ enabled: true,
+ formula: `${baseDamage.value.getFormula()} + ${this.damage.parts.hitPoints.value.getFormula()}`
+ };
+ }
+ }
}
if (this.roll.useDefault) {
this.roll.trait = this.item.system.attack.roll.trait;
@@ -22,16 +32,8 @@ export default class DHAttackAction extends DHDamageAction {
}
}
- getParentDamage() {
- return {
- value: {
- multiplier: 'prof',
- dice: this.item?.system?.attack.damage.parts.hitPoints.value.dice,
- bonus: this.item?.system?.attack.damage.parts.hitPoints.value.bonus ?? 0
- },
- type: this.item?.system?.attack.damage.parts.hitPoints.type,
- base: true
- };
+ getParentHitPointDamage() {
+ return this.item?.system?.attack.damage.parts.hitPoints;
}
get damageFormula() {
diff --git a/templates/actionTypes/damage.hbs b/templates/actionTypes/damage.hbs
index 454d0413..03300840 100644
--- a/templates/actionTypes/damage.hbs
+++ b/templates/actionTypes/damage.hbs
@@ -31,44 +31,40 @@
{{/unless}}
- {{#unless (and @root.source.damage.includeBase (eq key 'hitPoints'))}}
- {{#if (and (not @root.isNPC) @root.hasRoll (not dmg.base))}}
- {{formField ../fields.resultBased value=dmg.resultBased name=(concat "damage.parts." dmg.applyTo ".resultBased") localize=true classes="checkbox"}}
- {{/if}}
- {{#if (and (not @root.isNPC) @root.hasRoll (not dmg.base) dmg.resultBased)}}
-
-
- {{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.hope")}}
- {{> formula fields=../fields.value.fields type=../fields.type dmg=dmg source=dmg.value target="value" key=dmg.applyTo path=../path}}
-
-
- {{localize "DAGGERHEART.GENERAL.withThing" thing=(localize "DAGGERHEART.GENERAL.fear")}}
- {{> formula fields=../fields.valueAlt.fields type=../fields.type dmg=dmg source=dmg.valueAlt target="valueAlt" key=dmg.applyTo path=../path}}
-
-
- {{else}}
- {{> formula fields=../fields.value.fields type=../fields.type dmg=dmg source=dmg.value target="value" key=dmg.applyTo path=../path}}
- {{/if}}
-
- {{#if (and (eq dmg.applyTo 'hitPoints') (ne @root.source.type 'healing'))}}
- {{formField ../fields.type value=dmg.type name=(concat ../path "damage.parts." dmg.applyTo ".type") localize=true}}
- {{/if}}
-
- {{#if ../horde}}
+ {{#if (and (not @root.isNPC) @root.hasRoll (not dmg.base))}}
+ {{formField ../fields.resultBased value=dmg.resultBased name=(concat "damage.parts." dmg.applyTo ".resultBased") localize=true classes="checkbox"}}
+ {{/if}}
+ {{#if (and (not @root.isNPC) @root.hasRoll (not dmg.base) dmg.resultBased)}}
+
{{else}}
- {{localize "DAGGERHEART.ACTIONS.Config.itemDamageIsUsed"}}
- {{/unless}}
+ {{> formula fields=../fields.value.fields type=../fields.type dmg=dmg source=dmg.value target="value" key=dmg.applyTo path=../path}}
+ {{/if}}
+
+ {{#if (and (eq dmg.applyTo 'hitPoints') (ne @root.source.type 'healing'))}}
+ {{formField ../fields.type value=dmg.type name=(concat ../path "damage.parts." dmg.applyTo ".type") localize=true}}
+ {{/if}}
+
+ {{#if ../horde}}
+
+ {{localize "DAGGERHEART.ACTORS.Adversary.hordeDamage"}}
+
+
+ {{formField ../fields.valueAlt.fields.flatMultiplier value=dmg.valueAlt.flatMultiplier name=(concat ../path "damage.parts." dmg.applyTo ".valueAlt.flatMultiplier") label="DAGGERHEART.ACTIONS.Settings.multiplier" classes="inline-child" localize=true }}
+ {{formField ../fields.valueAlt.fields.dice value=dmg.valueAlt.dice name=(concat ../path "damage.parts." dmg.applyTo ".valueAlt.dice") classes="inline-child" localize=true}}
+ {{formField ../fields.valueAlt.fields.bonus value=dmg.valueAlt.bonus name=(concat ../path "damage.parts." dmg.applyTo ".valueAlt.bonus") localize=true classes="inline-child"}}
+
+
+ {{/if}}
+
{{/each}}
From 276aee4747005a83fc3909fc08dc8036ac05e9ef Mon Sep 17 00:00:00 2001
From: WBHarry
Date: Thu, 23 Apr 2026 00:38:55 +0200
Subject: [PATCH 002/134] Corrected fireball to be two different actions, one
for the casting and one for the explosion
---
...inCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json | 128 +++++++++++++-----
1 file changed, 96 insertions(+), 32 deletions(-)
diff --git a/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json b/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json
index f32f380a..78028bab 100644
--- a/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json
+++ b/src/packs/domains/domainCard_Book_of_Norai_WtwSWXTRZa7QVvmo.json
@@ -91,7 +91,7 @@
"type": "attack",
"_id": "GI2VkIcGDOjFRxpT",
"systemPath": "actions",
- "description": "Make a Spellcast Roll against a target within Very Far range. On a success, hurl a sphere of fire toward them that explodes on impact. The target and all creatures within Very Close range of them must make a Reaction Roll (13). Targets who fail take d20+5 magic damage using your Proficiency. Targets who succeed take half damage.
@Template[type:emanation|range:vc]
",
+ "description": "Make a Spellcast Roll against a target within Very Far range. On a success, hurl a sphere of fire toward them that explodes on impact.
",
"chatDisplay": true,
"actionType": "action",
"cost": [],
@@ -101,34 +101,7 @@
"recovery": null
},
"damage": {
- "parts": {
- "hitPoints": {
- "resultBased": false,
- "value": {
- "custom": {
- "enabled": false
- },
- "multiplier": "prof",
- "dice": "d20",
- "bonus": 5,
- "flatMultiplier": 1
- },
- "applyTo": "hitPoints",
- "type": [
- "magical"
- ],
- "base": false,
- "valueAlt": {
- "multiplier": "prof",
- "flatMultiplier": 1,
- "dice": "d6",
- "bonus": null,
- "custom": {
- "enabled": false
- }
- }
- }
- },
+ "parts": {},
"includeBase": false
},
"target": {
@@ -151,14 +124,105 @@
},
"useDefault": false
},
+ "save": {
+ "trait": null,
+ "difficulty": 13,
+ "damageMod": "half"
+ },
+ "name": "Fireball - Cast",
+ "img": "icons/magic/fire/explosion-fireball-large-red-orange.webp",
+ "range": "veryFar"
+ },
+ "HJ749c2a8WTjkSHY": {
+ "type": "attack",
+ "_id": "HJ749c2a8WTjkSHY",
+ "systemPath": "actions",
+ "baseAction": false,
+ "description": "The target and all creatures within Very Close range of them must make a Reaction Roll (13). Targets who fail take d20+5 magic damage using your Proficiency. Targets who succeed take half damage.
",
+ "chatDisplay": true,
+ "originItem": {
+ "type": "itemCollection"
+ },
+ "actionType": "action",
+ "triggers": [],
+ "areas": [
+ {
+ "name": "Fireball",
+ "type": "placed",
+ "shape": "emanation",
+ "size": "veryClose",
+ "effects": []
+ }
+ ],
+ "cost": [],
+ "uses": {
+ "value": null,
+ "max": "",
+ "recovery": null,
+ "consumeOnSuccess": false
+ },
+ "damage": {
+ "parts": {
+ "hitPoints": {
+ "applyTo": "hitPoints",
+ "resultBased": false,
+ "value": {
+ "multiplier": "prof",
+ "flatMultiplier": 1,
+ "dice": "d20",
+ "bonus": 5,
+ "custom": {
+ "enabled": false,
+ "formula": ""
+ }
+ },
+ "valueAlt": {
+ "multiplier": "flat",
+ "flatMultiplier": 1,
+ "dice": "d6",
+ "bonus": null,
+ "custom": {
+ "enabled": false,
+ "formula": ""
+ }
+ },
+ "base": false,
+ "type": [
+ "magical"
+ ]
+ }
+ },
+ "includeBase": false,
+ "direct": false
+ },
+ "target": {
+ "type": "any",
+ "amount": null
+ },
+ "effects": [],
+ "roll": {
+ "type": null,
+ "trait": null,
+ "difficulty": null,
+ "bonus": null,
+ "advState": "neutral",
+ "diceRolling": {
+ "multiplier": "prof",
+ "flatMultiplier": 1,
+ "dice": "d6",
+ "compare": null,
+ "treshold": null
+ },
+ "useDefault": false
+ },
"save": {
"trait": "agility",
"difficulty": 13,
"damageMod": "half"
},
- "name": "Fireball",
- "img": "icons/magic/fire/explosion-fireball-large-red-orange.webp",
- "range": "veryFar"
+ "name": "Fireball - Explosion",
+ "range": "",
+ "img": "icons/magic/fire/explosion-fireball-large-red-orange.webp"
}
},
"attribution": {
From d73760fc39858154cf4bcc05397c85b56e8851c8 Mon Sep 17 00:00:00 2001
From: WBHarry
Date: Thu, 23 Apr 2026 17:14:46 +0200
Subject: [PATCH 003/134] Raised version
---
system.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/system.json b/system.json
index babdde26..6751f957 100644
--- a/system.json
+++ b/system.json
@@ -2,7 +2,7 @@
"id": "daggerheart",
"title": "Daggerheart",
"description": "An unofficial implementation of the Daggerheart system",
- "version": "2.1.2",
+ "version": "2.2.0",
"compatibility": {
"minimum": "14.359",
"verified": "14.360",
@@ -10,7 +10,7 @@
},
"url": "https://github.com/Foundryborne/daggerheart",
"manifest": "https://raw.githubusercontent.com/Foundryborne/daggerheart/v14/system.json",
- "download": "https://github.com/Foundryborne/daggerheart/releases/download/2.1.2/system.zip",
+ "download": "https://github.com/Foundryborne/daggerheart/releases/download/2.2.0/system.zip",
"authors": [
{
"name": "WBHarry"
From 41829bc9d5611f4832fb22109f16f6c2e7a69920 Mon Sep 17 00:00:00 2001
From: WBHarry
Date: Thu, 23 Apr 2026 22:51:54 +0200
Subject: [PATCH 004/134] Fixed so that Homebrew Item Features without effects
don't error out because effects are expected
---
.../applications/sheets-configs/setting-feature-config.mjs | 5 +++--
module/config/itemConfig.mjs | 4 ++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/module/applications/sheets-configs/setting-feature-config.mjs b/module/applications/sheets-configs/setting-feature-config.mjs
index f90bb52f..a5bcc4f9 100644
--- a/module/applications/sheets-configs/setting-feature-config.mjs
+++ b/module/applications/sheets-configs/setting-feature-config.mjs
@@ -188,8 +188,9 @@ export default class SettingFeatureConfig extends HandlebarsApplicationMixin(App
if (type === 'effect') {
const move = foundry.utils.getProperty(this.settings, this.movePath);
for (const action of move.actions) {
- const remainingEffects = action.effects.filter(x => x._id !== id);
- if (action.effects.length !== remainingEffects.length) {
+ const actionEffects = action.effects ?? [];
+ const remainingEffects = actionEffects.filter(x => x._id !== id);
+ if (actionEffects.length !== remainingEffects.length) {
await action.update({
effects: remainingEffects.map(x => {
const { _id, ...rest } = x;
diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs
index a3e785c3..84bbbbdc 100644
--- a/module/config/itemConfig.mjs
+++ b/module/config/itemConfig.mjs
@@ -453,7 +453,7 @@ export const allArmorFeatures = () => {
const feature = homebrewFeatures[key];
const actions = feature.actions.map(action => ({
...action,
- effects: action.effects.map(effect => feature.effects.find(x => x.id === effect._id)),
+ effects: action.effects?.map(effect => feature.effects.find(x => x.id === effect._id))??[],
type: action.type
}));
const actionEffects = actions.flatMap(a => a.effects);
@@ -1407,7 +1407,7 @@ export const allWeaponFeatures = () => {
const actions = feature.actions.map(action => ({
...action,
- effects: action.effects.map(effect => feature.effects.find(x => x.id === effect._id)),
+ effects: action.effects?.map(effect => feature.effects.find(x => x.id === effect._id)) ?? [],
type: action.type
}));
const actionEffects = actions.flatMap(a => a.effects);
From f45b1210c72a36451d59b2d9d916e913bfdb33b1 Mon Sep 17 00:00:00 2001
From: WBHarry
Date: Thu, 23 Apr 2026 23:01:12 +0200
Subject: [PATCH 005/134] Adding so that newly creatd parties default to having
the ownership default be owner
---
module/documents/actor.mjs | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs
index db249033..a1b1f347 100644
--- a/module/documents/actor.mjs
+++ b/module/documents/actor.mjs
@@ -99,7 +99,7 @@ export default class DhpActor extends Actor {
}
// Configure prototype token settings
- if (['character', 'companion', 'party'].includes(this.type))
+ if (['character', 'companion', 'party'].includes(this.type)) {
Object.assign(update, {
prototypeToken: {
sight: { enabled: true },
@@ -107,6 +107,14 @@ export default class DhpActor extends Actor {
disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
}
});
+ }
+
+ if (this.type === 'party') {
+ Object.assign(update, {
+ 'ownership.default': CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER,
+ });
+ }
+
this.updateSource(update);
}
From da11510e02030610a0889c95f39500ba32a2bbf1 Mon Sep 17 00:00:00 2001
From: WBHarry
Date: Fri, 24 Apr 2026 00:28:08 +0200
Subject: [PATCH 006/134] Reverted party auto permission
---
module/config/itemConfig.mjs | 2 +-
module/documents/actor.mjs | 6 ------
2 files changed, 1 insertion(+), 7 deletions(-)
diff --git a/module/config/itemConfig.mjs b/module/config/itemConfig.mjs
index 84bbbbdc..43054ec5 100644
--- a/module/config/itemConfig.mjs
+++ b/module/config/itemConfig.mjs
@@ -453,7 +453,7 @@ export const allArmorFeatures = () => {
const feature = homebrewFeatures[key];
const actions = feature.actions.map(action => ({
...action,
- effects: action.effects?.map(effect => feature.effects.find(x => x.id === effect._id))??[],
+ effects: action.effects?.map(effect => feature.effects.find(x => x.id === effect._id)) ?? [],
type: action.type
}));
const actionEffects = actions.flatMap(a => a.effects);
diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs
index a1b1f347..52150dae 100644
--- a/module/documents/actor.mjs
+++ b/module/documents/actor.mjs
@@ -109,12 +109,6 @@ export default class DhpActor extends Actor {
});
}
- if (this.type === 'party') {
- Object.assign(update, {
- 'ownership.default': CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER,
- });
- }
-
this.updateSource(update);
}
From 84afec31a774c007d6542ee7d4bd7ba39b7061f4 Mon Sep 17 00:00:00 2001
From: Carlos Fernandez
Date: Fri, 24 Apr 2026 14:47:33 -0400
Subject: [PATCH 007/134] [Fix] class domains when setting max domains to null
or 0 (#1832)
* Fix class domains when setting max domains to null or 0
* Convert max loadout to use data prep
---
module/data/actor/character.mjs | 9 +++------
module/data/settings/Homebrew.mjs | 8 +++++++-
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs
index 1bb3560f..32f44df6 100644
--- a/module/data/actor/character.mjs
+++ b/module/data/actor/character.mjs
@@ -410,14 +410,11 @@ export default class DhCharacter extends DhCreature {
}
get loadoutSlot() {
- const loadoutCount = this.domainCards.loadout?.length ?? 0,
- worldSetting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxLoadout,
- max = !worldSetting ? null : worldSetting + this.bonuses.maxLoadout;
-
+ const loadoutCount = this.domainCards.loadout?.length ?? 0;
+ const worldSetting = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxLoadout;
return {
current: loadoutCount,
- available: !max ? true : Math.max(max - loadoutCount, 0),
- max
+ available: loadoutCount < worldSetting
};
}
diff --git a/module/data/settings/Homebrew.mjs b/module/data/settings/Homebrew.mjs
index d4b7b03f..b5e02675 100644
--- a/module/data/settings/Homebrew.mjs
+++ b/module/data/settings/Homebrew.mjs
@@ -54,7 +54,7 @@ export default class DhHomebrew extends foundry.abstract.DataModel {
maxDomains: new fields.NumberField({
required: true,
integer: true,
- min: 1,
+ min: 0,
initial: 2,
label: 'DAGGERHEART.SETTINGS.Homebrew.FIELDS.maxDomains.label'
}),
@@ -196,6 +196,12 @@ export default class DhHomebrew extends foundry.abstract.DataModel {
return source;
}
+ _initialize(options) {
+ super._initialize(options);
+ this.maxDomains ||= Infinity;
+ this.maxLoadout ||= Infinity;
+ }
+
/** Invoked by the setting when data changes */
handleChange() {
if (this.maxFear) {
From 4a60c56462ad15fe1565123cd9e1388ffb46c133 Mon Sep 17 00:00:00 2001
From: Carlos Fernandez
Date: Fri, 24 Apr 2026 14:48:42 -0400
Subject: [PATCH 008/134] Fix husky/lint-staged integration (#1831)
---
package-lock.json | 391 +++++++++++++++-------------------------------
package.json | 9 +-
2 files changed, 134 insertions(+), 266 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index b8fef1cd..47c5dede 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,8 +19,8 @@
"eslint": "^10.2.1",
"eslint-plugin-prettier": "^5.5.5",
"globals": "^17.5.0",
- "husky": "^9.1.5",
- "lint-staged": "^15.2.10",
+ "husky": "^9.1.7",
+ "lint-staged": "^16.4.0",
"postcss": "^8.4.32",
"prettier": "^3.5.3",
"rollup-plugin-postcss": "^4.0.2"
@@ -752,10 +752,11 @@
}
},
"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": "7.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz",
+ "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"environment": "^1.0.0"
},
@@ -767,10 +768,11 @@
}
},
"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.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -779,10 +781,11 @@
}
},
"node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -1207,6 +1210,7 @@
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
"integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"restore-cursor": "^5.0.0"
},
@@ -1218,39 +1222,34 @@
}
},
"node_modules/cli-truncate": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
- "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz",
+ "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "slice-ansi": "^5.0.0",
- "string-width": "^7.0.0"
+ "slice-ansi": "^8.0.0",
+ "string-width": "^8.2.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "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
- },
"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": "8.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz",
+ "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "emoji-regex": "^10.3.0",
- "get-east-asian-width": "^1.0.0",
- "strip-ansi": "^7.1.0"
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
},
"engines": {
- "node": ">=18"
+ "node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -1357,15 +1356,17 @@
"version": "2.0.20",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/commander": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
- "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
+ "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">=20"
}
},
"node_modules/commondir": {
@@ -1854,6 +1855,7 @@
"resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
"integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -2175,33 +2177,11 @@
}
},
"node_modules/eventemitter3": {
- "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==",
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
"dev": true,
- "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"
- }
+ "license": "MIT"
},
"node_modules/expand-tilde": {
"version": "2.0.2",
@@ -2471,10 +2451,11 @@
}
},
"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.5.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
+ "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -2519,18 +2500,6 @@
"node": ">= 0.4"
}
},
- "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": "8.1.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
@@ -2931,20 +2900,12 @@
"node": ">=0.10.0"
}
},
- "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.1.7",
"resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz",
"integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==",
"dev": true,
+ "license": "MIT",
"bin": {
"husky": "bin.js"
},
@@ -3213,12 +3174,16 @@
}
},
"node_modules/is-fullwidth-code-point": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
- "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz",
+ "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-east-asian-width": "^1.3.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -3321,18 +3286,6 @@
"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-typed-array": {
"version": "1.1.15",
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
@@ -3545,52 +3498,38 @@
"node": ">=10.13.0"
}
},
- "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==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
"node_modules/lint-staged": {
- "version": "15.5.2",
- "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz",
- "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==",
+ "version": "16.4.0",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz",
+ "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chalk": "^5.4.1",
- "commander": "^13.1.0",
- "debug": "^4.4.0",
- "execa": "^8.0.1",
- "lilconfig": "^3.1.3",
- "listr2": "^8.2.5",
- "micromatch": "^4.0.8",
- "pidtree": "^0.6.0",
+ "commander": "^14.0.3",
+ "listr2": "^9.0.5",
+ "picomatch": "^4.0.3",
"string-argv": "^0.3.2",
- "yaml": "^2.7.0"
+ "tinyexec": "^1.0.4",
+ "yaml": "^2.8.2"
},
"bin": {
"lint-staged": "bin/lint-staged.js"
},
"engines": {
- "node": ">=18.12.0"
+ "node": ">=20.17"
},
"funding": {
"url": "https://opencollective.com/lint-staged"
}
},
"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": "9.0.5",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz",
+ "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cli-truncate": "^4.0.0",
+ "cli-truncate": "^5.0.0",
"colorette": "^2.0.20",
"eventemitter3": "^5.0.1",
"log-update": "^6.1.0",
@@ -3598,7 +3537,7 @@
"wrap-ansi": "^9.0.0"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/loader-utils": {
@@ -3664,6 +3603,7 @@
"resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
"integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-escapes": "^7.0.0",
"cli-cursor": "^5.0.0",
@@ -3678,26 +3618,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/log-update/node_modules/is-fullwidth-code-point": {
- "version": "5.0.0",
- "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,
- "dependencies": {
- "get-east-asian-width": "^1.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/log-update/node_modules/slice-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
- "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz",
+ "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^6.2.1",
"is-fullwidth-code-point": "^5.0.0"
@@ -3766,12 +3692,6 @@
"integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
"dev": true
},
- "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/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
@@ -3807,23 +3727,12 @@
"node": ">=4"
}
},
- "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,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"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"
},
@@ -3985,33 +3894,6 @@
"node": ">= 10.13.0"
}
},
- "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,
- "dependencies": {
- "path-key": "^4.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "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/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@@ -4066,15 +3948,16 @@
}
},
"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==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "mimic-fn": "^4.0.0"
+ "mimic-function": "^5.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -4259,10 +4142,11 @@
"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": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -4270,18 +4154,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pidtree": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
- "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
- "dev": true,
- "bin": {
- "pidtree": "bin/pidtree.js"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
"node_modules/pify": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
@@ -5169,6 +5041,7 @@
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
"integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"onetime": "^7.0.0",
"signal-exit": "^4.1.0"
@@ -5180,21 +5053,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "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==",
- "dev": true,
- "dependencies": {
- "mimic-function": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/reusify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
@@ -5208,7 +5066,8 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/rollup": {
"version": "4.44.0",
@@ -5488,6 +5347,7 @@
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
+ "license": "ISC",
"engines": {
"node": ">=14"
},
@@ -5496,16 +5356,17 @@
}
},
"node_modules/slice-ansi": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
- "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz",
+ "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^6.0.0",
- "is-fullwidth-code-point": "^4.0.0"
+ "ansi-styles": "^6.2.3",
+ "is-fullwidth-code-point": "^5.1.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=20"
},
"funding": {
"url": "https://github.com/chalk/slice-ansi?sponsor=1"
@@ -5639,12 +5500,13 @@
}
},
"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==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
@@ -5653,18 +5515,6 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "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/style-inject": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz",
@@ -5800,6 +5650,16 @@
"readable-stream": "3"
}
},
+ "node_modules/tinyexec": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz",
+ "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -6082,10 +5942,11 @@
}
},
"node_modules/wrap-ansi": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
- "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+ "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^6.2.1",
"string-width": "^7.0.0",
@@ -6099,16 +5960,18 @@
}
},
"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
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "dev": true,
+ "license": "MIT"
},
"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==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"emoji-regex": "^10.3.0",
"get-east-asian-width": "^1.0.0",
@@ -6135,15 +5998,19 @@
}
},
"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.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
"dev": true,
+ "license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
"node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/yargs": {
diff --git a/package.json b/package.json
index 28c83549..52bb4ce7 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,8 @@
"createSymlink": "node ./tools/create-symlink.mjs",
"setup:dev": "node ./tools/dev-setup.mjs",
"lint": "eslint",
- "lint:fix": "eslint --fix"
+ "lint:fix": "eslint --fix",
+ "prepare": "husky"
},
"devDependencies": {
"@foundryvtt/foundryvtt-cli": "^1.0.2",
@@ -29,13 +30,13 @@
"eslint": "^10.2.1",
"eslint-plugin-prettier": "^5.5.5",
"globals": "^17.5.0",
- "husky": "^9.1.5",
- "lint-staged": "^15.2.10",
+ "husky": "^9.1.7",
+ "lint-staged": "^16.4.0",
"postcss": "^8.4.32",
"prettier": "^3.5.3",
"rollup-plugin-postcss": "^4.0.2"
},
"lint-staged": {
- "**/*": "prettier --write --ignore-unknown"
+ "**/*": "eslint --fix"
}
}
From ccb0073cefb7fb6efaac81f42a4b31b955723e1b Mon Sep 17 00:00:00 2001
From: Carlos Fernandez
Date: Fri, 24 Apr 2026 14:49:42 -0400
Subject: [PATCH 009/134] Prevent class sheet and character errors when
features/domains no longer exist (#1833)
---
module/data/actor/character.mjs | 3 ++-
module/data/actor/party.mjs | 2 +-
module/data/fields/foreignDocumentUUIDArrayField.mjs | 1 +
module/data/scene/scene.mjs | 2 +-
4 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs
index 32f44df6..6f60356e 100644
--- a/module/data/actor/character.mjs
+++ b/module/data/actor/character.mjs
@@ -391,8 +391,9 @@ export default class DhCharacter extends DhCreature {
return this.domains.map(key => {
const domain = allDomainData[key];
return {
+ id: key,
...domain,
- label: game.i18n.localize(domain.label)
+ label: game.i18n.localize(domain?.label) ?? key
};
});
}
diff --git a/module/data/actor/party.mjs b/module/data/actor/party.mjs
index 93596cda..5b9cccab 100644
--- a/module/data/actor/party.mjs
+++ b/module/data/actor/party.mjs
@@ -18,7 +18,7 @@ export default class DhParty extends BaseDataActor {
const fields = foundry.data.fields;
return {
...super.defineSchema(),
- partyMembers: new ForeignDocumentUUIDArrayField({ type: 'Actor' }, { prune: true }),
+ partyMembers: new ForeignDocumentUUIDArrayField({ type: 'Actor' }),
notes: new fields.HTMLField(),
gold: new GoldField(),
tagTeam: new fields.EmbeddedDataField(TagTeamData),
diff --git a/module/data/fields/foreignDocumentUUIDArrayField.mjs b/module/data/fields/foreignDocumentUUIDArrayField.mjs
index 456c0593..f8969d33 100644
--- a/module/data/fields/foreignDocumentUUIDArrayField.mjs
+++ b/module/data/fields/foreignDocumentUUIDArrayField.mjs
@@ -10,6 +10,7 @@ export default class ForeignDocumentUUIDArrayField extends foundry.data.fields.A
*/
constructor(fieldOption = {}, options = {}, context = {}) {
super(new ForeignDocumentUUIDField(fieldOption), options, context);
+ this.options.prune ??= true;
}
/** @inheritdoc */
diff --git a/module/data/scene/scene.mjs b/module/data/scene/scene.mjs
index f2a24308..50416573 100644
--- a/module/data/scene/scene.mjs
+++ b/module/data/scene/scene.mjs
@@ -19,7 +19,7 @@ export default class DHScene extends foundry.abstract.DataModel {
close: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.close.name' }),
far: new fields.NumberField({ integer: true, label: 'DAGGERHEART.CONFIG.Range.far.name' })
}),
- sceneEnvironments: new ForeignDocumentUUIDArrayField({ type: 'Actor', prune: true })
+ sceneEnvironments: new ForeignDocumentUUIDArrayField({ type: 'Actor' })
};
}
}
From e5ae56f45cd861fddd20f290ce9acc7fd29bfa11 Mon Sep 17 00:00:00 2001
From: WBHarry <89362246+WBHarry@users.noreply.github.com>
Date: Sat, 25 Apr 2026 13:01:13 +0200
Subject: [PATCH 010/134] Fixed so that replaceFormulaValue doesn't loose
getter values (#1836)
---
module/helpers/utils.mjs | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs
index 4527da1a..b4a04579 100644
--- a/module/helpers/utils.mjs
+++ b/module/helpers/utils.mjs
@@ -189,17 +189,14 @@ export const getDeleteKeys = (property, innerProperty, innerPropertyDefaultValue
// Fix on Foundry native formula replacement for DH
const nativeReplaceFormulaData = Roll.replaceFormulaData;
-Roll.replaceFormulaData = function (formula, baseData = {}, { missing, warn = false } = {}) {
+Roll.replaceFormulaData = function (formula, data = {}, { missing, warn = false } = {}) {
/* Inserting global data */
- const data = {
- ...baseData,
- partySize: game.actors?.party?.system.partyMembers.length ?? 0
- };
+ const defaultingTypes = [
+ ...Object.keys(CONFIG.DH.GENERAL.multiplierTypes).map(x => ({ term: x, default: 1 })),
+ { term: 'partySize', default: game.actors?.party?.system.partyMembers.length ?? 0 }
+ ];
- const terms = Object.keys(CONFIG.DH.GENERAL.multiplierTypes).map(type => {
- return { term: type, default: 1 };
- });
- formula = terms.reduce((a, c) => a.replaceAll(`@${c.term}`, data[c.term] ?? c.default), formula);
+ formula = defaultingTypes.reduce((a, c) => a.replaceAll(`@${c.term}`, data[c.term] ?? c.default), formula);
return nativeReplaceFormulaData(formula, data, { missing, warn });
};
From b8e00b28079be8da952e1506b06e450c183a75c3 Mon Sep 17 00:00:00 2001
From: WBHarry
Date: Sat, 25 Apr 2026 17:39:20 +0200
Subject: [PATCH 011/134] Translation fixes
---
templates/settings/variant-rules.hbs | 2 +-
templates/ui/combatTracker/combatTrackerHeader.hbs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/templates/settings/variant-rules.hbs b/templates/settings/variant-rules.hbs
index cdaef024..9c9650dd 100644
--- a/templates/settings/variant-rules.hbs
+++ b/templates/settings/variant-rules.hbs
@@ -32,7 +32,7 @@