diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cce444..0f00a4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,13 @@ ## 2.0.0 -- Rewrite for dnd5e system 4.0.0 +- Major Rewrite for dnd5e system 4.0.0 +- Powers now use activities +- Powers now just use the normal Item sheet +- New custom Consumption type available for *all* item types: Power Points! + - New activities on a Power with a level of 1 or more will default to having a Power Point consumption type + - These also have a default consumption max of `"1 + @flags.prime-psionics.manifestLimit - @activity.consumption.targets.0.value"` +- Added compatibility with the Compendium Browser ## 1.2.1 diff --git a/assets/AugmentPowerDetails.PNG b/assets/AugmentPowerDetails.PNG index 25c1f9e..e4e18a6 100644 Binary files a/assets/AugmentPowerDetails.PNG and b/assets/AugmentPowerDetails.PNG differ diff --git a/assets/TalentPowerDetails.PNG b/assets/TalentPowerDetails.PNG index 65d6154..2a25181 100644 Binary files a/assets/TalentPowerDetails.PNG and b/assets/TalentPowerDetails.PNG differ diff --git a/assets/icons/power.svg b/assets/icons/power.svg index 312342a..a99bde8 100644 --- a/assets/icons/power.svg +++ b/assets/icons/power.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..1895898 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,80 @@ +import globals from "globals"; +import path from "node:path"; +import {fileURLToPath} from "node:url"; +import js from "@eslint/js"; +import {FlatCompat} from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [{ + ignores: ["foundry/**/*", "dnd5e/**/*"] +}, ...compat.extends("eslint:recommended"), { + languageOptions: { + globals: { + ...globals.browser + }, + + ecmaVersion: "latest", + sourceType: "module" + }, + + rules: { + indent: ["error", 2, { + SwitchCase: 1 + }], + + "linebreak-style": ["error", "unix"], + quotes: ["error", "double"], + semi: ["error", "always"], + "quote-props": ["error", "as-needed"], + "array-bracket-newline": ["error", "consistent"], + "no-unused-vars": 0, + "key-spacing": "error", + "comma-dangle": "error", + "space-in-parens": ["error", "never"], + "space-infix-ops": 2, + "keyword-spacing": 2, + "semi-spacing": 2, + "no-multi-spaces": 2, + "no-extra-semi": 2, + "no-whitespace-before-property": 2, + "space-unary-ops": 2, + + "no-multiple-empty-lines": ["error", { + max: 1, + maxEOF: 0 + }], + + "object-curly-spacing": ["error", "never"], + "comma-spacing": ["error"], + "no-undef": "off", + "space-before-blocks": 2, + "arrow-spacing": 2, + "eol-last": ["error", "always"], + + "no-mixed-operators": ["error", { + allowSamePrecedence: true, + + groups: [[ + "==", + "!=", + "===", + "!==", + ">", + ">=", + "<", + "<=", + "&&", + "||", + "in", + "instanceof" + ]] + }] + } +}]; diff --git a/lang/en.json b/lang/en.json index 854d40f..c1f06a9 100644 --- a/lang/en.json +++ b/lang/en.json @@ -5,8 +5,7 @@ "PrimePsionics.PowerLevel": "Power Level", "PrimePsionics.Talent": "Talent", "PrimePsionics.Intensify": "Intensify", - "PrimePsionics.Intensify2": "Intensify (2)", - "PrimePsionics.Intensify3": "Intensify (3)", + "PrimePsionics.ConsumptionHint": "Consume {points} Psi Points. Your Manifest Limit is {limit}.", "PrimePsionics.PowerNone": "None", "PrimePsionics.PowerDiscipline": "Power Discipline", "PrimePsionics.DiscClair": "Clairsentience", @@ -40,9 +39,6 @@ "PrimePsionics.FullP": "Full Manifester", "PrimePsionics.HalfP": "Half Manifester", "PrimePsionics.ThirdP": "Third Manifester", - "PrimePsionics.PsiLimit": "Psi Limit", - "PrimePsionics.PPManifest": "

How many power points would you like to spend?

