Merge branch 'master' into 55-creatures-compendium

This commit is contained in:
Johannes Loher 2021-08-18 21:29:40 +02:00
commit 040c0f8069
37 changed files with 820 additions and 590 deletions

View file

@ -2,7 +2,7 @@
"private": true, "private": true,
"name": "dungeonslayers4", "name": "dungeonslayers4",
"description": "An implementation of the Dungeonslayers 4 game system for Foundry Virtual Tabletop.", "description": "An implementation of the Dungeonslayers 4 game system for Foundry Virtual Tabletop.",
"version": "1.1.3", "version": "1.2.1",
"license": "https://git.f3l.de/dungeonslayers/ds4#licensing", "license": "https://git.f3l.de/dungeonslayers/ds4#licensing",
"homepage": "https://git.f3l.de/dungeonslayers/ds4", "homepage": "https://git.f3l.de/dungeonslayers/ds4",
"repository": { "repository": {
@ -52,33 +52,32 @@
"postinstall": "husky install" "postinstall": "husky install"
}, },
"devDependencies": { "devDependencies": {
"@league-of-foundry-developers/foundry-vtt-types": "^0.8.8-5", "@league-of-foundry-developers/foundry-vtt-types": "0.8.8-8",
"@rollup/plugin-node-resolve": "^13.0.0", "@types/fs-extra": "9.0.12",
"@types/fs-extra": "^9.0.12", "@types/jest": "27.0.1",
"@types/jest": "^26.0.24", "@typescript-eslint/eslint-plugin": "4.29.2",
"@typescript-eslint/eslint-plugin": "^4.28.2", "@typescript-eslint/parser": "4.29.2",
"@typescript-eslint/parser": "^4.28.2", "chalk": "4.1.2",
"chalk": "^4.1.1", "eslint": "7.32.0",
"eslint": "^7.30.0", "eslint-config-prettier": "8.3.0",
"eslint-config-prettier": "^8.3.0", "eslint-plugin-jest": "24.4.0",
"eslint-plugin-jest": "^24.3.6", "eslint-plugin-prettier": "3.4.0",
"eslint-plugin-prettier": "^3.4.0", "fs-extra": "10.0.0",
"fs-extra": "^10.0.0", "gulp": "4.0.2",
"gulp": "^4.0.2", "gulp-sass": "5.0.0",
"gulp-sass": "^5.0.0", "husky": "7.0.1",
"husky": "^7.0.1", "jest": "27.0.6",
"jest": "^27.0.6", "jest-junit": "12.2.0",
"jest-junit": "^12.2.0", "lint-staged": "11.1.2",
"lint-staged": "^11.0.0", "prettier": "2.3.2",
"prettier": "^2.3.2", "rollup": "2.56.2",
"rollup": "^2.53.1", "rollup-plugin-typescript2": "0.30.0",
"rollup-plugin-typescript2": "^0.30.0", "sass": "1.38.0",
"sass": "1.35.2", "semver": "7.3.5",
"semver": "^7.3.5", "ts-jest": "27.0.5",
"ts-jest": "^27.0.3", "tslib": "2.3.1",
"tslib": "^2.3.0", "typescript": "4.3.5",
"typescript": "^4.3.5", "yargs": "17.1.1"
"yargs": "^17.0.1"
}, },
"lint-staged": { "lint-staged": {
"*.ts": "eslint --cache --fix", "*.ts": "eslint --cache --fix",

4
renovate.json Normal file
View file

@ -0,0 +1,4 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:base", ":automergeAll", ":automergeBranch", ":prHourlyLimitNone", ":prConcurrentLimitNone"]
}

3
renovate.json.license Normal file
View file

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-License-Identifier: MIT

View file

@ -3,7 +3,6 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
const typescript = require("rollup-plugin-typescript2"); const typescript = require("rollup-plugin-typescript2");
const { nodeResolve } = require("@rollup/plugin-node-resolve");
module.exports = { module.exports = {
input: "src/module/ds4.ts", input: "src/module/ds4.ts",
@ -12,5 +11,5 @@ module.exports = {
format: "es", format: "es",
sourcemap: true, sourcemap: true,
}, },
plugins: [nodeResolve(), typescript({})], plugins: [typescript({})],
}; };

View file

@ -1,10 +1,11 @@
{ {
"DS4.UserInteractionAddItem": "Neu", "DS4.UserInteractionAdd": "Neu",
"DS4.UserInteractionEditItem": "Bearbeiten", "DS4.UserInteractionAddItemTitle": "Item Erstellen",
"DS4.UserInteractionDeleteItem": "Löschen", "DS4.UserInteractionEditItemTitle": "Item Bearbeiten",
"DS4.UserInteractionAddEffect": "Neuer Effekt", "DS4.UserInteractionDeleteItemTitle": "Item Löschen",
"DS4.UserInteractionEditEffect": "Effekt bearbeiten", "DS4.UserInteractionAddEffectTitle": "Effekt Erstellen",
"DS4.UserInteractionDeleteEffect": "Effekt löschen", "DS4.UserInteractionEditEffectTitle": "Effekt Bearbeiten",
"DS4.UserInteractionDeleteEffectTitle": "Effekt Löschen",
"DS4.DocumentImageAltText": "Bild von {name}", "DS4.DocumentImageAltText": "Bild von {name}",
"DS4.RollableImageRollableTitle": "Für {name} würfeln", "DS4.RollableImageRollableTitle": "Für {name} würfeln",
"DS4.DiceOverlayImageAltText": "Bild eines W20", "DS4.DiceOverlayImageAltText": "Bild eines W20",
@ -18,7 +19,6 @@
"DS4.HeadingAbilities": "Fähigkeiten", "DS4.HeadingAbilities": "Fähigkeiten",
"DS4.HeadingSpells": "Zaubersprüche", "DS4.HeadingSpells": "Zaubersprüche",
"DS4.HeadingDescription": "Beschreibung", "DS4.HeadingDescription": "Beschreibung",
"DS4.HeadingSpecialCreatureAbilities": "Besondere Fähigkeiten",
"DS4.AttackType": "Angriffsart", "DS4.AttackType": "Angriffsart",
"DS4.AttackTypeAbbr": "AA", "DS4.AttackTypeAbbr": "AA",
"DS4.DialogAttackTypeSelection": "Welche Angriffsart?", "DS4.DialogAttackTypeSelection": "Welche Angriffsart?",
@ -121,6 +121,10 @@
"DS4.SpellMinimumLevelsSorcerer": "Zugangsstufe für Schwarzmagier", "DS4.SpellMinimumLevelsSorcerer": "Zugangsstufe für Schwarzmagier",
"DS4.SpellMinimumLevelsSorcererAbbr": "Zugangsstufe Sch", "DS4.SpellMinimumLevelsSorcererAbbr": "Zugangsstufe Sch",
"DS4.SpellPrice": "Preis (Gold)", "DS4.SpellPrice": "Preis (Gold)",
"DS4.EffectEnabled": "Aktiv",
"DS4.EffectEnabledAbbr": "A",
"DS4.EffectLabel": "Bezeichnung",
"DS4.EffectSourceName": "Quelle",
"DS4.ActorName": "Name", "DS4.ActorName": "Name",
"DS4.ActorImageAltText": "Bild des Aktors", "DS4.ActorImageAltText": "Bild des Aktors",
"DS4.ActorTypeCharacter": "Charakter", "DS4.ActorTypeCharacter": "Charakter",
@ -207,7 +211,7 @@
"DS4.CreatureBaseInfoSizeCategory": "Größenkategorie", "DS4.CreatureBaseInfoSizeCategory": "Größenkategorie",
"DS4.CreatureBaseInfoExperiencePoints": "Erfahrungspunkte", "DS4.CreatureBaseInfoExperiencePoints": "Erfahrungspunkte",
"DS4.CreatureBaseInfoDescription": "Beschreibung", "DS4.CreatureBaseInfoDescription": "Beschreibung",
"DS4.WarningManageActiveEffectOnOwnedItem": "Das Verwalten von aktiven Effekten innerhalb eines besessen Items wird derzeit nicht unterstützt und wird in einem nachfolgenden Update hinzugefügt.", "DS4.WarningManageActiveEffectOnOwnedItem": "Das Verwalten von aktiven Effekten innerhalb eines besessen Items wird derzeit nicht unterstützt und wird in einem nachfolgenden Update hinzugefügt. Falls Sie eigentlich den auf den Aktor übertragenen Effekt verwalten wollen, können Sie dies im 'Effekte'-Tab des Aktorbogens tun.",
"DS4.WarningActorCannotOwnItem": "Der Aktor '{actorName}' vom Typ '{actorType}' kann das Item '{itemName}' vom Typ '{itemType}' nicht besitzen.", "DS4.WarningActorCannotOwnItem": "Der Aktor '{actorName}' vom Typ '{actorType}' kann das Item '{itemName}' vom Typ '{itemType}' nicht besitzen.",
"DS4.ErrorDiceCoupFumbleOverlap": "Es gibt eine Überlappung zwischen Patzern und Immersiegen.", "DS4.ErrorDiceCoupFumbleOverlap": "Es gibt eine Überlappung zwischen Patzern und Immersiegen.",
"DS4.ErrorSlayingDiceRecursionLimitExceeded": "Die maximale Rekursionstiefe für slayende Würfelwürfe wurde überschritten.", "DS4.ErrorSlayingDiceRecursionLimitExceeded": "Die maximale Rekursionstiefe für slayende Würfelwürfe wurde überschritten.",
@ -253,6 +257,7 @@
"DS4.ErrorActorDoesNotHaveItem": "Der Aktor '{actor}' hat kein Item mit der ID '{id}'.", "DS4.ErrorActorDoesNotHaveItem": "Der Aktor '{actor}' hat kein Item mit der ID '{id}'.",
"DS4.ErrorUnexpectedError": "Es gab einen unerwarteten Fehler im Dungeonslayers 4 System. Für mehr Details schauen Sie bitte in die Konsole (F12).", "DS4.ErrorUnexpectedError": "Es gab einen unerwarteten Fehler im Dungeonslayers 4 System. Für mehr Details schauen Sie bitte in die Konsole (F12).",
"DS4.ErrorItemDoesNotHaveEffect": "Das Item '{item}' hat keinen Effekt mit der ID '{id}'.", "DS4.ErrorItemDoesNotHaveEffect": "Das Item '{item}' hat keinen Effekt mit der ID '{id}'.",
"DS4.ErrorActorDoesNotHaveEffect": "Der Aktor '{actor}' hat keinen Effekt mit der ID '{id}'.",
"DS4.DialogRollOptionsCheckTargetNumberLabel": "Probenwert", "DS4.DialogRollOptionsCheckTargetNumberLabel": "Probenwert",
"DS4.DialogRollOptionsGMModifierLabel": "SL-Modifikator", "DS4.DialogRollOptionsGMModifierLabel": "SL-Modifikator",
"DS4.DialogRollOptionsMaximumCoupResultLabel": "Immersieg bis", "DS4.DialogRollOptionsMaximumCoupResultLabel": "Immersieg bis",
@ -295,5 +300,17 @@
"DS4.ChecksWorkMechanism": "Mechanismus Öffnen", "DS4.ChecksWorkMechanism": "Mechanismus Öffnen",
"DS4.ActorCheckFlavor": "{actor} würfelt eine {check} Probe.", "DS4.ActorCheckFlavor": "{actor} würfelt eine {check} Probe.",
"DS4.ActorGenericCheckFlavor": "{actor} würfelt eine Probe gegen {attribute} + {trait}.", "DS4.ActorGenericCheckFlavor": "{actor} würfelt eine Probe gegen {attribute} + {trait}.",
"DS4.CheckTooltip": "{check} Probe würfeln" "DS4.CheckTooltip": "{check} Probe würfeln",
"DS4.NewWeaponName": "Neue Waffe",
"DS4.NewArmorName": "Neue Panzerung",
"DS4.NewShieldName": "Neuer Schild",
"DS4.NewSpellName": "Neuer Zauberspruch",
"DS4.NewEquipmentName": "Neue Ausrüstung",
"DS4.NewLootName": "Neue Beute",
"DS4.NewTalentName": "Neues Talent",
"DS4.NewRacialAbilityName": "Neue Volksfähigkeit",
"DS4.NewLanguageName": "Neue Sprache",
"DS4.NewAlphabetName": "Neue Schriftzeichen",
"DS4.NewSpecialCreatureAbilityName": "Neue Besondere Kreaturenfähigkeit",
"DS4.NewEffectLabel": "Neuer Effekt"
} }

View file

