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" }}
+
+
+
+
+{{> "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 @@