", - "PrimePsionics.ManifestLimit": "Your Manifest Limit is {limit}", "PrimePsionics.TooManyPP": "You don't have that many Psi Points available!", "PrimePsionics.Manifest": "Manifest Power", "PrimePsionics.Sheets.Power": "Default Power Sheet", diff --git a/module/config.mjs b/module/config.mjs index ae07066..d2e87cd 100644 --- a/module/config.mjs +++ b/module/config.mjs @@ -1,16 +1,17 @@ -import { typePower } from './utils.mjs'; +import {typePower} from "./utils.mjs"; +import PsiPoints from "./psiPoints.mjs"; const PP_CONFIG = { DND5E: {}, - PSIONICS: {}, + PSIONICS: {} }; /** * */ PP_CONFIG.PSIONICS.powerPreparationModes = { - always: 'PrimePsionics.PowerPrepKnown', - innate: 'PrimePsionics.PowerPrepInnate', + always: "PrimePsionics.PowerPrepKnown", + innate: "PrimePsionics.PowerPrepInnate" }; /** @@ -19,13 +20,13 @@ PP_CONFIG.PSIONICS.powerPreparationModes = { */ PP_CONFIG.PSIONICS.powerComponents = { auditory: { - label: 'PrimePsionics.ComponentAuditory', - abbr: 'PrimePsionics.ComponentAuditoryAbbr', + label: "PrimePsionics.ComponentAuditory", + abbreviation: "PrimePsionics.ComponentAuditoryAbbr" }, observable: { - label: 'PrimePsionics.ComponentObservable', - abbr: 'PrimePsionics.ComponentObservableAbbr', - }, + label: "PrimePsionics.ComponentObservable", + abbreviation: "PrimePsionics.ComponentObservableAbbr" + } }; /** @@ -38,35 +39,35 @@ PP_CONFIG.PSIONICS.powerComponents = { */ PP_CONFIG.PSIONICS.disciplines = { cla: { - label: 'PrimePsionics.DiscClair', - icon: 'modules/prime-psionics/assets/icons/clairsentience.svg', - fullKey: 'clairsentience', + label: "PrimePsionics.DiscClair", + icon: "modules/prime-psionics/assets/icons/clairsentience.svg", + fullKey: "clairsentience" }, mtc: { - label: 'PrimePsionics.DiscMTC', - icon: 'modules/prime-psionics/assets/icons/metacreativity.svg', - fullKey: 'metacreativity', + label: "PrimePsionics.DiscMTC", + icon: "modules/prime-psionics/assets/icons/metacreativity.svg", + fullKey: "metacreativity" }, psk: { - label: 'PrimePsionics.DiscKinesis', - icon: 'modules/prime-psionics/assets/icons/psychokinesis.svg', - fullKey: 'psychokinesis', + label: "PrimePsionics.DiscKinesis", + icon: "modules/prime-psionics/assets/icons/psychokinesis.svg", + fullKey: "psychokinesis" }, psm: { - label: 'PrimePsionics.DiscMetabolism', - icon: 'modules/prime-psionics/assets/icons/psychometabolism.svg', - fullKey: 'psychometabolism', + label: "PrimePsionics.DiscMetabolism", + icon: "modules/prime-psionics/assets/icons/psychometabolism.svg", + fullKey: "psychometabolism" }, pst: { - label: 'PrimePsionics.DiscPort', - icon: 'modules/prime-psionics/assets/icons/psychoportation.svg', - fullKey: 'psychoportation', + label: "PrimePsionics.DiscPort", + icon: "modules/prime-psionics/assets/icons/psychoportation.svg", + fullKey: "psychoportation" }, tlp: { - label: 'PrimePsionics.DiscTelepathy', - icon: 'modules/prime-psionics/assets/icons/telepathy.svg', - fullKey: 'telepathy', - }, + label: "PrimePsionics.DiscTelepathy", + icon: "modules/prime-psionics/assets/icons/telepathy.svg", + fullKey: "telepathy" + } }; /** @@ -74,11 +75,11 @@ PP_CONFIG.PSIONICS.disciplines = { * @enum {string} */ PP_CONFIG.PSIONICS.powerScalingModes = { - none: 'PrimePsionics.PowerNone', - talent: 'PrimePsionics.Talent', - intensify: 'PrimePsionics.Intensify', - intensify2: 'PrimePsionics.Intensify2', - intensify3: 'PrimePsionics.Intensify3', + none: "PrimePsionics.PowerNone", + talent: "PrimePsionics.Talent", + intensify: "PrimePsionics.Intensify", + intensify2: "PrimePsionics.Intensify2", + intensify3: "PrimePsionics.Intensify3" }; /** @@ -88,7 +89,7 @@ PP_CONFIG.PSIONICS.powerScalingModes = { PP_CONFIG.PSIONICS.scaling = { intensify: 1, intensify2: 2, - intensify3: 3, + intensify3: 3 }; /** @@ -98,7 +99,7 @@ PP_CONFIG.PSIONICS.scaling = { PP_CONFIG.PSIONICS.ppProgression = [ 0, 4, 6, 16, 20, 32, 38, 46, 54, 72, 82, 94, 94, 108, 108, 124, 124, 142, 152, - 164, 178, + 164, 178 ]; /** @@ -106,71 +107,75 @@ PP_CONFIG.PSIONICS.ppProgression = [ * @enum {string} */ PP_CONFIG.PSIONICS.powerLevels = { - 0: 'PrimePsionics.Talent', - 1: 'DND5E.SpellLevel1', - 2: 'DND5E.SpellLevel2', - 3: 'DND5E.SpellLevel3', - 4: 'DND5E.SpellLevel4', - 5: 'DND5E.SpellLevel5', - 6: 'DND5E.SpellLevel6', - 7: 'DND5E.SpellLevel7', - 8: 'DND5E.SpellLevel8', - 9: 'DND5E.SpellLevel9', + 0: "PrimePsionics.Talent", + 1: "DND5E.SpellLevel1", + 2: "DND5E.SpellLevel2", + 3: "DND5E.SpellLevel3", + 4: "DND5E.SpellLevel4", + 5: "DND5E.SpellLevel5", + 6: "DND5E.SpellLevel6", + 7: "DND5E.SpellLevel7", + 8: "DND5E.SpellLevel8", + 9: "DND5E.SpellLevel9" }; PP_CONFIG.DND5E = { itemProperties: { auditory: { - label: 'PrimePsionics.ComponentAuditory', - abbr: 'PrimePsionics.ComponentAuditoryAbbr', + label: "PrimePsionics.ComponentAuditory", + abbr: "PrimePsionics.ComponentAuditoryAbbr" }, observable: { - label: 'PrimePsionics.ComponentObservable', - abbr: 'PrimePsionics.ComponentObservableAbbr', - }, + label: "PrimePsionics.ComponentObservable", + abbr: "PrimePsionics.ComponentObservableAbbr" + } }, validProperties: { - [typePower]: new Set(['auditory', 'observable', 'concentration', 'ritual']), + [typePower]: new Set(["auditory", "observable", "concentration", "ritual"]) }, specialTimePeriods: { - foc: 'PrimePsionics.Focus', + foc: "PrimePsionics.Focus" }, spellProgression: { - fullp: 'PrimePsionics.FullP', - halfp: 'PrimePsionics.HalfP', - thirdp: 'PrimePsionics.ThirdP', + fullp: "PrimePsionics.FullP", + halfp: "PrimePsionics.HalfP", + thirdp: "PrimePsionics.ThirdP" }, spellcastingTypes: { psionics: { - label: 'PrimePsionics.Psionics', + label: "PrimePsionics.Psionics", progression: { fullp: { - label: 'PrimePsionics.FullP', - divisor: 1, + label: "PrimePsionics.FullP", + divisor: 1 }, halfp: { - label: 'PrimePsionics.HalfP', - divisor: 2, + label: "PrimePsionics.HalfP", + divisor: 2 }, thirdp: { - label: 'PrimePsionics.ThirdP', - divisor: 3, - }, - }, - }, - }, - abilityConsumptionTypes: { - flags: 'PrimePsionics.Flags', + label: "PrimePsionics.ThirdP", + divisor: 3 + } + } + } + }, + activityConsumptionTypes: { + psiPoints: { + label: PsiPoints.label, + consume: PsiPoints.consume, + consumptionLabels: PsiPoints.consumptionLabels + } }, defaultArtwork: { Item: { - [typePower]: 'modules/prime-psionics/assets/icons/power.svg', - }, + [typePower]: "modules/prime-psionics/assets/icons/power.svg" + } }, sourceBooks: { "Psion's Primer": - "The Korranberg Chronicle: Psion's Primer - A Complete Psionics System", - }, + "The Korranberg Chronicle: Psion's Primer - A Complete Psionics System" + } }; export default PP_CONFIG; diff --git a/module/powerData.mjs b/module/powerData.mjs index cc9b6a7..2c59604 100644 --- a/module/powerData.mjs +++ b/module/powerData.mjs @@ -1,4 +1,7 @@ -import { ppText } from './utils.mjs'; +import {modulePath, ppText, typePower} from "./utils.mjs"; + +const {ItemDescriptionTemplate, ActivitiesTemplate} = dnd5e.dataModels.item; +const {ActivationField, DurationField, RangeField, TargetField} = dnd5e.dataModels.shared; /** * Data definition for Power items. @@ -10,72 +13,218 @@ import { ppText } from './utils.mjs'; * @property {string} discipline Psionic discipline to which this power belongs. * @property {string} augmenting The base talent this power improves * @property {Set} properties General components and tags for this power. - * @property {object} scaling Details on how casting at higher levels affects this power. - * @property {string} scaling.mode Spell scaling mode as defined in `PSIONICS.powerScalingModes`. - * @property {string} scaling.formula Dice formula used for scaling. + * @property {string} preparation The preparation mode as found in `CONFIG.PSIONICS.powerPreparationModes` */ export default class PowerData extends dnd5e.dataModels.ItemDataModel.mixin( - dnd5e.dataModels.item.ItemDescriptionTemplate, - dnd5e.dataModels.item.ActivatedEffectTemplate, - dnd5e.dataModels.item.ActionTemplate + ItemDescriptionTemplate, + ActivitiesTemplate ) { + static LOCALIZATION_PREFIXES = [ + "DND5E.ACTIVATION", "DND5E.DURATION", "DND5E.RANGE", "DND5E.SOURCE", "DND5E.TARGET" + ]; + /** @inheritdoc */ static defineSchema() { return this.mergeSchema(super.defineSchema(), { + activation: new ActivationField(), + duration: new DurationField(), + range: new RangeField(), + target: new TargetField(), level: new foundry.data.fields.NumberField({ required: true, integer: true, initial: 1, min: 0, - label: 'DND5E.SpellLevel', + label: "PrimePsionics.PowerLevel" }), discipline: new foundry.data.fields.StringField({ required: true, - label: 'PrimePsionics.PowerDiscipline', + label: "PrimePsionics.PowerDiscipline" }), augmenting: new foundry.data.fields.StringField({ required: true, - label: 'PrimePsionics.Augmenting', + label: "PrimePsionics.Augmenting" }), properties: new foundry.data.fields.SetField( new foundry.data.fields.StringField(), - { label: 'DND5E.Properties' } + {label: "DND5E.Properties"} ), preparation: new foundry.data.fields.SchemaField( { mode: new foundry.data.fields.StringField({ required: true, - initial: 'always', - label: 'PrimePsionics.PowerPreparationMode', - }), - }, - { label: 'PrimePsionics.PowerPreparation' } - ), - scaling: new foundry.data.fields.SchemaField( - { - mode: new foundry.data.fields.StringField({ - required: true, - initial: 'none', - label: 'DND5E.ScalingMode', - }), - formula: new dnd5e.dataModels.fields.FormulaField({ - required: true, - nullable: true, - initial: null, - label: 'DND5E.ScalingFormula', - }), + initial: "always", + label: "PrimePsionics.PowerPreparationMode" + }) }, - { label: 'DND5E.LevelScaling' } + {label: "PrimePsionics.PowerPreparation"} ), + sourceClass: new foundry.data.fields.StringField({label: "DND5E.SpellSourceClass"}) }); } + /** @override */ + static get compendiumBrowserFilters() { + return new Map([ + ["level", { + label: "PrimePsionics.PowerLevel", + type: "range", + config: { + keyPath: "system.level", + min: 0, + max: Object.keys(CONFIG.DND5E.spellLevels).length - 1 + } + }], + ["discipline", { + label: "PrimePsionics.PowerDiscipline", + type: "set", + config: { + choices: CONFIG.PSIONICS.disciplines, + keyPath: "system.discipline" + } + }], + ["properties", this.compendiumBrowserPropertiesFilter(typePower)] + ]); + } + + /* -------------------------------------------- */ + /* Data Migrations */ + /* -------------------------------------------- */ + + /** @inheritDoc */ + static _migrateData(source) { + super._migrateData(source); + ActivitiesTemplate.migrateActivities(source); + PowerData.#migrateActivation(source); + PowerData.#migrateTarget(source); + } + /** + * Migrate activation data. + * Added in DnD5e 4.0.0. + * @param {object} source The candidate source data from which the model will be constructed. + */ + static #migrateActivation(source) { + if (source.activation?.cost) source.activation.value = source.activation.cost; + } + + /* -------------------------------------------- */ + + /** + * Migrate target data. + * Added in DnD5e 4.0.0. + * @param {object} source The candidate source data from which the model will be constructed. + */ + static #migrateTarget(source) { + if (!("target" in source)) return; + source.target.affects ??= {}; + source.target.template ??= {}; + + if ("units" in source.target) source.target.template.units = source.target.units; + if ("width" in source.target) source.target.template.width = source.target.width; + + const type = source.target.type ?? source.target.template.type ?? source.target.affects.type; + if (type in CONFIG.DND5E.areaTargetTypes) { + if ("type" in source.target) source.target.template.type = type; + if ("value" in source.target) source.target.template.size = source.target.value; + } else if (type in CONFIG.DND5E.individualTargetTypes) { + if ("type" in source.target) source.target.affects.type = type; + if ("value" in source.target) source.target.affects.count = source.target.value; + } + } + + /** + * Add additional data shims for powers. + */ + _applyPowerShims() { + Object.defineProperty(this.activation, "cost", { + get() { + foundry.utils.logCompatibilityWarning( + "The `activation.cost` property on `PowerData` has been renamed `activation.value`.", + {since: "DnD5e 4.0", until: "DnD5e 4.4", once: true} + ); + return this.value; + }, + configurable: true, + enumerable: false + }); + Object.defineProperty(this, "scaling", { + get() { + foundry.utils.logCompatibilityWarning( + "The `scaling` property on `PowerData` has been deprecated and is now handled by individual damage parts.", + {since: "DnD5e 4.0", until: "DnD5e 4.4", once: true} + ); + return {mode: "none", formula: null}; + }, + configurable: true, + enumerable: false + }); + Object.defineProperty(this.target, "value", { + get() { + foundry.utils.logCompatibilityWarning( + "The `target.value` property on `PowerData` has been split into `target.template.size` and `target.affects.count`.", + {since: "DnD5e 4.0", until: "DnD5e 4.4", once: true} + ); + return this.template.size || this.affects.count; + }, + configurable: true, + enumerable: false + }); + Object.defineProperty(this.target, "width", { + get() { + foundry.utils.logCompatibilityWarning( + "The `target.width` property on `PowerData` has been moved to `target.template.width`.", + {since: "DnD5e 4.0", until: "DnD5e 4.4", once: true} + ); + return this.template.width; + }, + configurable: true, + enumerable: false + }); + Object.defineProperty(this.target, "units", { + get() { + foundry.utils.logCompatibilityWarning( + "The `target.units` property on `PowerData` has been moved to `target.template.units`.", + {since: "DnD5e 4.0", until: "DnD5e 4.4", once: true} + ); + return this.template.units; + }, + configurable: true, + enumerable: false + }); + Object.defineProperty(this.target, "type", { + get() { + foundry.utils.logCompatibilityWarning( + "The `target.type` property on `PowerData` has been split into `target.template.type` and `target.affects.type`.", + {since: "DnD5e 4.0", until: "DnD5e 4.4", once: true} + ); + return this.template.type || this.affects.type; + }, + configurable: true, + enumerable: false + }); + const firstActivity = this.activities.contents[0] ?? {}; + Object.defineProperty(this.target, "prompt", { + get() { + foundry.utils.logCompatibilityWarning( + "The `target.prompt` property on `PowerData` has moved into its activity.", + {since: "DnD5e 4.0", until: "DnD5e 4.4", once: true} + ); + return firstActivity.target?.prompt; + }, + configurable: true, + enumerable: false + }); + } + + /* -------------------------------------------- */ + /* Tooltips */ + /* -------------------------------------------- */ + /** * The handlebars template for rendering item tooltips. * @type {string} */ - static ITEM_TOOLTIP_TEMPLATE = - 'modules/prime-psionics/templates/power-tooltip.hbs'; + static ITEM_TOOLTIP_TEMPLATE = modulePath("templates/power-tooltip.hbs"); async getCardData(enrichmentOptions = {}) { const context = await super.getCardData(enrichmentOptions); @@ -85,11 +234,11 @@ export default class PowerData extends dnd5e.dataModels.ItemDataModel.mixin( context.tags = this.labels.components.tags; context.subtitle = [ this.labels.level, - CONFIG.PSIONICS.disciplines[this.discipline].label, - ].filterJoin(' • '); + CONFIG.PSIONICS.disciplines[this.discipline].label + ].filterJoin(" • "); if (this.usesPP) { - context.pp = ppText(this.consume.amount, true); - context.tags = [...context.tags, ppText(this.consume.amount)]; + context.pp = ppText(this.ppValue, true); + context.tags = [...context.tags, ppText(this.ppValue)]; } context.augments = this.augmenting; return context; @@ -101,27 +250,23 @@ export default class PowerData extends dnd5e.dataModels.ItemDataModel.mixin( return foundry.utils.mergeObject(await super.getFavoriteData(), { subtitle: [ this.parent.labels.components.ao, - this.parent.labels.activation, + this.parent.labels.activation ], modifier: this.parent.labels.modifier, range: this.range, - save: this.save, + save: this.save }); } - /* -------------------------------------------- */ - /* Migrations */ - /* -------------------------------------------- */ - - static _migrateComponentData(source) { - const components = filteredKeys(source.system?.components ?? {}); - if (components.length) { - foundry.utils.setProperty( - source, - 'flags.dnd5e.migratedProperties', - components - ); - } + /** @inheritDoc */ + async getSheetData(context) { + context.subtitles = [ + {label: context.labels.level}, + {label: context.labels.discipline} + ]; + context.psionics = CONFIG.PSIONICS; + context.properties.active = this.parent.labels?.components?.tags; + context.parts = [modulePath("templates/details-power.hbs"), "dnd5e.field-uses"]; } /* -------------------------------------------- */ @@ -129,52 +274,64 @@ export default class PowerData extends dnd5e.dataModels.ItemDataModel.mixin( /* -------------------------------------------- */ prepareDerivedData() { - this.labels = {}; + ActivitiesTemplate._applyActivityShims.call(this); + this._applyPowerShims(); + super.prepareDerivedData(); + this.prepareDescriptionData(); + + this.duration.concentration = this.properties.has("concentration"); - const tags = Object.fromEntries( - Object.entries(CONFIG.DND5E.spellTags).map(([k, v]) => { - v.tag = true; - return [k, v]; - }) - ); - const attributes = { ...CONFIG.PSIONICS.powerComponents, ...tags }; + this.labels = this.parent.labels ??= {}; + + const tags = { + concentration: CONFIG.DND5E.itemProperties.concentration, + ritual: CONFIG.DND5E.itemProperties.ritual + }; + const attributes = {...CONFIG.PSIONICS.powerComponents, ...tags}; this.labels.level = this.level != 0 ? CONFIG.DND5E.spellLevels[this.level] - : game.i18n.localize('PrimePsionics.Talent'); + : game.i18n.localize("PrimePsionics.Talent"); + this.labels.discipline = CONFIG.PSIONICS.disciplines[this.discipline]?.label; this.labels.school = CONFIG.PSIONICS.disciplines[this.discipline]?.label; - this.labels.pp = this.usesPP ? 'PrimePsionics.PP' : ''; + this.labels.pp = this.usesPP ? "PrimePsionics.PP" : ""; this.labels.aug = this.augmenting - ? game.i18n.format('PrimePsionics.AugmentPower', { - power: this.augmenting, - }) - : ''; + ? game.i18n.format("PrimePsionics.AugmentPower", { + power: this.augmenting + }) + : ""; this.labels.components = this.properties.reduce( (obj, c) => { const config = attributes[c]; if (!config) return obj; - const { abbr, label, icon } = config; - obj.all.push({ abbr, label, icon, tag: config.tag }); - if (config.tag) obj.tags.push(config.label); - else obj.ao.push(config.abbr); + const {abbreviation, label, icon} = config; + obj.all.push({abbreviation, label, icon, tag: config.tag}); + if (config.isTag) obj.tags.push(config.label); + else obj.ao.push(config.abbreviation); return obj; }, - { all: [], ao: [], tags: [] } + {all: [], ao: [], tags: []} ); this.labels.components.ao = new Intl.ListFormat(game.i18n.lang, { - style: 'narrow', - type: 'conjunction', + style: "narrow", + type: "conjunction" }).format(this.labels.components.ao); - this.properties.add('mgc'); + this.properties.add("mgc"); } /** @inheritDoc */ prepareFinalData() { - this.prepareFinalActivatedEffectData(); + const rollData = this.parent.getRollData({deterministic: true}); + const labels = this.parent.labels ??= {}; + this.prepareFinalActivityData(); + ActivationField.prepareData.call(this, rollData, labels); + DurationField.prepareData.call(this, rollData, labels); + RangeField.prepareData.call(this, rollData, labels); + TargetField.prepareData.call(this, rollData, labels); // Necessary because excluded from valid types in Item5e#_prepareProficiency - if ( !this.parent.actor?.system.attributes?.prof ) { + if (!this.parent.actor?.system.attributes?.prof) { this.prof = new dnd5e.documents.Proficiency(0, 0); return; } @@ -182,11 +339,18 @@ export default class PowerData extends dnd5e.dataModels.ItemDataModel.mixin( this.prof = new dnd5e.documents.Proficiency(this.parent.actor.system.attributes.prof, this.proficiencyMultiplier ?? 0); } - /* -------------------------------------------- */ /* Getters */ /* -------------------------------------------- */ + /** + * Attack classification of this spell. + * @type {"spell"} + */ + get attackClassification() { + return "spell"; + } + /** * Properties displayed in chat. * @type {string[]} @@ -199,7 +363,7 @@ export default class PowerData extends dnd5e.dataModels.ItemDataModel.mixin( return [ ...properties, this.labels.components.ao, - ...this.labels.components.tags, + ...this.labels.components.tags ]; } @@ -207,18 +371,20 @@ export default class PowerData extends dnd5e.dataModels.ItemDataModel.mixin( * @returns {boolean} Whether this power is configured to use power points or not */ get usesPP() { - return ( - this.preparation.mode === 'always' && - this.consume.type === 'flags' && - this.consume.target === 'pp' - ); + return (this.preparation.mode === "always") && this.activities.some(a => a.consumption.targets.some(c => c.type === "psiPoints")); + } + + get ppValue() { + const [consumptionData] = this.activities.map(a => a.consumption.targets.find(c => c.type === "psiPoints")); + if (!consumptionData) return null; + return consumptionData.value; } /* -------------------------------------------- */ /** @inheritdoc */ get _typeAbilityMod() { - return this.parent?.actor?.system.attributes.spellcasting || 'int'; + return this.parent?.actor?.system.attributes.spellcasting || "int"; } /* -------------------------------------------- */ @@ -235,4 +401,17 @@ export default class PowerData extends dnd5e.dataModels.ItemDataModel.mixin( get proficiencyMultiplier() { return 1; } + + /** @inheritDoc */ + get scalingIncrease() { + if (this.level !== 0) return null; + return Math.floor(((this.parent.actor?.system.cantripLevel?.({system: {preparation: {mode: "prepared"}}}) ?? 0) + 1) / 6); + } + + /** @inheritDoc */ + getRollData(...options) { + const data = super.getRollData(...options); + // data.item.level = data.item.level + (this.parent.getFlag("dnd5e", "scaling") ?? 0); + return data; + } } diff --git a/module/powerSheet.mjs b/module/powerSheet.mjs index d573a00..c4d0843 100644 --- a/module/powerSheet.mjs +++ b/module/powerSheet.mjs @@ -1,29 +1,31 @@ -import { ppText } from './utils.mjs'; +import {ppText} from "./utils.mjs"; export default class PowerSheet extends dnd5e.applications.item.ItemSheet5e { get template() { - return `modules/prime-psionics/templates/power-sheet.hbs`; + return "modules/prime-psionics/templates/power-sheet.hbs"; } async getData(options = {}) { const context = await super.getData(options); context.psionics = CONFIG.PSIONICS; + context.powerComponents = { ...CONFIG.PSIONICS.powerComponents, - ...CONFIG.DND5E.spellTags, + concentration: CONFIG.DND5E.itemProperties.concentration, + ritual: CONFIG.DND5E.itemProperties.ritual }; - if (context.system.actionType === 'msak') + if (context.system.actionType === "msak") context.itemProperties[0] = game.i18n.localize( - 'PrimePsionics.ActionMPAK' + "PrimePsionics.ActionMPAK" ); - if (context.system.actionType === 'rsak') + if (context.system.actionType === "rsak") context.itemProperties[0] = game.i18n.localize( - 'PrimePsionics.ActionRPAK' + "PrimePsionics.ActionRPAK" ); const consume = - context.system.consume.type === 'flags' - ? { pp: game.i18n.localize('PrimePsionics.PP') } + context.system.consume.type === "flags" + ? {pp: game.i18n.localize("PrimePsionics.PP")} : {}; context.powerScalingModes = CONFIG.PSIONICS.powerScalingModes; @@ -38,7 +40,7 @@ export default class PowerSheet extends dnd5e.applications.item.ItemSheet5e { } else delete context.system.labels.pp; foundry.utils.mergeObject(context, { labels: context.system.labels, - abilityConsumptionTargets: consume, + abilityConsumptionTargets: consume }); return context; diff --git a/module/psiPoints.mjs b/module/psiPoints.mjs new file mode 100644 index 0000000..3bc867f --- /dev/null +++ b/module/psiPoints.mjs @@ -0,0 +1,72 @@ +import {moduleID} from "./utils.mjs"; + +/** + * Class implementing the new ActivityConsumptionTargetConfig using static members + */ +export default class PsiPoints { + /** + * Localized label for the target type. + */ + static get label() { + return "PrimePsionics.PP"; + } + + /** + * Function used to consume according to this type. + * @this {InstanceType} + * @param {ActivityUseConfiguration} config Configuration data for the activity usage. + * @param {ActivityUsageUpdates} updates Updates to be performed. + */ + static async consume(config, updates) { + const pp = this.actor.getFlag(moduleID, "pp"); + const expenditure = Number(this.value) + Number(config.scaling); + updates.actor[`flags.${moduleID}.pp.value`] = pp.value - expenditure; + } + + /** + * Function used to generate a hint of consumption amount. + * @this {InstanceType} + * @param {ActivityUseConfiguration} config Configuration data for the activity usage. + * @returns {{ label: string, hint: string }} Label and hint text. + */ + static consumptionLabels(config) { + const limit = this.actor.getFlag(moduleID, "manifestLimit"); + const points = Number(this.value ?? 0) + Number(config.scaling ?? 0); + return { + label: game.i18n.localize("PrimePsionics.Intensify"), + hint: game.i18n.format("PrimePsionics.ConsumptionHint", {points, limit}) + }; + } +} + +/** + * Configuration data for an activity usage being prepared. + * + * @typedef {object} ActivityUseConfiguration + * @property {object|false} create + * @property {boolean} create.measuredTemplate Should this item create a template? + * @property {object} concentration + * @property {boolean} concentration.begin Should this usage initiate concentration? + * @property {string|null} concentration.end ID of an active effect to end concentration on. + * @property {object|false} consume + * @property {boolean|number[]} consume.resources Set to `true` or `false` to enable or disable all resource + * consumption or provide a list of consumption target indexes + * to only enable those targets. + * @property {boolean} consume.spellSlot Should this spell consume a spell slot? + * @property {Event} event The browser event which triggered the item usage, if any. + * @property {boolean|number} scaling Number of steps above baseline to scale this usage, or `false` if + * scaling is not allowed. + * @property {object} spell + * @property {number} spell.slot The spell slot to consume. + */ + +/** + * Update data produced by activity usage. + * + * @typedef {object} ActivityUsageUpdates + * @property {object} activity Updates applied to activity that performed the activation. + * @property {object} actor Updates applied to the actor that performed the activation. + * @property {string[]} delete IDs of items to be deleted from the actor. + * @property {object[]} item Updates applied to items on the actor that performed the activation. + * @property {Roll[]} rolls Any rolls performed as part of the activation. + */ diff --git a/module/utils.mjs b/module/utils.mjs index 647f6f8..a999b5f 100644 --- a/module/utils.mjs +++ b/module/utils.mjs @@ -1,5 +1,6 @@ -export const typePower = 'prime-psionics.power'; -export const moduleID = 'prime-psionics'; +export const typePower = "prime-psionics.power"; +export const moduleID = "prime-psionics"; +export const modulePath = (path) => "modules/prime-psionics/" + path; /** * @@ -11,8 +12,8 @@ export const moduleID = 'prime-psionics'; export function ppText(pp, lowercase = false) { let text = `${pp} ${ pp === 1 - ? game.i18n.localize('PrimePsionics.1PP') - : game.i18n.localize('PrimePsionics.PP') + ? game.i18n.localize("PrimePsionics.1PP") + : game.i18n.localize("PrimePsionics.PP") }`; return lowercase ? text.toLocaleLowerCase() : text; } diff --git a/package-lock.json b/package-lock.json index 92b2b32..db5b19d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,266 +9,1845 @@ "version": "1.0.0", "license": "ISC", "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.10.0", + "eslint": "^9.10.0", + "globals": "^15.9.0", "rollup": "^3.29.4", "sass": "^1.70.0" } }, - "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "is-extglob": "^2.1.1" + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": ">=0.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "node_modules/@eslint/js": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", + "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", "dev": true, - "bin": { - "rollup": "dist/bin/rollup" + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", + "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/sass": { - "version": "1.70.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", - "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", "bin": { - "sass": "sass.js" + "acorn": "bin/acorn" }, "engines": { - "node": ">=14.0.0" + "node": ">=0.4.0" } }, - "node_modules/sass/node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, - "node_modules/sass/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", + "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.10.0", + "@eslint/plugin-kit": "^0.1.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", + "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.70.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", + "integrity": "sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/sass/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/sass/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/sass/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sass/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/sass/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + } + } + }, + "@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true + }, + "@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "requires": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + } + }, + "@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", + "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", + "dev": true + }, + "@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true + }, + "@eslint/plugin-kit": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", + "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", + "dev": true, + "requires": { + "levn": "^0.4.1" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, - "engines": { - "node": ">=8" + "requires": { + "ms": "^2.1.3" } }, - "node_modules/sass/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", + "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.10.0", + "@eslint/plugin-kit": "^0.1.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.0", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.0.2", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" } }, - "node_modules/sass/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "eslint-scope": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, - "node_modules/sass/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true + }, + "espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "requires": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" } }, - "node_modules/sass/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "requires": { + "estraverse": "^5.1.0" } }, - "node_modules/sass/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "requires": { + "estraverse": "^5.2.0" } }, - "node_modules/sass/node_modules/is-binary-path": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "requires": { + "reusify": "^1.0.4" } }, - "node_modules/sass/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "engines": { - "node": ">=0.12.0" + "requires": { + "flat-cache": "^4.0.0" } }, - "node_modules/sass/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, - "node_modules/sass/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "is-glob": "^4.0.3" } - } - }, - "dependencies": { + }, + "globals": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", + "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true + }, "immutable": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "dev": true }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -284,18 +1863,195 @@ "is-extglob": "^2.1.1" } }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rollup": { "version": "3.29.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", @@ -314,6 +2070,15 @@ } } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "sass": { "version": "1.70.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.70.0.tgz", @@ -426,11 +2191,95 @@ } } }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index e6c8b48..d0a23cd 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,10 @@ }, "homepage": "https://github.com/JPMeehan/prime-psionics#readme", "devDependencies": { + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.10.0", + "globals": "^15.9.0", + "eslint": "^9.10.0", "rollup": "^3.29.4", "sass": "^1.70.0" } diff --git a/prime-psionics.mjs b/prime-psionics.mjs index 845785d..d39206c 100644 --- a/prime-psionics.mjs +++ b/prime-psionics.mjs @@ -1,23 +1,32 @@ -import PP_CONFIG from './module/config.mjs'; -import PowerData from './module/powerData.mjs'; -import PowerSheet from './module/powerSheet.mjs'; -import { typePower, moduleID, ppText } from './module/utils.mjs'; +import PP_CONFIG from "./module/config.mjs"; +import PowerData from "./module/powerData.mjs"; +import PowerSheet from "./module/powerSheet.mjs"; +import {typePower, moduleID, modulePath, ppText} from "./module/utils.mjs"; -Hooks.once('init', () => { +Hooks.once("init", () => { foundry.utils.mergeObject(CONFIG, PP_CONFIG); Object.assign(CONFIG.Item.dataModels, { - [typePower]: PowerData, + [typePower]: PowerData }); - dnd5e.utils.preLocalize('spellcastingTypes.psionics.progression', { - key: 'label', + dnd5e.utils.preLocalize("spellcastingTypes.psionics.progression", { + key: "label" }); Items.registerSheet(moduleID, PowerSheet, { types: [typePower], - makeDefault: true, - label: 'PrimePsionics.Sheets.Power', + label: "PrimePsionics.Sheets.Power" + }); + + loadTemplates([modulePath("templates/details-power.hbs")]); + + dnd5e.applications.CompendiumBrowser.TABS.splice(7, 0, { + tab: "primePowers", + label: "TYPES.Item.prime-psionics.powerPl", + svg: modulePath("assets/icons/power.svg"), + documentClass: "Item", + types: [typePower] }); }); @@ -27,18 +36,18 @@ Hooks.once('init', () => { * */ -Hooks.once('i18nInit', () => { +Hooks.once("i18nInit", () => { _localizeHelper(CONFIG.PSIONICS); }); function _localizeHelper(object) { for (const [key, value] of Object.entries(object)) { switch (typeof value) { - case 'string': - if (value.startsWith('PrimePsionics') || value.startsWith('DND5E')) + case "string": + if (value.startsWith("PrimePsionics") || value.startsWith("DND5E")) object[key] = game.i18n.localize(value); break; - case 'object': + case "object": _localizeHelper(object[key]); break; } @@ -51,11 +60,11 @@ function _localizeHelper(object) { * */ -Hooks.on('renderActorSheet5e', (app, html, context) => { +Hooks.on("renderActorSheet5e", (app, html, context) => { const actor = app.actor; if (!game.user.isGM && actor.limited) return true; - const newCharacterSheet = ['ActorSheet5eCharacter2', 'ActorSheet5eNPC2'].includes(app.constructor.name); + const newCharacterSheet = ["ActorSheet5eCharacter2", "ActorSheet5eNPC2"].includes(app.constructor.name); if (context.isCharacter || context.isNPC) { let powers = context.items.filter((i) => i.type === typePower); powers = app._filterItems(powers, app._filters.spellbook.properties); @@ -63,22 +72,22 @@ Hooks.on('renderActorSheet5e', (app, html, context) => { const spellbook = context.spellbook; const specialPowerPrepModes = { - innate: -5, + innate: -5 }; const specialPowerPrep = {}; const sections = { atwill: -20, innate: -10, - pact: 0.5, + pact: 0.5 }; const cantripOffset = !!spellbook.find((s) => s?.order === sections.atwill) + !!spellbook.find((s) => s?.order === sections.innate); const levelOffset = cantripOffset + !!spellbook.find((s) => s?.order === sections.pact); - const emptyTen = Array.from({ length: 10 }); - if (!!spellbook.length) { + const emptyTen = Array.from({length: 10}); + if (spellbook.length) { // Resolving #5 - bad order for mixed psionics + spellcasting if have spells > spell level. const manifestLevels = emptyTen.map((e, i) => spellbook.findIndex((s) => s?.order === i) @@ -86,7 +95,7 @@ Hooks.on('renderActorSheet5e', (app, html, context) => { let inserted = 0; for (const index in manifestLevels) { const i = Number(index); - if (i === 0 && manifestLevels[i] === -1) { + if ((i === 0) && (manifestLevels[i] === -1)) { inserted += 1; // Cantrip special case spellbook.splice(cantripOffset, 0, undefined); @@ -101,7 +110,7 @@ Hooks.on('renderActorSheet5e', (app, html, context) => { sl, p, label, - { preparationMode = 'always', override } = {} + {preparationMode = "always", override} = {} ) => { const aeOverride = foundry.utils.hasProperty( context.actor.overrides, @@ -114,16 +123,16 @@ Hooks.on('renderActorSheet5e', (app, html, context) => { canCreate: actor.isOwner, canPrepare: false, spells: [], - uses: '-', - slots: '-', + uses: "-", + slots: "-", override: override || 0, dataset: { type: typePower, level: preparationMode in sections ? 1 : p, - preparationMode, + preparationMode }, prop: sl, - editable: context.editable && !aeOverride, + editable: context.editable && !aeOverride }; let i = p; @@ -136,55 +145,54 @@ Hooks.on('renderActorSheet5e', (app, html, context) => { }; powers.forEach((power) => { - if (power.system.usesPP) - power.system.labels.pp = ppText(power.system.consume.amount); + if (power.system.usesPP) power.system.labels.pp = ppText(power.system.ppValue); foundry.utils.mergeObject(power, { - labels: power.system.labels, + labels: power.system.labels }); // Activation - const cost = power.system.activation?.cost; + const cost = power.system.activation?.value; const abbr = { - action: 'DND5E.ActionAbbr', - bonus: 'DND5E.BonusActionAbbr', - reaction: 'DND5E.ReactionAbbr', - minute: 'DND5E.TimeMinuteAbbr', - hour: 'DND5E.TimeHourAbbr', - day: 'DND5E.TimeDayAbbr', + action: "DND5E.ActionAbbr", + bonus: "DND5E.BonusActionAbbr", + reaction: "DND5E.ReactionAbbr", + minute: "DND5E.TimeMinuteAbbr", + hour: "DND5E.TimeHourAbbr", + day: "DND5E.TimeDayAbbr" }[power.system.activation.type]; const itemContext = newCharacterSheet ? { - activation: + activation: cost && abbr ? `${cost}${game.i18n.localize(abbr)}` : power.labels.activation, - preparation: { applicable: false }, - } + preparation: {applicable: false} + } : { - toggleTitle: CONFIG.DND5E.spellPreparationModes.always, - toggleClass: 'fixed', - }; + toggleTitle: CONFIG.DND5E.spellPreparationModes.always, + toggleClass: "fixed" + }; if (newCharacterSheet) { // Range const units = power.system.range?.units; - if (units && units !== 'none') { + if (units && (units !== "none")) { if (units in CONFIG.DND5E.movementUnits) { itemContext.range = { distance: true, value: power.system.range.value, - unit: game.i18n.localize(`DND5E.Dist${units.capitalize()}Abbr`), + unit: game.i18n.localize(`DND5E.Dist${units.capitalize()}Abbr`) }; - } else itemContext.range = { distance: false }; + } else itemContext.range = {distance: false}; } // To Hit const toHit = parseInt(power.labels.modifier); if (power.hasAttack && !isNaN(toHit)) { itemContext.toHit = { - sign: Math.sign(toHit) < 0 ? '-' : '+', - abs: Math.abs(toHit), + sign: Math.sign(toHit) < 0 ? "-" : "+", + abs: Math.abs(toHit) }; } } @@ -203,14 +211,14 @@ Hooks.on('renderActorSheet5e', (app, html, context) => { mode, index, CONFIG.PSIONICS.powerPreparationModes[mode], - { preparationMode: mode } + {preparationMode: mode} ); } specialPowerPrep[index].spells.push(power); } else { if (!spellbook[index]) { registerSection(pl, p, CONFIG.PSIONICS.powerLevels[p], { - preparationMode: power.system.preparation.mode, + preparationMode: power.system.preparation.mode }); } // Add the power to the relevant heading @@ -224,16 +232,16 @@ Hooks.on('renderActorSheet5e', (app, html, context) => { spellbook.sort((a, b) => a.order - b.order); const spellList = newCharacterSheet - ? html.find('.spells') - : html.find('.spellbook'); + ? html.find(".spells") + : html.find(".spellbook"); const spellListTemplate = newCharacterSheet - ? 'systems/dnd5e/templates/actors/tabs/creature-spells.hbs' - : 'systems/dnd5e/templates/actors/parts/actor-spellbook.hbs'; + ? "systems/dnd5e/templates/actors/tabs/creature-spells.hbs" + : "systems/dnd5e/templates/actors/parts/actor-spellbook.hbs"; renderTemplate(spellListTemplate, context).then((partial) => { spellList.html(partial); if (newCharacterSheet) { - const schoolSlots = spellList.find('.item-detail.item-school'); + const schoolSlots = spellList.find(".item-detail.item-school"); /** @type {Array} */ const disciplines = Object.values(CONFIG.PSIONICS.disciplines).map( (d) => d.label @@ -245,30 +253,30 @@ Hooks.on('renderActorSheet5e', (app, html, context) => { } } - let pp = app.actor.getFlag(moduleID, 'pp'); + let pp = app.actor.getFlag(moduleID, "pp"); if (pp) { const ppContext = { pp: pp.value, ppMax: pp.max, - limit: app.actor.getFlag(moduleID, 'manifestLimit'), + limit: app.actor.getFlag(moduleID, "manifestLimit") }; const ppTemplate = newCharacterSheet - ? '/modules/prime-psionics/templates/pp-partial-2.hbs' - : '/modules/prime-psionics/templates/pp-partial.hbs'; + ? "/modules/prime-psionics/templates/pp-partial-2.hbs" + : "/modules/prime-psionics/templates/pp-partial.hbs"; renderTemplate(ppTemplate, ppContext).then((powerHeader) => { const ppTarget = newCharacterSheet - ? 'dnd5e-inventory' - : '.inventory-list'; + ? "dnd5e-inventory" + : ".inventory-list"; spellList.find(ppTarget).prepend(powerHeader); }); } app.activateListeners(spellList); }); - if (app.constructor.name === 'ActorSheet5eNPC') { - const features = html.find('dnd5e-inventory').first(); - const inventory = features.find('ol').last(); - for (const i of inventory.find('li')) { + if (app.constructor.name === "ActorSheet5eNPC") { + const features = html.find("dnd5e-inventory").first(); + const inventory = features.find("ol").last(); + for (const i of inventory.find("li")) { const item = actor.items.get(i.dataset.itemId); if (item.type === typePower) i.remove(); } @@ -283,7 +291,7 @@ Hooks.on('renderActorSheet5e', (app, html, context) => { */ function hasPowerPoints(actor) { for (const cls of Object.values(actor.classes)) { - if (cls.spellcasting.type === 'psionics') return true; + if (cls.spellcasting.type === "psionics") return true; } return false; } @@ -295,18 +303,18 @@ function hasPowerPoints(actor) { */ Hooks.on( - 'dnd5e.computePsionicsProgression', + "dnd5e.computePsionicsProgression", (progression, actor, cls, spellcasting, count) => { - if (!progression.hasOwnProperty('psionics')) progression.psionics = 0; + if (!("psionics" in progression)) progression.psionics = 0; const prog = CONFIG.DND5E.spellcastingTypes.psionics.progression[ spellcasting.progression ]; if (!prog) return; - progression.psionics += Math.floor(spellcasting.levels / prog.divisor ?? 1); + progression.psionics += Math.floor(spellcasting.levels / (prog.divisor ?? 1)); // Single-classed, non-full progression rounds up, rather than down, except at first level for half manifesters. - if (count === 1 && prog.divisor > 1 && progression.psionics) { + if ((count === 1) && (prog.divisor > 1) && progression.psionics) { progression.psionics = Math.ceil(spellcasting.levels / prog.divisor); } @@ -314,10 +322,10 @@ Hooks.on( } ); -Hooks.on('dnd5e.preparePsionicsSlots', (spells, actor, progression) => { - if (actor.type !== 'npc' || !actor.items.some((i) => i.type === typePower)) +Hooks.on("dnd5e.preparePsionicsSlots", (spells, actor, progression) => { + if ((actor.type !== "npc") || !actor.items.some((i) => i.type === typePower)) return; - const level = foundry.utils.getProperty(actor, 'system.details.spellLevel'); + const level = foundry.utils.getProperty(actor, "system.details.spellLevel"); updateManifester(actor, level); }); @@ -332,172 +340,30 @@ function updateManifester(actor, manifesterLevel) { const updates = { manifestLimit: limit, pp: { - max: CONFIG.PSIONICS.ppProgression[manifesterLevel], - }, + max: CONFIG.PSIONICS.ppProgression[manifesterLevel] + } }; if (actor === undefined) return; - const pp = actor.getFlag(moduleID, 'pp'); + const pp = actor.getFlag(moduleID, "pp"); if (pp === undefined) updates.pp.value = CONFIG.PSIONICS.ppProgression[manifesterLevel]; - else if (typeof pp === 'number') updates.pp.value = pp; // migration + else if (typeof pp === "number") updates.pp.value = pp; // migration foundry.utils.mergeObject(actor.flags, { - [moduleID]: updates, + [moduleID]: updates }); } -/** - * - * ITEM USAGE HANDLING - * - */ - -Hooks.on('renderAbilityUseDialog', (dialog, html, data) => { - if (!dialog.item.system.usesPP) return; - - const limit = game.i18n.format('PrimePsionics.ManifestLimit', { - limit: dialog.item.parent.getFlag(moduleID, 'manifestLimit'), - }); - const input = ``; - - const notes = html.find('.notes'); - if (notes[0].innerHTML) { - notes[0].innerHTML += `
${limit}`; - html.height(html.height() + 10); - } else notes.text(limit); - - html - .find('#ability-use-form') - .append( - '
' + - game.i18n.localize('PrimePsionics.PPManifest') + - input + - '
' - ); - html.height(html.height() + 10); - html.find("input[name='consumeResource']").parents('.form-group').remove(); -}); - -Hooks.on('dnd5e.preItemUsageConsumption', (item, config, options) => { - if (!item.system.usesPP) return; - config.consumeResource = false; -}); - -Hooks.on('dnd5e.itemUsageConsumption', (item, config, options, usage) => { - if (!item.system.usesPP) return; - options.ppSpend = config.ppSpend; - const currentPP = item.parent.getFlag(moduleID, 'pp')?.value ?? 0; - const newPP = currentPP - config.ppSpend; - if (newPP >= 0) usage.actorUpdates['flags.prime-psionics.pp.value'] = newPP; - else { - ui.notifications.warn(game.i18n.localize('PrimePsionics.TooManyPP')); - return false; - } -}); - -Hooks.on('dnd5e.preDisplayCard', (item, chatData, options) => { - if (!item.system.usesPP) return; - chatData.content = chatData.content.replace( - ppText(item.system.consume.amount), - ppText(options.ppSpend) - ); - chatData.flags[moduleID] = { ppSpend: options.ppSpend }; -}); - -Hooks.on('renderChatMessage', (app, html, context) => { - const ppSpend = app.getFlag(moduleID, 'ppSpend'); - if (ppSpend === undefined) return; - const damage = html.find("button[data-action='damage']"); - if (damage.length) damage[0].dataset['ppSpend'] = ppSpend; -}); - -/** - * SCALING - */ - -Hooks.on('dnd5e.preRollDamage', (item, rollConfig) => { - if (item.type !== typePower) return; - const firstRoll = rollConfig.rollConfigs[0]; - if (item.system.scaling.mode === 'talent') { - let level; - if (rollConfig.actor.type === 'character') - level = rollConfig.actor.system.details.level; - else if (item.system.preparation.mode === 'innate') - level = Math.ceil(rollConfig.actor.system.details.cr); - else level = rollConfig.actor.system.details.spellLevel; - const add = Math.floor((level + 1) / 6); - if (add === 0) return; - - scaleDamage( - firstRoll.parts, - item.system.scaling.formula || firstRoll.parts.join(' + '), - add, - rollConfig.data - ); - } else if ( - Object.keys(CONFIG.PSIONICS.scaling).includes(item.system.scaling.mode) && - item.system.scaling.formula - ) { - const ppSpend = Number(rollConfig.event.target.dataset['ppSpend']); - if (ppSpend === NaN) return; - const minPP = item.system.consume.amount; - const intensify = Math.floor( - Math.max(0, ppSpend - minPP) / - CONFIG.PSIONICS.scaling[item.system.scaling.mode] - ); - if (intensify === 0) return; - scaleDamage( - firstRoll.parts, - item.system.scaling.formula, - intensify, - rollConfig.data - ); - } -}); -/** - * Scale an array of damage parts according to a provided scaling formula and scaling multiplier. - * @param {string[]} parts The original parts of the damage formula. - * @param {string} scaling The scaling formula. - * @param {number} times A number of times to apply the scaling formula. - * @param {object} rollData A data object that should be applied to the scaled damage roll - * @returns {string[]} The parts of the damage formula with the scaling applied. - * @private - */ -function scaleDamage(parts, scaling, times, rollData) { - if (times <= 0) return parts; - const p0 = new Roll(parts[0], rollData); - const s = new Roll(scaling, rollData).alter(times); - - // Attempt to simplify by combining like dice terms - let simplified = false; - if (s.terms[0] instanceof Die && s.terms.length === 1) { - const d0 = p0.terms[0]; - const s0 = s.terms[0]; - if ( - d0 instanceof Die && - d0.faces === s0.faces && - d0.modifiers.equals(s0.modifiers) - ) { - d0.number += s0.number; - parts[0] = p0.formula; - simplified = true; - } - } - - // Otherwise, add to the first part - if (!simplified) parts[0] = `${parts[0]} + ${s.formula}`; - return parts; -} /** * * POWER POINT RESET ON LR * */ -Hooks.on('dnd5e.preRestCompleted', (actor, result) => { +Hooks.on("dnd5e.preRestCompleted", (actor, result) => { if (!result.longRest) return true; - const pp = actor.getFlag(moduleID, 'pp'); + const pp = actor.getFlag(moduleID, "pp"); if (!pp) return; - result.updateData['flags.prime-psionics.pp.value'] = pp.max; + result.updateData["flags.prime-psionics.pp.value"] = pp.max; }); /** @@ -507,34 +373,75 @@ Hooks.on('dnd5e.preRestCompleted', (actor, result) => { */ Hooks.on( - 'dnd5e.buildPsionicsSpellcastingTable', + "dnd5e.buildPsionicsSpellcastingTable", (table, item, spellcasting) => { table.headers = [ [ - { content: game.i18n.localize('PrimePsionics.PP') }, - { content: game.i18n.localize('PrimePsionics.PsiLimit') }, - ], + {content: game.i18n.localize("PrimePsionics.PP")}, + {content: game.i18n.localize("PrimePsionics.PsiLimit")} + ] ]; - table.cols = [{ class: 'spellcasting', span: 2 }]; + table.cols = [{class: "spellcasting", span: 2}]; for (const level of Array.fromRange(CONFIG.DND5E.maxLevel, 1)) { - const progression = { psionics: 0 }; + const progression = {psionics: 0}; spellcasting.levels = level; globalThis.dnd5e.documents.Actor5e.computeClassProgression( progression, item, - { spellcasting } + {spellcasting} ); - const pp = CONFIG.PSIONICS.ppProgression[progression.psionics] || '—'; + const pp = CONFIG.PSIONICS.ppProgression[progression.psionics] || "—"; const limit = - Math.ceil(Math.min(progression.psionics, 10) / 2) * 2 || '—'; + Math.ceil(Math.min(progression.psionics, 10) / 2) * 2 || "—"; table.rows.push([ - { class: 'spell-slots', content: `${pp}` }, - { class: 'spell-slots', content: `${limit}` }, + {class: "spell-slots", content: `${pp}`}, + {class: "spell-slots", content: `${limit}`} ]); } } ); + +/** + * + * Useful Defaults + * + */ + +Hooks.on("preCreateItem", (item, data, context, userId) => { + if (item.type !== typePower) return; + const bookSource = foundry.utils.getProperty(data, "system.source.book"); + if (!bookSource) item.updateSource({"system.source": { + book: "Psion's Primer", + license: "DMsGuild CCA" + }}); +}); + +Hooks.on("preUpdateItem", (item, changes, context, userId) => { + if (item.type !== typePower) return; + const activityChanges = foundry.utils.getProperty(changes, "system.activities"); + if (!activityChanges) return; + const activities = foundry.utils.getProperty(item, "system.activities"); + for (const [key, activityData] of Object.entries(activityChanges)) { + if (!activities.get(key) && !key.startsWith("-=")) { + // make changes to activity + if (item.system.level > 0) { + activityData.consumption.targets.push({ + type: "psiPoints", + value: "1", + scaling: { + mode: "amount" + } + }); + activityData.consumption.scaling.allowed = true; + activityData.consumption.scaling.max = "1 + @flags.prime-psionics.manifestLimit - @activity.consumption.targets.0.value"; + } + else { + // Talents + } + } + } +}); diff --git a/rollup.config.mjs b/rollup.config.mjs index 05c41f2..06228a2 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -1,7 +1,7 @@ export default { - input: './prime-psionics.mjs', + input: "./prime-psionics.mjs", output: { - file: './prime-psionics-compiled.mjs', - format: 'esm', - }, + file: "./prime-psionics-compiled.mjs", + format: "esm" + } }; diff --git a/templates/details-power.hbs b/templates/details-power.hbs new file mode 100644 index 0000000..c2d48dc --- /dev/null +++ b/templates/details-power.hbs @@ -0,0 +1,44 @@ +

{{ localize "PrimePsionics.PowerDetails" }}

+
+ {{ localize "PrimePsionics.PowerDetails" }} + + {{!-- Spell Level --}} + {{ formField fields.level value=source.level choices=psionics.powerLevels localize=true }} + + {{#if system.level}} + {{ formField fields.augmenting value=source.augmenting localize=true }} + {{/if}} + + {{!-- Spell School --}} + {{ formField fields.discipline value=source.discipline choices=psionics.disciplines + labelAttr="label" blank="" localize=true }} + + {{!-- Spell Components --}} + {{ formField fields.properties options=properties.options label="DND5E.Properties" localize=true + input=inputs.createMultiCheckboxInput stacked=true classes="checkbox-grid checkbox-grid-3" }} + + {{!-- Source Class --}} + {{#if isEmbedded}} + {{ formField fields.sourceClass value=source.sourceClass localize=true choices=item.parent.spellcastingClasses + labelAttr="name" blank="" }} + {{/if}} +
+ +
+ {{ localize "PrimePsionics.PowerManifestingHeader" }} + + {{!-- Activation --}} + {{> "dnd5e.field-activation" activation=system.activation fields=fields.activation.fields data=source.activation + activationTypes=activationTypes inputs=inputs label="DND5E.SpellCastTime" }} + + {{!-- Range --}} + {{> "dnd5e.field-range" range=system.range fields=fields.range.fields data=source.range rangeTypes=rangeTypes + inputs=inputs }} + + {{!-- Duration --}} + {{> "dnd5e.field-duration" duration=system.duration fields=fields.duration.fields data=source.duration + durationUnits=durationUnits inputs=inputs }} +
+ +{{> "dnd5e.field-targets" target=system.target fields=fields.target.fields data=source.target inputs=inputs +disabled=false }} \ No newline at end of file diff --git a/templates/power-tooltip.hbs b/templates/power-tooltip.hbs index 1bab222..a7bb634 100644 --- a/templates/power-tooltip.hbs +++ b/templates/power-tooltip.hbs @@ -1,14 +1,14 @@
{{#if discipline}} -
- {{#with - (lookup @root.psionics.disciplines discipline) - as |disciplineConfig| - }} - - {{/with}} -
+
+ {{#with + (lookup @root.psionics.disciplines discipline) + as |disciplineConfig| + }} + + {{/with}} +
{{/if}}
{{name}} @@ -20,37 +20,37 @@
{{#if uses.max}} - {{uses.value}} - / - {{uses.max}} - {{localize 'DND5E.Charges'}} + {{uses.value}} + / + {{uses.max}} + {{localize 'DND5E.Charges'}} {{/if}}
    {{#if augments}} -
  • - {{localize 'PrimePsionics.Augmenting'}}: - - {{augments}} - -
  • +
  • + {{localize 'PrimePsionics.Augmenting'}}: + + {{augments}} + +
  • {{/if}} {{#if pp}} -
  • - {{localize 'PrimePsionics.PsiCost'}}: - - {{pp}} - -
  • +
  • + {{localize 'PrimePsionics.PsiCost'}}: + + {{pp}} + +
  • {{/if}}
  • {{localize 'PrimePsionics.ManifestTime'}}: {{labels.activation}} {{#if activation.condition}} - ({{activation.condition}}) + ({{activation.condition}}) {{/if}}
  • @@ -76,9 +76,14 @@
    {{{description.value}}}
      {{#each tags}} -
    • - {{this}} -
    • +
    • + {{this}} +
    • {{/each}} -
    +
{{#if controlHints}} +
+ {{ localize + {{ localize "DND5E.Controls.LockHint" }} +
+ {{/if}}
\ No newline at end of file