@ -1,10 +1,11 @@
{ {
"DS4.UserInteractionAddItem": "Add item", "DS4.UserInteractionAdd": "Add",
"DS4.UserInteractionEditItem": "Edit item", "DS4.UserInteractionAddItemTitle": "Create Item",
"DS4.UserInteractionDeleteItem": "Delete item", "DS4.UserInteractionEditItemTitle": "Edit Item",
"DS4.UserInteractionAddEffect": "Add Effect", "DS4.UserInteractionDeleteItemTitle": "Delete Item",
"DS4.UserInteractionEditEffect": "Edit Effect", "DS4.UserInteractionAddEffectTitle": "Create Effect",
"DS4.UserInteractionDeleteEffect": "Delete Effect", "DS4.UserInteractionEditEffectTitle": "Edit Effect",
"DS4.UserInteractionDeleteEffectTitle": "Delete Effect",
"DS4.DocumentImageAltText": "Image of {name}", "DS4.DocumentImageAltText": "Image of {name}",
"DS4.RollableImageRollableTitle": "Roll for {name}", "DS4.RollableImageRollableTitle": "Roll for {name}",
"DS4.DiceOverlayImageAltText": "Image of a d20", "DS4.DiceOverlayImageAltText": "Image of a d20",
@ -18,7 +19,6 @@
"DS4.HeadingAbilities": "Abilities", "DS4.HeadingAbilities": "Abilities",
"DS4.HeadingSpells": "Spells", "DS4.HeadingSpells": "Spells",
"DS4.HeadingDescription": "Description", "DS4.HeadingDescription": "Description",
"DS4.HeadingSpecialCreatureAbilities": "Special Abilities",
"DS4.AttackType": "Attack Type", "DS4.AttackType": "Attack Type",
"DS4.AttackTypeAbbr": "AT", "DS4.AttackTypeAbbr": "AT",
"DS4.DialogAttackTypeSelection": "Which Attack Type?", "DS4.DialogAttackTypeSelection": "Which Attack Type?",
@ -121,6 +121,10 @@
"DS4.SpellMinimumLevelsSorcerer": "Minimum level for Sorcerers", "DS4.SpellMinimumLevelsSorcerer": "Minimum level for Sorcerers",
"DS4.SpellMinimumLevelsSorcererAbbr": "Min lvl SRC", "DS4.SpellMinimumLevelsSorcererAbbr": "Min lvl SRC",
"DS4.SpellPrice": "Price (Gold)", "DS4.SpellPrice": "Price (Gold)",
"DS4.EffectEnabled": "Enabled",
"DS4.EffectEnabledAbbr": "E",
"DS4.EffectLabel": "Label",
"DS4.EffectSourceName": "Source",
"DS4.ActorName": "Name", "DS4.ActorName": "Name",
"DS4.ActorImageAltText": "Image of the Actor", "DS4.ActorImageAltText": "Image of the Actor",
"DS4.ActorTypeCharacter": "Character", "DS4.ActorTypeCharacter": "Character",
@ -207,7 +211,7 @@
"DS4.CreatureBaseInfoSizeCategory": "Size Category", "DS4.CreatureBaseInfoSizeCategory": "Size Category",
"DS4.CreatureBaseInfoExperiencePoints": "Experience Points", "DS4.CreatureBaseInfoExperiencePoints": "Experience Points",
"DS4.CreatureBaseInfoDescription": "Description", "DS4.CreatureBaseInfoDescription": "Description",
"DS4.WarningManageActiveEffectOnOwnedItem": "Managing Active Effects within an Owned Item is not currently supported and will be added in a subsequent update.", "DS4.WarningManageActiveEffectOnOwnedItem": "Managing Active Effects within an Owned Item is not currently supported and will be added in a subsequent update. If you actually want to manage the effect that has been transferred to the actor, you can do so in the 'Effects' tab in the actor sheet.",
"DS4.WarningActorCannotOwnItem": "The actor '{actorName}' of type '{actorType}' cannot own the item '{itemName}' of type '{itemType}'.", "DS4.WarningActorCannotOwnItem": "The actor '{actorName}' of type '{actorType}' cannot own the item '{itemName}' of type '{itemType}'.",
"DS4.ErrorDiceCoupFumbleOverlap": "There is an overlap between Fumbles and Coups.", "DS4.ErrorDiceCoupFumbleOverlap": "There is an overlap between Fumbles and Coups.",
"DS4.ErrorSlayingDiceRecursionLimitExceeded": "Maximum recursion depth for slaying dice roll exceeded.", "DS4.ErrorSlayingDiceRecursionLimitExceeded": "Maximum recursion depth for slaying dice roll exceeded.",
@ -253,6 +257,7 @@
"DS4.ErrorActorDoesNotHaveItem": "The actor '{actor}' does not have any item with the id '{id}'.", "DS4.ErrorActorDoesNotHaveItem": "The actor '{actor}' does not have any item with the id '{id}'.",
"DS4.ErrorUnexpectedError": "There was an unexpected error in the Dungeonslayers 4 system. For more details, please take a look at the console (F12).", "DS4.ErrorUnexpectedError": "There was an unexpected error in the Dungeonslayers 4 system. For more details, please take a look at the console (F12).",
"DS4.ErrorItemDoesNotHaveEffect": "The item '{item}' does not have any effect with the id '{id}'.", "DS4.ErrorItemDoesNotHaveEffect": "The item '{item}' does not have any effect with the id '{id}'.",
"DS4.ErrorActorDoesNotHaveEffect": "The actor '{actor}' does not have any effect with the id '{id}'.",
"DS4.DialogRollOptionsCheckTargetNumberLabel": "Check Target Number", "DS4.DialogRollOptionsCheckTargetNumberLabel": "Check Target Number",
"DS4.DialogRollOptionsGMModifierLabel": "Game Master Modifier", "DS4.DialogRollOptionsGMModifierLabel": "Game Master Modifier",
"DS4.DialogRollOptionsMaximumCoupResultLabel": "Coup to", "DS4.DialogRollOptionsMaximumCoupResultLabel": "Coup to",
@ -295,5 +300,17 @@
"DS4.ChecksWorkMechanism": "Work Mechanism", "DS4.ChecksWorkMechanism": "Work Mechanism",
"DS4.ActorCheckFlavor": "{actor} rolls a {check} check.", "DS4.ActorCheckFlavor": "{actor} rolls a {check} check.",
"DS4.ActorGenericCheckFlavor": "{actor} rolls a check against {attribute} + {trait}.", "DS4.ActorGenericCheckFlavor": "{actor} rolls a check against {attribute} + {trait}.",
"DS4.CheckTooltip": "Roll a {check} check" "DS4.CheckTooltip": "Roll a {check} check",
"DS4.NewWeaponName": "New Weapon",
"DS4.NewArmorName": "New Armor",
"DS4.NewShieldName": "New Shield",
"DS4.NewSpellName": "New Spell",
"DS4.NewEquipmentName": "New Equipment",
"DS4.NewLootName": "New Loot",
"DS4.NewTalentName": "New Talent",
"DS4.NewRacialAbilityName": "New Racial Ability",
"DS4.NewLanguageName": "New Language",
"DS4.NewAlphabetName": "New Alphabet",
"DS4.NewSpecialCreatureAbilityName": "New Special Creature Ability",
"DS4.NewEffectLabel": "New Effect"
} }

View file

@ -3,6 +3,7 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
import { DS4Actor } from "./actor/actor"; import { DS4Actor } from "./actor/actor";
import { getGame } from "./helpers";
declare global { declare global {
interface DocumentClassConfig { interface DocumentClassConfig {
@ -10,7 +11,18 @@ declare global {
} }
} }
type PromisedType<T> = T extends Promise<infer U> ? U : T;
export class DS4ActiveEffect extends ActiveEffect { export class DS4ActiveEffect extends ActiveEffect {
/**
* A fallback icon that can be used if no icon is defined for the effect.
*/
static FALLBACK_ICON = "icons/svg/aura.svg";
/**
* A cached reference to the source document to avoid recurring database lookups
*/
protected source: PromisedType<ReturnType<typeof fromUuid>> | undefined = undefined;
/** @override */ /** @override */
apply(actor: DS4Actor, change: foundry.data.ActiveEffectData["changes"][number]): unknown { apply(actor: DS4Actor, change: foundry.data.ActiveEffectData["changes"][number]): unknown {
change.value = Roll.replaceFormulaData(change.value, actor.data); change.value = Roll.replaceFormulaData(change.value, actor.data);
@ -21,4 +33,25 @@ export class DS4ActiveEffect extends ActiveEffect {
} }
return super.apply(actor, change); return super.apply(actor, change);
} }
/**
* Gets the current source name based on the cached source object.
*/
async getCurrentSourceName(): Promise<string> {
const game = getGame();
const origin = await this.getSource();
if (origin === null) return game.i18n.localize("None");
return origin.name ?? game.i18n.localize("Unknown");
}
/**
* Gets the source document for this effect. Uses the cached {@link DS4ActiveEffect#origin} if it has already been
* set.
*/
protected async getSource(): ReturnType<typeof fromUuid> {
if (this.source === undefined) {
this.source = this.data.origin !== undefined ? await fromUuid(this.data.origin) : null;
}
return this.source;
}
} }

View file

@ -5,16 +5,17 @@
// //
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
import { DS4ActiveEffect } from "../../active-effect";
import { ModifiableDataBaseTotal } from "../../common/common-data"; import { ModifiableDataBaseTotal } from "../../common/common-data";
import { DS4 } from "../../config"; import { DS4 } from "../../config";
import { getCanvas, getGame } from "../../helpers"; import { getCanvas, getGame } from "../../helpers";
import { DS4Item } from "../../item/item";
import { DS4Settings, getDS4Settings } from "../../settings"; import { DS4Settings, getDS4Settings } from "../../settings";
import notifications from "../../ui/notifications"; import notifications from "../../ui/notifications";
import { enforce } from "../../utils";
import { isCheck } from "../actor-data-properties"; import { isCheck } from "../actor-data-properties";
/** /**
* The base Sheet class for all DS4 Actors * The base sheet class for all {@link DS4Actor}s.
*/ */
export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetData> { export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetData> {
/** @override */ /** @override */
@ -22,15 +23,7 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
return foundry.utils.mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["ds4", "sheet", "actor"], classes: ["ds4", "sheet", "actor"],
height: 620, height: 620,
scrollY: [ scrollY: [".values", ".inventory", ".spells", ".abilities", ".effects", ".biography", ".description"],
".values",
".inventory",
".spells",
".abilities",
".profile",
".biography",
".special-creature-abilities",
],
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "values" }], tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "values" }],
dragDrop: [ dragDrop: [
{ dragSelector: ".item-list .item", dropSelector: null }, { dragSelector: ".item-list .item", dropSelector: null },
@ -46,29 +39,36 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
return `${basePath}/${this.actor.data.type}-sheet.hbs`; return `${basePath}/${this.actor.data.type}-sheet.hbs`;
} }
/** /** @override */
* This method returns the data for the template of the actor sheet.
* It explicitly adds the items of the object sorted by type in the
* object itemsByType.
* @returns The data fed to the template of the actor sheet
*/
async getData(): Promise<DS4ActorSheetData> { async getData(): Promise<DS4ActorSheetData> {
const itemsByType = Object.fromEntries( const itemsByType = Object.fromEntries(
Object.entries(this.actor.itemTypes).map(([itemType, items]) => { Object.entries(this.actor.itemTypes).map(([itemType, items]) => {
return [itemType, items.map((item) => item.data).sort((a, b) => (a.sort || 0) - (b.sort || 0))]; return [itemType, items.map((item) => item.data).sort((a, b) => (a.sort || 0) - (b.sort || 0))];
}), }),
); );
const enrichedEffectPromises = this.actor.effects.map(async (effect) => {
return {
...effect.toObject(),
icon: effect.data.icon ?? DS4ActiveEffect.FALLBACK_ICON,
sourceName: await effect.getCurrentSourceName(),
};
});
const enrichedEffects = await Promise.all(enrichedEffectPromises);
const data = { const data = {
...this.addTooltipsToData(await super.getData()), ...this.addTooltipsToData(await super.getData()),
// Add the localization config to the data:
config: DS4, config: DS4,
// Add the items explicitly sorted by type to the data:
itemsByType, itemsByType,
enrichedEffects,
settings: getDS4Settings(), settings: getDS4Settings(),
}; };
return data; return data;
} }
/**
* Adds tooltips to the attributes, traits, and combatValues of the actor data of the given {@link ActorSheet.Data}.
*/
protected addTooltipsToData(data: ActorSheet.Data): ActorSheet.Data { protected addTooltipsToData(data: ActorSheet.Data): ActorSheet.Data {
const valueGroups = [data.data.data.attributes, data.data.data.traits, data.data.data.combatValues]; const valueGroups = [data.data.data.attributes, data.data.data.traits, data.data.data.combatValues];
@ -80,6 +80,9 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
return data; return data;
} }
/**
* Generates a tooltip for a given attribute, trait, or combatValue.
*/
protected getTooltipForValue(value: ModifiableDataBaseTotal<number>): string { protected getTooltipForValue(value: ModifiableDataBaseTotal<number>): string {
return `${value.base} (${getGame().i18n.localize("DS4.TooltipBaseValue")}) + ${ return `${value.base} (${getGame().i18n.localize("DS4.TooltipBaseValue")}) + ${
value.mod value.mod
@ -92,144 +95,209 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
activateListeners(html: JQuery): void { activateListeners(html: JQuery): void {
super.activateListeners(html); super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return; if (!this.options.editable) return;
// Add Inventory Item html.find(".control-item").on("click", this.onControlItem.bind(this));
html.find(".item-create").on("click", this.onItemCreate.bind(this)); html.find(".change-item").on("change", this.onChangeItem.bind(this));
// Update Inventory Item html.find(".control-effect").on("click", this.onControlEffect.bind(this));
html.find(".item-edit").on("click", (ev) => { html.find(".change-effect").on("change", this.onChangeEffect.bind(this));
const li = $(ev.currentTarget).parents(".item");
const id = li.data("itemId");
const item = this.actor.items.get(id);
if (!item) {
throw new Error(getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
}
if (!item.sheet) {
throw new Error(getGame().i18n.localize("DS4.ErrorUnexpectedError"));
}
item.sheet.render(true);
});
// Delete Inventory Item
html.find(".item-delete").on("click", (ev) => {
const li = $(ev.currentTarget).parents(".item");
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")]);
li.slideUp(200, () => this.render(false));
});
html.find(".item-change").on("change", this.onItemChange.bind(this));
html.find(".rollable-item").on("click", this.onRollItem.bind(this)); html.find(".rollable-item").on("click", this.onRollItem.bind(this));
html.find(".rollable-check").on("click", this.onRollCheck.bind(this)); html.find(".rollable-check").on("click", this.onRollCheck.bind(this));
} }
/** /**
* Handle creating a new embedded Item for the actor using initial data defined in the HTML dataset * Handles a click on an element of this sheet to control an embedded item of the actor corresponding to this sheet.
*
* @param event - The originating click event * @param event - The originating click event
*/ */
protected onItemCreate(event: JQuery.ClickEvent): void { protected onControlItem(event: JQuery.ClickEvent): void {
event.preventDefault(); event.preventDefault();
const header = event.currentTarget; const a = event.currentTarget;
switch (a.dataset["action"]) {
const { type, ...data } = foundry.utils.deepClone(header.dataset); case "create":
return this.onCreateItem(event);
const name = `New ${type.capitalize()}`; case "edit":
return this.onEditItem(event);
case "delete":
return this.onDeleteItem(event);
}
}
/**
* Creates a new embedded item using the initial data defined in the HTML dataset of the clicked element.
*
* @param event - The originating click event
*/
protected onCreateItem(event: JQuery.ClickEvent): void {
const { type, ...data } = foundry.utils.deepClone(event.currentTarget.dataset);
const name = getGame().i18n.localize(`DS4.New${type.capitalize()}Name`);
const itemData = { const itemData = {
name: name, name: name,
type: type, type: type,
data: data, data: data,
}; };
Item.create(itemData, { parent: this.actor });
DS4Item.create(itemData, { parent: this.actor });
} }
/** /**
* Handle changes to properties of an Owned Item from within character sheet. * Opens the sheet of the embedded item corresponding to the clicked element.
* Can currently properly bind: see getValue(). *
* Assumes the item property is given as the value of the HTML element property 'data-property'. * @param event - The originating click event
* @param ev - The originating change event
*/ */
protected onItemChange(ev: JQuery.ChangeEvent): void { protected onEditItem(event: JQuery.ClickEvent): void {
ev.preventDefault(); const id = $(event.currentTarget)
const el: HTMLFormElement = $(ev.currentTarget).get(0); .parents(embeddedDocumentListEntryProperties.Item.selector)
const id = $(ev.currentTarget).parents(".item").data("itemId"); .data(embeddedDocumentListEntryProperties.Item.idDataAttribute);
const item = this.actor.items.get(id); const item = this.actor.items.get(id);
if (!item) { enforce(item, getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
throw new Error(getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name })); enforce(item.sheet);
} item.sheet.render(true);
const itemObject = item.toObject();
const property: string | undefined = $(ev.currentTarget).data("property");
// Early return:
// Disabled => do nothing
if (el.disabled || el.getAttribute("disabled")) return;
// name not given => raise
if (property === undefined) {
throw TypeError("HTML element does not provide 'data-property' attribute");
}
// Set new value
const newValue = this.getValue(el);
foundry.utils.setProperty(itemObject, property, newValue);
item.update(itemObject);
} }
/** /**
* Collect the value of a form element depending on the element's type * Deletes the embedded item corresponding to the clicked element.
* The value is parsed to: *
* - Checkbox: boolean * @param event - The originating click event
* - Text input: string
* - Number: number
* @param el - The input element to collect the value of
*/ */
private getValue(el: HTMLFormElement): boolean | string | number { protected onDeleteItem(event: JQuery.ClickEvent): void {
// One needs to differentiate between e.g. checkboxes (value="on") and select boxes etc. const li = $(event.currentTarget).parents(embeddedDocumentListEntryProperties.Item.selector);
// Checkbox: this.actor.deleteEmbeddedDocuments("Item", [li.data(embeddedDocumentListEntryProperties.Item.idDataAttribute)]);
if (el.type === "checkbox") { li.slideUp(200, () => this.render(false));
const value: boolean = el.checked; }
return value;
/**
* Applies a change to a property of an embedded item depending on the `data-property` attribute of the
* {@link HTMLInputElement} that has been changed and its new value.
*
* @param event - The originating change event
*/
protected onChangeItem(event: JQuery.ChangeEvent): void {
return this.onChangeEmbeddedDocument(event, "Item");
}
/**
* Handles a click on an element of this sheet to control an embedded effect of the actor corresponding to this
* sheet.
*
* @param event - The originating click event
*/
protected onControlEffect(event: JQuery.ClickEvent): void {
event.preventDefault();
const a = event.currentTarget;
switch (a.dataset["action"]) {
case "create":
return this.onCreateEffect();
case "edit":
return this.onEditEffect(event);
case "delete":
return this.onDeleteEffect(event);
} }
}
// Text input: /**
else if (el.type === "text") { * Creates a new embedded effect.
const value: string = el.value; *
return value; * @param event - The originating click event
} */
protected onCreateEffect(): void {
const effectData = {
label: getGame().i18n.localize(`DS4.NewEffectLabel`),
icon: "icons/svg/aura.svg",
origin: this.actor.uuid,
};
ActiveEffect.create(effectData, { parent: this.actor });
}
// Numbers: /**
else if (el.type === "number") { * Opens the sheet of the embedded effect corresponding to the clicked element.
const value = Number(el.value.trim()); *
return value; * @param event - The originating click event
} */
protected onEditEffect(event: JQuery.ClickEvent): void {
const id = $(event.currentTarget)
.parents(embeddedDocumentListEntryProperties.ActiveEffect.selector)
.data(embeddedDocumentListEntryProperties.ActiveEffect.idDataAttribute);
const effect = this.actor.effects.get(id);
enforce(effect, getGame().i18n.format("DS4.ErrorActorDoesNotHaveEffect", { id, actor: this.actor.name }));
effect.sheet.render(true);
}
// // Ranges: /**
// else if (el.type === "range") { * Deletes the embedded item corresponding to the clicked element.
// const value: string = el.value.trim(); *
// return value; * @param event - The originating click event
// } */
protected onDeleteEffect(event: JQuery.ClickEvent): void {
const li = $(event.currentTarget).parents(embeddedDocumentListEntryProperties.ActiveEffect.selector);
const id = li.data(embeddedDocumentListEntryProperties.ActiveEffect.idDataAttribute);
this.actor.deleteEmbeddedDocuments("ActiveEffect", [id]);
li.slideUp(200, () => this.render(false));
}
// // Radio Checkboxes (untested, cf. FormDataExtended.process) /**
// else if (el.type === "radio") { * Applies a change to a property of an embedded effect depending on the `data-property` attribute of the
// const chosen: HTMLFormElement = el.find((r: HTMLFormElement) => r["checked"]); * {@link HTMLInputElement} that has been changed and its new value.
// const value: string = chosen ? chosen.value : null; *
// return value; * @param event - The originating change event
// } */
protected onChangeEffect(event: JQuery.ChangeEvent): void {
return this.onChangeEmbeddedDocument(event, "ActiveEffect");
}
// // Multi-Select (untested, cf. FormDataExtended.process) /**
// else if (el.type === "select-multiple") { * Applies a change to a property of an embedded document of the actor belonging to this sheet. The change depends
// const value: Array<string> = []; * on the `data-property` attribute of the {@link HTMLInputElement} that has been changed and its new value.
// el.options.array.forEach((opt: HTMLOptionElement) => { *
// if (opt.selected) value.push(opt.value); * @param event - The originating change event
// }); * @param documentName - The name of the embedded document to be changed.
// return value; */
protected onChangeEmbeddedDocument(event: JQuery.ChangeEvent, documentName: "Item" | "ActiveEffect"): void {
event.preventDefault();
const element = $(event.currentTarget).get(0);
enforce(element instanceof HTMLInputElement);
if (element.disabled) return;
// unsupported: const effectElement = element.closest(embeddedDocumentListEntryProperties[documentName].selector);
else { enforce(effectElement instanceof HTMLElement);
throw new TypeError("Binding of item property to this type of HTML element not supported; given: " + el); const id = effectElement.dataset[embeddedDocumentListEntryProperties[documentName].idDataAttribute];
const property = element.dataset["property"];
enforce(property !== undefined, TypeError("HTML element does not provide 'data-property' attribute"));
const newValue = this.parseValue(element);
this.actor.updateEmbeddedDocuments(documentName, [{ _id: id, [property]: newValue }]);
}
/**
* Parses the value of the given {@link HTMLInputElement} depending on the element's type
* The value is parsed to:
* - checkbox: `boolean`, if the attribute `data-inverted` is set to a truthy value, the parsed value is inverted
* - text input: `string`
* - number: `number`
*
* @param element - The input element to parse the value from
*/
protected parseValue(element: HTMLInputElement): boolean | string | number {
switch (element.type) {
case "checkbox": {
const inverted = Boolean(element.dataset["inverted"]);
const value: boolean = element.checked;
return inverted ? !value : value;
}
case "text": {
const value: string = element.value;
return value;
}
case "number": {
const value = Number(element.value.trim());
return value;
}
default: {
throw new TypeError(
"Binding of item property to this type of HTML element not supported; given: " + element,
);
}
} }
} }
@ -239,11 +307,11 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
*/ */
protected onRollItem(event: JQuery.ClickEvent): void { protected onRollItem(event: JQuery.ClickEvent): void {
event.preventDefault(); event.preventDefault();
const id = $(event.currentTarget).parents(".item").data("itemId"); const id = $(event.currentTarget)
.parents(embeddedDocumentListEntryProperties.Item.selector)
.data(embeddedDocumentListEntryProperties.Item.idDataAttribute);
const item = this.actor.items.get(id); const item = this.actor.items.get(id);
if (!item) { enforce(item, getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
throw new Error(getGame().i18n.format("DS4.ErrorActorDoesNotHaveItem", { id, actor: this.actor.name }));
}
item.roll().catch((e) => notifications.error(e, { log: true })); item.roll().catch((e) => notifications.error(e, { log: true }));
} }
@ -265,7 +333,7 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
const check = target.dataset.check; const check = target.dataset.check;
if (!check) return super._onDragStart(event); if (!check) return super._onDragStart(event);
if (!isCheck(check)) throw new Error(getGame().i18n.format("DS4.ErrorCannotDragMissingCheck", { check })); enforce(isCheck(check), getGame().i18n.format("DS4.ErrorCannotDragMissingCheck", { check }));
const dragData = { const dragData = {
actorId: this.actor.id, actorId: this.actor.id,
@ -280,7 +348,7 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
/** @override */ /** @override */
protected async _onDropItem(event: DragEvent, data: ActorSheet.DropData.Item): Promise<unknown> { protected async _onDropItem(event: DragEvent, data: ActorSheet.DropData.Item): Promise<unknown> {
const item = await DS4Item.fromDropData(data); const item = await Item.fromDropData(data);
if (item && !this.actor.canOwnItemType(item.data.type)) { if (item && !this.actor.canOwnItemType(item.data.type)) {
notifications.warn( notifications.warn(
getGame().i18n.format("DS4.WarningActorCannotOwnItem", { getGame().i18n.format("DS4.WarningActorCannotOwnItem", {
@ -299,5 +367,27 @@ export class DS4ActorSheet extends ActorSheet<ActorSheet.Options, DS4ActorSheetD
interface DS4ActorSheetData extends ActorSheet.Data<ActorSheet.Options> { interface DS4ActorSheetData extends ActorSheet.Data<ActorSheet.Options> {
config: typeof DS4; config: typeof DS4;
itemsByType: Record<string, foundry.data.ItemData[]>; itemsByType: Record<string, foundry.data.ItemData[]>;
enrichedEffects: EnrichedActiveEffectDataSource[];
settings: DS4Settings; settings: DS4Settings;
} }
type ActiveEffectDataSource = foundry.data.ActiveEffectData["_source"];
interface EnrichedActiveEffectDataSource extends ActiveEffectDataSource {
icon: string;
sourceName: string;
}
/**
* This object contains information about specific properties embedded document list entries for each different type.
*/
const embeddedDocumentListEntryProperties = Object.freeze({
ActiveEffect: {
selector: ".effect",
idDataAttribute: "effectId",
},
Item: {
selector: ".item",
idDataAttribute: "itemId",
},
});

View file

@ -8,30 +8,33 @@ export default async function registerHandlebarsPartials(): Promise<void> {
const templatePaths = [ const templatePaths = [
"systems/ds4/templates/sheets/actor/components/actor-header.hbs", "systems/ds4/templates/sheets/actor/components/actor-header.hbs",
"systems/ds4/templates/sheets/actor/components/actor-progression.hbs", "systems/ds4/templates/sheets/actor/components/actor-progression.hbs",
"systems/ds4/templates/sheets/actor/components/add-button.hbs",
"systems/ds4/templates/sheets/actor/components/biography.hbs", "systems/ds4/templates/sheets/actor/components/biography.hbs",
"systems/ds4/templates/sheets/actor/components/character-properties.hbs", "systems/ds4/templates/sheets/actor/components/character-properties.hbs",
"systems/ds4/templates/sheets/actor/components/check.hbs", "systems/ds4/templates/sheets/actor/components/check.hbs",
"systems/ds4/templates/sheets/actor/components/checks.hbs", "systems/ds4/templates/sheets/actor/components/checks.hbs",
"systems/ds4/templates/sheets/actor/components/combat-value.hbs", "systems/ds4/templates/sheets/actor/components/combat-value.hbs",
"systems/ds4/templates/sheets/actor/components/combat-values.hbs", "systems/ds4/templates/sheets/actor/components/combat-values.hbs",
"systems/ds4/templates/sheets/actor/components/control-button-group.hbs",
"systems/ds4/templates/sheets/actor/components/core-value.hbs", "systems/ds4/templates/sheets/actor/components/core-value.hbs",
"systems/ds4/templates/sheets/actor/components/core-values.hbs", "systems/ds4/templates/sheets/actor/components/core-values.hbs",
"systems/ds4/templates/sheets/actor/components/creature-properties.hbs", "systems/ds4/templates/sheets/actor/components/creature-properties.hbs",
"systems/ds4/templates/sheets/actor/components/currency.hbs", "systems/ds4/templates/sheets/actor/components/currency.hbs",
"systems/ds4/templates/sheets/actor/components/effect-list-entry.hbs",
"systems/ds4/templates/sheets/actor/components/effect-list-header.hbs",
"systems/ds4/templates/sheets/actor/components/item-list-entry.hbs", "systems/ds4/templates/sheets/actor/components/item-list-entry.hbs",
"systems/ds4/templates/sheets/actor/components/item-list-header.hbs", "systems/ds4/templates/sheets/actor/components/item-list-header.hbs",
"systems/ds4/templates/sheets/actor/components/items-overview.hbs", "systems/ds4/templates/sheets/actor/components/items-overview.hbs",
"systems/ds4/templates/sheets/actor/components/overview-add-button.hbs",
"systems/ds4/templates/sheets/actor/components/overview-control-buttons.hbs",
"systems/ds4/templates/sheets/actor/components/profile.hbs", "systems/ds4/templates/sheets/actor/components/profile.hbs",
"systems/ds4/templates/sheets/actor/components/rollable-image.hbs", "systems/ds4/templates/sheets/actor/components/rollable-image.hbs",
"systems/ds4/templates/sheets/actor/components/talent-rank-equation.hbs", "systems/ds4/templates/sheets/actor/components/talent-rank-equation.hbs",
"systems/ds4/templates/sheets/actor/tabs/abilities.hbs",
"systems/ds4/templates/sheets/actor/tabs/biography.hbs", "systems/ds4/templates/sheets/actor/tabs/biography.hbs",
"systems/ds4/templates/sheets/actor/tabs/character-abilities.hbs",
"systems/ds4/templates/sheets/actor/tabs/character-inventory.hbs", "systems/ds4/templates/sheets/actor/tabs/character-inventory.hbs",
"systems/ds4/templates/sheets/actor/tabs/creature-abilities.hbs",
"systems/ds4/templates/sheets/actor/tabs/creature-inventory.hbs", "systems/ds4/templates/sheets/actor/tabs/creature-inventory.hbs",
"systems/ds4/templates/sheets/actor/tabs/description.hbs", "systems/ds4/templates/sheets/actor/tabs/description.hbs",
"systems/ds4/templates/sheets/actor/tabs/special-creature-abilities.hbs", "systems/ds4/templates/sheets/actor/tabs/effects.hbs",
"systems/ds4/templates/sheets/actor/tabs/spells.hbs", "systems/ds4/templates/sheets/actor/tabs/spells.hbs",
"systems/ds4/templates/sheets/actor/tabs/values.hbs", "systems/ds4/templates/sheets/actor/tabs/values.hbs",
"systems/ds4/templates/sheets/item/components/body.hbs", "systems/ds4/templates/sheets/item/components/body.hbs",

View file

@ -15,3 +15,7 @@ export function getGame(): Game {
} }
return game; return game;
} }
export function getGameSafe(): Game | undefined {
return game instanceof Game ? game : undefined;
}

View file

@ -99,8 +99,9 @@ export class DS4ItemSheet extends ItemSheet<ItemSheet.Options, DS4ItemSheetData>
*/ */
protected async createActiveEffect(): Promise<ActiveEffect | undefined> { protected async createActiveEffect(): Promise<ActiveEffect | undefined> {
const createData = { const createData = {
label: "New Effect", label: getGame().i18n.localize(`DS4.NewEffectLabel`),
icon: "icons/svg/aura.svg", icon: "icons/svg/aura.svg",
origin: this.item.uuid,
}; };
return ActiveEffect.create(createData, { parent: this.item }); return ActiveEffect.create(createData, { parent: this.item });

View file

@ -38,7 +38,7 @@ async function getOrCreateRollItemMacro(itemData: foundry.data.ItemData["_source
} }
/** /**
* Executes the roll item macro for the given itemId. * Executes the roll item macro for the item associated to the given `itemId`.
*/ */
export async function rollItem(itemId: string): Promise<void> { export async function rollItem(itemId: string): Promise<void> {
const actor = getActiveActor(); const actor = getActiveActor();

View file

@ -5,10 +5,12 @@
import { getGame } from "./helpers"; import { getGame } from "./helpers";
export function registerSystemSettings(): void { export function registerSystemSettings(): void {
const game = getGame();
/** /**
* Track the migrations version of the latest migration that has been applied * Track the migrations version of the latest migration that has been applied
*/ */
getGame().settings.register("ds4", "systemMigrationVersion", { game.settings.register("ds4", "systemMigrationVersion", {
name: "System Migration Version", name: "System Migration Version",
scope: "world", scope: "world",
config: false, config: false,
@ -16,7 +18,7 @@ export function registerSystemSettings(): void {
default: -1, default: -1,
}); });
getGame().settings.register("ds4", "useSlayingDiceForAutomatedChecks", { game.settings.register("ds4", "useSlayingDiceForAutomatedChecks", {
name: "DS4.SettingUseSlayingDiceForAutomatedChecksName", name: "DS4.SettingUseSlayingDiceForAutomatedChecksName",
hint: "DS4.SettingUseSlayingDiceForAutomatedChecksHint", hint: "DS4.SettingUseSlayingDiceForAutomatedChecksHint",
scope: "world", scope: "world",
@ -25,7 +27,7 @@ export function registerSystemSettings(): void {
default: false, default: false,
}); });
getGame().settings.register("ds4", "showSlayerPoints", { game.settings.register("ds4", "showSlayerPoints", {
name: "DS4.SettingShowSlayerPointsName", name: "DS4.SettingShowSlayerPointsName",
hint: "DS4.SettingShowSlayerPointsHint", hint: "DS4.SettingShowSlayerPointsHint",
scope: "world", scope: "world",
@ -42,9 +44,10 @@ export interface DS4Settings {
} }
export function getDS4Settings(): DS4Settings { export function getDS4Settings(): DS4Settings {
const game = getGame();
return { return {
systemMigrationVersion: getGame().settings.get("ds4", "systemMigrationVersion"), systemMigrationVersion: game.settings.get("ds4", "systemMigrationVersion"),
useSlayingDiceForAutomatedChecks: getGame().settings.get("ds4", "useSlayingDiceForAutomatedChecks"), useSlayingDiceForAutomatedChecks: game.settings.get("ds4", "useSlayingDiceForAutomatedChecks"),
showSlayerPoints: getGame().settings.get("ds4", "showSlayerPoints"), showSlayerPoints: game.settings.get("ds4", "showSlayerPoints"),
}; };
} }

24
src/module/utils.ts Normal file
View file

@ -0,0 +1,24 @@
// SPDX-FileCopyrightText: 2021 Johannes Loher
//
// SPDX-License-Identifier: MIT
import { getGameSafe } from "./helpers";
/**
* Tests if the given `value` is truthy.
*
* If it is not truthy, an {@link Error} is thrown, which depends on the given `message` parameter:
* - If `message` is a string`, it is used to construct a new {@link Error} which then is thrown.
* - If `message` is an instance of {@link Error}, it is thrown.
* - If `message` is `undefined`, an {@link Error} with a default message is thrown.
*/
export function enforce(value: unknown, message?: string | Error): asserts value {
if (!value) {
if (!message) {
message =
getGameSafe()?.i18n.localize("DS4.ErrorUnexpectedError") ??
"There was an unexpected error in the Dungeonslayers 4 system. For more details, please take a look at the console (F12).";
}
throw message instanceof Error ? message : new Error(message);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: 2021 Johannes Loher
*
* SPDX-License-Identifier: MIT
*/
.ds4-control-button-group {
display: flex;
text-align: center;
width: 100%;
padding: 0 calc(1em / 3);
&__button {
flex: 1;
}
}

View file

@ -8,7 +8,7 @@
@use "../utils/mixins"; @use "../utils/mixins";
@use "../utils/variables"; @use "../utils/variables";
.ds4-item-list { .ds4-embedded-document-list {
@include mixins.mark-invalid-or-disabled-input; @include mixins.mark-invalid-or-disabled-input;
$row-height: 1.75em; $row-height: 1.75em;
@ -23,24 +23,51 @@
&--weapon { &--weapon {
grid-template-columns: $row-height $row-height 3ch 3fr $row-height 1fr 3ch 5fr 5ch; grid-template-columns: $row-height $row-height 3ch 3fr $row-height 1fr 3ch 5fr 5ch;
:nth-child(9n + 1),
:nth-child(9n + 5),
:nth-child(9n + 6),
:nth-child(9n + 7) {
justify-self: center;
}
} }
&--armor { &--armor {
grid-template-columns: $row-height $row-height 3ch 3fr 1fr 1fr 3ch 5fr 5ch; grid-template-columns: $row-height $row-height 3ch 3fr 1fr 1fr 3ch 5fr 5ch;
:nth-child(9n + 1),
:nth-child(9n + 7) {
justify-self: center;
}
} }
&--shield { &--shield {
grid-template-columns: $row-height $row-height 3ch 1fr 3ch 3fr 5ch; grid-template-columns: $row-height $row-height 3ch 1fr 3ch 3fr 5ch;
:nth-child(7n + 1),
:nth-child(7n + 5) {
justify-self: center;
}
} }
&--equipment { &--equipment {
grid-template-columns: $row-height $row-height 3ch 1fr 10ch 3fr 5ch; grid-template-columns: $row-height $row-height 3ch 1fr 10ch 3fr 5ch;
:nth-child(7n + 1) {
justify-self: center;
}
} }
&--loot { &--loot {
grid-template-columns: $row-height 3ch 1fr 10ch 3fr 5ch; grid-template-columns: $row-height 3ch 1fr 10ch 3fr 5ch;
} }
&--spell { &--spell {
grid-template-columns: $row-height $row-height 2fr $row-height 1fr 1fr 1fr 1fr 5ch; grid-template-columns: $row-height $row-height 2fr $row-height 1fr 1fr 1fr 1fr 5ch;
:nth-child(9n + 1),
:nth-child(9n + 4),
:nth-child(9n + 6),
:nth-child(9n + 7),
:nth-child(9n + 8) {
justify-self: center;
}
} }
&--talent { &--talent {
grid-template-columns: $row-height 1fr 21ch 3fr 5ch; grid-template-columns: $row-height 1fr 21ch 3fr 5ch;
:nth-child(9n + 3) {
justify-self: center;
}
} }
&--racial-ability, &--racial-ability,
&--language, &--language,
@ -49,6 +76,13 @@
grid-template-columns: $row-height 1fr 3fr 5ch; grid-template-columns: $row-height 1fr 3fr 5ch;
} }
&--effect {
grid-template-columns: $row-height $row-height 3fr 2fr 5ch;
:nth-child(5n + 1) {
justify-self: center;
}
}
&__row { &__row {
display: contents; // TODO: Once chromium supports `grid-template-columns: subgrid` (https://bugs.chromium.org/p/chromium/issues/detail?id=618969), switch to `display: grid; grid: 1/-1; grid-template-columns: subgrid` display: contents; // TODO: Once chromium supports `grid-template-columns: subgrid` (https://bugs.chromium.org/p/chromium/issues/detail?id=618969), switch to `display: grid; grid: 1/-1; grid-template-columns: subgrid`
@ -96,17 +130,9 @@
text-overflow: ellipsis; text-overflow: ellipsis;
} }
} }
&__control-buttons {
display: grid;
grid-template-columns: 1fr 1fr;
text-align: center;
width: 100%;
padding: 0 calc(1em / 3);
}
} }
.ds4-item-list-title { .ds4-embedded-document-list-title {
border-bottom: variables.$border-groove; border-bottom: variables.$border-groove;
font-weight: bold; font-weight: bold;
margin-bottom: 0; margin-bottom: 0;

View file

@ -29,12 +29,13 @@
@include meta.load-css("components/checks"); @include meta.load-css("components/checks");
@include meta.load-css("components/combat_value"); @include meta.load-css("components/combat_value");
@include meta.load-css("components/combat_values"); @include meta.load-css("components/combat_values");
@include meta.load-css("components/control_button_group");
@include meta.load-css("components/core_value"); @include meta.load-css("components/core_value");
@include meta.load-css("components/core_values"); @include meta.load-css("components/core_values");
@include meta.load-css("components/currency"); @include meta.load-css("components/currency");
@include meta.load-css("components/description"); @include meta.load-css("components/description");
@include meta.load-css("components/embedded_document_list");
@include meta.load-css("components/forms"); @include meta.load-css("components/forms");
@include meta.load-css("components/item_list");
@include meta.load-css("components/profile"); @include meta.load-css("components/profile");
@include meta.load-css("components/rollable_image"); @include meta.load-css("components/rollable_image");
@include meta.load-css("components/sheet_tab_nav"); @include meta.load-css("components/sheet_tab_nav");

View file

@ -1,11 +1,10 @@
{ {
"name": "ds4", "name": "ds4",
"title": "Dungeonslayers 4", "title": "Dungeonslayers 4",
"description": "The Dungeonslayers 4 system for FoundryVTT. Dungeonslayers by Christian Kennig is licensed under CC BY-NC-SA 3.0 (https://creativecommons.org/licenses/by-nc-sa/3.0/). The icons by the authors of Game-icons.net are licensed under CC BY 3.0 (https://creativecommons.org/licenses/by/3.0/). The creature images by Devin Night (https://immortalnights.com/) and are licensed under the terms described at https://immortalnights.com/tokens/token-usage-rights/.", "description": "The Dungeonslayers 4 system for FoundryVTT. Dungeonslayers by Christian Kennig is licensed under CC BY-NC-SA 3.0 (https://creativecommons.org/licenses/by-nc-sa/3.0/). The icons by the authors of Game-icons.net are licensed under CC BY 3.0 (https://creativecommons.org/licenses/by/3.0/). The token images by Devin Night (https://immortalnights.com/) and are licensed under the terms described at https://immortalnights.com/tokens/token-usage-rights/.",
"version": "1.1.3", "version": "1.2.1",
"minimumCoreVersion": "0.8.8", "minimumCoreVersion": "0.8.8",
"compatibleCoreVersion": "0.8.8", "compatibleCoreVersion": "0.8.8",
"templateVersion": 6,
"author": "Johannes Loher, Gesina Schwalbe, Oliver Rümpelein, Siegfried Krug, Max Tharr, Sascha Martens", "author": "Johannes Loher, Gesina Schwalbe, Oliver Rümpelein, Siegfried Krug, Max Tharr, Sascha Martens",
"authors": [ "authors": [
{ {
@ -93,7 +92,7 @@
"primaryTokenAttribute": "combatValues.hitPoints", "primaryTokenAttribute": "combatValues.hitPoints",
"url": "https://git.f3l.de/dungeonslayers/ds4", "url": "https://git.f3l.de/dungeonslayers/ds4",
"manifest": "https://git.f3l.de/dungeonslayers/ds4/-/raw/latest/src/system.json?inline=false", "manifest": "https://git.f3l.de/dungeonslayers/ds4/-/raw/latest/src/system.json?inline=false",
"download": "https://git.f3l.de/dungeonslayers/ds4/-/jobs/artifacts/1.1.3/download?job=build", "download": "https://git.f3l.de/dungeonslayers/ds4/-/jobs/artifacts/1.2.1/download?job=build",
"license": "https://git.f3l.de/dungeonslayers/ds4#licensing", "license": "https://git.f3l.de/dungeonslayers/ds4#licensing",
"initiative": "@combatValues.initiative.total", "initiative": "@combatValues.initiative.total",
"manifestPlusVersion": "1.0.0", "manifestPlusVersion": "1.0.0",

View file

@ -18,6 +18,7 @@ SPDX-License-Identifier: MIT
<a class="ds4-sheet-tab-nav__item item" data-tab="inventory">{{localize 'DS4.HeadingInventory'}}</a> <a class="ds4-sheet-tab-nav__item item" data-tab="inventory">{{localize 'DS4.HeadingInventory'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="spells">{{localize 'DS4.HeadingSpells'}}</a> <a class="ds4-sheet-tab-nav__item item" data-tab="spells">{{localize 'DS4.HeadingSpells'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="abilities">{{localize 'DS4.HeadingAbilities'}}</a> <a class="ds4-sheet-tab-nav__item item" data-tab="abilities">{{localize 'DS4.HeadingAbilities'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="effects">{{localize 'DS4.HeadingEffects'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="biography">{{localize 'DS4.HeadingBiography'}}</a> <a class="ds4-sheet-tab-nav__item item" data-tab="biography">{{localize 'DS4.HeadingBiography'}}</a>
</nav> </nav>
@ -35,7 +36,10 @@ SPDX-License-Identifier: MIT
{{> systems/ds4/templates/sheets/actor/tabs/spells.hbs}} {{> systems/ds4/templates/sheets/actor/tabs/spells.hbs}}
{{!-- Abilities Tab --}} {{!-- Abilities Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/abilities.hbs}} {{> systems/ds4/templates/sheets/actor/tabs/character-abilities.hbs}}
{{!-- Effects Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/effects.hbs}}
{{!-- Biography Tab --}} {{!-- Biography Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/biography.hbs}} {{> systems/ds4/templates/sheets/actor/tabs/biography.hbs}}

View file

@ -0,0 +1,20 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!
!-- Render an "add" button.
!-- @param documentType: The type of document this button controls, item or effect
!-- @param title: The title to use for the link element (will be localized)
!-- @param type: An optional property to use as data-type attribute
}}
<div>
<a class="control-{{documentType}}" title="{{localize title}}" data-action="create" {{#if type}}data-type="{{type}}"
{{/if}}>
<i class="fas fa-plus"></i>
{{localize "DS4.UserInteractionAdd"}}
</a>
</div>

View file

@ -0,0 +1,20 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!--
!-- Render a group of an "edit" and a "delete" button.
!-- The current item is defined by the a corresponding id attribute of the parent li element.
!-- @param documentType: The type of document that is controlled by this button group, item or effect
!-- @param editTitle: The title to use for the edit link element (will be localized)
!-- @param deleteTitle: The title to use for the delete link element (will be localized)
--}}
<div class="ds4-control-button-group">
<a class="ds4-control-button-group__button control-{{documentType}}" data-action="edit"
title="{{localize editTitle}}"><i class="fas fa-edit"></i></a>
<a class="ds4-control-button-group__button control-{{documentType}}" data-action="delete"
title="{{localize deleteTitle}}"><i class="fas fa-trash"></i></a>
</div>

View file

@ -10,7 +10,7 @@ SPDX-License-Identifier: MIT
<div class="ds4-currency"> <div class="ds4-currency">
{{#each data.data.currency as |value key|}} {{#each data.data.currency as |value key|}}
<label for="data.currency.{{key}}" class="flex05">{{lookup ../config.i18n.characterCurrency key}}</label> <label for="data.currency.{{key}}" class="flex05">{{lookup ../config.i18n.characterCurrency key}}</label>
<input class="ds4-currency__value ds4-currency__value--{{key}} item-change" type="number" min="0" step="1" <input class="ds4-currency__value ds4-currency__value--{{key}} change-item" type="number" min="0" step="1"
name="data.currency.{{key}}" id="data.currency.{{key}}" value="{{value}}" data-dtype="Number" /> name="data.currency.{{key}}" id="data.currency.{{key}}" value="{{value}}" data-dtype="Number" />
{{/each}} {{/each}}
</div> </div>

View file

@ -0,0 +1,31 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!--
!-- Render an effect list entry row.
!-- @param effectData: The data of the item.
--}}
<li class="ds4-embedded-document-list__row effect" data-effect-id="{{effectData._id}}">
{{!-- enabled --}}
<input class="ds4-embedded-document-list__editable ds4-embedded-document-list__editable--checkbox change-effect" type="checkbox" {{checked
(ne effectData.disabled true)}} data-dtype="Boolean" data-property="disabled" data-inverted="true"
title="{{localize 'DS4.EffectEnabled'}}">
{{!-- icon --}}
{{> systems/ds4/templates/sheets/actor/components/rollable-image.hbs rollable=false src=effectData.icon
alt=(localize "DS4.EffectIconAltText" label=effectData.label) title=effectData.label}}
{{!-- label --}}
<div title="{{effectData.label}}">{{effectData.label}}</div>
{{!-- source name --}}
<div>{{effectData.sourceName}}</div>
{{!-- control button group --}}
{{> systems/ds4/templates/sheets/actor/components/control-button-group.hbs documentType="effect"
editTitle="DS4.UserInteractionEditEffectTitle" deleteTitle="DS4.UserInteractionDeleteEffectTitle"}}
</li>

View file

@ -0,0 +1,26 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!--
!-- Render an effect list header row.
--}}
<li class="ds4-embedded-document-list__row ds4-embedded-document-list__row--header">
{{!-- enabled --}}
<div title="{{localize 'DS4.EffectEnabled'}}">{{localize 'DS4.EffectEnabledAbbr'}}</div>
{{!-- icon --}}
<div></div>
{{!-- label --}}
<div>{{localize 'DS4.EffectLabel'}}</div>
{{!-- source name --}}
<div>{{localize 'DS4.EffectSourceName'}}</div>
{{!-- control buttons placeholder --}}
<div></div>
</li>

View file

@ -15,10 +15,10 @@ SPDX-License-Identifier: MIT
!-- @param hideDescription: A flag to disable the description column. !-- @param hideDescription: A flag to disable the description column.
!-- @param @partial-block: Custom column headers can be passed using the partial block. !-- @param @partial-block: Custom column headers can be passed using the partial block.
--}} --}}
<li class="ds4-item-list__row item" data-item-id="{{itemData._id}}"> <li class="ds4-embedded-document-list__row item" data-item-id="{{itemData._id}}">
{{!-- equipped --}} {{!-- equipped --}}
{{#if isEquipable}} {{#if isEquipable}}
<input class="ds4-item-list__editable ds4-item-list__editable--checkbox item-change" type="checkbox" {{checked <input class="ds4-embedded-document-list__editable ds4-embedded-document-list__editable--checkbox change-item" type="checkbox" {{checked
itemData.data.equipped}} data-dtype="Boolean" data-property="data.equipped" itemData.data.equipped}} data-dtype="Boolean" data-property="data.equipped"
title="{{localize 'DS4.ItemEquipped'}}"> title="{{localize 'DS4.ItemEquipped'}}">
{{/if}} {{/if}}
@ -30,12 +30,12 @@ SPDX-License-Identifier: MIT
{{!-- amount --}} {{!-- amount --}}
{{#if hasQuantity}} {{#if hasQuantity}}
<input class="ds4-item-list__editable item-change" type="number" min="0" step="1" value="{{itemData.data.quantity}}" <input class="ds4-embedded-document-list__editable change-item" type="number" min="0" step="1" value="{{itemData.data.quantity}}"
data-dtype="Number" data-property="data.quantity" title="{{localize 'DS4.Quantity'}}" /> data-dtype="Number" data-property="data.quantity" title="{{localize 'DS4.Quantity'}}" />
{{/if}} {{/if}}
{{!-- name --}} {{!-- name --}}
<input class="ds4-item-list__editable item-change" type="text" value="{{itemData.name}}" data-dtype="String" <input class="ds4-embedded-document-list__editable change-item" type="text" value="{{itemData.name}}" data-dtype="String"
data-property="name" title="{{htmlToPlainText itemData.data.description}}" /> data-property="name" title="{{htmlToPlainText itemData.data.description}}" />
{{!-- item type specifics --}} {{!-- item type specifics --}}
@ -45,11 +45,11 @@ SPDX-License-Identifier: MIT
{{!-- description --}} {{!-- description --}}
{{#unless hideDescription}} {{#unless hideDescription}}
<div class="ds4-item-list__description" title="{{htmlToPlainText itemData.data.description}}"> <div class="ds4-embedded-document-list__description" title="{{htmlToPlainText itemData.data.description}}">
{{{itemData.data.description}}}</div> {{{itemData.data.description}}}</div>
{{/unless}} {{/unless}}
{{!-- control buttons --}} {{!-- control button group --}}
{{> systems/ds4/templates/sheets/actor/components/overview-control-buttons.hbs {{> systems/ds4/templates/sheets/actor/components/control-button-group.hbs documentType="item"
class="ds4-item-list__control-buttons" }} editTitle="DS4.UserInteractionEditItemTitle" deleteTitle="DS4.UserInteractionDeleteItemTitle"}}
</li> </li>

View file

@ -14,7 +14,7 @@ SPDX-License-Identifier: MIT
!-- @param hideDescription: A flag to disable the description column. !-- @param hideDescription: A flag to disable the description column.
!-- @param @partial-block: Custom column headers can be passed using the partial block. !-- @param @partial-block: Custom column headers can be passed using the partial block.
--}} --}}
<li class="ds4-item-list__row ds4-item-list__row--header"> <li class="ds4-embedded-document-list__row ds4-embedded-document-list__row--header">
{{!-- equipped --}} {{!-- equipped --}}
{{#if isEquipable}} {{#if isEquipable}}
<div title="{{localize 'DS4.ItemEquipped'}}">{{localize 'DS4.ItemEquippedAbbr'}}</div> <div title="{{localize 'DS4.ItemEquipped'}}">{{localize 'DS4.ItemEquippedAbbr'}}</div>

View file

@ -7,12 +7,12 @@ SPDX-License-Identifier: MIT
--}} --}}
{{!-- WEAPONS --}} {{!-- WEAPONS --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeWeaponPlural'}}</h4> <h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeWeaponPlural'}}</h4>
{{#unless (isEmpty itemsByType.weapon)}} {{#unless (isEmpty itemsByType.weapon)}}
<ol class="ds4-item-list ds4-item-list--weapon item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--weapon item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}} {{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}}
{{!-- attack type --}} {{!-- attack type --}}
<div class="ds4-item-list__image" title="{{localize 'DS4.AttackType'}}">{{localize 'DS4.AttackTypeAbbr'}}</div> <div class="ds4-embedded-document-list__image" title="{{localize 'DS4.AttackType'}}">{{localize 'DS4.AttackTypeAbbr'}}</div>
{{!-- weapon bonus --}} {{!-- weapon bonus --}}
<div title="{{localize 'DS4.WeaponBonus'}}"> <div title="{{localize 'DS4.WeaponBonus'}}">
@ -29,7 +29,7 @@ SPDX-License-Identifier: MIT
{{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData isEquipable=true {{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData isEquipable=true
hasQuantity=true}} hasQuantity=true}}
{{!-- attack type --}} {{!-- attack type --}}
<img class="ds4-item-list__image" src="{{lookup ../../config.icons.attackTypes itemData.data.attackType}}" <img class="ds4-embedded-document-list__image" src="{{lookup ../../config.icons.attackTypes itemData.data.attackType}}"
title="{{lookup ../../config.i18n.attackTypes itemData.data.attackType}}" /> title="{{lookup ../../config.i18n.attackTypes itemData.data.attackType}}" />
{{!-- weapon bonus --}} {{!-- weapon bonus --}}
@ -41,12 +41,13 @@ SPDX-License-Identifier: MIT
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='weapon'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='weapon'}}
{{!-- ARMOR --}} {{!-- ARMOR --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeArmorPlural'}}</h4> <h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeArmorPlural'}}</h4>
{{#unless (isEmpty itemsByType.armor)}} {{#unless (isEmpty itemsByType.armor)}}
<ol class="ds4-item-list ds4-item-list--armor item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--armor item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}} {{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}}
{{!-- armor material type --}} {{!-- armor material type --}}
<div title="{{localize 'DS4.ArmorMaterialType'}}">{{localize 'DS4.ArmorMaterialTypeAbbr'}}</div> <div title="{{localize 'DS4.ArmorMaterialType'}}">{{localize 'DS4.ArmorMaterialTypeAbbr'}}</div>
@ -79,12 +80,13 @@ SPDX-License-Identifier: MIT
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='armor'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='armor'}}
{{!-- SHIELD --}} {{!-- SHIELD --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeShieldPlural'}}</h4> <h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeShieldPlural'}}</h4>
{{#unless (isEmpty itemsByType.shield)}} {{#unless (isEmpty itemsByType.shield)}}
<ol class="ds4-item-list ds4-item-list--shield item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--shield item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}} {{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}}
{{!-- armor value --}} {{!-- armor value --}}
<div title="{{localize 'DS4.ArmorValue'}}"> <div title="{{localize 'DS4.ArmorValue'}}">
@ -100,12 +102,13 @@ SPDX-License-Identifier: MIT
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='shield'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='shield'}}
{{!-- EQUIPMENT --}} {{!-- EQUIPMENT --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeEquipmentPlural'}}</h4> <h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeEquipmentPlural'}}</h4>
{{#unless (isEmpty itemsByType.equipment)}} {{#unless (isEmpty itemsByType.equipment)}}
<ol class="ds4-item-list ds4-item-list--equipment item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--equipment item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}} {{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hasQuantity=true}}
{{!-- storage location --}} {{!-- storage location --}}
<div>{{localize 'DS4.StorageLocation'}}</div> <div>{{localize 'DS4.StorageLocation'}}</div>
@ -114,18 +117,19 @@ SPDX-License-Identifier: MIT
{{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData isEquipable=true {{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData isEquipable=true
hasQuantity=true}} hasQuantity=true}}
{{!-- storage location --}} {{!-- storage location --}}
<input class="ds4-item-list__editable item-change" type="text" value="{{itemData.data.storageLocation}}" <input class="ds4-embedded-document-list__editable change-item" type="text" value="{{itemData.data.storageLocation}}"
data-dtype="String" data-property="data.storageLocation" title="{{localize 'DS4.StorageLocation'}}"> data-dtype="String" data-property="data.storageLocation" title="{{localize 'DS4.StorageLocation'}}">
{{/systems/ds4/templates/sheets/actor/components/item-list-entry.hbs}} {{/systems/ds4/templates/sheets/actor/components/item-list-entry.hbs}}
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='equipment'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='equipment'}}
{{!-- LOOT --}} {{!-- LOOT --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeLootPlural'}}</h4> <h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeLootPlural'}}</h4>
{{#unless (isEmpty itemsByType.loot)}} {{#unless (isEmpty itemsByType.loot)}}
<ol class="ds4-item-list ds4-item-list--loot item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--loot item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs hasQuantity=true}} {{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs hasQuantity=true}}
{{!-- storage location --}} {{!-- storage location --}}
<div>{{localize 'DS4.StorageLocation'}}</div> <div>{{localize 'DS4.StorageLocation'}}</div>
@ -133,10 +137,11 @@ SPDX-License-Identifier: MIT
{{#each itemsByType.loot as |itemData id|}} {{#each itemsByType.loot as |itemData id|}}
{{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData hasQuantity=true}} {{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData hasQuantity=true}}
{{!-- storage location --}} {{!-- storage location --}}
<input class="ds4-item-list__editable item-change" type="text" value="{{itemData.data.storageLocation}}" <input class="ds4-embedded-document-list__editable change-item" type="text" value="{{itemData.data.storageLocation}}"
data-dtype="String" data-property="data.storageLocation" title="{{localize 'DS4.StorageLocation'}}"> data-dtype="String" data-property="data.storageLocation" title="{{localize 'DS4.StorageLocation'}}">
{{/systems/ds4/templates/sheets/actor/components/item-list-entry.hbs}} {{/systems/ds4/templates/sheets/actor/components/item-list-entry.hbs}}
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='loot'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='loot'}}

View file

@ -1,17 +0,0 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!
!-- Render an "add" button for adding an item of given data type.
!-- @param dataType: hand over the dataType to the partial as hash parameter
}}
<div class="item-controls">
<a class="item-control item-create" title="Create item" data-type="{{dataType}}">
<i class="fas fa-plus"></i>
{{localize "DS4.UserInteractionAddItem"}}
</a>
</div>

View file

@ -1,17 +0,0 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
{{!--
!-- Render a group of an "edit" and a "delete" button for the current item.
!-- The current item is defined by the data-item-id HTML property of the parent li element.
!-- @param class: Additional CSS class(es) for the controls
--}}
<div class="item-controls {{class}}">
<a class="item-control item-edit" title="{{localize 'DS4.UserInteractionEditItem'}}"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="{{localize 'DS4.UserInteractionDeleteItem'}}"><i
class="fas fa-trash"></i></a>
</div>

View file

@ -18,7 +18,7 @@ disable the input element
!-- @param localizeString: The string to use as key for the localized tooltip !-- @param localizeString: The string to use as key for the localized tooltip
--}} --}}
{{#*inline "talentRankValue"}} {{#*inline "talentRankValue"}}
<input class="ds4-talent-rank-equation__value item-change" data-dtype="Number" type="number" min="0" step="1" {{#if (eq <input class="ds4-talent-rank-equation__value change-item" data-dtype="Number" type="number" min="0" step="1" {{#if (eq
property 'base' ) }}max="{{talentRank.max}}" {{/if}} {{disabled}} data-property="data.rank.{{property}}" property 'base' ) }}max="{{talentRank.max}}" {{/if}} {{disabled}} data-property="data.rank.{{property}}"
value="{{lookup talentRank property}}" title="{{localize localizeString}}" /> value="{{lookup talentRank property}}" title="{{localize localizeString}}" />
{{/inline}} {{/inline}}

View file

@ -17,9 +17,9 @@ SPDX-License-Identifier: MIT
<nav class="ds4-sheet-tab-nav sheet-tabs tabs" data-group="primary"> <nav class="ds4-sheet-tab-nav sheet-tabs tabs" data-group="primary">
<a class="ds4-sheet-tab-nav__item item" data-tab="values">{{localize 'DS4.HeadingValues'}}</a> <a class="ds4-sheet-tab-nav__item item" data-tab="values">{{localize 'DS4.HeadingValues'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="inventory">{{localize 'DS4.HeadingInventory'}}</a> <a class="ds4-sheet-tab-nav__item item" data-tab="inventory">{{localize 'DS4.HeadingInventory'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="special-creature-abilities">{{localize
'DS4.HeadingSpecialCreatureAbilities'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="spells">{{localize 'DS4.HeadingSpells'}}</a> <a class="ds4-sheet-tab-nav__item item" data-tab="spells">{{localize 'DS4.HeadingSpells'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="abilities">{{localize 'DS4.HeadingAbilities'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="effects">{{localize 'DS4.HeadingEffects'}}</a>
<a class="ds4-sheet-tab-nav__item item" data-tab="description">{{localize 'DS4.HeadingDescription'}}</a> <a class="ds4-sheet-tab-nav__item item" data-tab="description">{{localize 'DS4.HeadingDescription'}}</a>
</nav> </nav>
@ -31,12 +31,15 @@ SPDX-License-Identifier: MIT
{{!-- Inventory Tab --}} {{!-- Inventory Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/creature-inventory.hbs}} {{> systems/ds4/templates/sheets/actor/tabs/creature-inventory.hbs}}
{{!-- Special Creature Abilities Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/special-creature-abilities.hbs}}
{{!-- Spells Tab --}} {{!-- Spells Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/spells.hbs}} {{> systems/ds4/templates/sheets/actor/tabs/spells.hbs}}
{{!-- Abilities Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/creature-abilities.hbs}}
{{!-- Effects Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/effects.hbs}}
{{!-- Description Tab --}} {{!-- Description Tab --}}
{{> systems/ds4/templates/sheets/actor/tabs/description.hbs}} {{> systems/ds4/templates/sheets/actor/tabs/description.hbs}}
</section> </section>

View file

@ -7,9 +7,9 @@ SPDX-License-Identifier: MIT
<div class="tab abilities" data-group="primary" data-tab="abilities"> <div class="tab abilities" data-group="primary" data-tab="abilities">
{{!-- TALENT --}} {{!-- TALENT --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeTalentPlural'}}</h4> <h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeTalentPlural'}}</h4>
{{#unless (isEmpty itemsByType.talent)}} {{#unless (isEmpty itemsByType.talent)}}
<ol class="ds4-item-list ds4-item-list--talent item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--talent item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}} {{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{!-- rank --}} {{!-- rank --}}
<div>{{localize 'DS4.TalentRank'}}</div> <div>{{localize 'DS4.TalentRank'}}</div>
@ -22,41 +22,45 @@ SPDX-License-Identifier: MIT
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='talent'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='talent'}}
{{!-- RACIAL ABILITY --}} {{!-- RACIAL ABILITY --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeRacialAbilityPlural'}}</h4> <h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeRacialAbilityPlural'}}</h4>
{{#unless (isEmpty itemsByType.racialAbility)}} {{#unless (isEmpty itemsByType.racialAbility)}}
<ol class="ds4-item-list ds4-item-list--racial-ability item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--racial-ability item-list">
{{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}} {{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{#each itemsByType.racialAbility as |itemData id|}} {{#each itemsByType.racialAbility as |itemData id|}}
{{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}} {{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}}
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='racialAbility'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='racialAbility'}}
{{!-- LANGUAGE --}} {{!-- LANGUAGE --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeLanguagePlural'}}</h4> <h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeLanguagePlural'}}</h4>
{{#unless (isEmpty itemsByType.language)}} {{#unless (isEmpty itemsByType.language)}}
<ol class="ds4-item-list ds4-item-list--language item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--language item-list">
{{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}} {{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{#each itemsByType.language as |itemData id|}} {{#each itemsByType.language as |itemData id|}}
{{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}} {{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}}
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='language'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='language'}}
{{!-- ALPHABET --}} {{!-- ALPHABET --}}
<h4 class="ds4-item-list-title">{{localize 'DS4.ItemTypeAlphabetPlural'}}</h4> <h4 class="ds4-embedded-document-list-title">{{localize 'DS4.ItemTypeAlphabetPlural'}}</h4>
{{#unless (isEmpty itemsByType.alphabet)}} {{#unless (isEmpty itemsByType.alphabet)}}
<ol class="ds4-item-list ds4-item-list--alphabet item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--alphabet item-list">
{{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}} {{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{#each itemsByType.alphabet as |itemData id|}} {{#each itemsByType.alphabet as |itemData id|}}
{{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}} {{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}}
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='alphabet'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='alphabet'}}
</div> </div>

View file

@ -5,14 +5,15 @@ SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT SPDX-License-Identifier: MIT
--}} --}}
<div class="tab special-creature-abilities" data-group="primary" data-tab="special-creature-abilities"> <div class="tab abilities" data-group="primary" data-tab="abilities">
{{#unless (isEmpty itemsByType.specialCreatureAbility)}} {{#unless (isEmpty itemsByType.specialCreatureAbility)}}
<ol class="ds4-item-list ds4-item-list--special-creature-ability item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--special-creature-ability item-list">
{{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}} {{> systems/ds4/templates/sheets/actor/components/item-list-header.hbs}}
{{#each itemsByType.specialCreatureAbility as |itemData id|}} {{#each itemsByType.specialCreatureAbility as |itemData id|}}
{{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}} {{> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData}}
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='specialCreatureAbility'}} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='specialCreatureAbility'}}
</div> </div>

View file

@ -0,0 +1,19 @@
{{!--
SPDX-FileCopyrightText: 2021 Johannes Loher
SPDX-FileCopyrightText: 2021 Gesina Schwalbe
SPDX-License-Identifier: MIT
--}}
<div class="tab effects" data-group="primary" data-tab="effects">
{{#unless (isEmpty data.effects)}}
<ol class="ds4-embedded-document-list ds4-embedded-document-list--effect">
{{> systems/ds4/templates/sheets/actor/components/effect-list-header.hbs}}
{{#each enrichedEffects as |effectData id| }}
{{> systems/ds4/templates/sheets/actor/components/effect-list-entry.hbs effectData=effectData}}
{{/each}}
</ol>
{{/unless}}
{{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddEffectTitle'
documentType='effect'}}
</div>

View file

@ -51,7 +51,7 @@ titleKey=titleKey}}
<div class="tab spells" data-group="primary" data-tab="spells"> <div class="tab spells" data-group="primary" data-tab="spells">
{{#unless (isEmpty itemsByType.spell)}} {{#unless (isEmpty itemsByType.spell)}}
<ol class="ds4-item-list ds4-item-list--spell item-list"> <ol class="ds4-embedded-document-list ds4-embedded-document-list--spell item-list">
{{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hideDescription=true}} {{#> systems/ds4/templates/sheets/actor/components/item-list-header.hbs isEquipable=true hideDescription=true}}
{{!-- spell type --}} {{!-- spell type --}}
<div title="{{localize 'DS4.SpellType'}}">{{localize 'DS4.SpellTypeAbbr'}}</div> <div title="{{localize 'DS4.SpellType'}}">{{localize 'DS4.SpellTypeAbbr'}}</div>
@ -72,11 +72,11 @@ titleKey=titleKey}}
{{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData isEquipable=true {{#> systems/ds4/templates/sheets/actor/components/item-list-entry.hbs itemData=itemData isEquipable=true
hideDescription=true}} hideDescription=true}}
{{!-- spell type --}} {{!-- spell type --}}
<img class="ds4-item-list__image" src="{{lookup ../../config.icons.spellTypes itemData.data.spellType}}" <img class="ds4-embedded-document-list__image" src="{{lookup ../../config.icons.spellTypes itemData.data.spellType}}"
title="{{lookup ../../config.i18n.spellTypes itemData.data.spellType}}" /> title="{{lookup ../../config.i18n.spellTypes itemData.data.spellType}}" />
{{!-- spell bonus --}} {{!-- spell bonus --}}
<input class="ds4-item-list__editable item-change" type="text" data-dtype="String" data-property="data.bonus" <input class="ds4-embedded-document-list__editable change-item" type="text" data-dtype="String" data-property="data.bonus"
value="{{itemData.data.bonus}}" title="{{localize 'DS4.SpellBonus'}}" /> value="{{itemData.data.bonus}}" title="{{localize 'DS4.SpellBonus'}}" />
{{!-- max. distance --}} {{!-- max. distance --}}
@ -93,5 +93,6 @@ titleKey=titleKey}}
{{/each}} {{/each}}
</ol> </ol>
{{/unless}} {{/unless}}
{{> systems/ds4/templates/sheets/actor/components/overview-add-button.hbs dataType='spell' }} {{> systems/ds4/templates/sheets/actor/components/add-button.hbs title='DS4.UserInteractionAddItemTitle'
documentType='item' type='spell'}}
</div> </div>

View file

@ -12,17 +12,18 @@ SPDX-License-Identifier: MIT
<div class="effect-image"></div> <div class="effect-image"></div>
<div class="effect-name">Name</div> <div class="effect-name">Name</div>
<div class="effect-controls"> <div class="effect-controls">
<a class="effect-control" data-action="create" title="{{localize 'DS4.UserInteractionAddEffect'}}"> <a class="effect-control" data-action="create" title="{{localize 'DS4.UserInteractionAddEffectTitle'}}">
<i class="fas fa-plus"></i> {{localize 'DS4.UserInteractionAddEffect'}}</a> <i class="fas fa-plus"></i> {{localize 'DS4.UserInteractionAdd'}}</a>
</div> </div>
</li> </li>
{{#each item.effects as |effect id|}} {{#each item.effects as |effect id|}}
<li class="effect flexrow" data-effect-id="{{effect.id}}"> <li class="effect flexrow" data-effect-id="{{effect.id}}">
<h4 class="effect-name">{{effect.data.label}}</h4> <h4 class="effect-name">{{effect.data.label}}</h4>
<div class="effect-controls"> <div class="effect-controls">
<a class="effect-control" data-action="edit" title="{{localize 'DS4.UserInteractionEditEffect'}}"> <a class="effect-control" data-action="edit" title="{{localize 'DS4.UserInteractionEditEffectTitle'}}">
<i class="fas fa-edit"></i></a> <i class="fas fa-edit"></i></a>
<a class="effect-control" data-action="delete" title="{{localize 'DS4.UserInteractionDeleteEffect'}}"> <a class="effect-control" data-action="delete"
title="{{localize 'DS4.UserInteractionDeleteEffectTitle'}}">
<i class="fas fa-trash"></i></a> <i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>

476
yarn.lock
View file

@ -420,9 +420,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@eslint/eslintrc@npm:^0.4.2": "@eslint/eslintrc@npm:^0.4.3":
version: 0.4.2 version: 0.4.3
resolution: "@eslint/eslintrc@npm:0.4.2" resolution: "@eslint/eslintrc@npm:0.4.3"
dependencies: dependencies:
ajv: ^6.12.4 ajv: ^6.12.4
debug: ^4.1.1 debug: ^4.1.1
@ -433,7 +433,7 @@ __metadata:
js-yaml: ^3.13.1 js-yaml: ^3.13.1
minimatch: ^3.0.4 minimatch: ^3.0.4
strip-json-comments: ^3.1.1 strip-json-comments: ^3.1.1
checksum: 60b66ce4257bf5c36a920dea83a056102fef746e7afd7100a6fe245a126ff455f67f4948e75d28ed73090bff8f8556b6a996e74a124911ca703440bc245dbc23 checksum: fa916db689fac96c749571f03f931448d896ce07c3da40079082f28621f52defa36cc0c88bfcdd8d19b9981a6549c3a9a3977953db2f6945aba1135bb83a3d35
languageName: node languageName: node
linkType: hard linkType: hard
@ -663,19 +663,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@jest/types@npm:^26.6.2":
version: 26.6.2
resolution: "@jest/types@npm:26.6.2"
dependencies:
"@types/istanbul-lib-coverage": ^2.0.0
"@types/istanbul-reports": ^3.0.0
"@types/node": "*"
"@types/yargs": ^15.0.0
chalk: ^4.0.0
checksum: 5c511d7807f414b298299ae4a053abf265f39984942e0eefdfb17a7986a36f1047e0fd9a6f785bdddbf7343a5737595dfabe148719a80e118dd77486502009cc
languageName: node
linkType: hard
"@jest/types@npm:^27.0.6": "@jest/types@npm:^27.0.6":
version: 27.0.6 version: 27.0.6
resolution: "@jest/types@npm:27.0.6" resolution: "@jest/types@npm:27.0.6"
@ -689,19 +676,19 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@league-of-foundry-developers/foundry-vtt-types@npm:^0.8.8-5": "@league-of-foundry-developers/foundry-vtt-types@npm:0.8.8-8":
version: 0.8.8-5 version: 0.8.8-8
resolution: "@league-of-foundry-developers/foundry-vtt-types@npm:0.8.8-5" resolution: "@league-of-foundry-developers/foundry-vtt-types@npm:0.8.8-8"
dependencies: dependencies:
"@types/jquery": ~3.5.5 "@types/jquery": ~3.5.6
"@types/simple-peer": ~9.11.0 "@types/simple-peer": ~9.11.1
handlebars: 4.7.7 handlebars: 4.7.7
pixi-particles: 4.3.1 pixi-particles: 4.3.1
pixi.js: 5.3.4 pixi.js: 5.3.4
socket.io-client: 4.1.2 socket.io-client: 4.1.2
tinymce: 5.8.1 tinymce: 5.8.1
typescript: ^4.1.6 typescript: ^4.3.5
checksum: e5f06d5bd68403cf79ed367bcfcc2eade250dc00800e1ede33357515ba9cd437336e0c1388c316501087ac5bce8b36731782e2509683d9186e1387283ed83e35 checksum: e327a47b2f0a18ab05bbc8703c596aed4d35f3b12aff3252b5facbcc6b993a88034f233fcf446d0925176c7e8d5b15546ec97e0df10d1e9689e11b4e19ab1e3a
languageName: node languageName: node
linkType: hard linkType: hard
@ -1122,35 +1109,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@rollup/plugin-node-resolve@npm:^13.0.0":
version: 13.0.0
resolution: "@rollup/plugin-node-resolve@npm:13.0.0"
dependencies:
"@rollup/pluginutils": ^3.1.0
"@types/resolve": 1.17.1
builtin-modules: ^3.1.0
deepmerge: ^4.2.2
is-module: ^1.0.0
resolve: ^1.19.0
peerDependencies:
rollup: ^2.42.0
checksum: 4b323e8ad5f1245449cd44b4857ed94a8dd3b998178ce139e74542c216a5abeb5a9e44885f3809ac747296a108f0562f986f9561055e76d1b0b268cf788a5c83
languageName: node
linkType: hard
"@rollup/pluginutils@npm:^3.1.0":
version: 3.1.0
resolution: "@rollup/pluginutils@npm:3.1.0"
dependencies:
"@types/estree": 0.0.39
estree-walker: ^1.0.1
picomatch: ^2.2.2
peerDependencies:
rollup: ^1.20.0||^2.0.0
checksum: 45da6411e045d1b034242a8144f4a5e8c02ff1b68a2e0857807f5bb4b091c416f2015e075057f0f0dec200e7b35efe6ed4e301b43e365cedea09192f01a6839b
languageName: node
linkType: hard
"@rollup/pluginutils@npm:^4.1.0": "@rollup/pluginutils@npm:^4.1.0":
version: 4.1.0 version: 4.1.0
resolution: "@rollup/pluginutils@npm:4.1.0" resolution: "@rollup/pluginutils@npm:4.1.0"
@ -1236,14 +1194,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/estree@npm:0.0.39": "@types/fs-extra@npm:9.0.12":
version: 0.0.39
resolution: "@types/estree@npm:0.0.39"
checksum: 43e5361de39969def145f32f4599391ab13055ec94841f1633a7cfe10f0e8a940ebf0e9a4b2770454a6bddd034b57e7e0d51a4d565cb2714ee2accf10a7718be
languageName: node
linkType: hard
"@types/fs-extra@npm:^9.0.12":
version: 9.0.12 version: 9.0.12
resolution: "@types/fs-extra@npm:9.0.12" resolution: "@types/fs-extra@npm:9.0.12"
dependencies: dependencies:
@ -1286,17 +1237,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/jest@npm:^26.0.24": "@types/jest@npm:27.0.1":
version: 26.0.24 version: 27.0.1
resolution: "@types/jest@npm:26.0.24" resolution: "@types/jest@npm:27.0.1"
dependencies: dependencies:
jest-diff: ^26.0.0 jest-diff: ^27.0.0
pretty-format: ^26.0.0 pretty-format: ^27.0.0
checksum: e5d3651c1edf197011d19ee8f4bacd52667fa673d1b2ffbfbce624208d643fd4372ebb31fa8a1d89843a7705f142e38076e25e1e7b67f3aacafd6ae8bc77cbcf checksum: 5f2382b5800e736a1fb805b5ce35dc9276b978ab24225f3d3da0c5f74789a528cd8e2b085e3a157a12b1395038f137f7e1babd18c4b55c54c25f5db1d4ea3153
languageName: node languageName: node
linkType: hard linkType: hard
"@types/jquery@npm:~3.5.5": "@types/jquery@npm:~3.5.6":
version: 3.5.6 version: 3.5.6
resolution: "@types/jquery@npm:3.5.6" resolution: "@types/jquery@npm:3.5.6"
dependencies: dependencies:
@ -1333,16 +1284,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/resolve@npm:1.17.1": "@types/simple-peer@npm:~9.11.1":
version: 1.17.1
resolution: "@types/resolve@npm:1.17.1"
dependencies:
"@types/node": "*"
checksum: 8e72a73574f9489760662498c1ad512a8d4084a5db15f327e0d785cb277bb0a3146cd049241a8e3268bd0ed204ad3ee7b4a6b4622ef681e70547be9af258ca6a
languageName: node
linkType: hard
"@types/simple-peer@npm:~9.11.0":
version: 9.11.1 version: 9.11.1
resolution: "@types/simple-peer@npm:9.11.1" resolution: "@types/simple-peer@npm:9.11.1"
dependencies: dependencies:
@ -1372,15 +1314,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/yargs@npm:^15.0.0":
version: 15.0.13
resolution: "@types/yargs@npm:15.0.13"
dependencies:
"@types/yargs-parser": "*"
checksum: fa1a5b0a07dbbff1657a27d1191d586632412d170321000f6f417f279547a8c191d7058dbf4d4187c188a5a1aeb2473ddb25fe316b206fccdfe1de6fad976619
languageName: node
linkType: hard
"@types/yargs@npm:^16.0.0": "@types/yargs@npm:^16.0.0":
version: 16.0.3 version: 16.0.3
resolution: "@types/yargs@npm:16.0.3" resolution: "@types/yargs@npm:16.0.3"
@ -1390,12 +1323,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/eslint-plugin@npm:^4.28.2": "@typescript-eslint/eslint-plugin@npm:4.29.2":
version: 4.28.2 version: 4.29.2
resolution: "@typescript-eslint/eslint-plugin@npm:4.28.2" resolution: "@typescript-eslint/eslint-plugin@npm:4.29.2"
dependencies: dependencies:
"@typescript-eslint/experimental-utils": 4.28.2 "@typescript-eslint/experimental-utils": 4.29.2
"@typescript-eslint/scope-manager": 4.28.2 "@typescript-eslint/scope-manager": 4.29.2
debug: ^4.3.1 debug: ^4.3.1
functional-red-black-tree: ^1.0.1 functional-red-black-tree: ^1.0.1
regexpp: ^3.1.0 regexpp: ^3.1.0
@ -1407,23 +1340,23 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 6af8ea7665d5eaf0bafe241d71e3a85df07c0c82e59f530bd6627e0371e66a2d4a517cacd00d030680fe13d423b065c53185d3f48daa174fea316f024b1ab545 checksum: 5ea5fc49a7569cb4a636ae71c5521908e74d3e504a6898977a67bba0a50756ebff63446f81424a8c427629095b6fa1bd014fdf8bd541a459bf5e6461890bfb2c
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/experimental-utils@npm:4.28.2": "@typescript-eslint/experimental-utils@npm:4.29.2":
version: 4.28.2 version: 4.29.2
resolution: "@typescript-eslint/experimental-utils@npm:4.28.2" resolution: "@typescript-eslint/experimental-utils@npm:4.29.2"
dependencies: dependencies:
"@types/json-schema": ^7.0.7 "@types/json-schema": ^7.0.7
"@typescript-eslint/scope-manager": 4.28.2 "@typescript-eslint/scope-manager": 4.29.2
"@typescript-eslint/types": 4.28.2 "@typescript-eslint/types": 4.29.2
"@typescript-eslint/typescript-estree": 4.28.2 "@typescript-eslint/typescript-estree": 4.29.2
eslint-scope: ^5.1.1 eslint-scope: ^5.1.1
eslint-utils: ^3.0.0 eslint-utils: ^3.0.0
peerDependencies: peerDependencies:
eslint: "*" eslint: "*"
checksum: 5b3fed818af9882ae54bf258351c2740a92aa0bb5a85478ce1d4d957e594882ece42048149b1a1a8500023c1d334d9846048bc96f309ed60715232be8ef5d1a8 checksum: c92c7ae0c8395f06f77367b73c2a65de4f703d1fea54372ba7792eba0356e2e1f4d2102ca1a03f27ecad6e43e414d3b67cc227931a28c341d92a039a6e0ffd7d
languageName: node languageName: node
linkType: hard linkType: hard
@ -1443,20 +1376,20 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/parser@npm:^4.28.2": "@typescript-eslint/parser@npm:4.29.2":
version: 4.28.2 version: 4.29.2
resolution: "@typescript-eslint/parser@npm:4.28.2" resolution: "@typescript-eslint/parser@npm:4.29.2"
dependencies: dependencies:
"@typescript-eslint/scope-manager": 4.28.2 "@typescript-eslint/scope-manager": 4.29.2
"@typescript-eslint/types": 4.28.2 "@typescript-eslint/types": 4.29.2
"@typescript-eslint/typescript-estree": 4.28.2 "@typescript-eslint/typescript-estree": 4.29.2
debug: ^4.3.1 debug: ^4.3.1
peerDependencies: peerDependencies:
eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 eslint: ^5.0.0 || ^6.0.0 || ^7.0.0
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 4d71ddbe039007f366b6e9deca12183e45ea165053a29b64e8e4534451a134fe664fd3bf8ec06951e2afe8b5fd14143fb2ef3182a9ee8d2b20a89a3c0f4f2529 checksum: a836810bf6611cc1d66aa8d99fefd865e56f75d1bd49387f36d90c339f43c236894d7f7b7cdb343d389f95d592a1db3f4f0b096f8be9641d4164f1ccb0046212
languageName: node languageName: node
linkType: hard linkType: hard
@ -1470,13 +1403,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/scope-manager@npm:4.28.2": "@typescript-eslint/scope-manager@npm:4.29.2":
version: 4.28.2 version: 4.29.2
resolution: "@typescript-eslint/scope-manager@npm:4.28.2" resolution: "@typescript-eslint/scope-manager@npm:4.29.2"
dependencies: dependencies:
"@typescript-eslint/types": 4.28.2 "@typescript-eslint/types": 4.29.2
"@typescript-eslint/visitor-keys": 4.28.2 "@typescript-eslint/visitor-keys": 4.29.2
checksum: 31c30f428ba50087fc6a8dacc00b4d007d6653f1ea261a468e0a5425d730c5bf1e87bea581494862687c294d1f2ace30813f919800a05190fa332db6cd192bef checksum: 136c22579df2a3ad550f0e8b92d0b18b61facda27364715d1db9721c12aa079191f7917396eeb89fe72f98c17a4d2ec6494fee4dc95bffbc91d6f93df06f1efe
languageName: node languageName: node
linkType: hard linkType: hard
@ -1487,10 +1420,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/types@npm:4.28.2": "@typescript-eslint/types@npm:4.29.2":
version: 4.28.2 version: 4.29.2
resolution: "@typescript-eslint/types@npm:4.28.2" resolution: "@typescript-eslint/types@npm:4.29.2"
checksum: 9f5e6bf3df4540adf8eb1f83909bac778257f60a6ef7fcafa7df5224949839a63dba61fe4b58de538ffe17517e88ff6b29f691209f80a55df87935bac6349f69 checksum: 31e4438afcb2aed8c24d9aeb8d65f46ea2bea6b35f796b77de399977b39516a515f8307f8596fff3568b9852664d72d03fd58f55cc346c66d5841c10f230fa5a
languageName: node languageName: node
linkType: hard linkType: hard
@ -1512,12 +1445,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/typescript-estree@npm:4.28.2": "@typescript-eslint/typescript-estree@npm:4.29.2":
version: 4.28.2 version: 4.29.2
resolution: "@typescript-eslint/typescript-estree@npm:4.28.2" resolution: "@typescript-eslint/typescript-estree@npm:4.29.2"
dependencies: dependencies:
"@typescript-eslint/types": 4.28.2 "@typescript-eslint/types": 4.29.2
"@typescript-eslint/visitor-keys": 4.28.2 "@typescript-eslint/visitor-keys": 4.29.2
debug: ^4.3.1 debug: ^4.3.1
globby: ^11.0.3 globby: ^11.0.3
is-glob: ^4.0.1 is-glob: ^4.0.1
@ -1526,7 +1459,7 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
checksum: 4fe36863b8af9808ee86b3cf64d6076a8b9a3224f9e1c17650d06ea46d80225b7e94903f71e7330a682b84eb1045189f1f09dc896165e9cab36714d24992ee84 checksum: 74cc09a05ee5b26948ec0f8054397b8f6f43b57169e04ae404a6573a48f58ca321cabb4332f9779a294890b623802b4fa8d9c637771652ef1f9c57aa95157508
languageName: node languageName: node
linkType: hard linkType: hard
@ -1540,13 +1473,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@typescript-eslint/visitor-keys@npm:4.28.2": "@typescript-eslint/visitor-keys@npm:4.29.2":
version: 4.28.2 version: 4.29.2
resolution: "@typescript-eslint/visitor-keys@npm:4.28.2" resolution: "@typescript-eslint/visitor-keys@npm:4.29.2"
dependencies: dependencies:
"@typescript-eslint/types": 4.28.2 "@typescript-eslint/types": 4.29.2
eslint-visitor-keys: ^2.0.0 eslint-visitor-keys: ^2.0.0
checksum: cec563831f563bb057f00045104db7ed92576755065d7563607c5f3581e5588fe8b83229767cd81763136aeb663dd49b99e7ee24decfbfc5fc7bd7b36bb1a525 checksum: 30e1eef4f29e52193441240c2dfcc583d19691657bda4c93494cac7c728db47182b76d742239ad36323b5d5289073aaf88defd0e309c01405abd422ef272c53b
languageName: node languageName: node
linkType: hard linkType: hard
@ -2210,20 +2143,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"buffer-from@npm:1.x, buffer-from@npm:^1.0.0": "buffer-from@npm:^1.0.0":
version: 1.1.1 version: 1.1.1
resolution: "buffer-from@npm:1.1.1" resolution: "buffer-from@npm:1.1.1"
checksum: 540ceb79c4f5bfcadaabbc18324fa84c50dc52905084be7c03596a339cf5a88513bee6831ce9b36ddd046fab09257a7c80686e129d0559a0cfd141da196ad956 checksum: 540ceb79c4f5bfcadaabbc18324fa84c50dc52905084be7c03596a339cf5a88513bee6831ce9b36ddd046fab09257a7c80686e129d0559a0cfd141da196ad956
languageName: node languageName: node
linkType: hard linkType: hard
"builtin-modules@npm:^3.1.0":
version: 3.2.0
resolution: "builtin-modules@npm:3.2.0"
checksum: f0e7240f70ae472a0a0167bf76d2e828c73028fe60be8cd229939c38a27527ea68c92f700553dac1316fa124af3037bc7a765ca0e029a03d2e9201dfb372ea24
languageName: node
linkType: hard
"cacache@npm:^15.0.5": "cacache@npm:^15.0.5":
version: 15.2.0 version: 15.2.0
resolution: "cacache@npm:15.2.0" resolution: "cacache@npm:15.2.0"
@ -2311,6 +2237,16 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"chalk@npm:4.1.2":
version: 4.1.2
resolution: "chalk@npm:4.1.2"
dependencies:
ansi-styles: ^4.1.0
supports-color: ^7.1.0
checksum: e3901b97d953991712bf0b941d586175be7ca5da56a97d25187e07453c6b26cae0ac8d9c7aa9e87e7c5c986fff870771b3a8e2705b3becda868829e2e12c2a65
languageName: node
linkType: hard
"chalk@npm:^2.0.0": "chalk@npm:^2.0.0":
version: 2.4.2 version: 2.4.2
resolution: "chalk@npm:2.4.2" resolution: "chalk@npm:2.4.2"
@ -2904,13 +2840,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"diff-sequences@npm:^26.6.2":
version: 26.6.2
resolution: "diff-sequences@npm:26.6.2"
checksum: dd1eb6e52f0a200228b836876a69c90690003b8991cf7d9264d6e6063acde8fe852084b6a196f2a13f169d309e30c24c457e9c8db617aed186c665efb50af1d8
languageName: node
linkType: hard
"diff-sequences@npm:^27.0.6": "diff-sequences@npm:^27.0.6":
version: 27.0.6 version: 27.0.6
resolution: "diff-sequences@npm:27.0.6" resolution: "diff-sequences@npm:27.0.6"
@ -2949,33 +2878,32 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "dungeonslayers4@workspace:." resolution: "dungeonslayers4@workspace:."
dependencies: dependencies:
"@league-of-foundry-developers/foundry-vtt-types": ^0.8.8-5 "@league-of-foundry-developers/foundry-vtt-types": 0.8.8-8
"@rollup/plugin-node-resolve": ^13.0.0 "@types/fs-extra": 9.0.12
"@types/fs-extra": ^9.0.12 "@types/jest": 27.0.1
"@types/jest": ^26.0.24 "@typescript-eslint/eslint-plugin": 4.29.2
"@typescript-eslint/eslint-plugin": ^4.28.2 "@typescript-eslint/parser": 4.29.2
"@typescript-eslint/parser": ^4.28.2 chalk: 4.1.2
chalk: ^4.1.1 eslint: 7.32.0
eslint: ^7.30.0 eslint-config-prettier: 8.3.0
eslint-config-prettier: ^8.3.0 eslint-plugin-jest: 24.4.0
eslint-plugin-jest: ^24.3.6 eslint-plugin-prettier: 3.4.0
eslint-plugin-prettier: ^3.4.0 fs-extra: 10.0.0
fs-extra: ^10.0.0 gulp: 4.0.2
gulp: ^4.0.2 gulp-sass: 5.0.0
gulp-sass: ^5.0.0 husky: 7.0.1
husky: ^7.0.1 jest: 27.0.6
jest: ^27.0.6 jest-junit: 12.2.0
jest-junit: ^12.2.0 lint-staged: 11.1.2
lint-staged: ^11.0.0 prettier: 2.3.2
prettier: ^2.3.2 rollup: 2.56.2
rollup: ^2.53.1 rollup-plugin-typescript2: 0.30.0
rollup-plugin-typescript2: ^0.30.0 sass: 1.38.0
sass: 1.35.2 semver: 7.3.5
semver: ^7.3.5 ts-jest: 27.0.5
ts-jest: ^27.0.3 tslib: 2.3.1
tslib: ^2.3.0 typescript: 4.3.5
typescript: ^4.3.5 yargs: 17.1.1
yargs: ^17.0.1
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@ -3203,7 +3131,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-config-prettier@npm:^8.3.0": "eslint-config-prettier@npm:8.3.0":
version: 8.3.0 version: 8.3.0
resolution: "eslint-config-prettier@npm:8.3.0" resolution: "eslint-config-prettier@npm:8.3.0"
peerDependencies: peerDependencies:
@ -3214,9 +3142,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-plugin-jest@npm:^24.3.6": "eslint-plugin-jest@npm:24.4.0":
version: 24.3.6 version: 24.4.0
resolution: "eslint-plugin-jest@npm:24.3.6" resolution: "eslint-plugin-jest@npm:24.4.0"
dependencies: dependencies:
"@typescript-eslint/experimental-utils": ^4.0.1 "@typescript-eslint/experimental-utils": ^4.0.1
peerDependencies: peerDependencies:
@ -3225,11 +3153,11 @@ __metadata:
peerDependenciesMeta: peerDependenciesMeta:
"@typescript-eslint/eslint-plugin": "@typescript-eslint/eslint-plugin":
optional: true optional: true
checksum: 13f4522cd838a6a356a080f76424579a58aa2f9b4f4b3fdd3713278718496c62ba3d8f53c0fb6ad6fd96ca6cfd6ee728f7dd51893b91eccfb4396b832f757afb checksum: 189a78413943822ad3b58e13906960815dca790035ed00eab796fe465b6f48855b7e2f40a1d30c5fa34bf205d9baa27fdf47cc58c9f402f7d7c358cd3dea8698
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-plugin-prettier@npm:^3.4.0": "eslint-plugin-prettier@npm:3.4.0":
version: 3.4.0 version: 3.4.0
resolution: "eslint-plugin-prettier@npm:3.4.0" resolution: "eslint-plugin-prettier@npm:3.4.0"
dependencies: dependencies:
@ -3288,12 +3216,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint@npm:^7.30.0": "eslint@npm:7.32.0":
version: 7.30.0 version: 7.32.0
resolution: "eslint@npm:7.30.0" resolution: "eslint@npm:7.32.0"
dependencies: dependencies:
"@babel/code-frame": 7.12.11 "@babel/code-frame": 7.12.11
"@eslint/eslintrc": ^0.4.2 "@eslint/eslintrc": ^0.4.3
"@humanwhocodes/config-array": ^0.5.0 "@humanwhocodes/config-array": ^0.5.0
ajv: ^6.10.0 ajv: ^6.10.0
chalk: ^4.0.0 chalk: ^4.0.0
@ -3334,7 +3262,7 @@ __metadata:
v8-compile-cache: ^2.0.3 v8-compile-cache: ^2.0.3
bin: bin:
eslint: bin/eslint.js eslint: bin/eslint.js
checksum: 028048847e0252d6c972ac612fe37be55822ae2255d10d1bf68255749f7ae1364b2aa538cd95f3bc4d951fc7d36195e46b62fe8d215297ef9a6a8aeb8ca28a90 checksum: e25f9159d3b6b7e826b190ebb38accf3ec1513e1811bd7df2e8de83313370d266b8b6a571491a9f092d254fc53b2c5cde14dd2196cf046e22970ef037a4c7f3d
languageName: node languageName: node
linkType: hard linkType: hard
@ -3391,13 +3319,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"estree-walker@npm:^1.0.1":
version: 1.0.1
resolution: "estree-walker@npm:1.0.1"
checksum: 85e7cee763e9125a7d8a947b3a06a8b9282873936df220dd0d791d9b3315e45e40ab096b43ba71bdc99140c11a6d23fdcf686642dc119a7b2d6181004fdb24d2
languageName: node
linkType: hard
"estree-walker@npm:^2.0.1": "estree-walker@npm:^2.0.1":
version: 2.0.2 version: 2.0.2
resolution: "estree-walker@npm:2.0.2" resolution: "estree-walker@npm:2.0.2"
@ -3785,6 +3706,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"fs-extra@npm:10.0.0":
version: 10.0.0
resolution: "fs-extra@npm:10.0.0"
dependencies:
graceful-fs: ^4.2.0
jsonfile: ^6.0.1
universalify: ^2.0.0
checksum: 84632d143fe3125b8c3c2b1fedbbdfcfb84fc3e087522b4e138cc07edf574619925713a6609f6d5e53ede2e31ab319c7d528ea4a4a770ba6622a16bf4447cd8b
languageName: node
linkType: hard
"fs-extra@npm:8.1.0": "fs-extra@npm:8.1.0":
version: 8.1.0 version: 8.1.0
resolution: "fs-extra@npm:8.1.0" resolution: "fs-extra@npm:8.1.0"
@ -3796,17 +3728,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"fs-extra@npm:^10.0.0":
version: 10.0.0
resolution: "fs-extra@npm:10.0.0"
dependencies:
graceful-fs: ^4.2.0
jsonfile: ^6.0.1
universalify: ^2.0.0
checksum: 84632d143fe3125b8c3c2b1fedbbdfcfb84fc3e087522b4e138cc07edf574619925713a6609f6d5e53ede2e31ab319c7d528ea4a4a770ba6622a16bf4447cd8b
languageName: node
linkType: hard
"fs-minipass@npm:^2.0.0": "fs-minipass@npm:^2.0.0":
version: 2.1.0 version: 2.1.0
resolution: "fs-minipass@npm:2.1.0" resolution: "fs-minipass@npm:2.1.0"
@ -4125,7 +4046,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"gulp-sass@npm:^5.0.0": "gulp-sass@npm:5.0.0":
version: 5.0.0 version: 5.0.0
resolution: "gulp-sass@npm:5.0.0" resolution: "gulp-sass@npm:5.0.0"
dependencies: dependencies:
@ -4140,7 +4061,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"gulp@npm:^4.0.2": "gulp@npm:4.0.2":
version: 4.0.2 version: 4.0.2
resolution: "gulp@npm:4.0.2" resolution: "gulp@npm:4.0.2"
dependencies: dependencies:
@ -4340,7 +4261,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"husky@npm:^7.0.1": "husky@npm:7.0.1":
version: 7.0.1 version: 7.0.1
resolution: "husky@npm:7.0.1" resolution: "husky@npm:7.0.1"
bin: bin:
@ -4667,13 +4588,6 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"is-module@npm:^1.0.0":
version: 1.0.0
resolution: "is-module@npm:1.0.0"
checksum: 2cbd41e2760874130b76aee84cc53120c4feef0d0f196fa665326857b444c8549909cc840f3f3a59652a7e8df46146a77f6c0f3f70a578704e03670975843e74
languageName: node
linkType: hard
"is-negated-glob@npm:^1.0.0": "is-negated-glob@npm:^1.0.0":
version: 1.0.0 version: 1.0.0
resolution: "is-negated-glob@npm:1.0.0" resolution: "is-negated-glob@npm:1.0.0"
@ -4988,19 +4902,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"jest-diff@npm:^26.0.0": "jest-diff@npm:^27.0.0, jest-diff@npm:^27.0.6":
version: 26.6.2
resolution: "jest-diff@npm:26.6.2"
dependencies:
chalk: ^4.0.0
diff-sequences: ^26.6.2
jest-get-type: ^26.3.0
pretty-format: ^26.6.2
checksum: 05d0f1bdba147a026eab4121a73a69ee3df21aec59ecd34659d665ee0663e518636650b435d248974ab5aceb345de9bfcc035efd01df723fe788756a07c8d046
languageName: node
linkType: hard
"jest-diff@npm:^27.0.6":
version: 27.0.6 version: 27.0.6
resolution: "jest-diff@npm:27.0.6" resolution: "jest-diff@npm:27.0.6"
dependencies: dependencies:
@ -5063,13 +4965,6 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"jest-get-type@npm:^26.3.0":
version: 26.3.0
resolution: "jest-get-type@npm:26.3.0"
checksum: fc3e2d2b90cca74597c4ad6234c2fcc2ccb62894d0f7afe22fc55b5d93a2f02d3080ccef50f09c979d4b5a060bc76c4343911556d75ed9e892e0ebda6d54c44b
languageName: node
linkType: hard
"jest-get-type@npm:^27.0.6": "jest-get-type@npm:^27.0.6":
version: 27.0.6 version: 27.0.6
resolution: "jest-get-type@npm:27.0.6" resolution: "jest-get-type@npm:27.0.6"
@ -5127,7 +5022,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"jest-junit@npm:^12.2.0": "jest-junit@npm:12.2.0":
version: 12.2.0 version: 12.2.0
resolution: "jest-junit@npm:12.2.0" resolution: "jest-junit@npm:12.2.0"
dependencies: dependencies:
@ -5395,7 +5290,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"jest@npm:^27.0.6": "jest@npm:27.0.6":
version: 27.0.6 version: 27.0.6
resolution: "jest@npm:27.0.6" resolution: "jest@npm:27.0.6"
dependencies: dependencies:
@ -5678,16 +5573,15 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"lint-staged@npm:^11.0.0": "lint-staged@npm:11.1.2":
version: 11.0.0 version: 11.1.2
resolution: "lint-staged@npm:11.0.0" resolution: "lint-staged@npm:11.1.2"
dependencies: dependencies:
chalk: ^4.1.1 chalk: ^4.1.1
cli-truncate: ^2.1.0 cli-truncate: ^2.1.0
commander: ^7.2.0 commander: ^7.2.0
cosmiconfig: ^7.0.0 cosmiconfig: ^7.0.0
debug: ^4.3.1 debug: ^4.3.1
dedent: ^0.7.0
enquirer: ^2.3.6 enquirer: ^2.3.6
execa: ^5.0.0 execa: ^5.0.0
listr2: ^3.8.2 listr2: ^3.8.2
@ -5699,7 +5593,7 @@ fsevents@^1.2.7:
stringify-object: ^3.3.0 stringify-object: ^3.3.0
bin: bin:
lint-staged: bin/lint-staged.js lint-staged: bin/lint-staged.js
checksum: e5d9c38f468fae090939d150f8a1676ca208e50c714f20c9957a16833eeae20ca9676c8679883d0a005fda58375581c26352e18a2227d6449a29adaca650f957 checksum: 0c44f4fbd9360cb68a7c80475a2c37c01adc60c3598cc0beafc27d48f49be7d696e01f2a4b96eef0d6aba3fbe547861a434910ba80ec96fda30b6b21375ae937
languageName: node languageName: node
linkType: hard linkType: hard
@ -6057,7 +5951,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"mkdirp@npm:1.x, mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
version: 1.0.4 version: 1.0.4
resolution: "mkdirp@npm:1.0.4" resolution: "mkdirp@npm:1.0.4"
bin: bin:
@ -6777,7 +6671,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"prettier@npm:^2.3.2": "prettier@npm:2.3.2":
version: 2.3.2 version: 2.3.2
resolution: "prettier@npm:2.3.2" resolution: "prettier@npm:2.3.2"
bin: bin:
@ -6786,19 +6680,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"pretty-format@npm:^26.0.0, pretty-format@npm:^26.6.2": "pretty-format@npm:^27.0.0, pretty-format@npm:^27.0.6":
version: 26.6.2
resolution: "pretty-format@npm:26.6.2"
dependencies:
"@jest/types": ^26.6.2
ansi-regex: ^5.0.0
ansi-styles: ^4.0.0
react-is: ^17.0.1
checksum: 5ad34fc128218485732cf0271d396158a00584708fc97bf063c1c3c000fe14da572e9a1d3d7b92d95c5e24965434656c56ed0e45804dea2435ca59a1f86f1b07
languageName: node
linkType: hard
"pretty-format@npm:^27.0.6":
version: 27.0.6 version: 27.0.6
resolution: "pretty-format@npm:27.0.6" resolution: "pretty-format@npm:27.0.6"
dependencies: dependencies:
@ -7140,7 +7022,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"resolve@1.20.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.4.0": "resolve@1.20.0, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.4.0":
version: 1.20.0 version: 1.20.0
resolution: "resolve@npm:1.20.0" resolution: "resolve@npm:1.20.0"
dependencies: dependencies:
@ -7150,7 +7032,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"resolve@patch:resolve@1.20.0#builtin<compat/resolve>, resolve@patch:resolve@^1.1.6#builtin<compat/resolve>, resolve@patch:resolve@^1.1.7#builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#builtin<compat/resolve>, resolve@patch:resolve@^1.19.0#builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#builtin<compat/resolve>, resolve@patch:resolve@^1.4.0#builtin<compat/resolve>": "resolve@patch:resolve@1.20.0#builtin<compat/resolve>, resolve@patch:resolve@^1.1.6#builtin<compat/resolve>, resolve@patch:resolve@^1.1.7#builtin<compat/resolve>, resolve@patch:resolve@^1.10.0#builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#builtin<compat/resolve>, resolve@patch:resolve@^1.4.0#builtin<compat/resolve>":
version: 1.20.0 version: 1.20.0
resolution: "resolve@patch:resolve@npm%3A1.20.0#builtin<compat/resolve>::version=1.20.0&hash=3388aa" resolution: "resolve@patch:resolve@npm%3A1.20.0#builtin<compat/resolve>::version=1.20.0&hash=3388aa"
dependencies: dependencies:
@ -7212,7 +7094,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"rollup-plugin-typescript2@npm:^0.30.0": "rollup-plugin-typescript2@npm:0.30.0":
version: 0.30.0 version: 0.30.0
resolution: "rollup-plugin-typescript2@npm:0.30.0" resolution: "rollup-plugin-typescript2@npm:0.30.0"
dependencies: dependencies:
@ -7228,9 +7110,9 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"rollup@npm:^2.53.1": "rollup@npm:2.56.2":
version: 2.53.1 version: 2.56.2
resolution: "rollup@npm:2.53.1" resolution: "rollup@npm:2.56.2"
dependencies: dependencies:
fsevents: ~2.3.2 fsevents: ~2.3.2
dependenciesMeta: dependenciesMeta:
@ -7238,7 +7120,7 @@ fsevents@^1.2.7:
optional: true optional: true
bin: bin:
rollup: dist/bin/rollup rollup: dist/bin/rollup
checksum: 7c63a7251e87715795a4141371f4f7b31ce46c7dd8273a0f4b5240977eb7ecaddd1e8d0fdaf8eabfc7cf73075cc9d83e03c67b89e56f31a2e85cf1089e9fc34f checksum: babe2dce8eec8c130915baa54b0d62260fa4691ca9f2a989a2685b4e72761e701d53c374efa51a59a4c3f59a3c667ca5c8ac0e0de9a294ad50d1c1271d2d5199
languageName: node languageName: node
linkType: hard linkType: hard
@ -7283,14 +7165,14 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"sass@npm:1.35.2": "sass@npm:1.38.0":
version: 1.35.2 version: 1.38.0
resolution: "sass@npm:1.35.2" resolution: "sass@npm:1.38.0"
dependencies: dependencies:
chokidar: ">=3.0.0 <4.0.0" chokidar: ">=3.0.0 <4.0.0"
bin: bin:
sass: sass.js sass: sass.js
checksum: d102e3fd6e6aa1a61f9c765fb31ff701d78ef05cf256ebb9ed80994c86638dcc8cc71832df1a1f71edce427cf823449c2fc43618b29ad51a8ca5bf93349ccaf4 checksum: ce6da83497f56daab29bc9ed316cbfd18111c1c0afa466912e8c7815c8f006620595b8d3c5db632e9f09366691c2d8fc5f8faa8eb9532ae3bd0364c2ae7c6a93
languageName: node languageName: node
linkType: hard linkType: hard
@ -7328,7 +7210,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"semver@npm:7.x, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5": "semver@npm:7.3.5, semver@npm:7.x, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5":
version: 7.3.5 version: 7.3.5
resolution: "semver@npm:7.3.5" resolution: "semver@npm:7.3.5"
dependencies: dependencies:
@ -8066,26 +7948,34 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"ts-jest@npm:^27.0.3": "ts-jest@npm:27.0.5":
version: 27.0.3 version: 27.0.5
resolution: "ts-jest@npm:27.0.3" resolution: "ts-jest@npm:27.0.5"
dependencies: dependencies:
bs-logger: 0.x bs-logger: 0.x
buffer-from: 1.x
fast-json-stable-stringify: 2.x fast-json-stable-stringify: 2.x
jest-util: ^27.0.0 jest-util: ^27.0.0
json5: 2.x json5: 2.x
lodash: 4.x lodash: 4.x
make-error: 1.x make-error: 1.x
mkdirp: 1.x
semver: 7.x semver: 7.x
yargs-parser: 20.x yargs-parser: 20.x
peerDependencies: peerDependencies:
"@babel/core": ">=7.0.0-beta.0 <8"
"@types/jest": ^27.0.0
babel-jest: ">=27.0.0 <28"
jest: ^27.0.0 jest: ^27.0.0
typescript: ">=3.8 <5.0" typescript: ">=3.8 <5.0"
peerDependenciesMeta:
"@babel/core":
optional: true
"@types/jest":
optional: true
babel-jest:
optional: true
bin: bin:
ts-jest: cli.js ts-jest: cli.js
checksum: a63f3a8620a16335d745f22377a9cc118129d28a5b122c609a7c6aabbb8048c85733c771a0dd39b136e8a75401473409452bdd3c5b9e3b85317c2e3f3ac03267 checksum: 0f7479a6c967f192d9be8bf8ac75498f41cc03964ed7fa6f3ae826080bf8ddb1e2f1e59cda34342a99c44c2fff4b7350019dd4f963fa059af694de4196054576
languageName: node languageName: node
linkType: hard linkType: hard
@ -8096,6 +7986,13 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"tslib@npm:2.3.1":
version: 2.3.1
resolution: "tslib@npm:2.3.1"
checksum: 5ae2f209c5127bad284974c78916f02c72082615f65889a7ed0c7ca6d5f935c30338a0ee7310e1d9652dabc7b7507fd2905035487446d09d45fc1f19de71cf05
languageName: node
linkType: hard
"tslib@npm:^1.8.1, tslib@npm:^1.9.0": "tslib@npm:^1.8.1, tslib@npm:^1.9.0":
version: 1.14.1 version: 1.14.1
resolution: "tslib@npm:1.14.1" resolution: "tslib@npm:1.14.1"
@ -8103,13 +8000,6 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"tslib@npm:^2.3.0":
version: 2.3.0
resolution: "tslib@npm:2.3.0"
checksum: 7b4fc9feff0f704743c3760f5d8d708f6417fac6458159e63df3a6b1100f0736e3b99edb9fe370f274ad15160a1f49ff05cb49402534c818ff552c48e38c3e6e
languageName: node
linkType: hard
"tsutils@npm:^3.21.0": "tsutils@npm:^3.21.0":
version: 3.21.0 version: 3.21.0
resolution: "tsutils@npm:3.21.0" resolution: "tsutils@npm:3.21.0"
@ -8190,7 +8080,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@^4.1.6, typescript@^4.3.5": "typescript@4.3.5, typescript@^4.3.5":
version: 4.3.5 version: 4.3.5
resolution: "typescript@npm:4.3.5" resolution: "typescript@npm:4.3.5"
bin: bin:
@ -8200,7 +8090,7 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@patch:typescript@^4.1.6#builtin<compat/typescript>, typescript@patch:typescript@^4.3.5#builtin<compat/typescript>": "typescript@patch:typescript@4.3.5#builtin<compat/typescript>, typescript@patch:typescript@^4.3.5#builtin<compat/typescript>":
version: 4.3.5 version: 4.3.5
resolution: "typescript@patch:typescript@npm%3A4.3.5#builtin<compat/typescript>::version=4.3.5&hash=ddfc1b" resolution: "typescript@patch:typescript@npm%3A4.3.5#builtin<compat/typescript>::version=4.3.5&hash=ddfc1b"
bin: bin:
@ -8752,6 +8642,21 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"yargs@npm:17.1.1":
version: 17.1.1
resolution: "yargs@npm:17.1.1"
dependencies:
cliui: ^7.0.2
escalade: ^3.1.1
get-caller-file: ^2.0.5
require-directory: ^2.1.1
string-width: ^4.2.0
y18n: ^5.0.5
yargs-parser: ^20.2.2
checksum: c2a16b61eb0db8882becd0aa382a5c59b87afcd17b35dd7077b3c9d83f77a3ad3de1526e4f1cf940f9481d7ce537e883af7c16879c33258724a09bc43a04e8ea
languageName: node
linkType: hard
"yargs@npm:^16.0.3": "yargs@npm:^16.0.3":
version: 16.2.0 version: 16.2.0
resolution: "yargs@npm:16.2.0" resolution: "yargs@npm:16.2.0"
@ -8767,21 +8672,6 @@ fsevents@^1.2.7:
languageName: node languageName: node
linkType: hard linkType: hard
"yargs@npm:^17.0.1":
version: 17.0.1
resolution: "yargs@npm:17.0.1"
dependencies:
cliui: ^7.0.2
escalade: ^3.1.1
get-caller-file: ^2.0.5
require-directory: ^2.1.1
string-width: ^4.2.0
y18n: ^5.0.5
yargs-parser: ^20.2.2
checksum: a7969b48d2dea129a7d4fcc3f13e88d4f94bacbd24f720b2ce19946fa9facc42cfed89c059d953091241f4e9e9000ed9dbf86e4bb4b6ceb3a26af10ddebdd0b2
languageName: node
linkType: hard
"yargs@npm:^7.1.0": "yargs@npm:^7.1.0":
version: 7.1.2 version: 7.1.2
resolution: "yargs@npm:7.1.2" resolution: "yargs@npm:7.1.2"