{ "version": 3, "sources": ["../../../../../dev/foundry-helpers/node_modules/luxon/src/errors.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/formats.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/zone.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/zones/systemZone.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/zones/IANAZone.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/locale.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/zones/fixedOffsetZone.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/zones/invalidZone.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/zoneUtil.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/digits.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/settings.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/invalid.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/conversions.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/util.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/english.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/formatter.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/regexParser.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/duration.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/interval.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/info.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/diff.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/impl/tokenParser.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/datetime.js", "../../../../../dev/foundry-helpers/node_modules/luxon/src/luxon.js", "../../../../../dev/foundry-helpers/node_modules/remeda/dist/index.js", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/lazyDataLastImpl.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/purry.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/add.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/addProp.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/allPass.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/anyPass.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/capitalize.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/withPrecision.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/ceil.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/chunk.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/clamp.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/clone.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/concat.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/purryOn.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/conditional.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/constant.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/countBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/debounce.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/defaultTo.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/utilityEvaluators.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/pipe.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/purryFromLazy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/difference.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/differenceWith.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/divide.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/doNothing.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/drop.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/hasAtLeast.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/swapInPlace.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/heap.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/purryOrderRules.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/dropFirstBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/dropLast.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/dropLastWhile.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/dropWhile.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/endsWith.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/entries.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/evolve.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/filter.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/toSingle.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/find.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/findIndex.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/findLast.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/findLastIndex.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/first.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/firstBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/flat.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/flatMap.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/floor.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/forEach.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/forEachObj.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/fromEntries.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/fromKeys.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/funnel.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/groupBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/groupByProp.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isDeepEqual.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/hasSubObject.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/identity.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/indexBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/intersection.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/intersectionWith.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/invert.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isArray.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isBigInt.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isBoolean.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isDate.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isDefined.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isEmpty.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isEmptyish.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isError.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isFunction.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isIncludedIn.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isNonNull.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isNonNullish.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isNot.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isNullish.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isNumber.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isObjectType.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isPlainObject.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isPromise.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isShallowEqual.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isStrictEqual.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isString.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isSymbol.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/isTruthy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/join.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/keys.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/last.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/length.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/map.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/mapKeys.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/mapToObj.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/mapValues.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/mapWithFeedback.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sum.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/mean.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/meanBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/median.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/merge.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/mergeAll.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/mergeDeep.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/multiply.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/quickSelect.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/nthBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/objOf.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/omit.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/omitBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/once.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/only.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/partialBind.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/partialLastBind.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/partition.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/pathOr.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/pick.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/pickBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/piped.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/product.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/prop.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/pullObject.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/randomBigInt.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/randomInteger.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/randomString.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/range.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/rankBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/reduce.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/reverse.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/round.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sample.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/set.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/setPath.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/shuffle.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sliceString.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sort.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sortBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/binarySearchCutoffIndex.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sortedIndex.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sortedIndexBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sortedIndexWith.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sortedLastIndex.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sortedLastIndexBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/splice.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/split.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/splitAt.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/splitWhen.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/startsWith.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/stringToPath.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/subtract.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/sumBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/swapIndices.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/swapProps.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/take.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/takeFirstBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/takeLast.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/takeLastWhile.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/takeWhile.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/tap.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/times.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/internal/words.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/toCamelCase.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/toKebabCase.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/toLowerCase.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/toSnakeCase.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/toTitleCase.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/toUpperCase.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/truncate.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/uncapitalize.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/unique.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/uniqueBy.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/uniqueWith.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/values.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/when.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/zip.ts", "../../../../../dev/foundry-helpers/node_modules/remeda/src/zipWith.ts", "../../../../../dev/foundry-helpers/node_modules/zod/index.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/classic/external.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/index.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/core.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/util.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/errors.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/parse.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/regexes.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/checks.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/doc.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/versions.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/schemas.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/index.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ar.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/az.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/be.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/bg.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ca.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/cs.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/da.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/de.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/en.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/eo.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/es.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/fa.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/fi.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/fr.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/fr-CA.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/he.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/hu.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/hy.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/id.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/is.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/it.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ja.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ka.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/km.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/kh.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ko.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/lt.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/mk.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ms.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/nl.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/no.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ota.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ps.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/pl.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/pt.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ru.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/sl.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/sv.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ta.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/th.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/tr.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/uk.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ua.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/ur.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/uz.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/vi.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/zh-CN.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/zh-TW.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/locales/yo.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/registries.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/api.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/to-json-schema.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/json-schema-processors.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/json-schema-generator.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/core/json-schema.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/classic/schemas.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/classic/checks.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/classic/iso.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/classic/errors.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/classic/parse.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/classic/compat.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/classic/from-json-schema.js", "../../../../../dev/foundry-helpers/node_modules/zod/v4/classic/coerce.js", "../../../../../dev/foundry-helpers/dist/_zod/document-id.js", "../../../../../dev/foundry-helpers/dist/_zod/document-uuid.js", "../../../../../dev/foundry-helpers/dist/_zod/client-document.js", "../../../../../dev/foundry-helpers/dist/_zod/file-path.js", "../../../../../dev/foundry-helpers/dist/_zod/filters/equipment.js", "../../../../../dev/foundry-helpers/dist/_zod/foreign-document.js", "../../../../../dev/foundry-helpers/dist/_zod/range.js", "../../../../../dev/foundry-helpers/dist/_zod/safe-array.js", "../../../../../dev/foundry-helpers/dist/_zod/spellcasting.js", "../../../../../dev/foundry-helpers/dist/_zod/zod-document.js", "../../../../../dev/foundry-helpers/dist/system.js", "../../../../../dev/foundry-helpers/dist/module.js", "../../../../../dev/foundry-helpers/dist/action.js", "../../../../../dev/foundry-helpers/dist/actor.js", "../../../../../dev/foundry-helpers/dist/application.js", "../../../../../dev/foundry-helpers/dist/array.js", "../../../../../dev/foundry-helpers/dist/chat.js", "../../../../../dev/foundry-helpers/dist/compendium.js", "../../../../../dev/foundry-helpers/dist/damage.js", "../../../../../dev/foundry-helpers/dist/dialog.js", "../../../../../dev/foundry-helpers/dist/document.js", "../../../../../dev/foundry-helpers/dist/effect.js", "../../../../../dev/foundry-helpers/dist/flags.js", "../../../../../dev/foundry-helpers/dist/handlebars.js", "../../../../../dev/foundry-helpers/dist/hooks.js", "../../../../../dev/foundry-helpers/dist/html.js", "../../../../../dev/foundry-helpers/dist/item.js", "../../../../../dev/foundry-helpers/dist/keybinds.js", "../../../../../dev/foundry-helpers/dist/libwrapper.js", "../../../../../dev/foundry-helpers/dist/localize.js", "../../../../../dev/foundry-helpers/dist/math.js", "../../../../../dev/foundry-helpers/dist/object.js", "../../../../../dev/foundry-helpers/dist/pf2e/check.js", "../../../../../dev/foundry-helpers/dist/pf2e/degree-of-success.js", "../../../../../dev/foundry-helpers/dist/pf2e/difficulty-class.js", "../../../../../dev/foundry-helpers/dist/pf2e/document.js", "../../../../../dev/foundry-helpers/dist/pf2e/identify.js", "../../../../../dev/foundry-helpers/dist/pf2e/inventory.js", "../../../../../dev/foundry-helpers/dist/pf2e/misc.js", "../../../../../dev/foundry-helpers/dist/pf2e/rules.js", "../../../../../dev/foundry-helpers/dist/pf2e/notes.js", "../../../../../dev/foundry-helpers/dist/pf2e/spell.js", "../../../../../dev/foundry-helpers/dist/pf2e/spell-consumable.js", "../../../../../dev/foundry-helpers/dist/pf2e/spellcasting.js", "../../../../../dev/foundry-helpers/dist/rules.js", "../../../../../dev/foundry-helpers/dist/settings.js", "../../../../../dev/foundry-helpers/dist/socket.js", "../../../../../dev/foundry-helpers/dist/spellcasting.js", "../../../../../dev/foundry-helpers/dist/time.js", "../../../../../dev/foundry-helpers/dist/token.js", "../../../../../dev/foundry-helpers/dist/user.js", "../../../../../dev/foundry-helpers/dist/utils.js", "../src/tools/_shared.ts", "../src/tools/_utils.ts", "../src/tools/actionable/_utils.ts", "../src/module-tool-application.ts", "../src/tools/actionable/applications/generate-cast.ts", "../src/tools/actionable/spellcasting.ts", "../src/tools/actionable/rule-elements/actionable.ts", "../../../../../dev/foundry-helpers/src/system.ts", "../../../../../dev/foundry-helpers/src/module.ts", "../../../../../dev/foundry-helpers/src/action.ts", "../../../../../dev/foundry-helpers/src/html.ts", "../../../../../dev/foundry-helpers/src/item.ts", "../../../../../dev/foundry-helpers/src/localize.ts", "../../../../../dev/foundry-helpers/src/pf2e/difficulty-class.ts", "../../../../../dev/foundry-helpers/src/pf2e/identify.ts", "../../../../../dev/foundry-helpers/src/pf2e/inventory.ts", "../../../../../dev/foundry-helpers/src/pf2e/misc.ts", "../../../../../dev/foundry-helpers/src/pf2e/spell.ts", "../../../../../dev/foundry-helpers/src/pf2e/spell-consumable.ts", "../../../../../dev/foundry-helpers/src/settings.ts", "../../../../../dev/foundry-helpers/src/time.ts", "../src/tools/actionable/rule-elements/item-cast.ts", "../src/module-tool.ts", "../src/tools/actionable/tool.ts", "../src/tools/anonymous.ts", "../src/tools/arp.ts", "../src/tools/auto-cover/_contants.ts", "../src/tools/auto-cover/geometry.ts", "../src/tools/auto-cover/highlight.ts", "../src/tools/auto-cover/tool.ts", "../src/tools/better-chat/merge/_utils.ts", "../src/tools/better-chat/merge/data.ts", "../src/tools/better-chat/merge/process.ts", "../src/tools/better-chat/merge/render.ts", "../src/tools/better-chat/tool.ts", "../src/tools/better-effects-panel.ts", "../src/tools/better-inventory.ts", "../src/tools/better-merchant/data/filter.ts", "../src/tools/better-merchant/data/service.ts", "../src/tools/better-merchant/model/base.ts", "../src/tools/better-merchant/model/item.ts", "../src/tools/better-merchant/model/service.ts", "../src/tools/better-merchant/applications/filters-menu.ts", "../src/tools/better-merchant/applications/pull-menu.ts", "../src/tools/better-merchant/applications/sell-items.ts", "../src/tools/better-merchant/applications/service-menu.ts", "../src/tools/better-merchant/tool.ts", "../src/tools/better-movement.ts", "../src/tools/better-sheet/retrain.ts", "../src/tools/better-sheet/tool.ts", "../src/tools/better-tool.ts", "../src/tools/better-trade.ts", "../src/tools/character-importer/sheet/_utils.ts", "../src/tools/character-importer/sheet/entry.ts", "../src/tools/character-importer/sheet/context/_utils.ts", "../src/tools/character-importer/sheet/context/core.ts", "../src/tools/character-importer/sheet/context/details.ts", "../src/tools/character-importer/sheet/context/feats.ts", "../src/tools/character-importer/sheet/context/inventory.ts", "../src/tools/character-importer/sheet/context/skills.ts", "../src/tools/character-importer/sheet/context/spells.ts", "../src/tools/character-importer/sheet/import.ts", "../src/tools/character-importer/data.ts", "../src/tools/character-importer/model.ts", "../src/tools/character-importer/parser/_utils.ts", "../src/tools/character-importer/parser/pathbuilder.ts", "../src/tools/character-importer/tool.ts", "../src/tools/condition-manager/application.ts", "../src/tools/condition-manager/tool.ts", "../src/tools/droppeth.ts", "../src/tools/giveth.ts", "../src/tools/hero-actions/data.ts", "../src/tools/hero-actions/trade.ts", "../src/tools/hero-actions/tool.ts", "../src/tools/identify/data.ts", "../src/tools/identify/application.ts", "../src/tools/identify/tool.ts", "../src/tools/resource-tracker/data.ts", "../src/tools/resource-tracker/tracker.ts", "../src/tools/resource-tracker/tool.ts", "../src/tools/roll-tracker/data.ts", "../src/tools/roll-tracker/tracker.ts", "../src/tools/roll-tracker/tool.ts", "../src/tools/share-data/tool.ts", "../src/tools/share-data/data.ts", "../src/tools/share-data/application.ts", "../src/tools/target-helper/data/save-instance.ts", "../src/tools/target-helper/data/targets-data.ts", "../src/tools/target-helper/data/target-helper.ts", "../src/tools/target-helper/tool/_utils.ts", "../src/tools/target-helper/tool/_buttons.ts", "../src/tools/target-helper/tool/_saves.ts", "../src/tools/target-helper/tool/_targets.ts", "../src/tools/target-helper/tool/action.ts", "../src/tools/target-helper/tool/area.ts", "../src/tools/target-helper/tool/check.ts", "../src/tools/target-helper/tool/damage.ts", "../src/tools/target-helper/tool/spell.ts", "../src/tools/target-helper/tool/tool.ts", "../src/tools/unided.ts", "../src/main.ts"], "sourcesContent": ["// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n constructor(reason) {\n super(`Invalid DateTime: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n constructor(reason) {\n super(`Invalid Interval: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n constructor(reason) {\n super(`Invalid Duration: ${reason.toMessage()}`);\n }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n constructor(unit) {\n super(`Invalid unit ${unit}`);\n }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n constructor() {\n super(\"Zone is an abstract class\");\n }\n}\n", "/**\n * @private\n */\n\nconst n = \"numeric\",\n s = \"short\",\n l = \"long\";\n\nexport const DATE_SHORT = {\n year: n,\n month: n,\n day: n,\n};\n\nexport const DATE_MED = {\n year: n,\n month: s,\n day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n};\n\nexport const DATE_FULL = {\n year: n,\n month: l,\n day: n,\n};\n\nexport const DATE_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n hour: n,\n minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n hour: n,\n minute: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n hour: n,\n minute: n,\n second: n,\n hourCycle: \"h23\",\n timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n year: n,\n month: n,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n year: n,\n month: s,\n day: n,\n hour: n,\n minute: n,\n second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n year: n,\n month: s,\n day: n,\n weekday: s,\n hour: n,\n minute: n,\n};\n\nexport const DATETIME_FULL = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n year: n,\n month: l,\n day: n,\n weekday: l,\n hour: n,\n minute: n,\n second: n,\n timeZoneName: l,\n};\n", "import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n /**\n * The type of zone\n * @abstract\n * @type {string}\n */\n get type() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The name of this zone.\n * @abstract\n * @type {string}\n */\n get name() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * The IANA name of this zone.\n * Defaults to `name` if not overwritten by a subclass.\n * @abstract\n * @type {string}\n */\n get ianaName() {\n return this.name;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year.\n * @abstract\n * @type {boolean}\n */\n get isUniversal() {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, opts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Returns the offset's value as a string\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @abstract\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @abstract\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n throw new ZoneIsAbstractError();\n }\n\n /**\n * Return whether this Zone is valid.\n * @abstract\n * @type {boolean}\n */\n get isValid() {\n throw new ZoneIsAbstractError();\n }\n}\n", "import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n /**\n * Get a singleton instance of the local zone\n * @return {SystemZone}\n */\n static get instance() {\n if (singleton === null) {\n singleton = new SystemZone();\n }\n return singleton;\n }\n\n /** @override **/\n get type() {\n return \"system\";\n }\n\n /** @override **/\n get name() {\n return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale);\n }\n\n /** @override **/\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /** @override **/\n offset(ts) {\n return -new Date(ts).getTimezoneOffset();\n }\n\n /** @override **/\n equals(otherZone) {\n return otherZone.type === \"system\";\n }\n\n /** @override **/\n get isValid() {\n return true;\n }\n}\n", "import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n let dtf = dtfCache.get(zoneName);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(\"en-US\", {\n hour12: false,\n timeZone: zoneName,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n era: \"short\",\n });\n dtfCache.set(zoneName, dtf);\n }\n return dtf;\n}\n\nconst typeToPos = {\n year: 0,\n month: 1,\n day: 2,\n era: 3,\n hour: 4,\n minute: 5,\n second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n const formatted = dtf.formatToParts(date);\n const filled = [];\n for (let i = 0; i < formatted.length; i++) {\n const { type, value } = formatted[i];\n const pos = typeToPos[type];\n\n if (type === \"era\") {\n filled[pos] = value;\n } else if (!isUndefined(pos)) {\n filled[pos] = parseInt(value, 10);\n }\n }\n return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n /**\n * @param {string} name - Zone name\n * @return {IANAZone}\n */\n static create(name) {\n let zone = ianaZoneCache.get(name);\n if (zone === undefined) {\n ianaZoneCache.set(name, (zone = new IANAZone(name)));\n }\n return zone;\n }\n\n /**\n * Reset local caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCache() {\n ianaZoneCache.clear();\n dtfCache.clear();\n }\n\n /**\n * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n * @param {string} s - The string to check validity on\n * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n * @return {boolean}\n */\n static isValidSpecifier(s) {\n return this.isValidZone(s);\n }\n\n /**\n * Returns whether the provided string identifies a real zone\n * @param {string} zone - The string to check\n * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n * @return {boolean}\n */\n static isValidZone(zone) {\n if (!zone) {\n return false;\n }\n try {\n new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n return true;\n } catch (e) {\n return false;\n }\n }\n\n constructor(name) {\n super();\n /** @private **/\n this.zoneName = name;\n /** @private **/\n this.valid = IANAZone.isValidZone(name);\n }\n\n /**\n * The type of zone. `iana` for all instances of `IANAZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"iana\";\n }\n\n /**\n * The name of this zone (i.e. the IANA zone name).\n * @override\n * @type {string}\n */\n get name() {\n return this.zoneName;\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns false for all IANA zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return false;\n }\n\n /**\n * Returns the offset's common name (such as EST) at the specified timestamp\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the name\n * @param {Object} opts - Options to affect the format\n * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n * @param {string} opts.locale - What locale to return the offset name in.\n * @return {string}\n */\n offsetName(ts, { format, locale }) {\n return parseZoneInfo(ts, format, locale, this.name);\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.offset(ts), format);\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n * @override\n * @param {number} ts - Epoch milliseconds for which to compute the offset\n * @return {number}\n */\n offset(ts) {\n if (!this.valid) return NaN;\n const date = new Date(ts);\n\n if (isNaN(date)) return NaN;\n\n const dtf = makeDTF(this.name);\n let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n ? partsOffset(dtf, date)\n : hackyOffset(dtf, date);\n\n if (adOrBc === \"BC\") {\n year = -Math.abs(year) + 1;\n }\n\n // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n const adjustedHour = hour === 24 ? 0 : hour;\n\n const asUTC = objToLocalTS({\n year,\n month,\n day,\n hour: adjustedHour,\n minute,\n second,\n millisecond: 0,\n });\n\n let asTS = +date;\n const over = asTS % 1000;\n asTS -= over >= 0 ? over : 1000 + over;\n return (asUTC - asTS) / (60 * 1000);\n }\n\n /**\n * Return whether this Zone is equal to another zone\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"iana\" && otherZone.name === this.name;\n }\n\n /**\n * Return whether this Zone is valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return this.valid;\n }\n}\n", "import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlLFCache[key];\n if (!dtf) {\n dtf = new Intl.ListFormat(locString, opts);\n intlLFCache[key] = dtf;\n }\n return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache.get(key);\n if (dtf === undefined) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache.set(key, dtf);\n }\n return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n const key = JSON.stringify([locString, opts]);\n let inf = intlNumCache.get(key);\n if (inf === undefined) {\n inf = new Intl.NumberFormat(locString, opts);\n intlNumCache.set(key, inf);\n }\n return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n const key = JSON.stringify([locString, cacheKeyOpts]);\n let inf = intlRelCache.get(key);\n if (inf === undefined) {\n inf = new Intl.RelativeTimeFormat(locString, opts);\n intlRelCache.set(key, inf);\n }\n return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n if (sysLocaleCache) {\n return sysLocaleCache;\n } else {\n sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n return sysLocaleCache;\n }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n let opts = intlResolvedOptionsCache.get(locString);\n if (opts === undefined) {\n opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n intlResolvedOptionsCache.set(locString, opts);\n }\n return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n let data = weekInfoCache.get(locString);\n if (!data) {\n const locale = new Intl.Locale(locString);\n // browsers currently implement this as a property, but spec says it should be a getter function\n data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n if (!(\"minimalDays\" in data)) {\n data = { ...fallbackWeekSettings, ...data };\n }\n weekInfoCache.set(locString, data);\n }\n return data;\n}\n\nfunction parseLocaleString(localeStr) {\n // I really want to avoid writing a BCP 47 parser\n // see, e.g. https://github.com/wooorm/bcp-47\n // Instead, we'll do this:\n\n // a) if the string has no -u extensions, just leave it alone\n // b) if it does, use Intl to resolve everything\n // c) if Intl fails, try again without the -u\n\n // private subtags and unicode subtags have ordering requirements,\n // and we're not properly parsing this, so just strip out the\n // private ones if they exist.\n const xIndex = localeStr.indexOf(\"-x-\");\n if (xIndex !== -1) {\n localeStr = localeStr.substring(0, xIndex);\n }\n\n const uIndex = localeStr.indexOf(\"-u-\");\n if (uIndex === -1) {\n return [localeStr];\n } else {\n let options;\n let selectedStr;\n try {\n options = getCachedDTF(localeStr).resolvedOptions();\n selectedStr = localeStr;\n } catch (e) {\n const smaller = localeStr.substring(0, uIndex);\n options = getCachedDTF(smaller).resolvedOptions();\n selectedStr = smaller;\n }\n\n const { numberingSystem, calendar } = options;\n return [selectedStr, numberingSystem, calendar];\n }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n if (outputCalendar || numberingSystem) {\n if (!localeStr.includes(\"-u-\")) {\n localeStr += \"-u\";\n }\n\n if (outputCalendar) {\n localeStr += `-ca-${outputCalendar}`;\n }\n\n if (numberingSystem) {\n localeStr += `-nu-${numberingSystem}`;\n }\n return localeStr;\n } else {\n return localeStr;\n }\n}\n\nfunction mapMonths(f) {\n const ms = [];\n for (let i = 1; i <= 12; i++) {\n const dt = DateTime.utc(2009, i, 1);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction mapWeekdays(f) {\n const ms = [];\n for (let i = 1; i <= 7; i++) {\n const dt = DateTime.utc(2016, 11, 13 + i);\n ms.push(f(dt));\n }\n return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n const mode = loc.listingMode();\n\n if (mode === \"error\") {\n return null;\n } else if (mode === \"en\") {\n return englishFn(length);\n } else {\n return intlFn(length);\n }\n}\n\nfunction supportsFastNumbers(loc) {\n if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n return false;\n } else {\n return (\n loc.numberingSystem === \"latn\" ||\n !loc.locale ||\n loc.locale.startsWith(\"en\") ||\n getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n );\n }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n constructor(intl, forceSimple, opts) {\n this.padTo = opts.padTo || 0;\n this.floor = opts.floor || false;\n\n const { padTo, floor, ...otherOpts } = opts;\n\n if (!forceSimple || Object.keys(otherOpts).length > 0) {\n const intlOpts = { useGrouping: false, ...opts };\n if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n this.inf = getCachedINF(intl, intlOpts);\n }\n }\n\n format(i) {\n if (this.inf) {\n const fixed = this.floor ? Math.floor(i) : i;\n return this.inf.format(fixed);\n } else {\n // to match the browser's numberformatter defaults\n const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n return padStart(fixed, this.padTo);\n }\n }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n constructor(dt, intl, opts) {\n this.opts = opts;\n this.originalZone = undefined;\n\n let z = undefined;\n if (this.opts.timeZone) {\n // Don't apply any workarounds if a timeZone is explicitly provided in opts\n this.dt = dt;\n } else if (dt.zone.type === \"fixed\") {\n // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n // That is why fixed-offset TZ is set to that unless it is:\n // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n // 2. Unsupported by the browser:\n // - some do not support Etc/\n // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n const gmtOffset = -1 * (dt.offset / 60);\n const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n z = offsetZ;\n this.dt = dt;\n } else {\n // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n // we manually apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n } else if (dt.zone.type === \"system\") {\n this.dt = dt;\n } else if (dt.zone.type === \"iana\") {\n this.dt = dt;\n z = dt.zone.name;\n } else {\n // Custom zones can have any offset / offsetName so we just manually\n // apply the offset and substitute the zone as needed.\n z = \"UTC\";\n this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n this.originalZone = dt.zone;\n }\n\n const intlOpts = { ...this.opts };\n intlOpts.timeZone = intlOpts.timeZone || z;\n this.dtf = getCachedDTF(intl, intlOpts);\n }\n\n format() {\n if (this.originalZone) {\n // If we have to substitute in the actual zone name, we have to use\n // formatToParts so that the timezone can be replaced.\n return this.formatToParts()\n .map(({ value }) => value)\n .join(\"\");\n }\n return this.dtf.format(this.dt.toJSDate());\n }\n\n formatToParts() {\n const parts = this.dtf.formatToParts(this.dt.toJSDate());\n if (this.originalZone) {\n return parts.map((part) => {\n if (part.type === \"timeZoneName\") {\n const offsetName = this.originalZone.offsetName(this.dt.ts, {\n locale: this.dt.locale,\n format: this.opts.timeZoneName,\n });\n return {\n ...part,\n value: offsetName,\n };\n } else {\n return part;\n }\n });\n }\n return parts;\n }\n\n resolvedOptions() {\n return this.dtf.resolvedOptions();\n }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n constructor(intl, isEnglish, opts) {\n this.opts = { style: \"long\", ...opts };\n if (!isEnglish && hasRelative()) {\n this.rtf = getCachedRTF(intl, opts);\n }\n }\n\n format(count, unit) {\n if (this.rtf) {\n return this.rtf.format(count, unit);\n } else {\n return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n }\n }\n\n formatToParts(count, unit) {\n if (this.rtf) {\n return this.rtf.formatToParts(count, unit);\n } else {\n return [];\n }\n }\n}\n\nconst fallbackWeekSettings = {\n firstDay: 1,\n minimalDays: 4,\n weekend: [6, 7],\n};\n\n/**\n * @private\n */\nexport default class Locale {\n static fromOpts(opts) {\n return Locale.create(\n opts.locale,\n opts.numberingSystem,\n opts.outputCalendar,\n opts.weekSettings,\n opts.defaultToEN\n );\n }\n\n static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n const specifiedLocale = locale || Settings.defaultLocale;\n // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n }\n\n static resetCache() {\n sysLocaleCache = null;\n intlDTCache.clear();\n intlNumCache.clear();\n intlRelCache.clear();\n intlResolvedOptionsCache.clear();\n weekInfoCache.clear();\n }\n\n static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n }\n\n constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n this.locale = parsedLocale;\n this.numberingSystem = numbering || parsedNumberingSystem || null;\n this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n this.weekSettings = weekSettings;\n this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n this.weekdaysCache = { format: {}, standalone: {} };\n this.monthsCache = { format: {}, standalone: {} };\n this.meridiemCache = null;\n this.eraCache = {};\n\n this.specifiedLocale = specifiedLocale;\n this.fastNumbersCached = null;\n }\n\n get fastNumbers() {\n if (this.fastNumbersCached == null) {\n this.fastNumbersCached = supportsFastNumbers(this);\n }\n\n return this.fastNumbersCached;\n }\n\n listingMode() {\n const isActuallyEn = this.isEnglish();\n const hasNoWeirdness =\n (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n }\n\n clone(alts) {\n if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n return this;\n } else {\n return Locale.create(\n alts.locale || this.specifiedLocale,\n alts.numberingSystem || this.numberingSystem,\n alts.outputCalendar || this.outputCalendar,\n validateWeekSettings(alts.weekSettings) || this.weekSettings,\n alts.defaultToEN || false\n );\n }\n }\n\n redefaultToEN(alts = {}) {\n return this.clone({ ...alts, defaultToEN: true });\n }\n\n redefaultToSystem(alts = {}) {\n return this.clone({ ...alts, defaultToEN: false });\n }\n\n months(length, format = false) {\n return listStuff(this, length, English.months, () => {\n // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n // As such, just use format() instead of formatToParts() and take the whole string\n const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n format &= !monthSpecialCase;\n const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.monthsCache[formatStr][length]) {\n const mapper = !monthSpecialCase\n ? (dt) => this.extract(dt, intl, \"month\")\n : (dt) => this.dtFormatter(dt, intl).format();\n this.monthsCache[formatStr][length] = mapMonths(mapper);\n }\n return this.monthsCache[formatStr][length];\n });\n }\n\n weekdays(length, format = false) {\n return listStuff(this, length, English.weekdays, () => {\n const intl = format\n ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n : { weekday: length },\n formatStr = format ? \"format\" : \"standalone\";\n if (!this.weekdaysCache[formatStr][length]) {\n this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n this.extract(dt, intl, \"weekday\")\n );\n }\n return this.weekdaysCache[formatStr][length];\n });\n }\n\n meridiems() {\n return listStuff(\n this,\n undefined,\n () => English.meridiems,\n () => {\n // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n if (!this.meridiemCache) {\n const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n (dt) => this.extract(dt, intl, \"dayperiod\")\n );\n }\n\n return this.meridiemCache;\n }\n );\n }\n\n eras(length) {\n return listStuff(this, length, English.eras, () => {\n const intl = { era: length };\n\n // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n // to definitely enumerate them.\n if (!this.eraCache[length]) {\n this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n this.extract(dt, intl, \"era\")\n );\n }\n\n return this.eraCache[length];\n });\n }\n\n extract(dt, intlOpts, field) {\n const df = this.dtFormatter(dt, intlOpts),\n results = df.formatToParts(),\n matching = results.find((m) => m.type.toLowerCase() === field);\n return matching ? matching.value : null;\n }\n\n numberFormatter(opts = {}) {\n // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n // (in contrast, the rest of the condition is used heavily)\n return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n }\n\n dtFormatter(dt, intlOpts = {}) {\n return new PolyDateFormatter(dt, this.intl, intlOpts);\n }\n\n relFormatter(opts = {}) {\n return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n }\n\n listFormatter(opts = {}) {\n return getCachedLF(this.intl, opts);\n }\n\n isEnglish() {\n return (\n this.locale === \"en\" ||\n this.locale.toLowerCase() === \"en-us\" ||\n getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n );\n }\n\n getWeekSettings() {\n if (this.weekSettings) {\n return this.weekSettings;\n } else if (!hasLocaleWeekInfo()) {\n return fallbackWeekSettings;\n } else {\n return getCachedWeekInfo(this.locale);\n }\n }\n\n getStartOfWeek() {\n return this.getWeekSettings().firstDay;\n }\n\n getMinDaysInFirstWeek() {\n return this.getWeekSettings().minimalDays;\n }\n\n getWeekendDays() {\n return this.getWeekSettings().weekend;\n }\n\n equals(other) {\n return (\n this.locale === other.locale &&\n this.numberingSystem === other.numberingSystem &&\n this.outputCalendar === other.outputCalendar\n );\n }\n\n toString() {\n return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n }\n}\n", "import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n /**\n * Get a singleton instance of UTC\n * @return {FixedOffsetZone}\n */\n static get utcInstance() {\n if (singleton === null) {\n singleton = new FixedOffsetZone(0);\n }\n return singleton;\n }\n\n /**\n * Get an instance with a specified offset\n * @param {number} offset - The offset in minutes\n * @return {FixedOffsetZone}\n */\n static instance(offset) {\n return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n }\n\n /**\n * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n * @param {string} s - The offset string to parse\n * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n * @return {FixedOffsetZone}\n */\n static parseSpecifier(s) {\n if (s) {\n const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n if (r) {\n return new FixedOffsetZone(signedOffset(r[1], r[2]));\n }\n }\n return null;\n }\n\n constructor(offset) {\n super();\n /** @private **/\n this.fixed = offset;\n }\n\n /**\n * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n * @override\n * @type {string}\n */\n get type() {\n return \"fixed\";\n }\n\n /**\n * The name of this zone.\n * All fixed zones' names always start with \"UTC\" (plus optional offset)\n * @override\n * @type {string}\n */\n get name() {\n return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n }\n\n /**\n * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n *\n * @override\n * @type {string}\n */\n get ianaName() {\n if (this.fixed === 0) {\n return \"Etc/UTC\";\n } else {\n return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n }\n }\n\n /**\n * Returns the offset's common name at the specified timestamp.\n *\n * For fixed offset zones this equals to the zone name.\n * @override\n */\n offsetName() {\n return this.name;\n }\n\n /**\n * Returns the offset's value as a string\n * @override\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\n formatOffset(ts, format) {\n return formatOffset(this.fixed, format);\n }\n\n /**\n * Returns whether the offset is known to be fixed for the whole year:\n * Always returns true for all fixed offset zones.\n * @override\n * @type {boolean}\n */\n get isUniversal() {\n return true;\n }\n\n /**\n * Return the offset in minutes for this zone at the specified timestamp.\n *\n * For fixed offset zones, this is constant and does not depend on a timestamp.\n * @override\n * @return {number}\n */\n offset() {\n return this.fixed;\n }\n\n /**\n * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n * @override\n * @param {Zone} otherZone - the zone to compare\n * @return {boolean}\n */\n equals(otherZone) {\n return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n }\n\n /**\n * Return whether this Zone is valid:\n * All fixed offset zones are valid.\n * @override\n * @type {boolean}\n */\n get isValid() {\n return true;\n }\n}\n", "import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n constructor(zoneName) {\n super();\n /** @private */\n this.zoneName = zoneName;\n }\n\n /** @override **/\n get type() {\n return \"invalid\";\n }\n\n /** @override **/\n get name() {\n return this.zoneName;\n }\n\n /** @override **/\n get isUniversal() {\n return false;\n }\n\n /** @override **/\n offsetName() {\n return null;\n }\n\n /** @override **/\n formatOffset() {\n return \"\";\n }\n\n /** @override **/\n offset() {\n return NaN;\n }\n\n /** @override **/\n equals() {\n return false;\n }\n\n /** @override **/\n get isValid() {\n return false;\n }\n}\n", "/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n let offset;\n if (isUndefined(input) || input === null) {\n return defaultZone;\n } else if (input instanceof Zone) {\n return input;\n } else if (isString(input)) {\n const lowered = input.toLowerCase();\n if (lowered === \"default\") return defaultZone;\n else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n } else if (isNumber(input)) {\n return FixedOffsetZone.instance(input);\n } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n // This is dumb, but the instanceof check above doesn't seem to really work\n // so we're duck checking it\n return input;\n } else {\n return new InvalidZone(input);\n }\n}\n", "const numberingSystems = {\n arab: \"[\\u0660-\\u0669]\",\n arabext: \"[\\u06F0-\\u06F9]\",\n bali: \"[\\u1B50-\\u1B59]\",\n beng: \"[\\u09E6-\\u09EF]\",\n deva: \"[\\u0966-\\u096F]\",\n fullwide: \"[\\uFF10-\\uFF19]\",\n gujr: \"[\\u0AE6-\\u0AEF]\",\n hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n khmr: \"[\\u17E0-\\u17E9]\",\n knda: \"[\\u0CE6-\\u0CEF]\",\n laoo: \"[\\u0ED0-\\u0ED9]\",\n limb: \"[\\u1946-\\u194F]\",\n mlym: \"[\\u0D66-\\u0D6F]\",\n mong: \"[\\u1810-\\u1819]\",\n mymr: \"[\\u1040-\\u1049]\",\n orya: \"[\\u0B66-\\u0B6F]\",\n tamldec: \"[\\u0BE6-\\u0BEF]\",\n telu: \"[\\u0C66-\\u0C6F]\",\n thai: \"[\\u0E50-\\u0E59]\",\n tibt: \"[\\u0F20-\\u0F29]\",\n latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n arab: [1632, 1641],\n arabext: [1776, 1785],\n bali: [6992, 7001],\n beng: [2534, 2543],\n deva: [2406, 2415],\n fullwide: [65296, 65303],\n gujr: [2790, 2799],\n khmr: [6112, 6121],\n knda: [3302, 3311],\n laoo: [3792, 3801],\n limb: [6470, 6479],\n mlym: [3430, 3439],\n mong: [6160, 6169],\n mymr: [4160, 4169],\n orya: [2918, 2927],\n tamldec: [3046, 3055],\n telu: [3174, 3183],\n thai: [3664, 3673],\n tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n let value = parseInt(str, 10);\n if (isNaN(value)) {\n value = \"\";\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n\n if (str[i].search(numberingSystems.hanidec) !== -1) {\n value += hanidecChars.indexOf(str[i]);\n } else {\n for (const key in numberingSystemsUTF16) {\n const [min, max] = numberingSystemsUTF16[key];\n if (code >= min && code <= max) {\n value += code - min;\n }\n }\n }\n }\n return parseInt(value, 10);\n } else {\n return value;\n }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nexport function resetDigitRegexCache() {\n digitRegexCache.clear();\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n const ns = numberingSystem || \"latn\";\n\n let appendCache = digitRegexCache.get(ns);\n if (appendCache === undefined) {\n appendCache = new Map();\n digitRegexCache.set(ns, appendCache);\n }\n let regex = appendCache.get(append);\n if (regex === undefined) {\n regex = new RegExp(`${numberingSystems[ns]}${append}`);\n appendCache.set(append, regex);\n }\n\n return regex;\n}\n", "import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport DateTime from \"./datetime.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\nimport { resetDigitRegexCache } from \"./impl/digits.js\";\n\nlet now = () => Date.now(),\n defaultZone = \"system\",\n defaultLocale = null,\n defaultNumberingSystem = null,\n defaultOutputCalendar = null,\n twoDigitCutoffYear = 60,\n throwOnInvalid,\n defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n /**\n * Get the callback for returning the current timestamp.\n * @type {function}\n */\n static get now() {\n return now;\n }\n\n /**\n * Set the callback for returning the current timestamp.\n * The function should return a number, which will be interpreted as an Epoch millisecond count\n * @type {function}\n * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n */\n static set now(n) {\n now = n;\n }\n\n /**\n * Set the default time zone to create DateTimes in. Does not affect existing instances.\n * Use the value \"system\" to reset this value to the system's time zone.\n * @type {string}\n */\n static set defaultZone(zone) {\n defaultZone = zone;\n }\n\n /**\n * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n * The default value is the system's time zone (the one set on the machine that runs this code).\n * @type {Zone}\n */\n static get defaultZone() {\n return normalizeZone(defaultZone, SystemZone.instance);\n }\n\n /**\n * Get the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultLocale() {\n return defaultLocale;\n }\n\n /**\n * Set the default locale to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultLocale(locale) {\n defaultLocale = locale;\n }\n\n /**\n * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultNumberingSystem() {\n return defaultNumberingSystem;\n }\n\n /**\n * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultNumberingSystem(numberingSystem) {\n defaultNumberingSystem = numberingSystem;\n }\n\n /**\n * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static get defaultOutputCalendar() {\n return defaultOutputCalendar;\n }\n\n /**\n * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n * @type {string}\n */\n static set defaultOutputCalendar(outputCalendar) {\n defaultOutputCalendar = outputCalendar;\n }\n\n /**\n * @typedef {Object} WeekSettings\n * @property {number} firstDay\n * @property {number} minimalDays\n * @property {number[]} weekend\n */\n\n /**\n * @return {WeekSettings|null}\n */\n static get defaultWeekSettings() {\n return defaultWeekSettings;\n }\n\n /**\n * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n * how many days are required in the first week of a year.\n * Does not affect existing instances.\n *\n * @param {WeekSettings|null} weekSettings\n */\n static set defaultWeekSettings(weekSettings) {\n defaultWeekSettings = validateWeekSettings(weekSettings);\n }\n\n /**\n * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n */\n static get twoDigitCutoffYear() {\n return twoDigitCutoffYear;\n }\n\n /**\n * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n * @type {number}\n * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n */\n static set twoDigitCutoffYear(cutoffYear) {\n twoDigitCutoffYear = cutoffYear % 100;\n }\n\n /**\n * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static get throwOnInvalid() {\n return throwOnInvalid;\n }\n\n /**\n * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n * @type {boolean}\n */\n static set throwOnInvalid(t) {\n throwOnInvalid = t;\n }\n\n /**\n * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n * @return {void}\n */\n static resetCaches() {\n Locale.resetCache();\n IANAZone.resetCache();\n DateTime.resetCache();\n resetDigitRegexCache();\n }\n}\n", "export default class Invalid {\n constructor(reason, explanation) {\n this.reason = reason;\n this.explanation = explanation;\n }\n\n toMessage() {\n if (this.explanation) {\n return `${this.reason}: ${this.explanation}`;\n } else {\n return this.reason;\n }\n }\n}\n", "import {\n integerBetween,\n isLeapYear,\n timeObject,\n daysInYear,\n daysInMonth,\n weeksInWeekYear,\n isInteger,\n isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n return new Invalid(\n \"unit out of range\",\n `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n );\n}\n\nexport function dayOfWeek(year, month, day) {\n const d = new Date(Date.UTC(year, month - 1, day));\n\n if (year < 100 && year >= 0) {\n d.setUTCFullYear(d.getUTCFullYear() - 1900);\n }\n\n const js = d.getUTCDay();\n\n return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n month0 = table.findIndex((i) => i < ordinal),\n day = ordinal - table[month0];\n return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { year, month, day } = gregObj,\n ordinal = computeOrdinal(year, month, day),\n weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n weekYear;\n\n if (weekNumber < 1) {\n weekYear = year - 1;\n weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n weekYear = year + 1;\n weekNumber = 1;\n } else {\n weekYear = year;\n }\n\n return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const { weekYear, weekNumber, weekday } = weekData,\n weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n yearInDays = daysInYear(weekYear);\n\n let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n year;\n\n if (ordinal < 1) {\n year = weekYear - 1;\n ordinal += daysInYear(year);\n } else if (ordinal > yearInDays) {\n year = weekYear + 1;\n ordinal -= daysInYear(weekYear);\n } else {\n year = weekYear;\n }\n\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n const { year, month, day } = gregData;\n const ordinal = computeOrdinal(year, month, day);\n return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n const { year, ordinal } = ordinalData;\n const { month, day } = uncomputeOrdinal(year, ordinal);\n return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n const hasLocaleWeekData =\n !isUndefined(obj.localWeekday) ||\n !isUndefined(obj.localWeekNumber) ||\n !isUndefined(obj.localWeekYear);\n if (hasLocaleWeekData) {\n const hasIsoWeekData =\n !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n if (hasIsoWeekData) {\n throw new ConflictingSpecificationError(\n \"Cannot mix locale-based week fields with ISO-based week fields\"\n );\n }\n if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n delete obj.localWeekday;\n delete obj.localWeekNumber;\n delete obj.localWeekYear;\n return {\n minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n startOfWeek: loc.getStartOfWeek(),\n };\n } else {\n return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const validYear = isInteger(obj.weekYear),\n validWeek = integerBetween(\n obj.weekNumber,\n 1,\n weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n ),\n validWeekday = integerBetween(obj.weekday, 1, 7);\n\n if (!validYear) {\n return unitOutOfRange(\"weekYear\", obj.weekYear);\n } else if (!validWeek) {\n return unitOutOfRange(\"week\", obj.weekNumber);\n } else if (!validWeekday) {\n return unitOutOfRange(\"weekday\", obj.weekday);\n } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n const validYear = isInteger(obj.year),\n validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validOrdinal) {\n return unitOutOfRange(\"ordinal\", obj.ordinal);\n } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n const validYear = isInteger(obj.year),\n validMonth = integerBetween(obj.month, 1, 12),\n validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n if (!validYear) {\n return unitOutOfRange(\"year\", obj.year);\n } else if (!validMonth) {\n return unitOutOfRange(\"month\", obj.month);\n } else if (!validDay) {\n return unitOutOfRange(\"day\", obj.day);\n } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n const { hour, minute, second, millisecond } = obj;\n const validHour =\n integerBetween(hour, 0, 23) ||\n (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n validMinute = integerBetween(minute, 0, 59),\n validSecond = integerBetween(second, 0, 59),\n validMillisecond = integerBetween(millisecond, 0, 999);\n\n if (!validHour) {\n return unitOutOfRange(\"hour\", hour);\n } else if (!validMinute) {\n return unitOutOfRange(\"minute\", minute);\n } else if (!validSecond) {\n return unitOutOfRange(\"second\", second);\n } else if (!validMillisecond) {\n return unitOutOfRange(\"millisecond\", millisecond);\n } else return false;\n}\n", "/*\n This is just a junk drawer, containing anything used across multiple classes.\n Because Luxon is small(ish), this should stay small and we won't worry about splitting\n it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n try {\n return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n } catch (e) {\n return false;\n }\n}\n\nexport function hasLocaleWeekInfo() {\n try {\n return (\n typeof Intl !== \"undefined\" &&\n !!Intl.Locale &&\n (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n );\n } catch (e) {\n return false;\n }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n if (arr.length === 0) {\n return undefined;\n }\n return arr.reduce((best, next) => {\n const pair = [by(next), next];\n if (!best) {\n return pair;\n } else if (compare(best[0], pair[0]) === best[0]) {\n return best;\n } else {\n return pair;\n }\n }, null)[1];\n}\n\nexport function pick(obj, keys) {\n return keys.reduce((a, k) => {\n a[k] = obj[k];\n return a;\n }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n if (settings == null) {\n return null;\n } else if (typeof settings !== \"object\") {\n throw new InvalidArgumentError(\"Week settings must be an object\");\n } else {\n if (\n !integerBetween(settings.firstDay, 1, 7) ||\n !integerBetween(settings.minimalDays, 1, 7) ||\n !Array.isArray(settings.weekend) ||\n settings.weekend.some((v) => !integerBetween(v, 1, 7))\n ) {\n throw new InvalidArgumentError(\"Invalid week settings\");\n }\n return {\n firstDay: settings.firstDay,\n minimalDays: settings.minimalDays,\n weekend: Array.from(settings.weekend),\n };\n }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n const isNeg = input < 0;\n let padded;\n if (isNeg) {\n padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n } else {\n padded = (\"\" + input).padStart(n, \"0\");\n }\n return padded;\n}\n\nexport function parseInteger(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseInt(string, 10);\n }\n}\n\nexport function parseFloating(string) {\n if (isUndefined(string) || string === null || string === \"\") {\n return undefined;\n } else {\n return parseFloat(string);\n }\n}\n\nexport function parseMillis(fraction) {\n // Return undefined (instead of 0) in these cases, where fraction is not set\n if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n return undefined;\n } else {\n const f = parseFloat(\"0.\" + fraction) * 1000;\n return Math.floor(f);\n }\n}\n\nexport function roundTo(number, digits, rounding = \"round\") {\n const factor = 10 ** digits;\n switch (rounding) {\n case \"expand\":\n return number > 0\n ? Math.ceil(number * factor) / factor\n : Math.floor(number * factor) / factor;\n case \"trunc\":\n return Math.trunc(number * factor) / factor;\n case \"round\":\n return Math.round(number * factor) / factor;\n case \"floor\":\n return Math.floor(number * factor) / factor;\n case \"ceil\":\n return Math.ceil(number * factor) / factor;\n default:\n throw new RangeError(`Value rounding ${rounding} is out of range`);\n }\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n const modMonth = floorMod(month - 1, 12) + 1,\n modYear = year + (month - modMonth) / 12;\n\n if (modMonth === 2) {\n return isLeapYear(modYear) ? 29 : 28;\n } else {\n return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n let d = Date.UTC(\n obj.year,\n obj.month - 1,\n obj.day,\n obj.hour,\n obj.minute,\n obj.second,\n obj.millisecond\n );\n\n // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n if (obj.year < 100 && obj.year >= 0) {\n d = new Date(d);\n // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n // the calculations done by Date.UTC are using year 2000 - which is incorrect\n d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n }\n return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n if (year > 99) {\n return year;\n } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n const date = new Date(ts),\n intlOpts = {\n hourCycle: \"h23\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n\n if (timeZone) {\n intlOpts.timeZone = timeZone;\n }\n\n const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n const parsed = new Intl.DateTimeFormat(locale, modified)\n .formatToParts(date)\n .find((m) => m.type.toLowerCase() === \"timezonename\");\n return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n let offHour = parseInt(offHourStr, 10);\n\n // don't || this because we want to preserve -0\n if (Number.isNaN(offHour)) {\n offHour = 0;\n }\n\n const offMin = parseInt(offMinuteStr, 10) || 0,\n offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n const numericValue = Number(value);\n if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n throw new InvalidArgumentError(`Invalid unit value ${value}`);\n return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n const normalized = {};\n for (const u in obj) {\n if (hasOwnProperty(obj, u)) {\n const v = obj[u];\n if (v === undefined || v === null) continue;\n normalized[normalizer(u)] = asNumber(v);\n }\n }\n return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nexport function formatOffset(offset, format) {\n const hours = Math.trunc(Math.abs(offset / 60)),\n minutes = Math.trunc(Math.abs(offset % 60)),\n sign = offset >= 0 ? \"+\" : \"-\";\n\n switch (format) {\n case \"short\":\n return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n case \"narrow\":\n return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n case \"techie\":\n return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n default:\n throw new RangeError(`Value format ${format} is out of range for property format`);\n }\n}\n\nexport function timeObject(obj) {\n return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n", "import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nexport const monthsShort = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n switch (length) {\n case \"narrow\":\n return [...monthsNarrow];\n case \"short\":\n return [...monthsShort];\n case \"long\":\n return [...monthsLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n case \"2-digit\":\n return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n default:\n return null;\n }\n}\n\nexport const weekdaysLong = [\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n switch (length) {\n case \"narrow\":\n return [...weekdaysNarrow];\n case \"short\":\n return [...weekdaysShort];\n case \"long\":\n return [...weekdaysLong];\n case \"numeric\":\n return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n default:\n return null;\n }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n switch (length) {\n case \"narrow\":\n return [...erasNarrow];\n case \"short\":\n return [...erasShort];\n case \"long\":\n return [...erasLong];\n default:\n return null;\n }\n}\n\nexport function meridiemForDateTime(dt) {\n return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n const units = {\n years: [\"year\", \"yr.\"],\n quarters: [\"quarter\", \"qtr.\"],\n months: [\"month\", \"mo.\"],\n weeks: [\"week\", \"wk.\"],\n days: [\"day\", \"day\", \"days\"],\n hours: [\"hour\", \"hr.\"],\n minutes: [\"minute\", \"min.\"],\n seconds: [\"second\", \"sec.\"],\n };\n\n const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n if (numeric === \"auto\" && lastable) {\n const isDay = unit === \"days\";\n switch (count) {\n case 1:\n return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n case -1:\n return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n case 0:\n return isDay ? \"today\" : `this ${units[unit][0]}`;\n default: // fall through\n }\n }\n\n const isInPast = Object.is(count, -0) || count < 0,\n fmtValue = Math.abs(count),\n singular = fmtValue === 1,\n lilUnits = units[unit],\n fmtUnit = narrow\n ? singular\n ? lilUnits[1]\n : lilUnits[2] || lilUnits[1]\n : singular\n ? units[unit][0]\n : unit;\n return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n // these all have the offsets removed because we don't have access to them\n // without all the intl stuff this is backfilling\n const filtered = pick(knownFormat, [\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n \"hourCycle\",\n ]),\n key = stringify(filtered),\n dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n switch (key) {\n case stringify(Formats.DATE_SHORT):\n return \"M/d/yyyy\";\n case stringify(Formats.DATE_MED):\n return \"LLL d, yyyy\";\n case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n return \"EEE, LLL d, yyyy\";\n case stringify(Formats.DATE_FULL):\n return \"LLLL d, yyyy\";\n case stringify(Formats.DATE_HUGE):\n return \"EEEE, LLLL d, yyyy\";\n case stringify(Formats.TIME_SIMPLE):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_SECONDS):\n return \"h:mm:ss a\";\n case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_WITH_LONG_OFFSET):\n return \"h:mm a\";\n case stringify(Formats.TIME_24_SIMPLE):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_SECONDS):\n return \"HH:mm:ss\";\n case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n return \"HH:mm\";\n case stringify(Formats.DATETIME_SHORT):\n return \"M/d/yyyy, h:mm a\";\n case stringify(Formats.DATETIME_MED):\n return \"LLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL):\n return \"LLLL d, yyyy, h:mm a\";\n case stringify(Formats.DATETIME_HUGE):\n return dateTimeHuge;\n case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n return \"M/d/yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n return \"LLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n return \"EEE, d LLL yyyy, h:mm a\";\n case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n return \"LLLL d, yyyy, h:mm:ss a\";\n case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n default:\n return dateTimeHuge;\n }\n}\n", "import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n let s = \"\";\n for (const token of splits) {\n if (token.literal) {\n s += token.val;\n } else {\n s += tokenToString(token.val);\n }\n }\n return s;\n}\n\nconst macroTokenToFormatOpts = {\n D: Formats.DATE_SHORT,\n DD: Formats.DATE_MED,\n DDD: Formats.DATE_FULL,\n DDDD: Formats.DATE_HUGE,\n t: Formats.TIME_SIMPLE,\n tt: Formats.TIME_WITH_SECONDS,\n ttt: Formats.TIME_WITH_SHORT_OFFSET,\n tttt: Formats.TIME_WITH_LONG_OFFSET,\n T: Formats.TIME_24_SIMPLE,\n TT: Formats.TIME_24_WITH_SECONDS,\n TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n f: Formats.DATETIME_SHORT,\n ff: Formats.DATETIME_MED,\n fff: Formats.DATETIME_FULL,\n ffff: Formats.DATETIME_HUGE,\n F: Formats.DATETIME_SHORT_WITH_SECONDS,\n FF: Formats.DATETIME_MED_WITH_SECONDS,\n FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n static create(locale, opts = {}) {\n return new Formatter(locale, opts);\n }\n\n static parseFormat(fmt) {\n // white-space is always considered a literal in user-provided formats\n // the \" \" token has a special meaning (see unitForToken)\n\n let current = null,\n currentFull = \"\",\n bracketed = false;\n const splits = [];\n for (let i = 0; i < fmt.length; i++) {\n const c = fmt.charAt(i);\n if (c === \"'\") {\n // turn '' into a literal signal quote instead of just skipping the empty literal\n if (currentFull.length > 0 || bracketed) {\n splits.push({\n literal: bracketed || /^\\s+$/.test(currentFull),\n val: currentFull === \"\" ? \"'\" : currentFull,\n });\n }\n current = null;\n currentFull = \"\";\n bracketed = !bracketed;\n } else if (bracketed) {\n currentFull += c;\n } else if (c === current) {\n currentFull += c;\n } else {\n if (currentFull.length > 0) {\n splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n }\n currentFull = c;\n current = c;\n }\n }\n\n if (currentFull.length > 0) {\n splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n }\n\n return splits;\n }\n\n static macroTokenToFormatOpts(token) {\n return macroTokenToFormatOpts[token];\n }\n\n constructor(locale, formatOpts) {\n this.opts = formatOpts;\n this.loc = locale;\n this.systemLoc = null;\n }\n\n formatWithSystemDefault(dt, opts) {\n if (this.systemLoc === null) {\n this.systemLoc = this.loc.redefaultToSystem();\n }\n const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n return df.format();\n }\n\n dtFormatter(dt, opts = {}) {\n return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n }\n\n formatDateTime(dt, opts) {\n return this.dtFormatter(dt, opts).format();\n }\n\n formatDateTimeParts(dt, opts) {\n return this.dtFormatter(dt, opts).formatToParts();\n }\n\n formatInterval(interval, opts) {\n const df = this.dtFormatter(interval.start, opts);\n return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n }\n\n resolvedOptions(dt, opts) {\n return this.dtFormatter(dt, opts).resolvedOptions();\n }\n\n num(n, p = 0, signDisplay = undefined) {\n // we get some perf out of doing this here, annoyingly\n if (this.opts.forceSimple) {\n return padStart(n, p);\n }\n\n const opts = { ...this.opts };\n\n if (p > 0) {\n opts.padTo = p;\n }\n if (signDisplay) {\n opts.signDisplay = signDisplay;\n }\n\n return this.loc.numberFormatter(opts).format(n);\n }\n\n formatDateTimeFromString(dt, fmt) {\n const knownEnglish = this.loc.listingMode() === \"en\",\n useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n string = (opts, extract) => this.loc.extract(dt, opts, extract),\n formatOffset = (opts) => {\n if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n return \"Z\";\n }\n\n return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n },\n meridiem = () =>\n knownEnglish\n ? English.meridiemForDateTime(dt)\n : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n month = (length, standalone) =>\n knownEnglish\n ? English.monthForDateTime(dt, length)\n : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n weekday = (length, standalone) =>\n knownEnglish\n ? English.weekdayForDateTime(dt, length)\n : string(\n standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n \"weekday\"\n ),\n maybeMacro = (token) => {\n const formatOpts = Formatter.macroTokenToFormatOpts(token);\n if (formatOpts) {\n return this.formatWithSystemDefault(dt, formatOpts);\n } else {\n return token;\n }\n },\n era = (length) =>\n knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n tokenToString = (token) => {\n // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n switch (token) {\n // ms\n case \"S\":\n return this.num(dt.millisecond);\n case \"u\":\n // falls through\n case \"SSS\":\n return this.num(dt.millisecond, 3);\n // seconds\n case \"s\":\n return this.num(dt.second);\n case \"ss\":\n return this.num(dt.second, 2);\n // fractional seconds\n case \"uu\":\n return this.num(Math.floor(dt.millisecond / 10), 2);\n case \"uuu\":\n return this.num(Math.floor(dt.millisecond / 100));\n // minutes\n case \"m\":\n return this.num(dt.minute);\n case \"mm\":\n return this.num(dt.minute, 2);\n // hours\n case \"h\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n case \"hh\":\n return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n case \"H\":\n return this.num(dt.hour);\n case \"HH\":\n return this.num(dt.hour, 2);\n // offset\n case \"Z\":\n // like +6\n return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n case \"ZZ\":\n // like +06:00\n return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n case \"ZZZ\":\n // like +0600\n return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n case \"ZZZZ\":\n // like EST\n return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n case \"ZZZZZ\":\n // like Eastern Standard Time\n return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n // zone\n case \"z\":\n // like America/New_York\n return dt.zoneName;\n // meridiems\n case \"a\":\n return meridiem();\n // dates\n case \"d\":\n return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n case \"dd\":\n return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n // weekdays - standalone\n case \"c\":\n // like 1\n return this.num(dt.weekday);\n case \"ccc\":\n // like 'Tues'\n return weekday(\"short\", true);\n case \"cccc\":\n // like 'Tuesday'\n return weekday(\"long\", true);\n case \"ccccc\":\n // like 'T'\n return weekday(\"narrow\", true);\n // weekdays - format\n case \"E\":\n // like 1\n return this.num(dt.weekday);\n case \"EEE\":\n // like 'Tues'\n return weekday(\"short\", false);\n case \"EEEE\":\n // like 'Tuesday'\n return weekday(\"long\", false);\n case \"EEEEE\":\n // like 'T'\n return weekday(\"narrow\", false);\n // months - standalone\n case \"L\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"LL\":\n // like 01, doesn't seem to work\n return useDateTimeFormatter\n ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n : this.num(dt.month, 2);\n case \"LLL\":\n // like Jan\n return month(\"short\", true);\n case \"LLLL\":\n // like January\n return month(\"long\", true);\n case \"LLLLL\":\n // like J\n return month(\"narrow\", true);\n // months - format\n case \"M\":\n // like 1\n return useDateTimeFormatter\n ? string({ month: \"numeric\" }, \"month\")\n : this.num(dt.month);\n case \"MM\":\n // like 01\n return useDateTimeFormatter\n ? string({ month: \"2-digit\" }, \"month\")\n : this.num(dt.month, 2);\n case \"MMM\":\n // like Jan\n return month(\"short\", false);\n case \"MMMM\":\n // like January\n return month(\"long\", false);\n case \"MMMMM\":\n // like J\n return month(\"narrow\", false);\n // years\n case \"y\":\n // like 2014\n return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n case \"yy\":\n // like 14\n return useDateTimeFormatter\n ? string({ year: \"2-digit\" }, \"year\")\n : this.num(dt.year.toString().slice(-2), 2);\n case \"yyyy\":\n // like 0012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 4);\n case \"yyyyyy\":\n // like 000012\n return useDateTimeFormatter\n ? string({ year: \"numeric\" }, \"year\")\n : this.num(dt.year, 6);\n // eras\n case \"G\":\n // like AD\n return era(\"short\");\n case \"GG\":\n // like Anno Domini\n return era(\"long\");\n case \"GGGGG\":\n return era(\"narrow\");\n case \"kk\":\n return this.num(dt.weekYear.toString().slice(-2), 2);\n case \"kkkk\":\n return this.num(dt.weekYear, 4);\n case \"W\":\n return this.num(dt.weekNumber);\n case \"WW\":\n return this.num(dt.weekNumber, 2);\n case \"n\":\n return this.num(dt.localWeekNumber);\n case \"nn\":\n return this.num(dt.localWeekNumber, 2);\n case \"ii\":\n return this.num(dt.localWeekYear.toString().slice(-2), 2);\n case \"iiii\":\n return this.num(dt.localWeekYear, 4);\n case \"o\":\n return this.num(dt.ordinal);\n case \"ooo\":\n return this.num(dt.ordinal, 3);\n case \"q\":\n // like 1\n return this.num(dt.quarter);\n case \"qq\":\n // like 01\n return this.num(dt.quarter, 2);\n case \"X\":\n return this.num(Math.floor(dt.ts / 1000));\n case \"x\":\n return this.num(dt.ts);\n default:\n return maybeMacro(token);\n }\n };\n\n return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n }\n\n formatDurationFromString(dur, fmt) {\n const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n const tokenToField = (token) => {\n switch (token[0]) {\n case \"S\":\n return \"milliseconds\";\n case \"s\":\n return \"seconds\";\n case \"m\":\n return \"minutes\";\n case \"h\":\n return \"hours\";\n case \"d\":\n return \"days\";\n case \"w\":\n return \"weeks\";\n case \"M\":\n return \"months\";\n case \"y\":\n return \"years\";\n default:\n return null;\n }\n },\n tokenToString = (lildur, info) => (token) => {\n const mapped = tokenToField(token);\n if (mapped) {\n const inversionFactor =\n info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n let signDisplay;\n if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n signDisplay = \"never\";\n } else if (this.opts.signMode === \"all\") {\n signDisplay = \"always\";\n } else {\n // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n signDisplay = \"auto\";\n }\n return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n } else {\n return token;\n }\n },\n tokens = Formatter.parseFormat(fmt),\n realTokens = tokens.reduce(\n (found, { literal, val }) => (literal ? found : found.concat(val)),\n []\n ),\n collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n durationInfo = {\n isNegativeDuration: collapsed < 0,\n // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n // in order\n largestUnit: Object.keys(collapsed.values)[0],\n };\n return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n }\n}\n", "import {\n untruncateYear,\n signedOffset,\n parseInteger,\n parseMillis,\n isUndefined,\n parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n const full = regexes.reduce((f, r) => f + r.source, \"\");\n return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n return (m) =>\n extractors\n .reduce(\n ([mergedVals, mergedZone, cursor], ex) => {\n const [val, zone, next] = ex(m, cursor);\n return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n },\n [{}, null, 1]\n )\n .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n if (s == null) {\n return [null, null];\n }\n\n for (const [regex, extractor] of patterns) {\n const m = regex.exec(s);\n if (m) {\n return extractor(m);\n }\n }\n return [null, null];\n}\n\nfunction simpleParse(...keys) {\n return (match, cursor) => {\n const ret = {};\n let i;\n\n for (i = 0; i < keys.length; i++) {\n ret[keys[i]] = parseInteger(match[cursor + i]);\n }\n return [ret, null, cursor + i];\n };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n const m = match[pos];\n return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n const item = {\n year: int(match, cursor),\n month: int(match, cursor + 1, 1),\n day: int(match, cursor + 2, 1),\n };\n\n return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n const item = {\n hours: int(match, cursor, 0),\n minutes: int(match, cursor + 1, 0),\n seconds: int(match, cursor + 2, 0),\n milliseconds: parseMillis(match[cursor + 3]),\n };\n\n return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n const local = !match[cursor] && !match[cursor + 1],\n fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n zone = local ? null : FixedOffsetZone.instance(fullOffset);\n return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n match;\n\n const hasNegativePrefix = s[0] === \"-\";\n const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n const maybeNegate = (num, force = false) =>\n num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n return [\n {\n years: maybeNegate(parseFloating(yearStr)),\n months: maybeNegate(parseFloating(monthStr)),\n weeks: maybeNegate(parseFloating(weekStr)),\n days: maybeNegate(parseFloating(dayStr)),\n hours: maybeNegate(parseFloating(hourStr)),\n minutes: maybeNegate(parseFloating(minuteStr)),\n seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n },\n ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n const result = {\n year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n month: English.monthsShort.indexOf(monthStr) + 1,\n day: parseInteger(dayStr),\n hour: parseInteger(hourStr),\n minute: parseInteger(minuteStr),\n };\n\n if (secondStr) result.second = parseInteger(secondStr);\n if (weekdayStr) {\n result.weekday =\n weekdayStr.length > 3\n ? English.weekdaysLong.indexOf(weekdayStr) + 1\n : English.weekdaysShort.indexOf(weekdayStr) + 1;\n }\n\n return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n const [\n ,\n weekdayStr,\n dayStr,\n monthStr,\n yearStr,\n hourStr,\n minuteStr,\n secondStr,\n obsOffset,\n milOffset,\n offHourStr,\n offMinuteStr,\n ] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n let offset;\n if (obsOffset) {\n offset = obsOffsets[obsOffset];\n } else if (milOffset) {\n offset = 0;\n } else {\n offset = signedOffset(offHourStr, offMinuteStr);\n }\n\n return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s\n .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n .replace(/(\\s\\s+)/g, \" \")\n .trim();\n}\n\n// http date\n\nconst rfc1123 =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n rfc850 =\n /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n ascii =\n /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n extractISOYmd,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n extractISOWeekData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n extractISOOrdinalData,\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n return parse(\n s,\n [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n [isoTimeCombinedRegex, extractISOTimeAndOffset]\n );\n}\n\nexport function parseRFC2822Date(s) {\n return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n return parse(\n s,\n [rfc1123, extractRFC1123Or850],\n [rfc850, extractRFC1123Or850],\n [ascii, extractASCII]\n );\n}\n\nexport function parseISODuration(s) {\n return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n extractISOTime,\n extractISOOffset,\n extractIANAZone\n);\n\nexport function parseSQL(s) {\n return parse(\n s,\n [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n );\n}\n", "import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n asNumber,\n hasOwnProperty,\n isNumber,\n isUndefined,\n normalizeObject,\n roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n weeks: {\n days: 7,\n hours: 7 * 24,\n minutes: 7 * 24 * 60,\n seconds: 7 * 24 * 60 * 60,\n milliseconds: 7 * 24 * 60 * 60 * 1000,\n },\n days: {\n hours: 24,\n minutes: 24 * 60,\n seconds: 24 * 60 * 60,\n milliseconds: 24 * 60 * 60 * 1000,\n },\n hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n minutes: { seconds: 60, milliseconds: 60 * 1000 },\n seconds: { milliseconds: 1000 },\n },\n casualMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: 52,\n days: 365,\n hours: 365 * 24,\n minutes: 365 * 24 * 60,\n seconds: 365 * 24 * 60 * 60,\n milliseconds: 365 * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: 13,\n days: 91,\n hours: 91 * 24,\n minutes: 91 * 24 * 60,\n seconds: 91 * 24 * 60 * 60,\n milliseconds: 91 * 24 * 60 * 60 * 1000,\n },\n months: {\n weeks: 4,\n days: 30,\n hours: 30 * 24,\n minutes: 30 * 24 * 60,\n seconds: 30 * 24 * 60 * 60,\n milliseconds: 30 * 24 * 60 * 60 * 1000,\n },\n\n ...lowOrderMatrix,\n },\n daysInYearAccurate = 146097.0 / 400,\n daysInMonthAccurate = 146097.0 / 4800,\n accurateMatrix = {\n years: {\n quarters: 4,\n months: 12,\n weeks: daysInYearAccurate / 7,\n days: daysInYearAccurate,\n hours: daysInYearAccurate * 24,\n minutes: daysInYearAccurate * 24 * 60,\n seconds: daysInYearAccurate * 24 * 60 * 60,\n milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n },\n quarters: {\n months: 3,\n weeks: daysInYearAccurate / 28,\n days: daysInYearAccurate / 4,\n hours: (daysInYearAccurate * 24) / 4,\n minutes: (daysInYearAccurate * 24 * 60) / 4,\n seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n },\n months: {\n weeks: daysInMonthAccurate / 7,\n days: daysInMonthAccurate,\n hours: daysInMonthAccurate * 24,\n minutes: daysInMonthAccurate * 24 * 60,\n seconds: daysInMonthAccurate * 24 * 60 * 60,\n milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n },\n ...lowOrderMatrix,\n };\n\n// units ordered by size\nconst orderedUnits = [\n \"years\",\n \"quarters\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n // deep merge for vals\n const conf = {\n values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n loc: dur.loc.clone(alts.loc),\n conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n matrix: alts.matrix || dur.matrix,\n };\n return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n let sum = vals.milliseconds ?? 0;\n for (const unit of reverseUnits.slice(1)) {\n if (vals[unit]) {\n sum += vals[unit] * matrix[unit][\"milliseconds\"];\n }\n }\n return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n // the logic below assumes the overall value of the duration is positive\n // if this is not the case, factor is used to make it so\n const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n orderedUnits.reduceRight((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const previousVal = vals[previous] * factor;\n const conv = matrix[current][previous];\n\n // if (previousVal < 0):\n // lower order unit is negative (e.g. { years: 2, days: -2 })\n // normalize this by reducing the higher order unit by the appropriate amount\n // and increasing the lower order unit\n // this can never make the higher order unit negative, because this function only operates\n // on positive durations, so the amount of time represented by the lower order unit cannot\n // be larger than the higher order unit\n // else:\n // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n // in this case we attempt to convert as much as possible from the lower order unit into\n // the higher order one\n //\n // Math.floor takes care of both of these cases, rounding away from 0\n // if previousVal < 0 it makes the absolute value larger\n // if previousVal >= it makes the absolute value smaller\n const rollUp = Math.floor(previousVal / conv);\n vals[current] += rollUp * factor;\n vals[previous] -= rollUp * conv * factor;\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n\n // try to convert any decimals into smaller units if possible\n // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n orderedUnits.reduce((previous, current) => {\n if (!isUndefined(vals[current])) {\n if (previous) {\n const fraction = vals[previous] % 1;\n vals[previous] -= fraction;\n vals[current] += fraction * matrix[previous][current];\n }\n return current;\n } else {\n return previous;\n }\n }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n const newVals = {};\n for (const [key, value] of Object.entries(vals)) {\n if (value !== 0) {\n newVals[key] = value;\n }\n }\n return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n /**\n * @private\n */\n constructor(config) {\n const accurate = config.conversionAccuracy === \"longterm\" || false;\n let matrix = accurate ? accurateMatrix : casualMatrix;\n\n if (config.matrix) {\n matrix = config.matrix;\n }\n\n /**\n * @access private\n */\n this.values = config.values;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.matrix = matrix;\n /**\n * @access private\n */\n this.isLuxonDuration = true;\n }\n\n /**\n * Create Duration from a number of milliseconds.\n * @param {number} count of milliseconds\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n static fromMillis(count, opts) {\n return Duration.fromObject({ milliseconds: count }, opts);\n }\n\n /**\n * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n * If this object is empty then a zero milliseconds duration is returned.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.years\n * @param {number} obj.quarters\n * @param {number} obj.months\n * @param {number} obj.weeks\n * @param {number} obj.days\n * @param {number} obj.hours\n * @param {number} obj.minutes\n * @param {number} obj.seconds\n * @param {number} obj.milliseconds\n * @param {Object} [opts=[]] - options for creating this Duration\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the custom conversion system to use\n * @return {Duration}\n */\n static fromObject(obj, opts = {}) {\n if (obj == null || typeof obj !== \"object\") {\n throw new InvalidArgumentError(\n `Duration.fromObject: argument expected to be an object, got ${\n obj === null ? \"null\" : typeof obj\n }`\n );\n }\n\n return new Duration({\n values: normalizeObject(obj, Duration.normalizeUnit),\n loc: Locale.fromObject(opts),\n conversionAccuracy: opts.conversionAccuracy,\n matrix: opts.matrix,\n });\n }\n\n /**\n * Create a Duration from DurationLike.\n *\n * @param {Object | number | Duration} durationLike\n * One of:\n * - object with keys like 'years' and 'hours'.\n * - number representing milliseconds\n * - Duration instance\n * @return {Duration}\n */\n static fromDurationLike(durationLike) {\n if (isNumber(durationLike)) {\n return Duration.fromMillis(durationLike);\n } else if (Duration.isDuration(durationLike)) {\n return durationLike;\n } else if (typeof durationLike === \"object\") {\n return Duration.fromObject(durationLike);\n } else {\n throw new InvalidArgumentError(\n `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n );\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 duration string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the preset conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n * @return {Duration}\n */\n static fromISO(text, opts) {\n const [parsed] = parseISODuration(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create a Duration from an ISO 8601 time string.\n * @param {string} text - text to parse\n * @param {Object} opts - options for parsing\n * @param {string} [opts.locale='en-US'] - the locale to use\n * @param {string} opts.numberingSystem - the numbering system to use\n * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n * @param {string} [opts.matrix=Object] - the conversion system to use\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n * @return {Duration}\n */\n static fromISOTime(text, opts) {\n const [parsed] = parseISOTimeOnly(text);\n if (parsed) {\n return Duration.fromObject(parsed, opts);\n } else {\n return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n }\n\n /**\n * Create an invalid Duration.\n * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Duration}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDurationError(invalid);\n } else {\n return new Duration({ invalid });\n }\n }\n\n /**\n * @private\n */\n static normalizeUnit(unit) {\n const normalized = {\n year: \"years\",\n years: \"years\",\n quarter: \"quarters\",\n quarters: \"quarters\",\n month: \"months\",\n months: \"months\",\n week: \"weeks\",\n weeks: \"weeks\",\n day: \"days\",\n days: \"days\",\n hour: \"hours\",\n hours: \"hours\",\n minute: \"minutes\",\n minutes: \"minutes\",\n second: \"seconds\",\n seconds: \"seconds\",\n millisecond: \"milliseconds\",\n milliseconds: \"milliseconds\",\n }[unit ? unit.toLowerCase() : unit];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n }\n\n /**\n * Check if an object is a Duration. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDuration(o) {\n return (o && o.isLuxonDuration) || false;\n }\n\n /**\n * Get the locale of a Duration, such 'en-GB'\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n * * `S` for milliseconds\n * * `s` for seconds\n * * `m` for minutes\n * * `h` for hours\n * * `d` for days\n * * `w` for weeks\n * * `M` for months\n * * `y` for years\n * Notes:\n * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n * * Tokens can be escaped by wrapping with single quotes.\n * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n * @param {string} fmt - the format string\n * @param {Object} opts - options\n * @param {boolean} [opts.floor=true] - floor numerical values\n * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n const fmtOpts = {\n ...opts,\n floor: opts.round !== false && opts.floor !== false,\n };\n return this.isValid\n ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a string representation of a Duration with all units included.\n * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n * @example\n * ```js\n * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n * ```\n */\n toHuman(opts = {}) {\n if (!this.isValid) return INVALID;\n\n const showZeros = opts.showZeros !== false;\n\n const l = orderedUnits\n .map((unit) => {\n const val = this.values[unit];\n if (isUndefined(val) || (val === 0 && !showZeros)) {\n return null;\n }\n return this.loc\n .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n .format(val);\n })\n .filter((n) => n);\n\n return this.loc\n .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n .format(l);\n }\n\n /**\n * Returns a JavaScript object with this Duration's values.\n * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n * @return {Object}\n */\n toObject() {\n if (!this.isValid) return {};\n return { ...this.values };\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n * @return {string}\n */\n toISO() {\n // we could use the formatter, but this is an easier way to get the minimum string\n if (!this.isValid) return null;\n\n let s = \"P\";\n if (this.years !== 0) s += this.years + \"Y\";\n if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n if (this.weeks !== 0) s += this.weeks + \"W\";\n if (this.days !== 0) s += this.days + \"D\";\n if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n s += \"T\";\n if (this.hours !== 0) s += this.hours + \"H\";\n if (this.minutes !== 0) s += this.minutes + \"M\";\n if (this.seconds !== 0 || this.milliseconds !== 0)\n // this will handle \"floating point madness\" by removing extra decimal places\n // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n if (s === \"P\") s += \"T0S\";\n return s;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n * @return {string}\n */\n toISOTime(opts = {}) {\n if (!this.isValid) return null;\n\n const millis = this.toMillis();\n if (millis < 0 || millis >= 86400000) return null;\n\n opts = {\n suppressMilliseconds: false,\n suppressSeconds: false,\n includePrefix: false,\n format: \"extended\",\n ...opts,\n includeOffset: false,\n };\n\n const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n return dateTime.toISOTime(opts);\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n * @return {string}\n */\n toString() {\n return this.toISO();\n }\n\n /**\n * Returns a string representation of this Duration appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Duration { values: ${JSON.stringify(this.values)} }`;\n } else {\n return `Duration { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns an milliseconds value of this Duration.\n * @return {number}\n */\n toMillis() {\n if (!this.isValid) return NaN;\n\n return durationToMillis(this.matrix, this.values);\n }\n\n /**\n * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n plus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration),\n result = {};\n\n for (const k of orderedUnits) {\n if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n result[k] = dur.get(k) + this.get(k);\n }\n }\n\n return clone(this, { values: result }, true);\n }\n\n /**\n * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @return {Duration}\n */\n minus(duration) {\n if (!this.isValid) return this;\n\n const dur = Duration.fromDurationLike(duration);\n return this.plus(dur.negate());\n }\n\n /**\n * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n * @return {Duration}\n */\n mapUnits(fn) {\n if (!this.isValid) return this;\n const result = {};\n for (const k of Object.keys(this.values)) {\n result[k] = asNumber(fn(this.values[k], k));\n }\n return clone(this, { values: result }, true);\n }\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n * @return {number}\n */\n get(unit) {\n return this[Duration.normalizeUnit(unit)];\n }\n\n /**\n * \"Set\" the values of specified units. Return a newly-constructed Duration.\n * @param {Object} values - a mapping of units to numbers\n * @example dur.set({ years: 2017 })\n * @example dur.set({ hours: 8, minutes: 30 })\n * @return {Duration}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n return clone(this, { values: mixed });\n }\n\n /**\n * \"Set\" the locale and/or numberingSystem. Returns a newly-constructed Duration.\n * @example dur.reconfigure({ locale: 'en-GB' })\n * @return {Duration}\n */\n reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem });\n const opts = { loc, matrix, conversionAccuracy };\n return clone(this, opts);\n }\n\n /**\n * Return the length of the duration in the specified unit.\n * @param {string} unit - a unit such as 'minutes' or 'days'\n * @example Duration.fromObject({years: 1}).as('days') //=> 365\n * @example Duration.fromObject({years: 1}).as('months') //=> 12\n * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n * @return {number}\n */\n as(unit) {\n return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n }\n\n /**\n * Reduce this Duration to its canonical representation in its current units.\n * Assuming the overall value of the Duration is positive, this means:\n * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n * the overall value would be negative, see third example)\n * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n *\n * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n * @return {Duration}\n */\n normalize() {\n if (!this.isValid) return this;\n const vals = this.toObject();\n normalizeValues(this.matrix, vals);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Rescale units to its largest representation\n * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n * @return {Duration}\n */\n rescale() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Convert this Duration into its representation in a different set of units.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n * @return {Duration}\n */\n shiftTo(...units) {\n if (!this.isValid) return this;\n\n if (units.length === 0) {\n return this;\n }\n\n units = units.map((u) => Duration.normalizeUnit(u));\n\n const built = {},\n accumulated = {},\n vals = this.toObject();\n let lastUnit;\n\n for (const k of orderedUnits) {\n if (units.indexOf(k) >= 0) {\n lastUnit = k;\n\n let own = 0;\n\n // anything we haven't boiled down yet should get boiled to this unit\n for (const ak in accumulated) {\n own += this.matrix[ak][k] * accumulated[ak];\n accumulated[ak] = 0;\n }\n\n // plus anything that's already in this unit\n if (isNumber(vals[k])) {\n own += vals[k];\n }\n\n // only keep the integer part for now in the hopes of putting any decimal part\n // into a smaller unit later\n const i = Math.trunc(own);\n built[k] = i;\n accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n // otherwise, keep it in the wings to boil it later\n } else if (isNumber(vals[k])) {\n accumulated[k] = vals[k];\n }\n }\n\n // anything leftover becomes the decimal for the last unit\n // lastUnit must be defined since units is not empty\n for (const key in accumulated) {\n if (accumulated[key] !== 0) {\n built[lastUnit] +=\n key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n }\n }\n\n normalizeValues(this.matrix, built);\n return clone(this, { values: built }, true);\n }\n\n /**\n * Shift this Duration to all available units.\n * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n * @return {Duration}\n */\n shiftToAll() {\n if (!this.isValid) return this;\n return this.shiftTo(\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n \"minutes\",\n \"seconds\",\n \"milliseconds\"\n );\n }\n\n /**\n * Return the negative of this Duration.\n * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n * @return {Duration}\n */\n negate() {\n if (!this.isValid) return this;\n const negated = {};\n for (const k of Object.keys(this.values)) {\n negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n }\n return clone(this, { values: negated }, true);\n }\n\n /**\n * Removes all units with values equal to 0 from this Duration.\n * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n * @return {Duration}\n */\n removeZeros() {\n if (!this.isValid) return this;\n const vals = removeZeroes(this.values);\n return clone(this, { values: vals }, true);\n }\n\n /**\n * Get the years.\n * @type {number}\n */\n get years() {\n return this.isValid ? this.values.years || 0 : NaN;\n }\n\n /**\n * Get the quarters.\n * @type {number}\n */\n get quarters() {\n return this.isValid ? this.values.quarters || 0 : NaN;\n }\n\n /**\n * Get the months.\n * @type {number}\n */\n get months() {\n return this.isValid ? this.values.months || 0 : NaN;\n }\n\n /**\n * Get the weeks\n * @type {number}\n */\n get weeks() {\n return this.isValid ? this.values.weeks || 0 : NaN;\n }\n\n /**\n * Get the days.\n * @type {number}\n */\n get days() {\n return this.isValid ? this.values.days || 0 : NaN;\n }\n\n /**\n * Get the hours.\n * @type {number}\n */\n get hours() {\n return this.isValid ? this.values.hours || 0 : NaN;\n }\n\n /**\n * Get the minutes.\n * @type {number}\n */\n get minutes() {\n return this.isValid ? this.values.minutes || 0 : NaN;\n }\n\n /**\n * Get the seconds.\n * @return {number}\n */\n get seconds() {\n return this.isValid ? this.values.seconds || 0 : NaN;\n }\n\n /**\n * Get the milliseconds.\n * @return {number}\n */\n get milliseconds() {\n return this.isValid ? this.values.milliseconds || 0 : NaN;\n }\n\n /**\n * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n * on invalid DateTimes or Intervals.\n * @return {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this Duration became invalid, or null if the Duration is valid\n * @return {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Equality check\n * Two Durations are equal iff they have the same units and the same values for each unit.\n * @param {Duration} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n if (!this.loc.equals(other.loc)) {\n return false;\n }\n\n function eq(v1, v2) {\n // Consider 0 and undefined as equal\n if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n return v1 === v2;\n }\n\n for (const u of orderedUnits) {\n if (!eq(this.values[u], other.values[u])) {\n return false;\n }\n }\n return true;\n }\n}\n", "import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n if (!start || !start.isValid) {\n return Interval.invalid(\"missing or invalid start\");\n } else if (!end || !end.isValid) {\n return Interval.invalid(\"missing or invalid end\");\n } else if (end < start) {\n return Interval.invalid(\n \"end before start\",\n `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n );\n } else {\n return null;\n }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n /**\n * @private\n */\n constructor(config) {\n /**\n * @access private\n */\n this.s = config.start;\n /**\n * @access private\n */\n this.e = config.end;\n /**\n * @access private\n */\n this.invalid = config.invalid || null;\n /**\n * @access private\n */\n this.isLuxonInterval = true;\n }\n\n /**\n * Create an invalid Interval.\n * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {Interval}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidIntervalError(invalid);\n } else {\n return new Interval({ invalid });\n }\n }\n\n /**\n * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n * @param {DateTime|Date|Object} start\n * @param {DateTime|Date|Object} end\n * @return {Interval}\n */\n static fromDateTimes(start, end) {\n const builtStart = friendlyDateTime(start),\n builtEnd = friendlyDateTime(end);\n\n const validateError = validateStartEnd(builtStart, builtEnd);\n\n if (validateError == null) {\n return new Interval({\n start: builtStart,\n end: builtEnd,\n });\n } else {\n return validateError;\n }\n }\n\n /**\n * Create an Interval from a start DateTime and a Duration to extend to.\n * @param {DateTime|Date|Object} start\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static after(start, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(start);\n return Interval.fromDateTimes(dt, dt.plus(dur));\n }\n\n /**\n * Create an Interval from an end DateTime and a Duration to extend backwards to.\n * @param {DateTime|Date|Object} end\n * @param {Duration|Object|number} duration - the length of the Interval.\n * @return {Interval}\n */\n static before(end, duration) {\n const dur = Duration.fromDurationLike(duration),\n dt = friendlyDateTime(end);\n return Interval.fromDateTimes(dt.minus(dur), dt);\n }\n\n /**\n * Create an Interval from an ISO 8601 string.\n * Accepts `/`, `/`, and `/` formats.\n * @param {string} text - the ISO string to parse\n * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {Interval}\n */\n static fromISO(text, opts) {\n const [s, e] = (text || \"\").split(\"/\", 2);\n if (s && e) {\n let start, startIsValid;\n try {\n start = DateTime.fromISO(s, opts);\n startIsValid = start.isValid;\n } catch (e) {\n startIsValid = false;\n }\n\n let end, endIsValid;\n try {\n end = DateTime.fromISO(e, opts);\n endIsValid = end.isValid;\n } catch (e) {\n endIsValid = false;\n }\n\n if (startIsValid && endIsValid) {\n return Interval.fromDateTimes(start, end);\n }\n\n if (startIsValid) {\n const dur = Duration.fromISO(e, opts);\n if (dur.isValid) {\n return Interval.after(start, dur);\n }\n } else if (endIsValid) {\n const dur = Duration.fromISO(s, opts);\n if (dur.isValid) {\n return Interval.before(end, dur);\n }\n }\n }\n return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n }\n\n /**\n * Check if an object is an Interval. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isInterval(o) {\n return (o && o.isLuxonInterval) || false;\n }\n\n /**\n * Returns the start of the Interval\n * @type {DateTime}\n */\n get start() {\n return this.isValid ? this.s : null;\n }\n\n /**\n * Returns the end of the Interval. This is the first instant which is not part of the interval\n * (Interval is half-open).\n * @type {DateTime}\n */\n get end() {\n return this.isValid ? this.e : null;\n }\n\n /**\n * Returns the last DateTime included in the interval (since end is not part of the interval)\n * @type {DateTime}\n */\n get lastDateTime() {\n return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n }\n\n /**\n * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n * @type {boolean}\n */\n get isValid() {\n return this.invalidReason === null;\n }\n\n /**\n * Returns an error code if this Interval is invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Returns the length of the Interval in the specified unit.\n * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n * @return {number}\n */\n length(unit = \"milliseconds\") {\n return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n }\n\n /**\n * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n * @param {string} [unit='milliseconds'] - the unit of time to count.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n * @return {number}\n */\n count(unit = \"milliseconds\", opts) {\n if (!this.isValid) return NaN;\n const start = this.start.startOf(unit, opts);\n let end;\n if (opts?.useLocaleWeeks) {\n end = this.end.reconfigure({ locale: start.locale });\n } else {\n end = this.end;\n }\n end = end.startOf(unit, opts);\n return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n }\n\n /**\n * Returns whether this Interval's start and end are both in the same unit of time\n * @param {string} unit - the unit of time to check sameness on\n * @return {boolean}\n */\n hasSame(unit) {\n return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n }\n\n /**\n * Return whether this Interval has the same start and end DateTimes.\n * @return {boolean}\n */\n isEmpty() {\n return this.s.valueOf() === this.e.valueOf();\n }\n\n /**\n * Return whether this Interval's start is after the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isAfter(dateTime) {\n if (!this.isValid) return false;\n return this.s > dateTime;\n }\n\n /**\n * Return whether this Interval's end is before the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n isBefore(dateTime) {\n if (!this.isValid) return false;\n return this.e <= dateTime;\n }\n\n /**\n * Return whether this Interval contains the specified DateTime.\n * @param {DateTime} dateTime\n * @return {boolean}\n */\n contains(dateTime) {\n if (!this.isValid) return false;\n return this.s <= dateTime && this.e > dateTime;\n }\n\n /**\n * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n * @param {Object} values - the values to set\n * @param {DateTime} values.start - the starting DateTime\n * @param {DateTime} values.end - the ending DateTime\n * @return {Interval}\n */\n set({ start, end } = {}) {\n if (!this.isValid) return this;\n return Interval.fromDateTimes(start || this.s, end || this.e);\n }\n\n /**\n * Split this Interval at each of the specified DateTimes\n * @param {...DateTime} dateTimes - the unit of time to count.\n * @return {Array}\n */\n splitAt(...dateTimes) {\n if (!this.isValid) return [];\n const sorted = dateTimes\n .map(friendlyDateTime)\n .filter((d) => this.contains(d))\n .sort((a, b) => a.toMillis() - b.toMillis()),\n results = [];\n let { s } = this,\n i = 0;\n\n while (s < this.e) {\n const added = sorted[i] || this.e,\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n i += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into smaller Intervals, each of the specified length.\n * Left over time is grouped into a smaller interval\n * @param {Duration|Object|number} duration - The length of each resulting interval.\n * @return {Array}\n */\n splitBy(duration) {\n const dur = Duration.fromDurationLike(duration);\n\n if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n return [];\n }\n\n let { s } = this,\n idx = 1,\n next;\n\n const results = [];\n while (s < this.e) {\n const added = this.start.plus(dur.mapUnits((x) => x * idx));\n next = +added > +this.e ? this.e : added;\n results.push(Interval.fromDateTimes(s, next));\n s = next;\n idx += 1;\n }\n\n return results;\n }\n\n /**\n * Split this Interval into the specified number of smaller intervals.\n * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n * @return {Array}\n */\n divideEqually(numberOfParts) {\n if (!this.isValid) return [];\n return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n }\n\n /**\n * Return whether this Interval overlaps with the specified Interval\n * @param {Interval} other\n * @return {boolean}\n */\n overlaps(other) {\n return this.e > other.s && this.s < other.e;\n }\n\n /**\n * Return whether this Interval's end is adjacent to the specified Interval's start.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsStart(other) {\n if (!this.isValid) return false;\n return +this.e === +other.s;\n }\n\n /**\n * Return whether this Interval's start is adjacent to the specified Interval's end.\n * @param {Interval} other\n * @return {boolean}\n */\n abutsEnd(other) {\n if (!this.isValid) return false;\n return +other.e === +this.s;\n }\n\n /**\n * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n * @param {Interval} other\n * @return {boolean}\n */\n engulfs(other) {\n if (!this.isValid) return false;\n return this.s <= other.s && this.e >= other.e;\n }\n\n /**\n * Return whether this Interval has the same start and end as the specified Interval.\n * @param {Interval} other\n * @return {boolean}\n */\n equals(other) {\n if (!this.isValid || !other.isValid) {\n return false;\n }\n\n return this.s.equals(other.s) && this.e.equals(other.e);\n }\n\n /**\n * Return an Interval representing the intersection of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n * @param {Interval} other\n * @return {Interval}\n */\n intersection(other) {\n if (!this.isValid) return this;\n const s = this.s > other.s ? this.s : other.s,\n e = this.e < other.e ? this.e : other.e;\n\n if (s >= e) {\n return null;\n } else {\n return Interval.fromDateTimes(s, e);\n }\n }\n\n /**\n * Return an Interval representing the union of this Interval and the specified Interval.\n * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n * @param {Interval} other\n * @return {Interval}\n */\n union(other) {\n if (!this.isValid) return this;\n const s = this.s < other.s ? this.s : other.s,\n e = this.e > other.e ? this.e : other.e;\n return Interval.fromDateTimes(s, e);\n }\n\n /**\n * Merge an array of Intervals into an equivalent minimal set of Intervals.\n * Combines overlapping and adjacent Intervals.\n * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n * and ending with the latest.\n *\n * @param {Array} intervals\n * @return {Array}\n */\n static merge(intervals) {\n const [found, final] = intervals\n .sort((a, b) => a.s - b.s)\n .reduce(\n ([sofar, current], item) => {\n if (!current) {\n return [sofar, item];\n } else if (current.overlaps(item) || current.abutsStart(item)) {\n return [sofar, current.union(item)];\n } else {\n return [sofar.concat([current]), item];\n }\n },\n [[], null]\n );\n if (final) {\n found.push(final);\n }\n return found;\n }\n\n /**\n * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n * @param {Array} intervals\n * @return {Array}\n */\n static xor(intervals) {\n let start = null,\n currentCount = 0;\n const results = [],\n ends = intervals.map((i) => [\n { time: i.s, type: \"s\" },\n { time: i.e, type: \"e\" },\n ]),\n flattened = Array.prototype.concat(...ends),\n arr = flattened.sort((a, b) => a.time - b.time);\n\n for (const i of arr) {\n currentCount += i.type === \"s\" ? 1 : -1;\n\n if (currentCount === 1) {\n start = i.time;\n } else {\n if (start && +start !== +i.time) {\n results.push(Interval.fromDateTimes(start, i.time));\n }\n\n start = null;\n }\n }\n\n return Interval.merge(results);\n }\n\n /**\n * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n * @param {...Interval} intervals\n * @return {Array}\n */\n difference(...intervals) {\n return Interval.xor([this].concat(intervals))\n .map((i) => this.intersection(i))\n .filter((i) => i && !i.isEmpty());\n }\n\n /**\n * Returns a string representation of this Interval appropriate for debugging.\n * @return {string}\n */\n toString() {\n if (!this.isValid) return INVALID;\n return `[${this.s.toISO()} – ${this.e.toISO()})`;\n }\n\n /**\n * Returns a string representation of this Interval appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n } else {\n return `Interval { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns a localized string representing this Interval. Accepts the same options as the\n * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n * is browser-specific, but in general it will return an appropriate representation of the\n * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n * specified.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n * Intl.DateTimeFormat constructor options.\n * @param {Object} opts - Options to override the configuration of the start DateTime.\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n : INVALID;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this Interval.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISO(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of date of this Interval.\n * The time components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @return {string}\n */\n toISODate() {\n if (!this.isValid) return INVALID;\n return `${this.s.toISODate()}/${this.e.toISODate()}`;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of time of this Interval.\n * The date components are ignored.\n * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n * @param {Object} opts - The same options as {@link DateTime#toISO}\n * @return {string}\n */\n toISOTime(opts) {\n if (!this.isValid) return INVALID;\n return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this Interval formatted according to the specified format\n * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n * formatting tool.\n * @param {string} dateFormat - The format string. This string formats the start and end time.\n * See {@link DateTime#toFormat} for details.\n * @param {Object} opts - Options.\n * @param {string} [opts.separator = ' – '] - A separator to place between the start and end\n * representations.\n * @return {string}\n */\n toFormat(dateFormat, { separator = \" – \" } = {}) {\n if (!this.isValid) return INVALID;\n return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n }\n\n /**\n * Return a Duration representing the time spanned by this interval.\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n * @return {Duration}\n */\n toDuration(unit, opts) {\n if (!this.isValid) {\n return Duration.invalid(this.invalidReason);\n }\n return this.e.diff(this.s, unit, opts);\n }\n\n /**\n * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n * @param {function} mapFn\n * @return {Interval}\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n */\n mapEndpoints(mapFn) {\n return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n }\n}\n", "import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n /**\n * Return whether the specified zone contains a DST.\n * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n * @return {boolean}\n */\n static hasDST(zone = Settings.defaultZone) {\n const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n }\n\n /**\n * Return whether the specified zone is a valid IANA specifier.\n * @param {string} zone - Zone to check\n * @return {boolean}\n */\n static isValidIANAZone(zone) {\n return IANAZone.isValidZone(zone);\n }\n\n /**\n * Converts the input into a {@link Zone} instance.\n *\n * * If `input` is already a Zone instance, it is returned unchanged.\n * * If `input` is a string containing a valid time zone name, a Zone instance\n * with that name is returned.\n * * If `input` is a string that doesn't refer to a known time zone, a Zone\n * instance with {@link Zone#isValid} == false is returned.\n * * If `input is a number, a Zone instance with the specified fixed offset\n * in minutes is returned.\n * * If `input` is `null` or `undefined`, the default zone is returned.\n * @param {string|Zone|number} [input] - the value to be converted\n * @return {Zone}\n */\n static normalizeZone(input) {\n return normalizeZone(input, Settings.defaultZone);\n }\n\n /**\n * Get the weekday on which the week starts according to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n */\n static getStartOfWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getStartOfWeek();\n }\n\n /**\n * Get the minimum number of days necessary in a week before it is considered part of the next year according\n * to the given locale.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number}\n */\n static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n }\n\n /**\n * Get the weekdays, which are considered the weekend according to the given locale\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n */\n static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n // copy the array, because we cache it internally\n return (locObj || Locale.create(locale)).getWeekendDays().slice();\n }\n\n /**\n * Return an array of standalone month names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @example Info.months()[0] //=> 'January'\n * @example Info.months('short')[0] //=> 'Jan'\n * @example Info.months('numeric')[0] //=> '1'\n * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n * @return {Array}\n */\n static months(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n }\n\n /**\n * Return an array of format month names.\n * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n * changes the string.\n * See {@link Info#months}\n * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @param {string} [opts.outputCalendar='gregory'] - the calendar\n * @return {Array}\n */\n static monthsFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n }\n\n /**\n * Return an array of standalone week names.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @example Info.weekdays()[0] //=> 'Monday'\n * @example Info.weekdays('short')[0] //=> 'Mon'\n * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n * @return {Array}\n */\n static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n }\n\n /**\n * Return an array of format week names.\n * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n * changes the string.\n * See {@link Info#weekdays}\n * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale=null] - the locale code\n * @param {string} [opts.numberingSystem=null] - the numbering system\n * @param {string} [opts.locObj=null] - an existing locale object to use\n * @return {Array}\n */\n static weekdaysFormat(\n length = \"long\",\n { locale = null, numberingSystem = null, locObj = null } = {}\n ) {\n return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n }\n\n /**\n * Return an array of meridiems.\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n * @return {Array}\n */\n static meridiems({ locale = null } = {}) {\n return Locale.create(locale).meridiems();\n }\n\n /**\n * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n * @param {Object} opts - options\n * @param {string} [opts.locale] - the locale code\n * @example Info.eras() //=> [ 'BC', 'AD' ]\n * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n * @return {Array}\n */\n static eras(length = \"short\", { locale = null } = {}) {\n return Locale.create(locale, null, \"gregory\").eras(length);\n }\n\n /**\n * Return the set of available features in this environment.\n * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n * Keys:\n * * `relative`: whether this environment supports relative time formatting\n * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n * @example Info.features() //=> { relative: false, localeWeek: true }\n * @return {Object}\n */\n static features() {\n return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n }\n}\n", "import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n ms = utcDayStart(later) - utcDayStart(earlier);\n return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n const differs = [\n [\"years\", (a, b) => b.year - a.year],\n [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n [\n \"weeks\",\n (a, b) => {\n const days = dayDiff(a, b);\n return (days - (days % 7)) / 7;\n },\n ],\n [\"days\", dayDiff],\n ];\n\n const results = {};\n const earlier = cursor;\n let lowestOrder, highWater;\n\n /* This loop tries to diff using larger units first.\n If we overshoot, we backtrack and try the next smaller unit.\n \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n as we use smaller and smaller units.\n highWater keeps track of where we would be if we added one more of the smallest unit,\n this is used later to potentially convert any difference smaller than the smallest higher order unit\n into a fraction of that smallest higher order unit\n */\n for (const [unit, differ] of differs) {\n if (units.indexOf(unit) >= 0) {\n lowestOrder = unit;\n\n results[unit] = differ(cursor, later);\n highWater = earlier.plus(results);\n\n if (highWater > later) {\n // we overshot the end point, backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n\n // if we are still overshooting now, we need to backtrack again\n // this happens in certain situations when diffing times in different zones,\n // because this calculation ignores time zones\n if (cursor > later) {\n // keep the \"overshot by 1\" around as highWater\n highWater = cursor;\n // backtrack cursor by 1\n results[unit]--;\n cursor = earlier.plus(results);\n }\n } else {\n cursor = highWater;\n }\n }\n }\n\n return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n const remainingMillis = later - cursor;\n\n const lowerOrderUnits = units.filter(\n (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n );\n\n if (lowerOrderUnits.length === 0) {\n if (highWater < later) {\n highWater = cursor.plus({ [lowestOrder]: 1 });\n }\n\n if (highWater !== cursor) {\n results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n }\n }\n\n const duration = Duration.fromObject(results, opts);\n\n if (lowerOrderUnits.length > 0) {\n return Duration.fromMillis(remainingMillis, opts)\n .shiftTo(...lowerOrderUnits)\n .plus(duration);\n } else {\n return duration;\n }\n}\n", "import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n // make dots optional and also make them literal\n // make space and non breakable space characters interchangeable\n return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n return s\n .replace(/\\./g, \"\") // ignore dots that were made optional\n .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n if (strings === null) {\n return null;\n } else {\n return {\n regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n deser: ([s]) =>\n strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n };\n }\n}\n\nfunction offset(regex, groups) {\n return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n const one = digitRegex(loc),\n two = digitRegex(loc, \"{2}\"),\n three = digitRegex(loc, \"{3}\"),\n four = digitRegex(loc, \"{4}\"),\n six = digitRegex(loc, \"{6}\"),\n oneOrTwo = digitRegex(loc, \"{1,2}\"),\n oneToThree = digitRegex(loc, \"{1,3}\"),\n oneToSix = digitRegex(loc, \"{1,6}\"),\n oneToNine = digitRegex(loc, \"{1,9}\"),\n twoToFour = digitRegex(loc, \"{2,4}\"),\n fourToSix = digitRegex(loc, \"{4,6}\"),\n literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n unitate = (t) => {\n if (token.literal) {\n return literal(t);\n }\n switch (t.val) {\n // era\n case \"G\":\n return oneOf(loc.eras(\"short\"), 0);\n case \"GG\":\n return oneOf(loc.eras(\"long\"), 0);\n // years\n case \"y\":\n return intUnit(oneToSix);\n case \"yy\":\n return intUnit(twoToFour, untruncateYear);\n case \"yyyy\":\n return intUnit(four);\n case \"yyyyy\":\n return intUnit(fourToSix);\n case \"yyyyyy\":\n return intUnit(six);\n // months\n case \"M\":\n return intUnit(oneOrTwo);\n case \"MM\":\n return intUnit(two);\n case \"MMM\":\n return oneOf(loc.months(\"short\", true), 1);\n case \"MMMM\":\n return oneOf(loc.months(\"long\", true), 1);\n case \"L\":\n return intUnit(oneOrTwo);\n case \"LL\":\n return intUnit(two);\n case \"LLL\":\n return oneOf(loc.months(\"short\", false), 1);\n case \"LLLL\":\n return oneOf(loc.months(\"long\", false), 1);\n // dates\n case \"d\":\n return intUnit(oneOrTwo);\n case \"dd\":\n return intUnit(two);\n // ordinals\n case \"o\":\n return intUnit(oneToThree);\n case \"ooo\":\n return intUnit(three);\n // time\n case \"HH\":\n return intUnit(two);\n case \"H\":\n return intUnit(oneOrTwo);\n case \"hh\":\n return intUnit(two);\n case \"h\":\n return intUnit(oneOrTwo);\n case \"mm\":\n return intUnit(two);\n case \"m\":\n return intUnit(oneOrTwo);\n case \"q\":\n return intUnit(oneOrTwo);\n case \"qq\":\n return intUnit(two);\n case \"s\":\n return intUnit(oneOrTwo);\n case \"ss\":\n return intUnit(two);\n case \"S\":\n return intUnit(oneToThree);\n case \"SSS\":\n return intUnit(three);\n case \"u\":\n return simple(oneToNine);\n case \"uu\":\n return simple(oneOrTwo);\n case \"uuu\":\n return intUnit(one);\n // meridiem\n case \"a\":\n return oneOf(loc.meridiems(), 0);\n // weekYear (k)\n case \"kkkk\":\n return intUnit(four);\n case \"kk\":\n return intUnit(twoToFour, untruncateYear);\n // weekNumber (W)\n case \"W\":\n return intUnit(oneOrTwo);\n case \"WW\":\n return intUnit(two);\n // weekdays\n case \"E\":\n case \"c\":\n return intUnit(one);\n case \"EEE\":\n return oneOf(loc.weekdays(\"short\", false), 1);\n case \"EEEE\":\n return oneOf(loc.weekdays(\"long\", false), 1);\n case \"ccc\":\n return oneOf(loc.weekdays(\"short\", true), 1);\n case \"cccc\":\n return oneOf(loc.weekdays(\"long\", true), 1);\n // offset/zone\n case \"Z\":\n case \"ZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n case \"ZZZ\":\n return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n // because we don't have any way to figure out what they are\n case \"z\":\n return simple(/[a-z_+-/]{1,256}?/i);\n // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n // in this case we accept any non-newline white-space\n case \" \":\n return simple(/[^\\S\\n\\r]/);\n default:\n return literal(t);\n }\n };\n\n const unit = unitate(token) || {\n invalidReason: MISSING_FTP,\n };\n\n unit.token = token;\n\n return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n year: {\n \"2-digit\": \"yy\",\n numeric: \"yyyyy\",\n },\n month: {\n numeric: \"M\",\n \"2-digit\": \"MM\",\n short: \"MMM\",\n long: \"MMMM\",\n },\n day: {\n numeric: \"d\",\n \"2-digit\": \"dd\",\n },\n weekday: {\n short: \"EEE\",\n long: \"EEEE\",\n },\n dayperiod: \"a\",\n dayPeriod: \"a\",\n hour12: {\n numeric: \"h\",\n \"2-digit\": \"hh\",\n },\n hour24: {\n numeric: \"H\",\n \"2-digit\": \"HH\",\n },\n minute: {\n numeric: \"m\",\n \"2-digit\": \"mm\",\n },\n second: {\n numeric: \"s\",\n \"2-digit\": \"ss\",\n },\n timeZoneName: {\n long: \"ZZZZZ\",\n short: \"ZZZ\",\n },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n const { type, value } = part;\n\n if (type === \"literal\") {\n const isSpace = /^\\s+$/.test(value);\n return {\n literal: !isSpace,\n val: isSpace ? \" \" : value,\n };\n }\n\n const style = formatOpts[type];\n\n // The user might have explicitly specified hour12 or hourCycle\n // if so, respect their decision\n // if not, refer back to the resolvedOpts, which are based on the locale\n let actualType = type;\n if (type === \"hour\") {\n if (formatOpts.hour12 != null) {\n actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n } else if (formatOpts.hourCycle != null) {\n if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n actualType = \"hour12\";\n } else {\n actualType = \"hour24\";\n }\n } else {\n // tokens only differentiate between 24 hours or not,\n // so we do not need to check hourCycle here, which is less supported anyways\n actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n }\n }\n let val = partTypeStyleToTokenVal[actualType];\n if (typeof val === \"object\") {\n val = val[style];\n }\n\n if (val) {\n return {\n literal: false,\n val,\n };\n }\n\n return undefined;\n}\n\nfunction buildRegex(units) {\n const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n const matches = input.match(regex);\n\n if (matches) {\n const all = {};\n let matchIndex = 1;\n for (const i in handlers) {\n if (hasOwnProperty(handlers, i)) {\n const h = handlers[i],\n groups = h.groups ? h.groups + 1 : 1;\n if (!h.literal && h.token) {\n all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n }\n matchIndex += groups;\n }\n }\n return [matches, all];\n } else {\n return [matches, {}];\n }\n}\n\nfunction dateTimeFromMatches(matches) {\n const toField = (token) => {\n switch (token) {\n case \"S\":\n return \"millisecond\";\n case \"s\":\n return \"second\";\n case \"m\":\n return \"minute\";\n case \"h\":\n case \"H\":\n return \"hour\";\n case \"d\":\n return \"day\";\n case \"o\":\n return \"ordinal\";\n case \"L\":\n case \"M\":\n return \"month\";\n case \"y\":\n return \"year\";\n case \"E\":\n case \"c\":\n return \"weekday\";\n case \"W\":\n return \"weekNumber\";\n case \"k\":\n return \"weekYear\";\n case \"q\":\n return \"quarter\";\n default:\n return null;\n }\n };\n\n let zone = null;\n let specificOffset;\n if (!isUndefined(matches.z)) {\n zone = IANAZone.create(matches.z);\n }\n\n if (!isUndefined(matches.Z)) {\n if (!zone) {\n zone = new FixedOffsetZone(matches.Z);\n }\n specificOffset = matches.Z;\n }\n\n if (!isUndefined(matches.q)) {\n matches.M = (matches.q - 1) * 3 + 1;\n }\n\n if (!isUndefined(matches.h)) {\n if (matches.h < 12 && matches.a === 1) {\n matches.h += 12;\n } else if (matches.h === 12 && matches.a === 0) {\n matches.h = 0;\n }\n }\n\n if (matches.G === 0 && matches.y) {\n matches.y = -matches.y;\n }\n\n if (!isUndefined(matches.u)) {\n matches.S = parseMillis(matches.u);\n }\n\n const vals = Object.keys(matches).reduce((r, k) => {\n const f = toField(k);\n if (f) {\n r[f] = matches[k];\n }\n\n return r;\n }, {});\n\n return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n if (!dummyDateTimeCache) {\n dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n }\n\n return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n if (token.literal) {\n return token;\n }\n\n const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n const tokens = formatOptsToTokens(formatOpts, locale);\n\n if (tokens == null || tokens.includes(undefined)) {\n return token;\n }\n\n return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport class TokenParser {\n constructor(locale, format) {\n this.locale = locale;\n this.format = format;\n this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n this.units = this.tokens.map((t) => unitForToken(t, locale));\n this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n if (!this.disqualifyingUnit) {\n const [regexString, handlers] = buildRegex(this.units);\n this.regex = RegExp(regexString, \"i\");\n this.handlers = handlers;\n }\n }\n\n explainFromTokens(input) {\n if (!this.isValid) {\n return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n } else {\n const [rawMatches, matches] = match(input, this.regex, this.handlers),\n [result, zone, specificOffset] = matches\n ? dateTimeFromMatches(matches)\n : [null, null, undefined];\n if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n throw new ConflictingSpecificationError(\n \"Can't include meridiem when specifying 24-hour format\"\n );\n }\n return {\n input,\n tokens: this.tokens,\n regex: this.regex,\n rawMatches,\n matches,\n result,\n zone,\n specificOffset,\n };\n }\n }\n\n get isValid() {\n return !this.disqualifyingUnit;\n }\n\n get invalidReason() {\n return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n }\n}\n\nexport function explainFromTokens(locale, input, format) {\n const parser = new TokenParser(locale, format);\n return parser.explainFromTokens(input);\n}\n\nexport function parseFromTokens(locale, input, format) {\n const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n if (!formatOpts) {\n return null;\n }\n\n const formatter = Formatter.create(locale, formatOpts);\n const df = formatter.dtFormatter(getDummyDateTime());\n const parts = df.formatToParts();\n const resolvedOpts = df.resolvedOptions();\n return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n", "import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n isUndefined,\n maybeArray,\n isDate,\n isNumber,\n bestBy,\n daysInMonth,\n daysInYear,\n isLeapYear,\n weeksInWeekYear,\n normalizeObject,\n roundTo,\n objToLocalTS,\n padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n parseFromTokens,\n explainFromTokens,\n formatOptsToTokens,\n expandMacroTokens,\n TokenParser,\n} from \"./impl/tokenParser.js\";\nimport {\n gregorianToWeek,\n weekToGregorian,\n gregorianToOrdinal,\n ordinalToGregorian,\n hasInvalidGregorianData,\n hasInvalidWeekData,\n hasInvalidOrdinalData,\n hasInvalidTimeData,\n usesLocalWeekValues,\n isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n InvalidArgumentError,\n ConflictingSpecificationError,\n InvalidUnitError,\n InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n if (dt.weekData === null) {\n dt.weekData = gregorianToWeek(dt.c);\n }\n return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n if (dt.localWeekData === null) {\n dt.localWeekData = gregorianToWeek(\n dt.c,\n dt.loc.getMinDaysInFirstWeek(),\n dt.loc.getStartOfWeek()\n );\n }\n return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n const current = {\n ts: inst.ts,\n zone: inst.zone,\n c: inst.c,\n o: inst.o,\n loc: inst.loc,\n invalid: inst.invalid,\n };\n return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n // Our UTC time is just a guess because our offset is just a guess\n let utcGuess = localTS - o * 60 * 1000;\n\n // Test whether the zone matches the offset for this ts\n const o2 = tz.offset(utcGuess);\n\n // If so, offset didn't change and we're done\n if (o === o2) {\n return [utcGuess, o];\n }\n\n // If not, change the ts by the difference in the offset\n utcGuess -= (o2 - o) * 60 * 1000;\n\n // If that gives us the local time we want, we're done\n const o3 = tz.offset(utcGuess);\n if (o2 === o3) {\n return [utcGuess, o2];\n }\n\n // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n ts += offset * 60 * 1000;\n\n const d = new Date(ts);\n\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n hour: d.getUTCHours(),\n minute: d.getUTCMinutes(),\n second: d.getUTCSeconds(),\n millisecond: d.getUTCMilliseconds(),\n };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n const oPre = inst.o,\n year = inst.c.year + Math.trunc(dur.years),\n month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n c = {\n ...inst.c,\n year,\n month,\n day:\n Math.min(inst.c.day, daysInMonth(year, month)) +\n Math.trunc(dur.days) +\n Math.trunc(dur.weeks) * 7,\n },\n millisToAdd = Duration.fromObject({\n years: dur.years - Math.trunc(dur.years),\n quarters: dur.quarters - Math.trunc(dur.quarters),\n months: dur.months - Math.trunc(dur.months),\n weeks: dur.weeks - Math.trunc(dur.weeks),\n days: dur.days - Math.trunc(dur.days),\n hours: dur.hours,\n minutes: dur.minutes,\n seconds: dur.seconds,\n milliseconds: dur.milliseconds,\n }).as(\"milliseconds\"),\n localTS = objToLocalTS(c);\n\n let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n if (millisToAdd !== 0) {\n ts += millisToAdd;\n // that could have changed the offset by going over a DST, but we want to keep the ts the same\n o = inst.zone.offset(ts);\n }\n\n return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n const { setZone, zone } = opts;\n if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n const interpretationZone = parsedZone || zone,\n inst = DateTime.fromObject(parsed, {\n ...opts,\n zone: interpretationZone,\n specificOffset,\n });\n return setZone ? inst : inst.setZone(zone);\n } else {\n return DateTime.invalid(\n new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n );\n }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n return dt.isValid\n ? Formatter.create(Locale.create(\"en-US\"), {\n allowZ,\n forceSimple: true,\n }).formatDateTimeFromString(dt, format)\n : null;\n}\n\nfunction toISODate(o, extended, precision) {\n const longFormat = o.c.year > 9999 || o.c.year < 0;\n let c = \"\";\n if (longFormat && o.c.year >= 0) c += \"+\";\n c += padStart(o.c.year, longFormat ? 6 : 4);\n if (precision === \"year\") return c;\n if (extended) {\n c += \"-\";\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n c += \"-\";\n } else {\n c += padStart(o.c.month);\n if (precision === \"month\") return c;\n }\n c += padStart(o.c.day);\n return c;\n}\n\nfunction toISOTime(\n o,\n extended,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n) {\n let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n c = \"\";\n switch (precision) {\n case \"day\":\n case \"month\":\n case \"year\":\n break;\n default:\n c += padStart(o.c.hour);\n if (precision === \"hour\") break;\n if (extended) {\n c += \":\";\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += \":\";\n c += padStart(o.c.second);\n }\n } else {\n c += padStart(o.c.minute);\n if (precision === \"minute\") break;\n if (showSeconds) {\n c += padStart(o.c.second);\n }\n }\n if (precision === \"second\") break;\n if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n c += \".\";\n c += padStart(o.c.millisecond, 3);\n }\n }\n\n if (includeOffset) {\n if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n c += \"Z\";\n } else if (o.o < 0) {\n c += \"-\";\n c += padStart(Math.trunc(-o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(-o.o % 60));\n } else {\n c += \"+\";\n c += padStart(Math.trunc(o.o / 60));\n c += \":\";\n c += padStart(Math.trunc(o.o % 60));\n }\n }\n\n if (extendedZone) {\n c += \"[\" + o.zone.ianaName + \"]\";\n }\n return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n month: 1,\n day: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultWeekUnitValues = {\n weekNumber: 1,\n weekday: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n },\n defaultOrdinalUnitValues = {\n ordinal: 1,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0,\n };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n orderedWeekUnits = [\n \"weekYear\",\n \"weekNumber\",\n \"weekday\",\n \"hour\",\n \"minute\",\n \"second\",\n \"millisecond\",\n ],\n orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n const normalized = {\n year: \"year\",\n years: \"year\",\n month: \"month\",\n months: \"month\",\n day: \"day\",\n days: \"day\",\n hour: \"hour\",\n hours: \"hour\",\n minute: \"minute\",\n minutes: \"minute\",\n quarter: \"quarter\",\n quarters: \"quarter\",\n second: \"second\",\n seconds: \"second\",\n millisecond: \"millisecond\",\n milliseconds: \"millisecond\",\n weekday: \"weekday\",\n weekdays: \"weekday\",\n weeknumber: \"weekNumber\",\n weeksnumber: \"weekNumber\",\n weeknumbers: \"weekNumber\",\n weekyear: \"weekYear\",\n weekyears: \"weekYear\",\n ordinal: \"ordinal\",\n }[unit.toLowerCase()];\n\n if (!normalized) throw new InvalidUnitError(unit);\n\n return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n switch (unit.toLowerCase()) {\n case \"localweekday\":\n case \"localweekdays\":\n return \"localWeekday\";\n case \"localweeknumber\":\n case \"localweeknumbers\":\n return \"localWeekNumber\";\n case \"localweekyear\":\n case \"localweekyears\":\n return \"localWeekYear\";\n default:\n return normalizeUnit(unit);\n }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n if (zoneOffsetTs === undefined) {\n zoneOffsetTs = Settings.now();\n }\n\n // Do not cache anything but IANA zones, because it is not safe to do so.\n // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n if (zone.type !== \"iana\") {\n return zone.offset(zoneOffsetTs);\n }\n const zoneName = zone.name;\n let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n if (offsetGuess === undefined) {\n offsetGuess = zone.offset(zoneOffsetTs);\n zoneOffsetGuessCache.set(zoneName, offsetGuess);\n }\n return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n const zone = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n }\n\n const loc = Locale.fromObject(opts);\n\n let ts, o;\n\n // assume we have the higher-order units\n if (!isUndefined(obj.year)) {\n for (const u of orderedUnits) {\n if (isUndefined(obj[u])) {\n obj[u] = defaultUnitValues[u];\n }\n }\n\n const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n const offsetProvis = guessOffsetForZone(zone);\n [ts, o] = objToTS(obj, offsetProvis, zone);\n } else {\n ts = Settings.now();\n }\n\n return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n const round = isUndefined(opts.round) ? true : opts.round,\n rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n format = (c, unit) => {\n c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n const formatter = end.loc.clone(opts).relFormatter(opts);\n return formatter.format(c, unit);\n },\n differ = (unit) => {\n if (opts.calendary) {\n if (!end.hasSame(start, unit)) {\n return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n } else return 0;\n } else {\n return end.diff(start, unit).get(unit);\n }\n };\n\n if (opts.unit) {\n return format(differ(opts.unit), opts.unit);\n }\n\n for (const unit of opts.units) {\n const count = differ(unit);\n if (Math.abs(count) >= 1) {\n return format(count, unit);\n }\n }\n return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n let opts = {},\n args;\n if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n opts = argList[argList.length - 1];\n args = Array.from(argList).slice(0, argList.length - 1);\n } else {\n args = Array.from(argList);\n }\n return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n /**\n * @access private\n */\n constructor(config) {\n const zone = config.zone || Settings.defaultZone;\n\n let invalid =\n config.invalid ||\n (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n (!zone.isValid ? unsupportedZone(zone) : null);\n /**\n * @access private\n */\n this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n let c = null,\n o = null;\n if (!invalid) {\n const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n if (unchanged) {\n [c, o] = [config.old.c, config.old.o];\n } else {\n // If an offset has been passed and we have not been called from\n // clone(), we can trust it and avoid the offset calculation.\n const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n c = tsToObj(this.ts, ot);\n invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n c = invalid ? null : c;\n o = invalid ? null : ot;\n }\n }\n\n /**\n * @access private\n */\n this._zone = zone;\n /**\n * @access private\n */\n this.loc = config.loc || Locale.create();\n /**\n * @access private\n */\n this.invalid = invalid;\n /**\n * @access private\n */\n this.weekData = null;\n /**\n * @access private\n */\n this.localWeekData = null;\n /**\n * @access private\n */\n this.c = c;\n /**\n * @access private\n */\n this.o = o;\n /**\n * @access private\n */\n this.isLuxonDateTime = true;\n }\n\n // CONSTRUCT\n\n /**\n * Create a DateTime for the current instant, in the system's time zone.\n *\n * Use Settings to override these default values if needed.\n * @example DateTime.now().toISO() //~> now in the ISO format\n * @return {DateTime}\n */\n static now() {\n return new DateTime({});\n }\n\n /**\n * Create a local DateTime\n * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month, 1-indexed\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @example DateTime.local() //~> now\n * @example DateTime.local({ zone: \"America/New_York\" }) //~> now, in US east coast time\n * @example DateTime.local(2017) //~> 2017-01-01T00:00:00\n * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00\n * @example DateTime.local(2017, 3, 12, { locale: \"fr\" }) //~> 2017-03-12T00:00:00, with a French locale\n * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00\n * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" }) //~> 2017-03-12T05:00:00, in UTC\n * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00\n * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10\n * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765\n * @return {DateTime}\n */\n static local() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime in UTC\n * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n * @param {number} [month=1] - The month, 1-indexed\n * @param {number} [day=1] - The day of the month\n * @param {number} [hour=0] - The hour of the day, in 24-hour time\n * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n * @param {Object} options - configuration options for the DateTime\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.utc() //~> now\n * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z\n * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z\n * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" }) //~> 2017-03-12T05:45:00Z with a French locale\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z\n * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n * @return {DateTime}\n */\n static utc() {\n const [opts, args] = lastOpts(arguments),\n [year, month, day, hour, minute, second, millisecond] = args;\n\n opts.zone = FixedOffsetZone.utcInstance;\n return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n }\n\n /**\n * Create a DateTime from a JavaScript Date object. Uses the default zone.\n * @param {Date} date - a JavaScript Date object\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @return {DateTime}\n */\n static fromJSDate(date, options = {}) {\n const ts = isDate(date) ? date.valueOf() : NaN;\n if (Number.isNaN(ts)) {\n return DateTime.invalid(\"invalid input\");\n }\n\n const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n return new DateTime({\n ts: ts,\n zone: zoneToUse,\n loc: Locale.fromObject(options),\n });\n }\n\n /**\n * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromMillis(milliseconds, options = {}) {\n if (!isNumber(milliseconds)) {\n throw new InvalidArgumentError(\n `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n );\n } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n return DateTime.invalid(\"Timestamp out of range\");\n } else {\n return new DateTime({\n ts: milliseconds,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n * @param {number} seconds - a number of seconds since 1970 UTC\n * @param {Object} options - configuration options for the DateTime\n * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromSeconds(seconds, options = {}) {\n if (!isNumber(seconds)) {\n throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n } else {\n return new DateTime({\n ts: seconds * 1000,\n zone: normalizeZone(options.zone, Settings.defaultZone),\n loc: Locale.fromObject(options),\n });\n }\n }\n\n /**\n * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n * @param {Object} obj - the object to create the DateTime from\n * @param {number} obj.year - a year, such as 1987\n * @param {number} obj.month - a month, 1-12\n * @param {number} obj.day - a day of the month, 1-31, depending on the month\n * @param {number} obj.ordinal - day of the year, 1-365 or 366\n * @param {number} obj.weekYear - an ISO week year\n * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n * @param {number} obj.localWeekYear - a week year, according to the locale\n * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n * @param {number} obj.hour - hour of the day, 0-23\n * @param {number} obj.minute - minute of the hour, 0-59\n * @param {number} obj.second - second of the minute, 0-59\n * @param {number} obj.millisecond - millisecond of the second, 0-999\n * @param {Object} opts - options for creating this DateTime\n * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n * @return {DateTime}\n */\n static fromObject(obj, opts = {}) {\n obj = obj || {};\n const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n if (!zoneToUse.isValid) {\n return DateTime.invalid(unsupportedZone(zoneToUse));\n }\n\n const loc = Locale.fromObject(opts);\n const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n const tsNow = Settings.now(),\n offsetProvis = !isUndefined(opts.specificOffset)\n ? opts.specificOffset\n : zoneToUse.offset(tsNow),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n // cases:\n // just a weekday -> this week's instance of that weekday, no worries\n // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n // (gregorian month or day) + ordinal -> error\n // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n // configure ourselves to deal with gregorian dates or week stuff\n let units,\n defaultValues,\n objNow = tsToObj(tsNow, offsetProvis);\n if (useWeekData) {\n units = orderedWeekUnits;\n defaultValues = defaultWeekUnitValues;\n objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n } else if (containsOrdinal) {\n units = orderedOrdinalUnits;\n defaultValues = defaultOrdinalUnitValues;\n objNow = gregorianToOrdinal(objNow);\n } else {\n units = orderedUnits;\n defaultValues = defaultUnitValues;\n }\n\n // set default values for missing stuff\n let foundFirst = false;\n for (const u of units) {\n const v = normalized[u];\n if (!isUndefined(v)) {\n foundFirst = true;\n } else if (foundFirst) {\n normalized[u] = defaultValues[u];\n } else {\n normalized[u] = objNow[u];\n }\n }\n\n // make sure the values we have are in range\n const higherOrderInvalid = useWeekData\n ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? hasInvalidOrdinalData(normalized)\n : hasInvalidGregorianData(normalized),\n invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n if (invalid) {\n return DateTime.invalid(invalid);\n }\n\n // compute the actual time\n const gregorian = useWeekData\n ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n : containsOrdinal\n ? ordinalToGregorian(normalized)\n : normalized,\n [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n inst = new DateTime({\n ts: tsFinal,\n zone: zoneToUse,\n o: offsetFinal,\n loc,\n });\n\n // gregorian data + weekday serves only to validate\n if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n return DateTime.invalid(\n \"mismatched weekday\",\n `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n );\n }\n\n if (!inst.isValid) {\n return DateTime.invalid(inst.invalid);\n }\n\n return inst;\n }\n\n /**\n * Create a DateTime from an ISO 8601 string\n * @param {string} text - the ISO string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n * @example DateTime.fromISO('2016-W05-4')\n * @return {DateTime}\n */\n static fromISO(text, opts = {}) {\n const [vals, parsedZone] = parseISODate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n }\n\n /**\n * Create a DateTime from an RFC 2822 string\n * @param {string} text - the RFC 2822 string\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n * @return {DateTime}\n */\n static fromRFC2822(text, opts = {}) {\n const [vals, parsedZone] = parseRFC2822Date(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n }\n\n /**\n * Create a DateTime from an HTTP header date\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @param {string} text - the HTTP header date\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994')\n * @return {DateTime}\n */\n static fromHTTP(text, opts = {}) {\n const [vals, parsedZone] = parseHTTPDate(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n }\n\n /**\n * Create a DateTime from an input string and format string.\n * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @return {DateTime}\n */\n static fromFormat(text, fmt, opts = {}) {\n if (isUndefined(text) || isUndefined(fmt)) {\n throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n }\n\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n }),\n [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n if (invalid) {\n return DateTime.invalid(invalid);\n } else {\n return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n }\n }\n\n /**\n * @deprecated use fromFormat instead\n */\n static fromString(text, fmt, opts = {}) {\n return DateTime.fromFormat(text, fmt, opts);\n }\n\n /**\n * Create a DateTime from a SQL date, time, or datetime\n * Defaults to en-US if no locale has been specified, regardless of the system's locale\n * @param {string} text - the string to parse\n * @param {Object} opts - options to affect the creation\n * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n * @example DateTime.fromSQL('2017-05-15')\n * @example DateTime.fromSQL('2017-05-15 09:12:34')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n * @example DateTime.fromSQL('09:12:34.342')\n * @return {DateTime}\n */\n static fromSQL(text, opts = {}) {\n const [vals, parsedZone] = parseSQL(text);\n return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n }\n\n /**\n * Create an invalid DateTime.\n * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n * @return {DateTime}\n */\n static invalid(reason, explanation = null) {\n if (!reason) {\n throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n }\n\n const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n if (Settings.throwOnInvalid) {\n throw new InvalidDateTimeError(invalid);\n } else {\n return new DateTime({ invalid });\n }\n }\n\n /**\n * Check if an object is an instance of DateTime. Works across context boundaries\n * @param {object} o\n * @return {boolean}\n */\n static isDateTime(o) {\n return (o && o.isLuxonDateTime) || false;\n }\n\n /**\n * Produce the format string for a set of options\n * @param formatOpts\n * @param localeOpts\n * @returns {string}\n */\n static parseFormatForOpts(formatOpts, localeOpts = {}) {\n const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n }\n\n /**\n * Produce the the fully expanded format token for the locale\n * Does NOT quote characters, so quoted tokens will not round trip correctly\n * @param fmt\n * @param localeOpts\n * @returns {string}\n */\n static expandFormat(fmt, localeOpts = {}) {\n const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n return expanded.map((t) => t.val).join(\"\");\n }\n\n static resetCache() {\n zoneOffsetTs = undefined;\n zoneOffsetGuessCache.clear();\n }\n\n // INFO\n\n /**\n * Get the value of unit.\n * @param {string} unit - a unit such as 'minute' or 'day'\n * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n * @return {number}\n */\n get(unit) {\n return this[unit];\n }\n\n /**\n * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n * * The DateTime was created by an operation on another invalid date\n * @type {boolean}\n */\n get isValid() {\n return this.invalid === null;\n }\n\n /**\n * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidReason() {\n return this.invalid ? this.invalid.reason : null;\n }\n\n /**\n * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n * @type {string}\n */\n get invalidExplanation() {\n return this.invalid ? this.invalid.explanation : null;\n }\n\n /**\n * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n *\n * @type {string}\n */\n get locale() {\n return this.isValid ? this.loc.locale : null;\n }\n\n /**\n * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n *\n * @type {string}\n */\n get numberingSystem() {\n return this.isValid ? this.loc.numberingSystem : null;\n }\n\n /**\n * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n *\n * @type {string}\n */\n get outputCalendar() {\n return this.isValid ? this.loc.outputCalendar : null;\n }\n\n /**\n * Get the time zone associated with this DateTime.\n * @type {Zone}\n */\n get zone() {\n return this._zone;\n }\n\n /**\n * Get the name of the time zone.\n * @type {string}\n */\n get zoneName() {\n return this.isValid ? this.zone.name : null;\n }\n\n /**\n * Get the year\n * @example DateTime.local(2017, 5, 25).year //=> 2017\n * @type {number}\n */\n get year() {\n return this.isValid ? this.c.year : NaN;\n }\n\n /**\n * Get the quarter\n * @example DateTime.local(2017, 5, 25).quarter //=> 2\n * @type {number}\n */\n get quarter() {\n return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n }\n\n /**\n * Get the month (1-12).\n * @example DateTime.local(2017, 5, 25).month //=> 5\n * @type {number}\n */\n get month() {\n return this.isValid ? this.c.month : NaN;\n }\n\n /**\n * Get the day of the month (1-30ish).\n * @example DateTime.local(2017, 5, 25).day //=> 25\n * @type {number}\n */\n get day() {\n return this.isValid ? this.c.day : NaN;\n }\n\n /**\n * Get the hour of the day (0-23).\n * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n * @type {number}\n */\n get hour() {\n return this.isValid ? this.c.hour : NaN;\n }\n\n /**\n * Get the minute of the hour (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n * @type {number}\n */\n get minute() {\n return this.isValid ? this.c.minute : NaN;\n }\n\n /**\n * Get the second of the minute (0-59).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n * @type {number}\n */\n get second() {\n return this.isValid ? this.c.second : NaN;\n }\n\n /**\n * Get the millisecond of the second (0-999).\n * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n * @type {number}\n */\n get millisecond() {\n return this.isValid ? this.c.millisecond : NaN;\n }\n\n /**\n * Get the week year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n * @type {number}\n */\n get weekYear() {\n return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the week number of the week year (1-52ish).\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n * @type {number}\n */\n get weekNumber() {\n return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the day of the week.\n * 1 is Monday and 7 is Sunday\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2014, 11, 31).weekday //=> 4\n * @type {number}\n */\n get weekday() {\n return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n }\n\n /**\n * Returns true if this date is on a weekend according to the locale, false otherwise\n * @returns {boolean}\n */\n get isWeekend() {\n return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n }\n\n /**\n * Get the day of the week according to the locale.\n * 1 is the first day of the week and 7 is the last day of the week.\n * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n * @returns {number}\n */\n get localWeekday() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n }\n\n /**\n * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n * because the week can start on different days of the week (see localWeekday) and because a different number of days\n * is required for a week to count as the first week of a year.\n * @returns {number}\n */\n get localWeekNumber() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n }\n\n /**\n * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n * differently, see localWeekNumber.\n * @returns {number}\n */\n get localWeekYear() {\n return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n }\n\n /**\n * Get the ordinal (meaning the day of the year)\n * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n * @type {number|DateTime}\n */\n get ordinal() {\n return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n }\n\n /**\n * Get the human readable short month name, such as 'Oct'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n * @type {string}\n */\n get monthShort() {\n return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable long month name, such as 'October'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).monthLong //=> October\n * @type {string}\n */\n get monthLong() {\n return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n }\n\n /**\n * Get the human readable short weekday, such as 'Mon'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n * @type {string}\n */\n get weekdayShort() {\n return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the human readable long weekday, such as 'Monday'.\n * Defaults to the system's locale if no locale has been specified\n * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n * @type {string}\n */\n get weekdayLong() {\n return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n }\n\n /**\n * Get the UTC offset of this DateTime in minutes\n * @example DateTime.now().offset //=> -240\n * @example DateTime.utc().offset //=> 0\n * @type {number}\n */\n get offset() {\n return this.isValid ? +this.o : NaN;\n }\n\n /**\n * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameShort() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"short\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n * Defaults to the system's locale if no locale has been specified\n * @type {string}\n */\n get offsetNameLong() {\n if (this.isValid) {\n return this.zone.offsetName(this.ts, {\n format: \"long\",\n locale: this.locale,\n });\n } else {\n return null;\n }\n }\n\n /**\n * Get whether this zone's offset ever changes, as in a DST.\n * @type {boolean}\n */\n get isOffsetFixed() {\n return this.isValid ? this.zone.isUniversal : null;\n }\n\n /**\n * Get whether the DateTime is in a DST.\n * @type {boolean}\n */\n get isInDST() {\n if (this.isOffsetFixed) {\n return false;\n } else {\n return (\n this.offset > this.set({ month: 1, day: 1 }).offset ||\n this.offset > this.set({ month: 5 }).offset\n );\n }\n }\n\n /**\n * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n * @returns {DateTime[]}\n */\n getPossibleOffsets() {\n if (!this.isValid || this.isOffsetFixed) {\n return [this];\n }\n const dayMs = 86400000;\n const minuteMs = 60000;\n const localTS = objToLocalTS(this.c);\n const oEarlier = this.zone.offset(localTS - dayMs);\n const oLater = this.zone.offset(localTS + dayMs);\n\n const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n const o2 = this.zone.offset(localTS - oLater * minuteMs);\n if (o1 === o2) {\n return [this];\n }\n const ts1 = localTS - o1 * minuteMs;\n const ts2 = localTS - o2 * minuteMs;\n const c1 = tsToObj(ts1, o1);\n const c2 = tsToObj(ts2, o2);\n if (\n c1.hour === c2.hour &&\n c1.minute === c2.minute &&\n c1.second === c2.second &&\n c1.millisecond === c2.millisecond\n ) {\n return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n }\n return [this];\n }\n\n /**\n * Returns true if this DateTime is in a leap year, false otherwise\n * @example DateTime.local(2016).isInLeapYear //=> true\n * @example DateTime.local(2013).isInLeapYear //=> false\n * @type {boolean}\n */\n get isInLeapYear() {\n return isLeapYear(this.year);\n }\n\n /**\n * Returns the number of days in this DateTime's month\n * @example DateTime.local(2016, 2).daysInMonth //=> 29\n * @example DateTime.local(2016, 3).daysInMonth //=> 31\n * @type {number}\n */\n get daysInMonth() {\n return daysInMonth(this.year, this.month);\n }\n\n /**\n * Returns the number of days in this DateTime's year\n * @example DateTime.local(2016).daysInYear //=> 366\n * @example DateTime.local(2013).daysInYear //=> 365\n * @type {number}\n */\n get daysInYear() {\n return this.isValid ? daysInYear(this.year) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's year\n * @see https://en.wikipedia.org/wiki/ISO_week_date\n * @example DateTime.local(2004).weeksInWeekYear //=> 53\n * @example DateTime.local(2013).weeksInWeekYear //=> 52\n * @type {number}\n */\n get weeksInWeekYear() {\n return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n }\n\n /**\n * Returns the number of weeks in this DateTime's local week year\n * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n * @type {number}\n */\n get weeksInLocalWeekYear() {\n return this.isValid\n ? weeksInWeekYear(\n this.localWeekYear,\n this.loc.getMinDaysInFirstWeek(),\n this.loc.getStartOfWeek()\n )\n : NaN;\n }\n\n /**\n * Returns the resolved Intl options for this DateTime.\n * This is useful in understanding the behavior of formatting methods\n * @param {Object} opts - the same options as toLocaleString\n * @return {Object}\n */\n resolvedLocaleOptions(opts = {}) {\n const { locale, numberingSystem, calendar } = Formatter.create(\n this.loc.clone(opts),\n opts\n ).resolvedOptions(this);\n return { locale, numberingSystem, outputCalendar: calendar };\n }\n\n // TRANSFORM\n\n /**\n * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n *\n * Equivalent to {@link DateTime#setZone}('utc')\n * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n * @param {Object} [opts={}] - options to pass to `setZone()`\n * @return {DateTime}\n */\n toUTC(offset = 0, opts = {}) {\n return this.setZone(FixedOffsetZone.instance(offset), opts);\n }\n\n /**\n * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n *\n * Equivalent to `setZone('local')`\n * @return {DateTime}\n */\n toLocal() {\n return this.setZone(Settings.defaultZone);\n }\n\n /**\n * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n *\n * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n * @param {Object} opts - options\n * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n * @return {DateTime}\n */\n setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n zone = normalizeZone(zone, Settings.defaultZone);\n if (zone.equals(this.zone)) {\n return this;\n } else if (!zone.isValid) {\n return DateTime.invalid(unsupportedZone(zone));\n } else {\n let newTS = this.ts;\n if (keepLocalTime || keepCalendarTime) {\n const offsetGuess = zone.offset(this.ts);\n const asObj = this.toObject();\n [newTS] = objToTS(asObj, offsetGuess, zone);\n }\n return clone(this, { ts: newTS, zone });\n }\n }\n\n /**\n * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n * @param {Object} properties - the properties to set\n * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n * @return {DateTime}\n */\n reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n return clone(this, { loc });\n }\n\n /**\n * \"Set\" the locale. Returns a newly-constructed DateTime.\n * Just a convenient alias for reconfigure({ locale })\n * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n * @return {DateTime}\n */\n setLocale(locale) {\n return this.reconfigure({ locale });\n }\n\n /**\n * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n *\n * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n * They cannot be mixed with ISO-week units like `weekday`.\n * @param {Object} values - a mapping of units to numbers\n * @example dt.set({ year: 2017 })\n * @example dt.set({ hour: 8, minute: 30 })\n * @example dt.set({ weekday: 5 })\n * @example dt.set({ year: 2005, ordinal: 234 })\n * @return {DateTime}\n */\n set(values) {\n if (!this.isValid) return this;\n\n const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n const settingWeekStuff =\n !isUndefined(normalized.weekYear) ||\n !isUndefined(normalized.weekNumber) ||\n !isUndefined(normalized.weekday),\n containsOrdinal = !isUndefined(normalized.ordinal),\n containsGregorYear = !isUndefined(normalized.year),\n containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n containsGregor = containsGregorYear || containsGregorMD,\n definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n throw new ConflictingSpecificationError(\n \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n );\n }\n\n if (containsGregorMD && containsOrdinal) {\n throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n }\n\n let mixed;\n if (settingWeekStuff) {\n mixed = weekToGregorian(\n { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n minDaysInFirstWeek,\n startOfWeek\n );\n } else if (!isUndefined(normalized.ordinal)) {\n mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n } else {\n mixed = { ...this.toObject(), ...normalized };\n\n // if we didn't set the day but we ended up on an overflow date,\n // use the last day of the right month\n if (isUndefined(normalized.day)) {\n mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n }\n }\n\n const [ts, o] = objToTS(mixed, this.o, this.zone);\n return clone(this, { ts, o });\n }\n\n /**\n * Add a period of time to this DateTime and return the resulting DateTime\n *\n * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n * @example DateTime.now().plus(123) //~> in 123 milliseconds\n * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n * @return {DateTime}\n */\n plus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration);\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * Subtract a period of time to this DateTime and return the resulting DateTime\n * See {@link DateTime#plus}\n * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n @return {DateTime}\n */\n minus(duration) {\n if (!this.isValid) return this;\n const dur = Duration.fromDurationLike(duration).negate();\n return clone(this, adjustTime(this, dur));\n }\n\n /**\n * \"Set\" this DateTime to the beginning of a unit of time.\n * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n * @return {DateTime}\n */\n startOf(unit, { useLocaleWeeks = false } = {}) {\n if (!this.isValid) return this;\n\n const o = {},\n normalizedUnit = Duration.normalizeUnit(unit);\n switch (normalizedUnit) {\n case \"years\":\n o.month = 1;\n // falls through\n case \"quarters\":\n case \"months\":\n o.day = 1;\n // falls through\n case \"weeks\":\n case \"days\":\n o.hour = 0;\n // falls through\n case \"hours\":\n o.minute = 0;\n // falls through\n case \"minutes\":\n o.second = 0;\n // falls through\n case \"seconds\":\n o.millisecond = 0;\n break;\n case \"milliseconds\":\n break;\n // no default, invalid units throw in normalizeUnit()\n }\n\n if (normalizedUnit === \"weeks\") {\n if (useLocaleWeeks) {\n const startOfWeek = this.loc.getStartOfWeek();\n const { weekday } = this;\n if (weekday < startOfWeek) {\n o.weekNumber = this.weekNumber - 1;\n }\n o.weekday = startOfWeek;\n } else {\n o.weekday = 1;\n }\n }\n\n if (normalizedUnit === \"quarters\") {\n const q = Math.ceil(this.month / 3);\n o.month = (q - 1) * 3 + 1;\n }\n\n return this.set(o);\n }\n\n /**\n * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n * @return {DateTime}\n */\n endOf(unit, opts) {\n return this.isValid\n ? this.plus({ [unit]: 1 })\n .startOf(unit, opts)\n .minus(1)\n : this;\n }\n\n // OUTPUT\n\n /**\n * Returns a string representation of this DateTime formatted according to the specified format string.\n * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n * @param {string} fmt - the format string\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n * @return {string}\n */\n toFormat(fmt, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n : INVALID;\n }\n\n /**\n * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n * of the DateTime in the assigned locale.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n * @param {Object} opts - opts to override the configuration options on this DateTime\n * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n * @return {string}\n */\n toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n : INVALID;\n }\n\n /**\n * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n * Defaults to the system's locale if no locale has been specified\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n * @example DateTime.now().toLocaleParts(); //=> [\n * //=> { type: 'day', value: '25' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'month', value: '05' },\n * //=> { type: 'literal', value: '/' },\n * //=> { type: 'year', value: '1982' }\n * //=> ]\n */\n toLocaleParts(opts = {}) {\n return this.isValid\n ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n : [];\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n * @return {string|null}\n */\n toISO({\n format = \"extended\",\n suppressSeconds = false,\n suppressMilliseconds = false,\n includeOffset = true,\n extendedZone = false,\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n const ext = format === \"extended\";\n\n let c = toISODate(this, ext, precision);\n if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n c += toISOTime(\n this,\n ext,\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n );\n return c;\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's date component\n * @param {Object} opts - options\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n * @return {string|null}\n */\n toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, format === \"extended\", normalizeUnit(precision));\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's week date\n * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n * @return {string}\n */\n toISOWeekDate() {\n return toTechFormat(this, \"kkkk-'W'WW-c\");\n }\n\n /**\n * Returns an ISO 8601-compliant string representation of this DateTime's time component\n * @param {Object} opts - options\n * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n * @param {string} [opts.format='extended'] - choose between the basic and extended format\n * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n * @return {string}\n */\n toISOTime({\n suppressMilliseconds = false,\n suppressSeconds = false,\n includeOffset = true,\n includePrefix = false,\n extendedZone = false,\n format = \"extended\",\n precision = \"milliseconds\",\n } = {}) {\n if (!this.isValid) {\n return null;\n }\n\n precision = normalizeUnit(precision);\n let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n return (\n c +\n toISOTime(\n this,\n format === \"extended\",\n suppressSeconds,\n suppressMilliseconds,\n includeOffset,\n extendedZone,\n precision\n )\n );\n }\n\n /**\n * Returns an RFC 2822-compatible string representation of this DateTime\n * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n * @return {string}\n */\n toRFC2822() {\n return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n * Specifically, the string conforms to RFC 1123.\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n * @return {string}\n */\n toHTTP() {\n return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Date\n * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n * @return {string|null}\n */\n toSQLDate() {\n if (!this.isValid) {\n return null;\n }\n return toISODate(this, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL Time\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n * @return {string}\n */\n toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n let fmt = \"HH:mm:ss.SSS\";\n\n if (includeZone || includeOffset) {\n if (includeOffsetSpace) {\n fmt += \" \";\n }\n if (includeZone) {\n fmt += \"z\";\n } else if (includeOffset) {\n fmt += \"ZZ\";\n }\n }\n\n return toTechFormat(this, fmt, true);\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n * @param {Object} opts - options\n * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n * @return {string}\n */\n toSQL(opts = {}) {\n if (!this.isValid) {\n return null;\n }\n\n return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for debugging\n * @return {string}\n */\n toString() {\n return this.isValid ? this.toISO() : INVALID;\n }\n\n /**\n * Returns a string representation of this DateTime appropriate for the REPL.\n * @return {string}\n */\n [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n if (this.isValid) {\n return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n } else {\n return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n }\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n * @return {number}\n */\n valueOf() {\n return this.toMillis();\n }\n\n /**\n * Returns the epoch milliseconds of this DateTime.\n * @return {number}\n */\n toMillis() {\n return this.isValid ? this.ts : NaN;\n }\n\n /**\n * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n * @return {number}\n */\n toSeconds() {\n return this.isValid ? this.ts / 1000 : NaN;\n }\n\n /**\n * Returns the epoch seconds (as a whole number) of this DateTime.\n * @return {number}\n */\n toUnixInteger() {\n return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n }\n\n /**\n * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n * @return {string}\n */\n toJSON() {\n return this.toISO();\n }\n\n /**\n * Returns a BSON serializable equivalent to this DateTime.\n * @return {Date}\n */\n toBSON() {\n return this.toJSDate();\n }\n\n /**\n * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n * @param opts - options for generating the object\n * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n * @return {Object}\n */\n toObject(opts = {}) {\n if (!this.isValid) return {};\n\n const base = { ...this.c };\n\n if (opts.includeConfig) {\n base.outputCalendar = this.outputCalendar;\n base.numberingSystem = this.loc.numberingSystem;\n base.locale = this.loc.locale;\n }\n return base;\n }\n\n /**\n * Returns a JavaScript Date equivalent to this DateTime.\n * @return {Date}\n */\n toJSDate() {\n return new Date(this.isValid ? this.ts : NaN);\n }\n\n // COMPARE\n\n /**\n * Return the difference between two DateTimes as a Duration.\n * @param {DateTime} otherDateTime - the DateTime to compare this one to\n * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @example\n * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n * i2 = DateTime.fromISO('1983-10-14T10:30');\n * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n * @return {Duration}\n */\n diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n if (!this.isValid || !otherDateTime.isValid) {\n return Duration.invalid(\"created by diffing an invalid DateTime\");\n }\n\n const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n const units = maybeArray(unit).map(Duration.normalizeUnit),\n otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n earlier = otherIsLater ? this : otherDateTime,\n later = otherIsLater ? otherDateTime : this,\n diffed = diff(earlier, later, units, durOpts);\n\n return otherIsLater ? diffed.negate() : diffed;\n }\n\n /**\n * Return the difference between this DateTime and right now.\n * See {@link DateTime#diff}\n * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n * @param {Object} opts - options that affect the creation of the Duration\n * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n * @return {Duration}\n */\n diffNow(unit = \"milliseconds\", opts = {}) {\n return this.diff(DateTime.now(), unit, opts);\n }\n\n /**\n * Return an Interval spanning between this DateTime and another DateTime\n * @param {DateTime} otherDateTime - the other end point of the Interval\n * @return {Interval|DateTime}\n */\n until(otherDateTime) {\n return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n }\n\n /**\n * Return whether this DateTime is in the same unit of time as another DateTime.\n * Higher-order units must also be identical for this function to return `true`.\n * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n * @param {DateTime} otherDateTime - the other DateTime\n * @param {string} unit - the unit of time to check sameness on\n * @param {Object} opts - options\n * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n * @return {boolean}\n */\n hasSame(otherDateTime, unit, opts) {\n if (!this.isValid) return false;\n\n const inputMs = otherDateTime.valueOf();\n const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n return (\n adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n );\n }\n\n /**\n * Equality check\n * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n * To compare just the millisecond values, use `+dt1 === +dt2`.\n * @param {DateTime} other - the other DateTime\n * @return {boolean}\n */\n equals(other) {\n return (\n this.isValid &&\n other.isValid &&\n this.valueOf() === other.valueOf() &&\n this.zone.equals(other.zone) &&\n this.loc.equals(other.loc)\n );\n }\n\n /**\n * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n */\n toRelative(options = {}) {\n if (!this.isValid) return null;\n const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n let unit = options.unit;\n if (Array.isArray(options.unit)) {\n units = options.unit;\n unit = undefined;\n }\n return diffRelative(base, this.plus(padding), {\n ...options,\n numeric: \"always\",\n units,\n unit,\n });\n }\n\n /**\n * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n * @param {Object} options - options that affect the output\n * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n * @param {string} options.locale - override the locale of this DateTime\n * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n */\n toRelativeCalendar(options = {}) {\n if (!this.isValid) return null;\n\n return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n ...options,\n numeric: \"auto\",\n units: [\"years\", \"months\", \"days\"],\n calendary: true,\n });\n }\n\n /**\n * Return the min of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n * @return {DateTime} the min DateTime, or undefined if called with no argument\n */\n static min(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n }\n\n /**\n * Return the max of several date times\n * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n * @return {DateTime} the max DateTime, or undefined if called with no argument\n */\n static max(...dateTimes) {\n if (!dateTimes.every(DateTime.isDateTime)) {\n throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n }\n return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n }\n\n // MISC\n\n /**\n * Explain how a string would be parsed by fromFormat()\n * @param {string} text - the string to parse\n * @param {string} fmt - the format the string is expected to be in (see description)\n * @param {Object} options - options taken by fromFormat()\n * @return {Object}\n */\n static fromFormatExplain(text, fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return explainFromTokens(localeToUse, text, fmt);\n }\n\n /**\n * @deprecated use fromFormatExplain instead\n */\n static fromStringExplain(text, fmt, options = {}) {\n return DateTime.fromFormatExplain(text, fmt, options);\n }\n\n /**\n * Build a parser for `fmt` using the given locale. This parser can be passed\n * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n * can be used to optimize cases where many dates need to be parsed in a\n * specific format.\n *\n * @param {String} fmt - the format the string is expected to be in (see\n * description)\n * @param {Object} options - options used to set locale and numberingSystem\n * for parser\n * @returns {TokenParser} - opaque object to be used\n */\n static buildFormatParser(fmt, options = {}) {\n const { locale = null, numberingSystem = null } = options,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n return new TokenParser(localeToUse, fmt);\n }\n\n /**\n * Create a DateTime from an input string and format parser.\n *\n * The format parser must have been created with the same locale as this call.\n *\n * @param {String} text - the string to parse\n * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n * @param {Object} opts - options taken by fromFormat()\n * @returns {DateTime}\n */\n static fromFormatParser(text, formatParser, opts = {}) {\n if (isUndefined(text) || isUndefined(formatParser)) {\n throw new InvalidArgumentError(\n \"fromFormatParser requires an input string and a format parser\"\n );\n }\n const { locale = null, numberingSystem = null } = opts,\n localeToUse = Locale.fromOpts({\n locale,\n numberingSystem,\n defaultToEN: true,\n });\n\n if (!localeToUse.equals(formatParser.locale)) {\n throw new InvalidArgumentError(\n `fromFormatParser called with a locale of ${localeToUse}, ` +\n `but the format parser was created for ${formatParser.locale}`\n );\n }\n\n const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n if (invalidReason) {\n return DateTime.invalid(invalidReason);\n } else {\n return parseDataToDateTime(\n result,\n zone,\n opts,\n `format ${formatParser.format}`,\n text,\n specificOffset\n );\n }\n }\n\n // FORMAT PRESETS\n\n /**\n * {@link DateTime#toLocaleString} format like 10/14/1983\n * @type {Object}\n */\n static get DATE_SHORT() {\n return Formats.DATE_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED() {\n return Formats.DATE_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n * @type {Object}\n */\n static get DATE_MED_WITH_WEEKDAY() {\n return Formats.DATE_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n * @type {Object}\n */\n static get DATE_FULL() {\n return Formats.DATE_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n * @type {Object}\n */\n static get DATE_HUGE() {\n return Formats.DATE_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_SIMPLE() {\n return Formats.TIME_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SECONDS() {\n return Formats.TIME_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_SHORT_OFFSET() {\n return Formats.TIME_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get TIME_WITH_LONG_OFFSET() {\n return Formats.TIME_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_SIMPLE() {\n return Formats.TIME_24_SIMPLE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SECONDS() {\n return Formats.TIME_24_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_SHORT_OFFSET() {\n return Formats.TIME_24_WITH_SHORT_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n * @type {Object}\n */\n static get TIME_24_WITH_LONG_OFFSET() {\n return Formats.TIME_24_WITH_LONG_OFFSET;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT() {\n return Formats.DATETIME_SHORT;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_SHORT_WITH_SECONDS() {\n return Formats.DATETIME_SHORT_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED() {\n return Formats.DATETIME_MED;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_SECONDS() {\n return Formats.DATETIME_MED_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_MED_WITH_WEEKDAY() {\n return Formats.DATETIME_MED_WITH_WEEKDAY;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL() {\n return Formats.DATETIME_FULL;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_FULL_WITH_SECONDS() {\n return Formats.DATETIME_FULL_WITH_SECONDS;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE() {\n return Formats.DATETIME_HUGE;\n }\n\n /**\n * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n * @type {Object}\n */\n static get DATETIME_HUGE_WITH_SECONDS() {\n return Formats.DATETIME_HUGE_WITH_SECONDS;\n }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n if (DateTime.isDateTime(dateTimeish)) {\n return dateTimeish;\n } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n return DateTime.fromJSDate(dateTimeish);\n } else if (dateTimeish && typeof dateTimeish === \"object\") {\n return DateTime.fromObject(dateTimeish);\n } else {\n throw new InvalidArgumentError(\n `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n );\n }\n}\n", "import DateTime from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Info from \"./info.js\";\nimport Zone from \"./zone.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport InvalidZone from \"./zones/invalidZone.js\";\nimport SystemZone from \"./zones/systemZone.js\";\nimport Settings from \"./settings.js\";\n\nconst VERSION = \"3.7.2\";\n\nexport {\n VERSION,\n DateTime,\n Duration,\n Interval,\n Info,\n Zone,\n FixedOffsetZone,\n IANAZone,\n InvalidZone,\n SystemZone,\n Settings,\n};\n", "import{purry as e}from\"./purry.js\";import{add as t}from\"./add.js\";import{addProp as n}from\"./addProp.js\";import{allPass as r}from\"./allPass.js\";import{anyPass as i}from\"./anyPass.js\";import{capitalize as a}from\"./capitalize.js\";import{ceil as o}from\"./ceil.js\";import{chunk as s}from\"./chunk.js\";import{clamp as c}from\"./clamp.js\";import{clone as l}from\"./clone.js\";import{concat as u}from\"./concat.js\";import{conditional as d}from\"./conditional.js\";import{constant as f}from\"./constant.js\";import{countBy as p}from\"./countBy.js\";import{debounce as m}from\"./debounce.js\";import{defaultTo as h}from\"./defaultTo.js\";import{pipe as g}from\"./pipe.js\";import{difference as _}from\"./difference.js\";import{differenceWith as v}from\"./differenceWith.js\";import{divide as y}from\"./divide.js\";import{doNothing as b}from\"./doNothing.js\";import{drop as x}from\"./drop.js\";import{hasAtLeast as S}from\"./hasAtLeast.js\";import{dropFirstBy as C}from\"./dropFirstBy.js\";import{dropLast as w}from\"./dropLast.js\";import{dropLastWhile as T}from\"./dropLastWhile.js\";import{dropWhile as E}from\"./dropWhile.js\";import{endsWith as D}from\"./endsWith.js\";import{entries as O}from\"./entries.js\";import{evolve as k}from\"./evolve.js\";import{filter as A}from\"./filter.js\";import{find as j}from\"./find.js\";import{findIndex as M}from\"./findIndex.js\";import{findLast as N}from\"./findLast.js\";import{findLastIndex as P}from\"./findLastIndex.js\";import{first as F}from\"./first.js\";import{firstBy as I}from\"./firstBy.js\";import{flat as L}from\"./flat.js\";import{flatMap as R}from\"./flatMap.js\";import{floor as z}from\"./floor.js\";import{forEach as B}from\"./forEach.js\";import{forEachObj as V}from\"./forEachObj.js\";import{fromEntries as H}from\"./fromEntries.js\";import{fromKeys as U}from\"./fromKeys.js\";import{funnel as W}from\"./funnel.js\";import{groupBy as G}from\"./groupBy.js\";import{groupByProp as K}from\"./groupByProp.js\";import{isDeepEqual as q}from\"./isDeepEqual.js\";import{hasSubObject as J}from\"./hasSubObject.js\";import{identity as Y}from\"./identity.js\";import{indexBy as X}from\"./indexBy.js\";import{intersection as Z}from\"./intersection.js\";import{intersectionWith as Q}from\"./intersectionWith.js\";import{invert as $}from\"./invert.js\";import{isArray as ee}from\"./isArray.js\";import{isBigInt as te}from\"./isBigInt.js\";import{isBoolean as ne}from\"./isBoolean.js\";import{isDate as re}from\"./isDate.js\";import{isDefined as ie}from\"./isDefined.js\";import{isEmpty as ae}from\"./isEmpty.js\";import{isEmptyish as oe}from\"./isEmptyish.js\";import{isError as se}from\"./isError.js\";import{isFunction as ce}from\"./isFunction.js\";import{isIncludedIn as le}from\"./isIncludedIn.js\";import{isNonNull as ue}from\"./isNonNull.js\";import{isNonNullish as de}from\"./isNonNullish.js\";import{isNot as fe}from\"./isNot.js\";import{isNullish as pe}from\"./isNullish.js\";import{isNumber as me}from\"./isNumber.js\";import{isObjectType as he}from\"./isObjectType.js\";import{isPlainObject as ge}from\"./isPlainObject.js\";import{isPromise as _e}from\"./isPromise.js\";import{isShallowEqual as ve}from\"./isShallowEqual.js\";import{isStrictEqual as ye}from\"./isStrictEqual.js\";import{isString as be}from\"./isString.js\";import{isSymbol as xe}from\"./isSymbol.js\";import{isTruthy as Se}from\"./isTruthy.js\";import{join as Ce}from\"./join.js\";import{keys as we}from\"./keys.js\";import{last as Te}from\"./last.js\";import{length as Ee}from\"./length.js\";import{map as De}from\"./map.js\";import{mapKeys as Oe}from\"./mapKeys.js\";import{mapToObj as ke}from\"./mapToObj.js\";import{mapValues as Ae}from\"./mapValues.js\";import{mapWithFeedback as je}from\"./mapWithFeedback.js\";import{sum as Me}from\"./sum.js\";import{mean as Ne}from\"./mean.js\";import{meanBy as Pe}from\"./meanBy.js\";import{median as Fe}from\"./median.js\";import{merge as Ie}from\"./merge.js\";import{mergeAll as Le}from\"./mergeAll.js\";import{mergeDeep as Re}from\"./mergeDeep.js\";import{multiply as ze}from\"./multiply.js\";import{nthBy as Be}from\"./nthBy.js\";import{objOf as Ve}from\"./objOf.js\";import{omit as He}from\"./omit.js\";import{omitBy as Ue}from\"./omitBy.js\";import{once as We}from\"./once.js\";import{only as Ge}from\"./only.js\";import{partialBind as Ke}from\"./partialBind.js\";import{partialLastBind as qe}from\"./partialLastBind.js\";import{partition as Je}from\"./partition.js\";import{pathOr as Ye}from\"./pathOr.js\";import{pick as Xe}from\"./pick.js\";import{pickBy as Ze}from\"./pickBy.js\";import{piped as Qe}from\"./piped.js\";import{product as $e}from\"./product.js\";import{prop as et}from\"./prop.js\";import{pullObject as tt}from\"./pullObject.js\";import{randomBigInt as nt}from\"./randomBigInt.js\";import{randomInteger as rt}from\"./randomInteger.js\";import{randomString as it}from\"./randomString.js\";import{range as at}from\"./range.js\";import{rankBy as ot}from\"./rankBy.js\";import{reduce as st}from\"./reduce.js\";import{reverse as ct}from\"./reverse.js\";import{round as lt}from\"./round.js\";import{sample as ut}from\"./sample.js\";import{set as dt}from\"./set.js\";import{setPath as ft}from\"./setPath.js\";import{shuffle as pt}from\"./shuffle.js\";import{sliceString as mt}from\"./sliceString.js\";import{sort as ht}from\"./sort.js\";import{sortBy as gt}from\"./sortBy.js\";import{sortedIndex as _t}from\"./sortedIndex.js\";import{sortedIndexBy as vt}from\"./sortedIndexBy.js\";import{sortedIndexWith as yt}from\"./sortedIndexWith.js\";import{sortedLastIndex as bt}from\"./sortedLastIndex.js\";import{sortedLastIndexBy as xt}from\"./sortedLastIndexBy.js\";import{splice as St}from\"./splice.js\";import{split as Ct}from\"./split.js\";import{splitAt as wt}from\"./splitAt.js\";import{splitWhen as Tt}from\"./splitWhen.js\";import{startsWith as Et}from\"./startsWith.js\";import{stringToPath as Dt}from\"./stringToPath.js\";import{subtract as Ot}from\"./subtract.js\";import{sumBy as kt}from\"./sumBy.js\";import{swapIndices as At}from\"./swapIndices.js\";import{swapProps as jt}from\"./swapProps.js\";import{take as Mt}from\"./take.js\";import{takeFirstBy as Nt}from\"./takeFirstBy.js\";import{takeLast as Pt}from\"./takeLast.js\";import{takeLastWhile as Ft}from\"./takeLastWhile.js\";import{takeWhile as It}from\"./takeWhile.js\";import{tap as Lt}from\"./tap.js\";import{times as Rt}from\"./times.js\";import{toCamelCase as zt}from\"./toCamelCase.js\";import{toKebabCase as Bt}from\"./toKebabCase.js\";import{toLowerCase as Vt}from\"./toLowerCase.js\";import{toSnakeCase as Ht}from\"./toSnakeCase.js\";import{toTitleCase as Ut}from\"./toTitleCase.js\";import{toUpperCase as Wt}from\"./toUpperCase.js\";import{truncate as Gt}from\"./truncate.js\";import{uncapitalize as Kt}from\"./uncapitalize.js\";import{unique as qt}from\"./unique.js\";import{uniqueBy as Jt}from\"./uniqueBy.js\";import{uniqueWith as Yt}from\"./uniqueWith.js\";import{values as Xt}from\"./values.js\";import{when as Zt}from\"./when.js\";import{zip as Qt}from\"./zip.js\";import{zipWith as $t}from\"./zipWith.js\";export{t as add,n as addProp,r as allPass,i as anyPass,a as capitalize,o as ceil,s as chunk,c as clamp,l as clone,u as concat,d as conditional,f as constant,p as countBy,m as debounce,h as defaultTo,_ as difference,v as differenceWith,y as divide,b as doNothing,x as drop,C as dropFirstBy,w as dropLast,T as dropLastWhile,E as dropWhile,D as endsWith,O as entries,k as evolve,A as filter,j as find,M as findIndex,N as findLast,P as findLastIndex,F as first,I as firstBy,L as flat,R as flatMap,z as floor,B as forEach,V as forEachObj,H as fromEntries,U as fromKeys,W as funnel,G as groupBy,K as groupByProp,S as hasAtLeast,J as hasSubObject,Y as identity,X as indexBy,Z as intersection,Q as intersectionWith,$ as invert,ee as isArray,te as isBigInt,ne as isBoolean,re as isDate,q as isDeepEqual,ie as isDefined,ae as isEmpty,oe as isEmptyish,se as isError,ce as isFunction,le as isIncludedIn,ue as isNonNull,de as isNonNullish,fe as isNot,pe as isNullish,me as isNumber,he as isObjectType,ge as isPlainObject,_e as isPromise,ve as isShallowEqual,ye as isStrictEqual,be as isString,xe as isSymbol,Se as isTruthy,Ce as join,we as keys,Te as last,Ee as length,De as map,Oe as mapKeys,ke as mapToObj,Ae as mapValues,je as mapWithFeedback,Ne as mean,Pe as meanBy,Fe as median,Ie as merge,Le as mergeAll,Re as mergeDeep,ze as multiply,Be as nthBy,Ve as objOf,He as omit,Ue as omitBy,We as once,Ge as only,Ke as partialBind,qe as partialLastBind,Je as partition,Ye as pathOr,Xe as pick,Ze as pickBy,g as pipe,Qe as piped,$e as product,et as prop,tt as pullObject,e as purry,nt as randomBigInt,rt as randomInteger,it as randomString,at as range,ot as rankBy,st as reduce,ct as reverse,lt as round,ut as sample,dt as set,ft as setPath,pt as shuffle,mt as sliceString,ht as sort,gt as sortBy,_t as sortedIndex,vt as sortedIndexBy,yt as sortedIndexWith,bt as sortedLastIndex,xt as sortedLastIndexBy,St as splice,Ct as split,wt as splitAt,Tt as splitWhen,Et as startsWith,Dt as stringToPath,Ot as subtract,Me as sum,kt as sumBy,At as swapIndices,jt as swapProps,Mt as take,Nt as takeFirstBy,Pt as takeLast,Ft as takeLastWhile,It as takeWhile,Lt as tap,Rt as times,zt as toCamelCase,Bt as toKebabCase,Vt as toLowerCase,Ht as toSnakeCase,Ut as toTitleCase,Wt as toUpperCase,Gt as truncate,Kt as uncapitalize,qt as unique,Jt as uniqueBy,Yt as uniqueWith,Xt as values,Zt as when,Qt as zip,$t as zipWith};", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { LazyEvaluator } from \"./types/LazyEvaluator\";\nimport type { StrictFunction } from \"./types/StrictFunction\";\n\n/**\n * Use this helper function to build the data last implementation together with\n * a lazy implementation. Use this when you need to build your own purrying\n * logic when you want to decide between dataFirst and dataLast on something\n * that isn't the number of arguments provided. This is useful for implementing\n * functions with optional or variadic arguments.\n */\nexport function lazyDataLastImpl(\n fn: StrictFunction,\n args: readonly unknown[],\n lazy?: (...args: any) => LazyEvaluator,\n // TODO: We can probably provide better typing to the return type...\n): unknown {\n // @ts-expect-error [ts2345] -- This error is accurate because we don't know\n // anything about `fn` so can't ensure that we are passing the correct\n // arguments to it, we just have to trust that the caller knows what they are\n // doing.\n const dataLast = (data: unknown): unknown => fn(data, ...args);\n\n return lazy === undefined\n ? dataLast\n : Object.assign(dataLast, { lazy, lazyArgs: args });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { lazyDataLastImpl } from \"./internal/lazyDataLastImpl\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport type { StrictFunction } from \"./internal/types/StrictFunction\";\n\n/**\n * Creates a function with `dataFirst` and `dataLast` signatures.\n *\n * `purry` is a dynamic function and it's not type safe. It should be wrapped by\n * a function that have proper typings. Refer to the example below for correct\n * usage.\n *\n * !IMPORTANT: functions that simply call `purry` and return the result (like\n * almost all functions in this library) should return `unknown` themselves if\n * an explicit return type is required. This is because we currently don't\n * provide a generic return type that is built from the input function, and\n * crafting one manually isn't worthwhile as we rely on function declaration\n * overloading to combine the types for dataFirst and dataLast invocations!\n *\n * @param fn - The function to purry.\n * @param args - The arguments.\n * @param lazy - A lazy version of the function to purry.\n * @signature purry(fn, args);\n * @example\n * function _findIndex(array, fn) {\n * for (let i = 0; i < array.length; i++) {\n * if (fn(array[i])) {\n * return i;\n * }\n * }\n * return -1;\n * }\n *\n * // data-first\n * function findIndex(array: T[], fn: (item: T) => boolean): number;\n *\n * // data-last\n * function findIndex(fn: (item: T) => boolean): (array: T[]) => number;\n *\n * function findIndex(...args: unknown[]) {\n * return purry(_findIndex, args);\n * }\n * @category Function\n */\nexport function purry(\n fn: StrictFunction,\n args: readonly unknown[],\n lazy?: (...args: any) => LazyEvaluator,\n): unknown {\n const diff = fn.length - args.length;\n if (diff === 0) {\n // @ts-expect-error [ts2345] -- This error is accurate because we don't know\n // anything about `fn` so can't ensure that we are passing the correct\n // arguments to it, we just have to trust that the caller knows what they\n // are doing.\n return fn(...args);\n }\n\n if (diff === 1) {\n return lazyDataLastImpl(fn, args, lazy);\n }\n\n throw new Error(\"Wrong number of arguments\");\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Adds two numbers.\n *\n * @param value - The number.\n * @param addend - The number to add to the value.\n * @signature\n * add(value, addend);\n * @example\n * add(10, 5) // => 15\n * add(10, -5) // => 5\n * @dataFirst\n * @category Number\n */\nexport function add(value: bigint, addend: bigint): bigint;\nexport function add(value: number, addend: number): number;\n\n/**\n * Adds two numbers.\n *\n * @param addend - The number to add to the value.\n * @signature\n * add(addend)(value);\n * @example\n * add(5)(10) // => 15\n * add(-5)(10) // => 5\n * map([1, 2, 3, 4], add(1)) // => [2, 3, 4, 5]\n * @dataLast\n * @category Number\n */\nexport function add(addend: bigint): (value: bigint) => bigint;\nexport function add(addend: number): (value: number) => number;\n\nexport function add(...args: readonly unknown[]): unknown {\n return purry(addImplementation, args);\n}\n\n// The implementation only uses `number` types, but that's just because it's\n// hard to tell typescript that both value and addend would be of the same type.\nconst addImplementation = (value: number, addend: number): number =>\n value + addend;\n", "import type { UpsertProp } from \"./internal/types/UpsertProp\";\nimport { purry } from \"./purry\";\n\n/**\n * Add a new property to an object.\n *\n * The function doesn't do any checks on the input object. If the property\n * already exists it will be overwritten, and the type of the new value is not\n * checked against the previous type.\n *\n * Use `set` to override values explicitly with better protections.\n *\n * @param obj - The target object.\n * @param prop - The property name.\n * @param value - The property value.\n * @signature\n * addProp(obj, prop, value)\n * @example\n * addProp({firstName: 'john'}, 'lastName', 'doe') // => {firstName: 'john', lastName: 'doe'}\n * @dataFirst\n * @category Object\n */\nexport function addProp(\n obj: T,\n prop: K,\n value: V,\n): UpsertProp;\n\n/**\n * Add a new property to an object.\n *\n * The function doesn't do any checks on the input object. If the property\n * already exists it will be overwritten, and the type of the new value is not\n * checked against the previous type.\n *\n * Use `set` to override values explicitly with better protections.\n *\n * @param prop - The property name.\n * @param value - The property value.\n * @signature\n * addProp(prop, value)(obj)\n * @example\n * addProp('lastName', 'doe')({firstName: 'john'}) // => {firstName: 'john', lastName: 'doe'}\n * @dataLast\n * @category Object\n */\nexport function addProp(\n prop: K,\n value: V,\n): (obj: T) => UpsertProp;\n\nexport function addProp(...args: readonly unknown[]): unknown {\n return purry(addPropImplementation, args);\n}\n\nconst addPropImplementation = (\n obj: T,\n prop: K,\n value: V,\n): UpsertProp =>\n // @ts-expect-error [ts2322] - Hard to type...\n ({ ...obj, [prop]: value });\n", "import { purry } from \"./purry\";\n\n/**\n * Determines whether all predicates returns true for the input data.\n *\n * @param data - The input data for predicates.\n * @param fns - The list of predicates.\n * @signature\n * allPass(data, fns)\n * @example\n * const isDivisibleBy3 = (x: number) => x % 3 === 0\n * const isDivisibleBy4 = (x: number) => x % 4 === 0\n * const fns = [isDivisibleBy3, isDivisibleBy4]\n * allPass(12, fns) // => true\n * allPass(8, fns) // => false\n * @dataFirst\n * @category Array\n */\nexport function allPass(\n data: T,\n fns: readonly ((data: T) => boolean)[],\n): boolean;\n\n/**\n * Determines whether all predicates returns true for the input data.\n *\n * @param fns - The list of predicates.\n * @signature\n * allPass(fns)(data)\n * @example\n * const isDivisibleBy3 = (x: number) => x % 3 === 0\n * const isDivisibleBy4 = (x: number) => x % 4 === 0\n * const fns = [isDivisibleBy3, isDivisibleBy4]\n * allPass(fns)(12) // => true\n * allPass(fns)(8) // => false\n * @dataLast\n * @category Array\n */\nexport function allPass(\n fns: readonly ((data: T) => boolean)[],\n): (data: T) => boolean;\n\nexport function allPass(...args: readonly unknown[]): unknown {\n return purry(allPassImplementation, args);\n}\n\nconst allPassImplementation = (\n data: T,\n fns: readonly ((data: T) => boolean)[],\n): boolean => fns.every((fn) => fn(data));\n", "import { purry } from \"./purry\";\n\n/**\n * Determines whether any predicate returns true for the input data.\n *\n * @param data - The input data for predicates.\n * @param fns - The list of predicates.\n * @signature\n * anyPass(data, fns)\n * @example\n * const isDivisibleBy3 = (x: number) => x % 3 === 0\n * const isDivisibleBy4 = (x: number) => x % 4 === 0\n * const fns = [isDivisibleBy3, isDivisibleBy4]\n * anyPass(8, fns) // => true\n * anyPass(11, fns) // => false\n * @dataFirst\n * @category Array\n */\nexport function anyPass(\n data: T,\n fns: readonly ((data: T) => boolean)[],\n): boolean;\n\n/**\n * Determines whether any predicate returns true for the input data.\n *\n * @param fns - The list of predicates.\n * @signature\n * anyPass(fns)(data)\n * @example\n * const isDivisibleBy3 = (x: number) => x % 3 === 0\n * const isDivisibleBy4 = (x: number) => x % 4 === 0\n * const fns = [isDivisibleBy3, isDivisibleBy4]\n * anyPass(fns)(8) // => true\n * anyPass(fns)(11) // => false\n * @dataLast\n * @category Array\n */\nexport function anyPass(\n fns: readonly ((data: T) => boolean)[],\n): (data: T) => boolean;\n\nexport function anyPass(...args: readonly unknown[]): unknown {\n return purry(anyPassImplementation, args);\n}\n\nconst anyPassImplementation = (\n data: T,\n fns: readonly ((data: T) => boolean)[],\n): boolean => fns.some((fn) => fn(data));\n", "import { purry } from \"./purry\";\n\n/**\n * Makes the first character of a string uppercase while leaving the rest\n * unchanged.\n *\n * It uses the built-in [`String.prototype.toUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase)\n * for the runtime and the built-in [`Capitalize`](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html#capitalizestringtype)\n * utility type for typing and thus shares their _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase#description)_.\n *\n * For display purposes, prefer using the CSS pseudo-element [`::first-letter`](https://developer.mozilla.org/en-US/docs/Web/CSS/::first-letter) to target\n * just the first letter of the word, and [`text-transform: uppercase`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-transform#uppercase)\n * to capitalize it. This transformation **is** locale-aware.\n *\n * For other case manipulations see: `toUpperCase`, `toLowerCase`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, `toSnakeCase`, and\n * `toTitleCase`.\n *\n * @param data - A string.\n * @signature\n * capitalize(data);\n * @example\n * capitalize(\"hello world\"); // \"Hello world\"\n * @dataFirst\n * @category String\n */\nexport function capitalize(data: T): Capitalize;\n\n/**\n * Makes the first character of a string uppercase while leaving the rest\n * unchanged.\n *\n * It uses the built-in [`String.prototype.toUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase)\n * for the runtime and the built-in [`Capitalize`](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html#capitalizestringtype)\n * utility type for typing and thus shares their _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase#description)_.\n *\n * For display purposes, prefer using the CSS pseudo-element [`::first-letter`](https://developer.mozilla.org/en-US/docs/Web/CSS/::first-letter) to target\n * just the first letter of the word, and [`text-transform: uppercase`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-transform#uppercase)\n * to capitalize it. This transformation **is** locale-aware.\n *\n * For other case manipulations see: `toUpperCase`, `toLowerCase`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, `toSnakeCase`, and\n * `toTitleCase`.\n *\n * @signature\n * capitalize()(data);\n * @example\n * pipe(\"hello world\", capitalize()); // \"Hello world\"\n * @dataLast\n * @category String\n */\nexport function capitalize(): (data: T) => Capitalize;\n\nexport function capitalize(...args: readonly unknown[]): unknown {\n return purry(capitalizeImplementation, args);\n}\n\nconst capitalizeImplementation = (data: T): Capitalize =>\n `${data[0]?.toUpperCase() ?? \"\"}${data.slice(1)}` as Capitalize;\n", "// ECMAScript doesn't support more decimal places than 15 anyways,\n// so supporting higher values doesn't make a lot of sense,\n// Considering Number.MAX_SAFE_INTEGER < 10**16, we can use -15\n// for the negative precision limit, too.\nconst MAX_PRECISION = 15;\n\nconst RADIX = 10;\n\nexport const withPrecision =\n (roundingFn: (value: number) => number) =>\n (value: number, precision: number): number => {\n if (precision === 0) {\n return roundingFn(value);\n }\n\n if (!Number.isInteger(precision)) {\n throw new TypeError(\n `precision must be an integer: ${precision.toString()}`,\n );\n }\n\n if (precision > MAX_PRECISION || precision < -MAX_PRECISION) {\n throw new RangeError(\"precision must be between -15 and 15\");\n }\n\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return roundingFn(value);\n }\n\n const shiftedValue = shiftDecimalPoint(value, precision);\n const rounded = roundingFn(shiftedValue);\n return shiftDecimalPoint(rounded, -precision);\n };\n\n/**\n * Shift a number's decimal point via scientific notation.\n *\n * This takes advantage of the fact that `Number` methods support scientific\n * (e-notation) string natively and avoids working with double-precision\n * floating-point numbers directly, working around their limitations\n * with representing decimal numbers.\n */\nfunction shiftDecimalPoint(value: number, shift: number): number {\n const asString = value.toString();\n const [n, exponent] = asString.split(\"e\");\n\n const shiftedExponent =\n (exponent === undefined ? 0 : Number.parseInt(exponent, RADIX)) + shift;\n\n const shiftedValueAsString = `${n!}e${shiftedExponent.toString()}`;\n\n return Number.parseFloat(shiftedValueAsString);\n}\n", "import { withPrecision } from \"./internal/withPrecision\";\nimport { purry } from \"./purry\";\n\n/**\n * Rounds up a given number to a specific precision.\n * If you'd like to round up to an integer (i.e. use this function with constant `precision === 0`),\n * use `Math.ceil` instead, as it won't incur the additional library overhead.\n *\n * @param value - The number to round up.\n * @param precision - The precision to round up to. Must be an integer between -15 and 15.\n * @signature\n * ceil(value, precision);\n * @example\n * ceil(123.9876, 3) // => 123.988\n * ceil(483.22243, 1) // => 483.3\n * ceil(8541, -1) // => 8550\n * ceil(456789, -3) // => 457000\n * @dataFirst\n * @category Number\n */\nexport function ceil(value: number, precision: number): number;\n\n/**\n * Rounds up a given number to a specific precision.\n * If you'd like to round up to an integer (i.e. use this function with constant `precision === 0`),\n * use `Math.ceil` instead, as it won't incur the additional library overhead.\n *\n * @param precision - The precision to round up to. Must be an integer between -15 and 15.\n * @signature\n * ceil(precision)(value);\n * @example\n * ceil(3)(123.9876) // => 123.988\n * ceil(1)(483.22243) // => 483.3\n * ceil(-1)(8541) // => 8550\n * ceil(-3)(456789) // => 457000\n * @dataLast\n * @category Number\n */\nexport function ceil(precision: number): (value: number) => number;\n\nexport function ceil(...args: readonly unknown[]): unknown {\n return purry(withPrecision(Math.ceil), args);\n}\n", "import type {\n IntRange,\n IsNever,\n IsNumericLiteral,\n LessThan,\n Subtract,\n ValueOf,\n} from \"type-fest\";\nimport type { IntRangeInclusive } from \"./internal/types/IntRangeInclusive\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { NTuple } from \"./internal/types/NTuple\";\nimport type { NonEmptyArray } from \"./internal/types/NonEmptyArray\";\nimport type { PartialArray } from \"./internal/types/PartialArray\";\nimport type { TupleParts } from \"./internal/types/TupleParts\";\nimport { purry } from \"./purry\";\n\n// This prevents typescript from failing on complex arrays and large chunks. It\n// allows the typing to remain useful even when very large chunks are needed,\n// without loosing fidelity on smaller ones. It was chosen by trial-and-error,\n// and given some more wiggle room because the complexity of the array also\n// plays a role in when typescript fails to recurse.\n// See the type tests for an example.\ntype MAX_LITERAL_SIZE = 350;\n\ntype Chunk<\n T extends IterableContainer,\n N extends number,\n> = T extends readonly []\n ? []\n : IsNumericLiteral extends true\n ? LessThan extends true\n ? never\n : LessThan extends true\n ? // The spread here is used as a form of \"Simplify\" for arrays; without\n // it our return type isn't useful.\n [...LiteralChunk]\n : GenericChunk\n : GenericChunk;\n\ntype LiteralChunk =\n | ChunkRestElement<\n // Our result will always have the prefix tuple chunked the same way, so\n // we compute it once here and send it to the main logic below\n ChunkFixedTuple, N>,\n TupleParts[\"item\"],\n TupleParts[\"suffix\"],\n N\n >\n // If both the prefix and suffix tuples are empty then our input is a simple\n // array of the form `Item[]`. This means it could also be empty, so we\n // need to add the empty output to our return type.\n | ([...TuplePrefix, ...TupleParts[\"suffix\"]] extends readonly []\n ? []\n : never);\n\n/**\n * This type **only** works if the input array `T` is a fixed tuple. For these\n * inputs the chunked output could be computed as literal finite tuples too.\n */\ntype ChunkFixedTuple<\n T,\n N extends number,\n // Important! Result is initialized with an empty array (and not `[[]]`)\n // because the result of `chunk` on an empty array is `[]` and not `[[]]`.\n Result = [],\n> = T extends readonly [infer Head, ...infer Rest]\n ? // We continue consuming the input tuple recursively item by item.\n ChunkFixedTuple<\n Rest,\n N,\n Result extends [\n ...infer Previous extends unknown[][],\n infer Current extends unknown[],\n ]\n ? // We take a look at the last chunk in the result, this is the\n // \"current\" chunk where new items would be added, all chunks before\n // it are already full.\n Current[\"length\"] extends N\n ? // The current chunk is full, create a new chunk and put Head in it.\n [...Previous, Current, [Head]]\n : // The current chunk is not full yet, so we add Head to it.\n [...Previous, [...Current, Head]]\n : // This would only happen on the first iteration, when result is\n // still empty. In this case we create the first chunk and put Head\n // in it.\n [[Head]]\n >\n : // We know T is a finite tuple, so the only case where we would reach this\n // is when T is empty, and in that case our results array contains the whole\n // input chunked by N.\n Result;\n\n/**\n * Here lies the main complexity of building the chunk type. It takes the prefix\n * chunks, the rest param item type, and the suffix (not chunked!) and it\n * creates all possible combinations of adding items to the prefix and suffix\n * for all possible scenarios for how many items the rest param \"represents\".\n */\ntype ChunkRestElement<\n PrefixChunks,\n Item,\n Suffix extends unknown[],\n N extends number,\n> =\n IsNever extends true\n ? // The rest param is never when there is no rest param, the whole array is\n // a finite tuple and is represented already by the prefix chunks. Suffix\n // is assumed to be empty in this case.\n PrefixChunks\n : PrefixChunks extends [\n ...infer PrefixFullChunks extends unknown[][],\n infer LastPrefixChunk extends unknown[],\n ]\n ? // When our prefix chunks are not empty it means we need to look at all\n // combinations of mixing the prefix, the suffix, and different counts\n // of the rest param until we cover all possible scenarios.\n | ValueOf<{\n // We want to iterate over all possible padding sizes we can add\n // to the last prefix chunk until we reach N\n // (`0..N-LastPrefixChunk.length`). We need to do this because\n // until the last prefix chunk is full, we need to consider the\n // suffix being part of it too...\n [Padding in IntRangeInclusive<\n 0,\n Subtract\n >]: [\n ...PrefixFullChunks,\n ...ChunkFixedTuple<\n // Create a new array that would **not** contain a rest param\n // (so it's finite) made of the last prefix chunk, padding\n // from the rest param, and the suffix.\n [...LastPrefixChunk, ...NTuple, ...Suffix],\n N\n >,\n ];\n }>\n // Additionally, we need to consider the case where the last prefix\n // chunk **is** full, and follow it with an array of chunks of the\n // rest param (and only them), and then followed by all possible\n // variations of the suffix chunks.\n | [\n ...PrefixFullChunks,\n [\n // Fully padded last prefix chunk\n ...LastPrefixChunk,\n ...NTuple>,\n ],\n ...NTuple[],\n ...SuffixChunk,\n ]\n : // When our prefix chunks are empty we only need to handle the suffix\n [...NTuple[], ...SuffixChunk];\n\n/**\n * This type assumes it takes a finite tuple that represents the suffix of our\n * input array. It builds all possible combinations of adding items to the\n * **head** of the suffix in order to pad the suffix until the last chunk is\n * full.\n */\ntype SuffixChunk<\n T extends unknown[],\n Item,\n N extends number,\n> = T extends readonly []\n ? // If we don't have a suffix we simply create a single chunk with all\n // possible non-empty sub-arrays of `Item` up to size `N`.\n [ValueOf<{ [K in IntRangeInclusive<1, N>]: NTuple }>]\n : ValueOf<{\n // When suffix isn't empty we pad the head of the suffix and compute it's\n // chunks for all possible padding sizes.\n [Padding in IntRange<0, N>]: ChunkFixedTuple<\n [...NTuple, ...T],\n N\n >;\n }>;\n\n/**\n * This is the legacy type used when we don't know what N is. We can only adjust\n * our output based on if we know for sure that the array is empty or not.\n */\ntype GenericChunk = T extends\n | readonly [...unknown[], unknown]\n | readonly [unknown, ...unknown[]]\n ? NonEmptyArray>\n : NonEmptyArray[];\n\n// TODO: Chunk was built before we handled optional elements correctly. It needs to be fixed to handle these correctly, specifically in regard to optional elements creating whole chunks that themselves need to be optional, but that their items themselves should not be optional, except the last chunk...\ntype TuplePrefix = [\n ...TupleParts[\"required\"],\n ...PartialArray[\"optional\"]>,\n];\n\n/**\n * Split an array into groups the length of `size`. If `array` can't be split evenly, the final chunk will be the remaining elements.\n *\n * @param array - The array.\n * @param size - The length of the chunk.\n * @signature\n * chunk(array, size)\n * @example\n * chunk(['a', 'b', 'c', 'd'], 2) // => [['a', 'b'], ['c', 'd']]\n * chunk(['a', 'b', 'c', 'd'], 3) // => [['a', 'b', 'c'], ['d']]\n * @dataFirst\n * @category Array\n */\nexport function chunk(\n array: T,\n size: N,\n): Chunk;\n\n/**\n * Split an array into groups the length of `size`. If `array` can't be split evenly, the final chunk will be the remaining elements.\n *\n * @param size - The length of the chunk.\n * @signature\n * chunk(size)(array)\n * @example\n * chunk(2)(['a', 'b', 'c', 'd']) // => [['a', 'b'], ['c', 'd']]\n * chunk(3)(['a', 'b', 'c', 'd']) // => [['a', 'b', 'c'], ['d']]\n * @dataLast\n * @category Array\n */\nexport function chunk(\n size: N,\n): (array: T) => Chunk;\n\nexport function chunk(...args: readonly unknown[]): unknown {\n return purry(chunkImplementation, args);\n}\n\nfunction chunkImplementation(data: readonly T[], size: number): T[][] {\n if (size < 1) {\n throw new RangeError(\n `chunk: A chunk size of '${size.toString()}' would result in an infinite array`,\n );\n }\n\n if (data.length === 0) {\n return [];\n }\n\n if (size >= data.length) {\n // Optimized for when there is only one chunk.\n return [[...data]];\n }\n\n const chunks = Math.ceil(data.length / size);\n\n // eslint-disable-next-line unicorn/no-new-array -- This is OK, a sparse array allows us to handle very large arrays more efficiently.\n const result = new Array(chunks);\n\n if (size === 1) {\n // Optimized for when we don't need slice.\n for (const [index, item] of data.entries()) {\n result[index] = [item];\n }\n } else {\n for (let index = 0; index < chunks; index += 1) {\n const start = index * size;\n result[index] = data.slice(start, start + size);\n }\n }\n\n return result;\n}\n", "import { purry } from \"./purry\";\n\ntype Limits = {\n readonly min?: number;\n readonly max?: number;\n};\n\n/**\n * Clamp the given value within the inclusive min and max bounds.\n *\n * @param value - The number.\n * @param limits - The bounds limits.\n * @signature\n * clamp(value, { min, max });\n * @example\n * clamp(10, { min: 20 }) // => 20\n * clamp(10, { max: 5 }) // => 5\n * clamp(10, { max: 20, min: 5 }) // => 10\n * @dataFirst\n * @category Number\n */\nexport function clamp(value: number, limits: Limits): number;\n\n/**\n * Clamp the given value within the inclusive min and max bounds.\n *\n * @param limits - The bounds limits.\n * @signature\n * clamp({ min, max })(value);\n * @example\n * clamp({ min: 20 })(10) // => 20\n * clamp({ max: 5 })(10) // => 5\n * clamp({ max: 20, min: 5 })(10) // => 10\n * @dataLast\n * @category Number\n */\nexport function clamp(limits: Limits): (value: number) => number;\n\nexport function clamp(...args: readonly unknown[]): unknown {\n return purry(clampImplementation, args);\n}\n\nconst clampImplementation = (value: number, { min, max }: Limits): number =>\n min !== undefined && value < min\n ? min\n : max !== undefined && value > max\n ? max\n : value;\n", "/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types --\n * The state needed to compute the clone is passed by reference via mutable\n * arrays.\n */\n\nimport { purry } from \"./purry\";\n\n/**\n * Creates a deep copy of the value. Supported types: [plain objects](#isPlainObject),\n * `Array`, `number`, `string`, `boolean`, `Date`, and `RegExp`. Functions are\n * assigned by reference rather than copied. Class instances or any other\n * built-in type that isn't mentioned above are not supported (but might\n * work).\n *\n * @param data - The object to clone.\n * @signature\n * clone(data)\n * @example\n * clone({foo: 'bar'}) // {foo: 'bar'}\n * @dataFirst\n * @category Object\n */\nexport function clone(data: T): T;\n\n/**\n * Creates a deep copy of the value. Supported types: [plain objects](#isPlainObject),\n * `Array`, `number`, `string`, `boolean`, `Date`, and `RegExp`. Functions are\n * assigned by reference rather than copied. Class instances or any other\n * built-in type that isn't mentioned above are not supported (but might\n * work).\n *\n * @signature\n * clone()(data)\n * @example\n * pipe({foo: 'bar'}, clone()) // {foo: 'bar'}\n * @dataLast\n * @category Object\n */\nexport function clone(): (data: T) => T;\n\nexport function clone(...args: readonly unknown[]): unknown {\n return purry(cloneImplementation, args);\n}\n\nfunction cloneImplementation(\n value: T,\n refFrom: unknown[] = [],\n refTo: unknown[] = [],\n): T {\n if (typeof value === \"function\") {\n // Functions aren't cloned, we return the same instance.\n return value;\n }\n\n if (typeof value !== \"object\" || value === null) {\n // Only objects are interesting when cloning, everything else can use\n // whatever JS does by default.\n return structuredClone(value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const prototype = Object.getPrototypeOf(value);\n if (\n !Array.isArray(value) &&\n // Keep this check in sync with the same check in the impl of\n // `isPlainObject`.\n prototype !== null &&\n prototype !== Object.prototype\n ) {\n // Our cloning logic is only designed for plain objects and arrays; other\n // object types (like `Date`, `RegExp`, `File`, and user-defined classes)\n // wouldn't clone properly. We fallback to the native cloning for them.\n return structuredClone(value);\n }\n\n // In order to support cyclic/self-referential structures, and to support\n // functions _within_ objects, we need to have our own cloning logic.\n\n // First we check if we've already cloned this value.\n const idx = refFrom.indexOf(value);\n if (idx !== -1) {\n return refTo[idx] as T;\n }\n // And if we haven't, we add it to our list of seen values so that it is kept\n // and clone the deep structure.\n refFrom.push(value);\n return Array.isArray(value)\n ? deepCloneArray(value, refFrom, refTo)\n : deepCloneObject(value, refFrom, refTo);\n}\n\nfunction deepCloneObject(\n value: T,\n refFrom: unknown[],\n refTo: unknown[],\n): T {\n const copiedValue: Record = {};\n\n // It's important to first push the cloned ref so that it's index is kept in\n // sync with the ref to the original value in refFrom.\n refTo.push(copiedValue);\n\n for (const [k, v] of Object.entries(value)) {\n copiedValue[k] = cloneImplementation(v, refFrom, refTo);\n }\n\n return copiedValue as T;\n}\n\nfunction deepCloneArray(\n value: T,\n refFrom: unknown[],\n refTo: unknown[],\n): T {\n const copiedValue: unknown[] = [];\n\n // It's important to first push the cloned ref so that it's index is kept in\n // sync with the ref to the original value in refFrom.\n refTo.push(copiedValue);\n\n for (const [index, item] of value.entries()) {\n copiedValue[index] = cloneImplementation(item, refFrom, refTo);\n }\n\n return copiedValue as unknown as T;\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n/**\n * Merge two or more arrays. This method does not change the existing arrays,\n * but instead returns a new array, even if the other array is empty.\n *\n * @param data - The first items, these would be at the beginning of the new\n * array.\n * @param other - The remaining items, these would be at the end of the new\n * array.\n * @returns A new array with the items of the first array followed by the items\n * of the second array.\n * @signature\n * concat(data, other);\n * @example\n * concat([1, 2, 3], ['a']) // [1, 2, 3, 'a']\n * @dataFirst\n * @category Array\n */\nexport function concat<\n T1 extends IterableContainer,\n T2 extends IterableContainer,\n>(data: T1, other: T2): [...T1, ...T2];\n\n/**\n * Merge two or more arrays. This method does not change the existing arrays,\n * but instead returns a new array, even if the other array is empty.\n *\n * @param other - The remaining items, these would be at the end of the new\n * array.\n * @returns A new array with the items of the first array followed by the items\n * of the second array.\n * @signature\n * concat(arr2)(arr1);\n * @example\n * concat(['a'])([1, 2, 3]) // [1, 2, 3, 'a']\n * @dataLast\n * @category Array\n */\nexport function concat(\n other: T2,\n): (data: T1) => [...T1, ...T2];\n\nexport function concat(...args: readonly unknown[]): unknown {\n return purry(concatImplementation, args);\n}\n\nconst concatImplementation = <\n T1 extends IterableContainer,\n T2 extends IterableContainer,\n>(\n arr1: T1,\n arr2: T2,\n): [...T1, ...T2] => [...arr1, ...arr2];\n", "/**\n * Utility for purrying functions based on a predicate for the first argument.\n *\n * This is useful for purrying functions with a variadic argument list.\n */\nexport function purryOn(\n isArg: (firstArg: unknown) => firstArg is T,\n implementation: (\n data: unknown,\n firstArg: T,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Function inference in typescript relies on `any` to work, it doesn't work with `unknown`\n ...args: any\n ) => unknown,\n args: readonly unknown[],\n): unknown {\n return isArg(args[0])\n ? // @ts-expect-error [ts2556] - This is a low-level function that assumes the function declaration and setup is correct and won't result in typing issues when called dynamically.\n (data: unknown) => implementation(data, ...args)\n : // @ts-expect-error [ts2556] - This is a low-level function that assumes the function declaration and setup is correct and won't result in typing issues when called dynamically.\n implementation(...args);\n}\n", "/* eslint-disable jsdoc/check-param-names, jsdoc/require-param --\n * We don't document each `case` param, instead we document the concept more\n * generally, but these eslint rules can't detect that.\n */\n\nimport { purryOn } from \"./internal/purryOn\";\nimport type { GuardType } from \"./internal/types/GuardType\";\n\ntype Case<\n In,\n Out,\n When extends (x: In) => boolean = (x: In) => boolean,\n> = readonly [when: When, then: (x: GuardType & In) => Out];\n\ntype DefaultCase = (x: In) => Out;\n\n/**\n * Executes a transformer function based on the first matching predicate,\n * functioning like a series of `if...else if...` statements. It sequentially\n * evaluates each case and, upon finding a truthy predicate, runs the\n * corresponding transformer, and returns, ignoring any further cases, even if\n * they would match.\n *\n * *NOTE*: Some type-predicates may fail to narrow the param type of their\n * transformer; in such cases wrap your type-predicate in an anonymous arrow\n * function: e.g., instead of\n * `conditional(..., [myTypePredicate, myTransformer], ...)`, use\n * `conditional(..., [($) => myTypePredicate($), myTransformer], ...)`.\n *\n * To add a a default, catch-all, case you can provide a single callback\n * function (instead of a 2-tuple) as the last case. This is equivalent to\n * adding a case with a trivial always-true predicate as it's condition (see\n * example).\n *\n * For simpler cases you should also consider using `when` instead.\n *\n * Due to TypeScript's inability to infer the result of negating a type-\n * predicate we can't refine the types used in subsequent cases based on\n * previous conditions. Using a `switch (true)` statement or ternary operators\n * is recommended for more precise type control when such type narrowing is\n * needed.\n *\n * !IMPORTANT! - Unlike similar implementations in Lodash and Ramda, the Remeda\n * implementation **doesn't** implicitly return `undefined` as a fallback when\n * when none of the cases match; and instead **throws** an exception in those\n * cases! You have to explicitly provide a default case, and can use\n * `constant(undefined)` as your last case to replicate that behavior.\n *\n * @param cases - A list of (up to 10) cases. Each case can be either:\n * - A 2-tuple consisting of a predicate (or type-predicate) and a transformer\n * function that processes the data if the predicate matches.\n * - A single callback function that acts as a default fallback case.\n * @returns The output of the matched transformer. If no cases match, an\n * exception is thrown. The return type is a union of the return types of all\n * provided transformers.\n * @signature\n * conditional(...cases)(data);\n * @example\n * const nameOrId = 3 as string | number | boolean;\n *\n * pipe(\n * nameOrId,\n * conditional(\n * [isString, (name) => `Hello ${name}`],\n * [isNumber, (id) => `Hello ID: ${id}`],\n * ),\n * ); //=> 'Hello ID: 3' (typed as `string`), can throw!.\n *\n * pipe(\n * nameOrId,\n * conditional(\n * [isString, (name) => `Hello ${name}`],\n * [isNumber, (id) => `Hello ID: ${id}`],\n * constant(undefined),\n * ),\n * ); //=> 'Hello ID: 3' (typed as `string | undefined`), won't throw.\n *\n * pipe(\n * nameOrId,\n * conditional(\n * [isString, (name) => `Hello ${name}`],\n * [isNumber, (id) => `Hello ID: ${id}`],\n * (something) => `Hello something (${JSON.stringify(something)})`,\n * ),\n * ); //=> 'Hello ID: 3' (typed as `string`), won't throw.\n * @dataLast\n * @category Function\n */\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Return0,\n Fallback = never,\n>(\n // TODO [>2]: TypeScript has problems inferring narrowed types within the case tuples, making it hard to work with this utility. Removing the tuple wrappers solves these issues without impacting the API too much. @see https://github.com/remeda/remeda/issues/847#issuecomment-3057371891\n case0: Case,\n fallback?: DefaultCase,\n): (data: T) => Return0 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n // TODO [>2]: Exclude previous guarded types from the next functions in the chain. Although this isn't a prefect solution, it's the common approach to compute the \"negation\" of a type-predicate, and would provide a more comfortable API for bigger chains for cases like discriminated unions. This TODO is at the first occurrence where it is relevant, but it should be applied to **all** subsequent overloads. p.s. don't forget to update the docs too!\n Fn1 extends (x: T) => boolean,\n Return0,\n Return1,\n Fallback = never,\n>(\n case0: Case,\n case1: Case,\n fallback?: DefaultCase,\n): (data: T) => Return0 | Return1 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Fallback = never,\n>(\n case0: Case,\n case1: Case,\n case2: Case,\n fallback?: DefaultCase,\n): (data: T) => Return0 | Return1 | Return2 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Fallback = never,\n>(\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n fallback?: DefaultCase,\n): (data: T) => Return0 | Return1 | Return2 | Return3 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Fallback = never,\n>(\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n fallback?: DefaultCase,\n): (data: T) => Return0 | Return1 | Return2 | Return3 | Return4 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Fallback = never,\n>(\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n fallback?: DefaultCase,\n): (\n data: T,\n) => Return0 | Return1 | Return2 | Return3 | Return4 | Return5 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Fn6 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Return6,\n Fallback = never,\n>(\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n case6: Case,\n fallback?: DefaultCase,\n): (\n data: T,\n) =>\n | Return0\n | Return1\n | Return2\n | Return3\n | Return4\n | Return5\n | Return6\n | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Fn6 extends (x: T) => boolean,\n Fn7 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Return6,\n Return7,\n Fallback = never,\n>(\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n case6: Case,\n case7: Case,\n fallback?: DefaultCase,\n): (\n data: T,\n) =>\n | Return0\n | Return1\n | Return2\n | Return3\n | Return4\n | Return5\n | Return6\n | Return7\n | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Fn6 extends (x: T) => boolean,\n Fn7 extends (x: T) => boolean,\n Fn8 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Return6,\n Return7,\n Return8,\n Fallback = never,\n>(\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n case6: Case,\n case7: Case,\n case8: Case,\n fallback?: DefaultCase,\n): (\n data: T,\n) =>\n | Return0\n | Return1\n | Return2\n | Return3\n | Return4\n | Return5\n | Return6\n | Return7\n | Return8\n | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Fn6 extends (x: T) => boolean,\n Fn7 extends (x: T) => boolean,\n Fn8 extends (x: T) => boolean,\n Fn9 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Return6,\n Return7,\n Return8,\n Return9,\n Fallback = never,\n>(\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n case6: Case,\n case7: Case,\n case8: Case,\n case9: Case,\n fallback?: DefaultCase,\n): (\n data: T,\n) =>\n | Return0\n | Return1\n | Return2\n | Return3\n | Return4\n | Return5\n | Return6\n | Return7\n | Return8\n | Return9\n | Fallback;\n\n/**\n * Executes a transformer function based on the first matching predicate,\n * functioning like a series of `if...else if...` statements. It sequentially\n * evaluates each case and, upon finding a truthy predicate, runs the\n * corresponding transformer, and returns, ignoring any further cases, even if\n * they would match.\n *\n * *NOTE*: Some type-predicates may fail to narrow the param type of their\n * transformer; in such cases wrap your type-predicate in an anonymous arrow\n * function: e.g., instead of\n * `conditional(..., [myTypePredicate, myTransformer], ...)`, use\n * `conditional(..., [($) => myTypePredicate($), myTransformer], ...)`.\n *\n * To add a a default, catch-all, case you can provide a single callback\n * function (instead of a 2-tuple) as the last case. This is equivalent to\n * adding a case with a trivial always-true predicate as it's condition (see\n * example).\n *\n * For simpler cases you should also consider using `when` instead.\n *\n * Due to TypeScript's inability to infer the result of negating a type-\n * predicate we can't refine the types used in subsequent cases based on\n * previous conditions. Using a `switch (true)` statement or ternary operators\n * is recommended for more precise type control when such type narrowing is\n * needed.\n *\n * !IMPORTANT! - Unlike similar implementations in Lodash and Ramda, the Remeda\n * implementation **doesn't** implicitly return `undefined` as a fallback when\n * when none of the cases match; and instead **throws** an exception in those\n * cases! You have to explicitly provide a default case, and can use\n * `constant(undefined)` as your last case to replicate that behavior.\n *\n * @param data - The input data to be evaluated against the provided cases.\n * @param cases - A list of (up to 10) cases. Each case can be either:\n * - A 2-tuple consisting of a predicate (or type-predicate) and a transformer\n * function that processes the data if the predicate matches.\n * - A single callback function that acts as a default fallback case.\n * @returns The output of the matched transformer. If no cases match, an\n * exception is thrown. The return type is a union of the return types of all\n * provided transformers.\n * @signature\n * conditional(data, ...cases);\n * @example\n * const nameOrId = 3 as string | number | boolean;\n *\n * conditional(\n * nameOrId,\n * [isString, (name) => `Hello ${name}`],\n * [isNumber, (id) => `Hello ID: ${id}`],\n * ); //=> 'Hello ID: 3' (typed as `string`), can throw!.\n *\n * conditional(\n * nameOrId,\n * [isString, (name) => `Hello ${name}`],\n * [isNumber, (id) => `Hello ID: ${id}`],\n * constant(undefined),\n * ); //=> 'Hello ID: 3' (typed as `string | undefined`), won't throw.\n *\n * conditional(\n * nameOrId,\n * [isString, (name) => `Hello ${name}`],\n * [isNumber, (id) => `Hello ID: ${id}`],\n * (something) => `Hello something (${JSON.stringify(something)})`,\n * ); //=> 'Hello ID: 3' (typed as `string`), won't throw.\n * @dataFirst\n * @category Function\n */\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Return0,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n fallback?: DefaultCase,\n): Return0 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Return0,\n Return1,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n case1: Case,\n fallback?: DefaultCase,\n): Return0 | Return1 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n case1: Case,\n case2: Case,\n fallback?: DefaultCase,\n): Return0 | Return1 | Return2 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n fallback?: DefaultCase,\n): Return0 | Return1 | Return2 | Return3 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n fallback?: DefaultCase,\n): Return0 | Return1 | Return2 | Return3 | Return4 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n fallback?: DefaultCase,\n): Return0 | Return1 | Return2 | Return3 | Return4 | Return5 | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Fn6 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Return6,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n case6: Case,\n fallback?: DefaultCase,\n):\n | Return0\n | Return1\n | Return2\n | Return3\n | Return4\n | Return5\n | Return6\n | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Fn6 extends (x: T) => boolean,\n Fn7 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Return6,\n Return7,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n case6: Case,\n case7: Case,\n fallback?: DefaultCase,\n):\n | Return0\n | Return1\n | Return2\n | Return3\n | Return4\n | Return5\n | Return6\n | Return7\n | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Fn6 extends (x: T) => boolean,\n Fn7 extends (x: T) => boolean,\n Fn8 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Return6,\n Return7,\n Return8,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n case6: Case,\n case7: Case,\n case8: Case,\n fallback?: DefaultCase,\n):\n | Return0\n | Return1\n | Return2\n | Return3\n | Return4\n | Return5\n | Return6\n | Return7\n | Return8\n | Fallback;\n\nexport function conditional<\n T,\n Fn0 extends (x: T) => boolean,\n Fn1 extends (x: T) => boolean,\n Fn2 extends (x: T) => boolean,\n Fn3 extends (x: T) => boolean,\n Fn4 extends (x: T) => boolean,\n Fn5 extends (x: T) => boolean,\n Fn6 extends (x: T) => boolean,\n Fn7 extends (x: T) => boolean,\n Fn8 extends (x: T) => boolean,\n Fn9 extends (x: T) => boolean,\n Return0,\n Return1,\n Return2,\n Return3,\n Return4,\n Return5,\n Return6,\n Return7,\n Return8,\n Return9,\n Fallback = never,\n>(\n data: T,\n case0: Case,\n case1: Case,\n case2: Case,\n case3: Case,\n case4: Case,\n case5: Case,\n case6: Case,\n case7: Case,\n case8: Case,\n case9: Case,\n fallback?: DefaultCase,\n):\n | Return0\n | Return1\n | Return2\n | Return3\n | Return4\n | Return5\n | Return6\n | Return7\n | Return8\n | Return9\n | Fallback;\n\nexport function conditional(...args: readonly unknown[]): unknown {\n return purryOn(isCase, conditionalImplementation, args);\n}\n\nfunction conditionalImplementation(\n data: In,\n ...cases: readonly (Case | DefaultCase)[]\n): Out {\n for (const current of cases) {\n if (typeof current === \"function\") {\n return current(data);\n }\n\n const [when, then] = current;\n if (when(data)) {\n return then(data);\n }\n }\n\n // TODO [>2]: When we built this function originally we didn't want to have to always return `undefined` and force users to always have to handle that case even when they knew it would never happen. In hindsight that was wrong and we can support this at the type-level without throwing. If users want to throw they can always have an explicit fallback that does that (and we might add a throw utility in v3 too!).\n throw new Error(\"conditional: data failed for all cases\");\n}\n\nfunction isCase(maybeCase: unknown): maybeCase is Case {\n if (!Array.isArray(maybeCase)) {\n return false;\n }\n\n const [when, then, ...rest] = maybeCase as readonly unknown[];\n return (\n typeof when === \"function\" &&\n when.length <= 1 &&\n typeof then === \"function\" &&\n then.length <= 1 &&\n rest.length === 0\n );\n}\n", "/**\n * A function that takes any arguments and returns the provided `value` on every\n * invocation. This is useful to provide trivial implementations for APIs or in\n * combination with a ternary or other conditional execution to allow to short-\n * circuit more complex implementations for a specific case.\n *\n * Notice that this is a dataLast impl where the function needs to be invoked\n * to get the \"do nothing\" function.\n *\n * See also:\n * `doNothing` - A function that doesn't return anything.\n * `identity` - A function that returns the first argument it receives.\n *\n * @param value - The constant value that would be returned on every invocation.\n * The value is not copied/cloned on every invocation so care should be taken\n * with mutable objects (like arrays, objects, Maps, etc...).\n * @signature\n * constant(value);\n * @example\n * map([1, 2, 3], constant('a')); // => ['a', 'a', 'a']\n * map(\n * [1, 2, 3],\n * isDemoMode ? add(1) : constant(0),\n * ); // => [2, 3, 4] or [0, 0, 0]\n * @dataLast\n * @category Function\n */\nexport function constant(\n value: T,\n): // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- There is no other way to make typescript infer the function arguments \"backwards\" in data-last invocations without the Args type parameter. @see: https://github.com/typescript-eslint/typescript-eslint/issues/9887\n(...args: Args) => T {\n return () => value;\n}\n", "import type { BoundedPartial } from \"./internal/types/BoundedPartial\";\nimport { purry } from \"./purry\";\n\n/**\n * Categorize and count elements in an array using a defined callback function.\n * The callback function is applied to each element in the array to determine\n * its category and then counts how many elements fall into each category.\n *\n * @param data - The array.\n * @param categorizationFn - The categorization function.\n * @signature\n * countBy(data, categorizationFn)\n * @example\n * countBy(\n * [\"a\", \"b\", \"c\", \"B\", \"A\", \"a\"],\n * toLowerCase()\n * ); //=> { a: 3, b: 2, c: 1 }\n * @dataFirst\n * @category Array\n */\nexport function countBy(\n data: readonly T[],\n categorizationFn: (\n value: T,\n index: number,\n data: readonly T[],\n ) => K | undefined,\n): BoundedPartial>;\n\n/**\n * Categorize and count elements in an array using a defined callback function.\n * The callback function is applied to each element in the array to determine\n * its category and then counts how many elements fall into each category.\n *\n * @param categorizationFn - The categorization function.\n * @signature\n * countBy(categorizationFn)(data)\n * @example\n * pipe(\n * [\"a\", \"b\", \"c\", \"B\", \"A\", \"a\"],\n * countBy(toLowerCase()),\n * ); //=> { a: 3, b: 2, c: 1 }\n * @dataLast\n * @category Array\n */\nexport function countBy(\n categorizationFn: (\n value: T,\n index: number,\n data: readonly T[],\n ) => K | undefined,\n): (data: readonly T[]) => BoundedPartial>;\n\nexport function countBy(...args: readonly unknown[]): unknown {\n return purry(countByImplementation, args);\n}\n\nconst countByImplementation = (\n data: readonly T[],\n categorizationFn: (\n value: T,\n index: number,\n data: readonly T[],\n ) => PropertyKey | undefined,\n): BoundedPartial> => {\n const out = new Map();\n\n for (const [index, item] of data.entries()) {\n const category = categorizationFn(item, index, data);\n if (category !== undefined) {\n const count = out.get(category);\n if (count === undefined) {\n out.set(category, 1);\n } else {\n out.set(category, count + 1);\n }\n }\n }\n\n return Object.fromEntries(out);\n};\n", "import type { StrictFunction } from \"./internal/types/StrictFunction\";\n\ntype Debouncer = {\n /**\n * Invoke the debounced function.\n *\n * @param args - Same as the args for the debounced function.\n * @returns The last computed value of the debounced function with the\n * latest args provided to it. If `timing` does not include `leading` then the\n * the function would return `undefined` until the first cool-down period is\n * over, otherwise the function would always return the return type of the\n * debounced function.\n */\n readonly call: (\n ...args: Parameters\n ) => ReturnType | (true extends IsNullable ? undefined : never);\n\n /**\n * Cancels any debounced functions without calling them, effectively resetting\n * the debouncer to the same state it is when initially created.\n */\n readonly cancel: () => void;\n\n /**\n * Similar to `cancel`, but would also trigger the `trailing` invocation if\n * the debouncer would run one at the end of the cool-down period.\n */\n readonly flush: () => ReturnType | undefined;\n\n /**\n * Is `true` when there is an active cool-down period currently debouncing\n * invocations.\n */\n readonly isPending: boolean;\n\n /**\n * The last computed value of the debounced function.\n */\n readonly cachedValue: ReturnType | undefined;\n};\n\ntype DebounceOptions = {\n readonly waitMs?: number;\n readonly maxWaitMs?: number;\n};\n\n/**\n * Wraps `func` with a debouncer object that \"debounces\" (delays) invocations of the function during a defined cool-down period (`waitMs`). It can be configured to invoke the function either at the start of the cool-down period, the end of it, or at both ends (`timing`).\n * It can also be configured to allow invocations during the cool-down period (`maxWaitMs`).\n * It stores the latest call's arguments so they could be used at the end of the cool-down period when invoking `func` (if configured to invoke the function at the end of the cool-down period).\n * It stores the value returned by `func` whenever its invoked. This value is returned on every call, and is accessible via the `cachedValue` property of the debouncer. Its important to note that the value might be different from the value that would be returned from running `func` with the current arguments as it is a cached value from a previous invocation.\n * **Important**: The cool-down period defines the minimum between two invocations, and not the maximum. The period will be **extended** each time a call is made until a full cool-down period has elapsed without any additional calls.\n *\n *! **DEPRECATED**: This implementation of debounce is known to have issues and might not behave as expected. It should be replaced with the `funnel` utility instead. The test file [funnel.remeda-debounce.test.ts](https://github.com/remeda/remeda/blob/main/packages/remeda/src/funnel.remeda-debounce.test.ts) offers a reference implementation that replicates `debounce` via `funnel`!\n *\n * @param func - The function to debounce, the returned `call` function will have\n * the exact same signature.\n * @param options - An object allowing further customization of the debouncer:\n * - `timing?: 'leading' | 'trailing' |'both'`. The default is `'trailing'`.\n * `leading` would result in the function being invoked at the start of the\n * cool-down period; `trailing` would result in the function being invoked at\n * the end of the cool-down period (using the args from the last call to the\n * debouncer). When `both` is selected the `trailing` invocation would only\n * take place if there were more than one call to the debouncer during the\n * cool-down period. **DEFAULT: 'trailing'**\n * - `waitMs?: number`. The length of the cool-down period in milliseconds. The\n * debouncer would wait until this amount of time has passed without **any**\n * additional calls to the debouncer before triggering the end-of-cool-down-\n * period event. When this happens, the function would be invoked (if `timing`\n * isn't `'leading'`) and the debouncer state would be reset. **DEFAULT: 0**\n * - `maxWaitMs?: number`. The length of time since a debounced call (a call\n * that the debouncer prevented from being invoked) was made until it would be\n * invoked. Because the debouncer can be continually triggered and thus never\n * reach the end of the cool-down period, this allows the function to still\n * be invoked occasionally. IMPORTANT: This param is ignored when `timing` is\n * `'leading'`.\n * @returns A debouncer object. The main function is `call`. In addition to it\n * the debouncer comes with the following additional functions and properties:\n * - `cancel` method to cancel delayed `func` invocations\n * - `flush` method to end the cool-down period immediately.\n * - `cachedValue` the latest return value of an invocation (if one occurred).\n * - `isPending` flag to check if there is an inflight cool-down window.\n * @signature\n * debounce(func, options);\n * @example\n * const debouncer = debounce(identity(), { timing: 'trailing', waitMs: 1000 });\n * const result1 = debouncer.call(1); // => undefined\n * const result2 = debouncer.call(2); // => undefined\n * // after 1 second\n * const result3 = debouncer.call(3); // => 2\n * // after 1 second\n * debouncer.cachedValue; // => 3\n * @dataFirst\n * @category Function\n * @deprecated This implementation of debounce is known to have issues and might\n * not behave as expected. It should be replaced with the `funnel` utility\n * instead. The test file `funnel.remeda-debounce.test.ts` offers a reference\n * implementation that replicates `debounce` via `funnel`.\n * @see https://css-tricks.com/debouncing-throttling-explained-examples/\n */\nexport function debounce(\n func: F,\n options: DebounceOptions & { readonly timing?: \"trailing\" },\n): Debouncer;\nexport function debounce(\n func: F,\n options:\n | (DebounceOptions & { readonly timing: \"both\" })\n | (Omit & { readonly timing: \"leading\" }),\n): Debouncer;\n\nexport function debounce(\n func: F,\n {\n waitMs,\n timing = \"trailing\",\n maxWaitMs,\n }: DebounceOptions & {\n readonly timing?: \"both\" | \"leading\" | \"trailing\";\n },\n): Debouncer {\n if (maxWaitMs !== undefined && waitMs !== undefined && maxWaitMs < waitMs) {\n throw new Error(\n `debounce: maxWaitMs (${maxWaitMs.toString()}) cannot be less than waitMs (${waitMs.toString()})`,\n );\n }\n\n // All these are part of the debouncer runtime state:\n\n // The timeout is the main object we use to tell if there's an active cool-\n // down period or not.\n let coolDownTimeoutId: ReturnType | undefined;\n\n // We use an additional timeout to track how long the last debounced call is\n // waiting.\n let maxWaitTimeoutId: ReturnType | undefined;\n\n // For 'trailing' invocations we need to keep the args around until we\n // actually invoke the function.\n let latestCallArgs: Parameters | undefined;\n\n // To make any value of the debounced function we need to be able to return a\n // value. For any invocation except the first one when 'leading' is enabled we\n // will return this cached value.\n let result: ReturnType | undefined;\n\n const handleInvoke = (): void => {\n if (maxWaitTimeoutId !== undefined) {\n // We are invoking the function so the wait is over...\n const timeoutId = maxWaitTimeoutId;\n maxWaitTimeoutId = undefined;\n clearTimeout(timeoutId);\n }\n\n /* v8 ignore if -- This protects us against changes to the logic, there is no known flow we can simulate to reach this condition. It can only happen if a previous timeout isn't cleared (or faces a race condition clearing). @preserve */\n if (latestCallArgs === undefined) {\n // If you see this error pop up when using this function please report\n // it on the Remeda github page!\n throw new Error(\n \"REMEDA[debounce]: latestCallArgs was unexpectedly undefined.\",\n );\n }\n\n const args = latestCallArgs;\n // Make sure the args aren't accidentally used again, this is mainly\n // relevant for the check above where we'll fail a subsequent call to\n // 'trailingEdge'.\n latestCallArgs = undefined;\n\n // Invoke the function and store the results locally.\n // @ts-expect-error [ts2345, ts2322] -- TypeScript infers the generic sub-\n // types too eagerly, making itself blind to the fact that the types match\n // here.\n result = func(...args);\n };\n\n const handleCoolDownEnd = (): void => {\n if (coolDownTimeoutId === undefined) {\n // It's rare to get here, it should only happen when `flush` is called\n // when the cool-down window isn't active.\n return;\n }\n\n // Make sure there are no more timers running.\n const timeoutId = coolDownTimeoutId;\n coolDownTimeoutId = undefined;\n clearTimeout(timeoutId);\n // Then reset state so a new cool-down window can begin on the next call.\n\n if (latestCallArgs !== undefined) {\n // If we have a debounced call waiting to be invoked at the end of the\n // cool-down period we need to invoke it now.\n handleInvoke();\n }\n };\n\n const handleDebouncedCall = (args: Parameters): void => {\n // We save the latest call args so that (if and) when we invoke the function\n // in the future, we have args to invoke it with.\n latestCallArgs = args;\n\n if (maxWaitMs !== undefined && maxWaitTimeoutId === undefined) {\n // We only need to start the maxWait timeout once, on the first debounced\n // call that is now being delayed.\n maxWaitTimeoutId = setTimeout(handleInvoke, maxWaitMs);\n }\n };\n\n return {\n call: (...args) => {\n if (coolDownTimeoutId === undefined) {\n // This call is starting a new cool-down window!\n\n if (timing === \"trailing\") {\n // Only when the timing is \"trailing\" is the first call \"debounced\".\n handleDebouncedCall(args);\n } else {\n // Otherwise for \"leading\" and \"both\" the first call is actually\n // called directly and not via a timeout.\n // @ts-expect-error [ts2345, ts2322] -- TypeScript infers the generic\n // sub-types too eagerly, making itself blind to the fact that the\n // types match here.\n result = func(...args);\n }\n } else {\n // There's an inflight cool-down window.\n\n if (timing !== \"leading\") {\n // When the timing is 'leading' all following calls are just ignored\n // until the cool-down period ends. But for the other timings the call\n // is \"debounced\".\n handleDebouncedCall(args);\n }\n\n // The current timeout is no longer relevant because we need to wait the\n // full `waitMs` time from this call.\n const timeoutId = coolDownTimeoutId;\n coolDownTimeoutId = undefined;\n clearTimeout(timeoutId);\n }\n\n coolDownTimeoutId = setTimeout(\n handleCoolDownEnd,\n // If waitMs is not defined but maxWaitMs *is* it means the user is only\n // interested in the leaky-bucket nature of the debouncer which is\n // achieved by setting waitMs === maxWaitMs. If both are not defined we\n // default to 0 which would wait until the end of the execution frame.\n waitMs ?? maxWaitMs ?? 0,\n );\n\n // Return the last computed result while we \"debounce\" further calls.\n return result;\n },\n\n cancel: () => {\n // Reset all \"in-flight\" state of the debouncer. Notice that we keep the\n // cached value!\n\n if (coolDownTimeoutId !== undefined) {\n const timeoutId = coolDownTimeoutId;\n coolDownTimeoutId = undefined;\n clearTimeout(timeoutId);\n }\n\n if (maxWaitTimeoutId !== undefined) {\n const timeoutId = maxWaitTimeoutId;\n maxWaitTimeoutId = undefined;\n clearTimeout(timeoutId);\n }\n\n latestCallArgs = undefined;\n },\n\n flush: () => {\n // Flush is just a manual way to trigger the end of the cool-down window.\n handleCoolDownEnd();\n return result;\n },\n\n get isPending() {\n return coolDownTimeoutId !== undefined;\n },\n\n get cachedValue() {\n return result;\n },\n };\n}\n", "import type { IsEqual } from \"type-fest\";\nimport { purry } from \"./purry\";\nimport type { RemedaTypeError } from \"./internal/types/RemedaTypeError\";\n\ntype FallbackOf =\n IsEqual> extends true\n ? RemedaTypeError<\n \"defaultTo\",\n \"no unnecessary fallback\",\n // The type is `never` because it will never be used ;)\n { type: never; metadata: T }\n >\n : T;\n\n/**\n * A stricter wrapper around the [Nullish coalescing operator `??`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)\n * that ensures that the fallback matches the type of the data. Only works\n * when data can be `null` or `undefined`.\n *\n * Notice that `Number.NaN` is not nullish and would not result in returning the\n * fallback!\n *\n * @param data - A nullish value.\n * @param fallback - A value of the same type as `data` that would be returned\n * when `data` is nullish.\n * @signature\n * defaultTo(data, fallback);\n * @example\n * defaultTo(\"hello\" as string | undefined, \"world\"); //=> \"hello\"\n * defaultTo(undefined as string | undefined, \"world\"); //=> \"world\"\n * @dataFirst\n * @category Other\n */\nexport function defaultTo>(\n data: T,\n fallback: Fallback,\n): NonNullable | Fallback;\n\n/**\n * A stricter wrapper around the [Nullish coalescing operator `??`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)\n * that ensures that the fallback matches the type of the data, and that the\n * data is nullish (`null` or `undefined`).\n *\n * Notice that `Number.NaN` is not nullish and would not result in returning the\n * fallback!\n *\n * @param fallback - A value of the same type as `data` that would be returned\n * when `data` is nullish.\n * @signature\n * defaultTo(fallback)(data);\n * @example\n * pipe(\"hello\" as string | undefined, defaultTo(\"world\")); //=> \"hello\"\n * pipe(undefined as string | undefined, defaultTo(\"world\")); //=> \"world\"\n * @dataLast\n * @category Other\n */\nexport function defaultTo>(\n fallback: Fallback,\n): (data: T) => NonNullable | Fallback;\n\nexport function defaultTo(...args: readonly unknown[]): unknown {\n return purry(defaultToImplementation, args);\n}\n\nconst defaultToImplementation = >(\n data: T,\n fallback: Fallback,\n): NonNullable | Fallback => data ?? fallback;\n", "import type { LazyResult } from \"./types/LazyResult\";\n\nconst EMPTY_PIPE = { done: true, hasNext: false } as const;\n\n/**\n * A singleton value for skipping an item in a lazy evaluator.\n */\nexport const SKIP_ITEM = { done: false, hasNext: false } as const;\n\n/**\n * A helper evaluator when we want to return an empty result. It memoizes both\n * the result and the evaluator itself to reduce memory usage.\n */\nexport const lazyEmptyEvaluator = (): LazyResult => EMPTY_PIPE;\n\n/**\n * A helper evaluator when we want to return a shallow clone of the input. It\n * memoizes both the evaluator itself to reduce memory usage.\n */\nexport const lazyIdentityEvaluator = (value: T) =>\n ({\n hasNext: true,\n next: value,\n done: false,\n }) as const;\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable jsdoc/check-param-names -- we don't document the op params, it'd be redundant */\n\nimport type { LazyDefinition } from \"./internal/types/LazyDefinition\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport type { LazyResult } from \"./internal/types/LazyResult\";\nimport { SKIP_ITEM } from \"./internal/utilityEvaluators\";\n\ntype PreparedLazyFunction = LazyEvaluator & {\n readonly isSingle: boolean;\n\n // These are intentionally mutable, they maintain the lazy piped state.\n index: number;\n items: unknown[];\n};\n\ntype LazyFunction = LazyDefinition & ((input: unknown) => unknown);\n\n/**\n * Performs left-to-right function composition, passing data through functions\n * in sequence. Each function receives the output of the previous function,\n * creating a readable top-to-bottom data flow that matches how the\n * transformation is executed. This enables converting deeply nested function\n * calls into clear, sequential steps without temporary variables.\n *\n * When consecutive functions with a `lazy` tag (e.g., `map`, `filter`, `take`,\n * `drop`, `forEach`, etc...) are used together, they process data item-by-item\n * rather than creating intermediate arrays. This enables early termination\n * when only partial results are needed, improving performance for large\n * datasets and expensive operations.\n *\n * Functions are only evaluated lazily when their data-last form is used\n * directly in the pipe. To disable lazy evaluation, use data-first calls via\n * arrow functions: `($) => map($, callback)` instead of `map(callback)`.\n *\n * Any function can be used in pipes, not just Remeda utilities. For creating\n * custom functions with currying and lazy evaluation support, see the `purry`\n * utility.\n *\n * A \"headless\" variant `piped` is available for creating reusable pipe\n * functions without initial data.\n *\n * IMPORTANT: During lazy evaluation, callbacks using the third parameter (the\n * input array) receive only items processed up to that point, not the complete\n * array.\n *\n * @param data - The input data.\n * @param functions - A sequence of functions that take one argument and\n * return a value.\n * @signature\n * pipe(data, ...functions);\n * @example\n * pipe([1, 2, 3], map(multiply(3))); //=> [3, 6, 9]\n *\n * // = Early termination with lazy evaluation =\n * pipe(\n * hugeArray,\n * map(expensiveComputation),\n * filter(complexPredicate),\n * // Only processes items until 2 results are found, then stops.\n * // Most of hugeArray never gets processed.\n * take(2),\n * );\n *\n * // = Custom logic within a pipe =\n * pipe(\n * input,\n * toLowerCase(),\n * normalize,\n * ($) => validate($, CONFIG),\n * split(\",\"),\n * unique(),\n * );\n *\n * // = Migrating nested transformations to pipes =\n * // Nested\n * const result = prop(\n * mapValues(groupByProp(users, \"department\"), length()),\n * \"engineering\",\n * );\n *\n * // Piped\n * const result = pipe(\n * users,\n * groupByProp(\"department\"),\n * mapValues(length()),\n * prop(\"engineering\"),\n * );\n *\n * // = Using the 3rd param of a callback =\n * // The following would print out `data` in its entirety for each value\n * // of `data`.\n * forEach([1, 2, 3, 4], (_item, _index, data) => {\n * console.log(data);\n * }); //=> \"[1, 2, 3, 4]\" logged 4 times\n *\n * // But with `pipe` data would only contain the items up to the current\n * // index\n * pipe([1, 2, 3, 4], forEach((_item, _index, data) => {\n * console.log(data);\n * })); //=> \"[1]\", \"[1, 2]\", \"[1, 2, 3]\", \"[1, 2, 3, 4]\"\n * @dataFirst\n * @category Function\n */\nexport function pipe(data: A): A;\n\nexport function pipe(data: A, funcA: (input: A) => B): B;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n): C;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n): D;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n): E;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n): F;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n): G;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n): H;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n): I;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n): J;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n): K;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n): L;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n funcL: (input: L) => M,\n): M;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n funcL: (input: L) => M,\n funcM: (input: M) => N,\n): N;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n funcL: (input: L) => M,\n funcM: (input: M) => N,\n funcN: (input: N) => O,\n): O;\n\nexport function pipe(\n data: A,\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n funcL: (input: L) => M,\n funcM: (input: M) => N,\n funcN: (input: N) => O,\n funcO: (input: O) => P,\n): P;\n\nexport function pipe(\n input: unknown,\n ...functions: readonly (LazyFunction | ((value: any) => unknown))[]\n): any {\n let output = input;\n\n const lazyFunctions = functions.map((op) =>\n \"lazy\" in op ? prepareLazyFunction(op) : undefined,\n );\n\n let functionIndex = 0;\n while (functionIndex < functions.length) {\n const lazyFunction = lazyFunctions[functionIndex];\n if (lazyFunction === undefined || !isIterable(output)) {\n const func = functions[functionIndex]!;\n output = func(output);\n functionIndex += 1;\n continue;\n }\n\n const lazySequence: PreparedLazyFunction[] = [];\n for (let index = functionIndex; index < functions.length; index++) {\n const lazyOp = lazyFunctions[index];\n if (lazyOp === undefined) {\n break;\n }\n\n lazySequence.push(lazyOp);\n if (lazyOp.isSingle) {\n break;\n }\n }\n\n const accumulator: unknown[] = [];\n\n for (const value of output) {\n const shouldExitEarly = processItem(value, accumulator, lazySequence);\n if (shouldExitEarly) {\n break;\n }\n }\n\n const { isSingle } = lazySequence.at(-1)!;\n output = isSingle ? accumulator[0] : accumulator;\n functionIndex += lazySequence.length;\n }\n return output;\n}\n\nfunction processItem(\n item: unknown,\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types -- Intentionally mutable, we use the accumulator directly to accumulate the results.\n accumulator: unknown[],\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types -- Intentionally mutable, the lazy sequence is stateful and contains the state needed to compute the next value lazily.\n lazySequence: readonly PreparedLazyFunction[],\n): boolean {\n if (lazySequence.length === 0) {\n accumulator.push(item);\n return false;\n }\n\n let currentItem = item;\n\n let lazyResult: LazyResult = SKIP_ITEM;\n let isDone = false;\n for (const [functionsIndex, lazyFn] of lazySequence.entries()) {\n const { index, items } = lazyFn;\n items.push(currentItem);\n lazyResult = lazyFn(currentItem, index, items);\n lazyFn.index += 1;\n if (lazyResult.hasNext) {\n if (lazyResult.hasMany ?? false) {\n for (const subItem of lazyResult.next as readonly unknown[]) {\n const subResult = processItem(\n subItem,\n accumulator,\n lazySequence.slice(functionsIndex + 1),\n );\n if (subResult) {\n return true;\n }\n }\n return isDone;\n }\n currentItem = lazyResult.next;\n }\n if (!lazyResult.hasNext) {\n break;\n }\n // process remaining functions in the pipe\n // but don't process remaining elements in the input array\n if (lazyResult.done) {\n isDone = true;\n }\n }\n if (lazyResult.hasNext) {\n accumulator.push(currentItem);\n }\n return isDone;\n}\n\nfunction prepareLazyFunction(func: LazyFunction): PreparedLazyFunction {\n const { lazy, lazyArgs } = func;\n const fn = lazy(...lazyArgs);\n return Object.assign(fn, {\n isSingle: lazy.single ?? false,\n index: 0,\n items: [] as unknown[],\n });\n}\n\nfunction isIterable(something: unknown): something is Iterable {\n // Check for null and undefined to avoid errors when accessing Symbol.iterator\n return (\n typeof something === \"string\" ||\n (typeof something === \"object\" &&\n something !== null &&\n Symbol.iterator in something)\n );\n}\n", "import { pipe } from \"../pipe\";\nimport type { LazyDefinition } from \"./types/LazyDefinition\";\nimport type { LazyEvaluator } from \"./types/LazyEvaluator\";\n\n/**\n * A version of `purry` for cases where the only meaningful implementation is a\n * lazy one. This is useful for functions that don't have a built-in\n * implementation already, and that can't be optimized to take advantage of\n * having the complete array upfront.\n *\n * Under the hood the function uses `pipe` to utilize it's built-in lazy logic\n * and wraps the pipe with the required invocations to allow using the function\n * outside of pipes too.\n *\n * @param lazy - The main lazy implementation, it assumes that data is an\n * iterable (array-like).\n * @param args - The arguments passed to the overloaded invocation.\n * @see purry\n * @see pipe\n */\nexport function purryFromLazy(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n lazy: (...args: any) => LazyEvaluator,\n args: readonly unknown[],\n): unknown {\n const diff = args.length - lazy.length;\n\n if (diff === 1) {\n // dataFirst\n const [data, ...rest] = args;\n const lazyDefinition = { lazy, lazyArgs: rest } satisfies LazyDefinition;\n\n // @ts-expect-error [ts2353] - Pipe expects a function which *might* also have a lazy definition. We are tricking pipe here to take our lazyDefinition without any function attached to it.\n return pipe(data, lazyDefinition);\n }\n\n if (diff === 0) {\n const lazyDefinition = { lazy, lazyArgs: args } satisfies LazyDefinition;\n\n // @ts-expect-error [ts2353] - Pipe expects a function which *might* also have a lazy definition. We are tricking pipe here to take our lazyDefinition without any function attached to it.\n const dataLast = (data: unknown): unknown => pipe(data, lazyDefinition);\n return Object.assign(dataLast, lazyDefinition);\n }\n\n throw new Error(\"Wrong number of arguments\");\n}\n", "import { purryFromLazy } from \"./internal/purryFromLazy\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { SKIP_ITEM, lazyIdentityEvaluator } from \"./internal/utilityEvaluators\";\n\n/**\n * Excludes the values from `other` array. The output maintains the same order\n * as the input. The inputs are treated as multi-sets/bags (multiple copies of\n * items are treated as unique items).\n *\n * @param data - The input items.\n * @param other - The values to exclude.\n * @signature\n * difference(data, other)\n * @example\n * difference([1, 2, 3, 4], [2, 5, 3]); // => [1, 4]\n * difference([1, 1, 2, 2], [1]); // => [1, 2, 2]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function difference(data: readonly T[], other: readonly T[]): T[];\n\n/**\n * Excludes the values from `other` array. The output maintains the same order\n * as the input. The inputs are treated as multi-sets/bags (multiple copies of\n * items are treated as unique items).\n *\n * @param other - The values to exclude.\n * @signature\n * difference(other)(data)\n * @example\n * pipe([1, 2, 3, 4], difference([2, 5, 3])); // => [1, 4]\n * pipe([1, 1, 2, 2], difference([1])); // => [1, 2, 2]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function difference(other: readonly T[]): (data: readonly T[]) => T[];\n\nexport function difference(...args: readonly unknown[]): unknown {\n return purryFromLazy(lazyImplementation, args);\n}\n\nfunction lazyImplementation(other: readonly T[]): LazyEvaluator {\n if (other.length === 0) {\n return lazyIdentityEvaluator;\n }\n\n // We need to build a more efficient data structure that would allow us to\n // keep track of the number of times we've seen a value in the other array.\n const remaining = new Map();\n for (const value of other) {\n remaining.set(value, (remaining.get(value) ?? 0) + 1);\n }\n\n return (value) => {\n const copies = remaining.get(value);\n\n if (copies === undefined || copies === 0) {\n // The item is either not part of the other array or we've dropped enough\n // copies of it so we return it.\n return { done: false, hasNext: true, next: value };\n }\n\n // The item is equal to an item in the other array and there are still\n // copies of it to \"account\" for so we skip this one and remove it from our\n // ongoing tally.\n remaining.set(value, copies - 1);\n return SKIP_ITEM;\n };\n}\n", "import { purryFromLazy } from \"./internal/purryFromLazy\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { SKIP_ITEM } from \"./internal/utilityEvaluators\";\n\ntype IsEqual = (data: T, other: Other) => boolean;\n\n/**\n * Excludes the values from `other` array.\n * Elements are compared by custom comparator isEquals.\n *\n * @param data - The source array.\n * @param other - The values to exclude.\n * @param isEqual - The comparator.\n * @signature\n * differenceWith(data, other, isEqual)\n * @example\n * differenceWith(\n * [{ a: 1 }, { a: 2 }, { a: 3 }, { a: 4 }],\n * [2, 5, 3],\n * ({ a }, b) => a === b,\n * ); //=> [{ a: 1 }, { a: 4 }]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function differenceWith(\n data: readonly T[],\n other: readonly Other[],\n isEqual: IsEqual,\n): T[];\n\n/**\n * Excludes the values from `other` array.\n * Elements are compared by custom comparator isEquals.\n *\n * @param other - The values to exclude.\n * @param isEqual - The comparator.\n * @signature\n * differenceWith(other, isEqual)(data)\n * @example\n * pipe(\n * [{ a: 1 }, { a: 2 }, { a: 3 }, { a: 4 }, { a: 5 }, { a: 6 }],\n * differenceWith([2, 3], ({ a }, b) => a === b),\n * ); //=> [{ a: 1 }, { a: 4 }, { a: 5 }, { a: 6 }]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function differenceWith(\n other: readonly Other[],\n isEqual: IsEqual,\n): (data: readonly T[]) => T[];\n\nexport function differenceWith(...args: readonly unknown[]): unknown {\n return purryFromLazy(lazyImplementation, args);\n}\n\nconst lazyImplementation =\n (\n other: readonly Other[],\n isEqual: IsEqual,\n ): LazyEvaluator =>\n (value) =>\n other.every((otherValue) => !isEqual(value, otherValue))\n ? { done: false, hasNext: true, next: value }\n : SKIP_ITEM;\n", "import { purry } from \"./purry\";\n\n/**\n * Divides two numbers.\n *\n * @param value - The number.\n * @param divisor - The number to divide the value by.\n * @signature\n * divide(value, divisor);\n * @example\n * divide(12, 3) // => 4\n * reduce([1, 2, 3, 4], divide, 24) // => 1\n * @dataFirst\n * @category Number\n */\nexport function divide(value: bigint, divisor: bigint): bigint;\nexport function divide(value: number, divisor: number): number;\n\n/**\n * Divides two numbers.\n *\n * @param divisor - The number to divide the value by.\n * @signature\n * divide(divisor)(value);\n * @example\n * divide(3)(12) // => 4\n * map([2, 4, 6, 8], divide(2)) // => [1, 2, 3, 4]\n * @dataLast\n * @category Number\n */\nexport function divide(divisor: bigint): (value: bigint) => bigint;\nexport function divide(divisor: number): (value: number) => number;\n\nexport function divide(...args: readonly unknown[]): unknown {\n return purry(divideImplementation, args);\n}\n\n// The implementation only uses `number` types, but that's just because it's\n// hard to tell typescript that both value and divisor would be of the same\n// type.\nconst divideImplementation = (value: number, divisor: number): number =>\n value / divisor;\n", "/**\n * A function that takes any arguments and does nothing with them. This is\n * useful as a placeholder for any function or API that requires a **void**\n * function (a function that doesn't return a value). This could also be used in\n * combination with a ternary or other conditional execution to allow disabling\n * a function call for a specific case.\n *\n * Notice that this is a dataLast impl where the function needs to be invoked\n * to get the \"do nothing\" function.\n *\n * See also:\n * * `constant` - A function that ignores it's arguments and returns the same value on every invocation.\n * * `identity` - A function that returns the first argument it receives.\n *\n * @signature\n * doNothing();\n * @example\n * myApi({ onSuccess: handleSuccess, onError: doNothing() });\n * myApi({ onSuccess: isDemoMode ? doNothing(): handleSuccess });\n * @dataLast\n * @category Function\n */\nexport function doNothing(): typeof doesNothing {\n // Notice that the exported identity function is just the \"factory\" for the\n // function. We do it this way so that all \"Function\" utilities have a similar\n // API where the function is called, and not just used \"headless\". e.g.\n // `doNothing()` and not `doNothing`, just like the API for `constant(1)`.\n return doesNothing;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- There is no other way to make typescript infer the function arguments \"backwards\" in data-last invocations without the Args type parameter. @see: https://github.com/typescript-eslint/typescript-eslint/issues/9887\nfunction doesNothing(..._args: Args): void {\n /* do nothing */\n}\n", "import type { IsInteger, IsNegative, Writable } from \"type-fest\";\nimport type { ClampedIntegerSubtract } from \"./internal/types/ClampedIntegerSubtract\";\nimport type { CoercedArray } from \"./internal/types/CoercedArray\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport type { PartialArray } from \"./internal/types/PartialArray\";\nimport type { TupleParts } from \"./internal/types/TupleParts\";\nimport { SKIP_ITEM, lazyIdentityEvaluator } from \"./internal/utilityEvaluators\";\nimport { purry } from \"./purry\";\n\ntype Drop =\n IsNegative extends true\n ? // Negative numbers result in nothing being dropped, we return a shallow\n // clone of the array.\n Writable\n : IsInteger extends true\n ? ClampedIntegerSubtract<\n N,\n TupleParts[\"required\"][\"length\"]\n > extends infer RemainingPrefix extends number\n ? RemainingPrefix extends 0\n ? // The drop will occur within the required part of the tuple, we\n // simply remove those elements from it and reconstruct the rest of\n // the tuple.\n [\n ...DropFixedTuple[\"required\"], N>,\n ...PartialArray[\"optional\"]>,\n ...CoercedArray[\"item\"]>,\n ...TupleParts[\"suffix\"],\n ]\n : ClampedIntegerSubtract<\n RemainingPrefix,\n TupleParts[\"optional\"][\"length\"]\n > extends infer RemainingOptional extends number\n ? RemainingOptional extends 0\n ? // The drop will occur within the optional part of the tuple, we\n // completely remove the required part, remove enough elements\n // from the optional part, and reconstruct the rest of the\n // tuple.\n [\n ...PartialArray<\n DropFixedTuple[\"optional\"], RemainingPrefix>\n >,\n ...CoercedArray[\"item\"]>,\n ...TupleParts[\"suffix\"],\n ]\n : // The drop will occur within the rest element or the suffix.\n // Because the suffix can contain any number of elements this\n // case adds more complexity as we need to consider all\n // possible (relevant) lengths. We start by considering the\n // case where there are enough elements within the rest\n // param; this means we still maintain the rest element as it\n // could contain even more elements, and we add the suffix\n // untouched.\n | [\n ...CoercedArray[\"item\"]>,\n ...TupleParts[\"suffix\"],\n ]\n // Additionally, we need to consider the case where the rest\n // element has up to the same number of elements as the\n // suffix; this will result in removing the rest element\n // entirely, and dropping elements from the suffix. We do this\n // for all possible values from 0 to N where N is the\n // remaining value after we handled the prefix. We can exclude\n // the 0 case because it is contained in the previous case.\n | Exclude<\n DropFixedTuple<\n TupleParts[\"suffix\"],\n RemainingOptional,\n true /* IncludePrefixes */\n >,\n TupleParts[\"suffix\"]\n >\n : never\n : never\n : // We can't compute accurate types for non-integer numbers so we\n // fallback to the \"legacy\" typing where we convert our output to a\n // simple array. This is also the case when N is not a literal value\n // (e.g. it is `number`).\n // TODO: We can improve this type by returning a union of all possible dropped shapes (e.g. the equivalent of Drop | Drop | Drop | ...).\n T[number][];\n\ntype DropFixedTuple<\n T,\n N,\n // This flag controls if we want a union of all possible prefixes, or just the\n // final tuple with all N items dropped.\n IncludePrefixes = false,\n Dropped extends unknown[] = [],\n> = Dropped[\"length\"] extends N\n ? T\n : T extends readonly [unknown, ...infer Rest]\n ?\n | DropFixedTuple\n | (true extends IncludePrefixes ? T : never)\n : [];\n\n/**\n * Removes first `n` elements from the `array`.\n *\n * @param array - The target array.\n * @param n - The number of elements to skip.\n * @signature\n * drop(array, n)\n * @example\n * drop([1, 2, 3, 4, 5], 2) // => [3, 4, 5]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function drop(\n array: T,\n n: N,\n): Drop;\n\n/**\n * Removes first `n` elements from the `array`.\n *\n * @param n - The number of elements to skip.\n * @signature\n * drop(n)(array)\n * @example\n * drop(2)([1, 2, 3, 4, 5]) // => [3, 4, 5]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function drop(\n n: N,\n): (array: T) => Drop;\n\nexport function drop(...args: readonly unknown[]): unknown {\n return purry(dropImplementation, args, lazyImplementation);\n}\n\nconst dropImplementation = (\n array: T,\n n: number,\n): T[number][] => (n < 0 ? [...array] : array.slice(n));\n\nfunction lazyImplementation(n: number): LazyEvaluator {\n if (n <= 0) {\n return lazyIdentityEvaluator;\n }\n\n let left = n;\n return (value) => {\n if (left > 0) {\n left -= 1;\n return SKIP_ITEM;\n }\n return { done: false, hasNext: true, next: value };\n };\n}\n", "import type { IsNumericLiteral } from \"type-fest\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\nimport type { ArrayRequiredPrefix } from \"./internal/types/ArrayRequiredPrefix\";\n\n/**\n * Checks if the given array has at least the defined number of elements. When\n * the minimum used is a literal (e.g. `3`) the output is refined accordingly so\n * that those indices are defined when accessing the array even when using\n * typescript's 'noUncheckedIndexAccess'.\n *\n * @param data - The input array.\n * @param minimum - The minimum number of elements the array must have.\n * @returns True if the array's length is *at least* `minimum`. When `minimum`\n * is a literal value, the output is narrowed to ensure the first items are\n * guaranteed.\n * @signature\n * hasAtLeast(data, minimum)\n * @example\n * hasAtLeast([], 4); // => false\n *\n * const data: number[] = [1,2,3,4];\n * hasAtLeast(data, 1); // => true\n * data[0]; // 1, with type `number`\n * @dataFirst\n * @category Array\n */\nexport function hasAtLeast(\n data: IterableContainer | T,\n minimum: IsNumericLiteral extends true ? N : never,\n): data is ArrayRequiredPrefix;\nexport function hasAtLeast(data: IterableContainer, minimum: number): boolean;\n\n/**\n * Checks if the given array has at least the defined number of elements. When\n * the minimum used is a literal (e.g. `3`) the output is refined accordingly so\n * that those indices are defined when accessing the array even when using\n * typescript's 'noUncheckedIndexAccess'.\n *\n * @param minimum - The minimum number of elements the array must have.\n * @returns True if the array's length is *at least* `minimum`. When `minimum`\n * is a literal value, the output is narrowed to ensure the first items are\n * guaranteed.\n * @signature\n * hasAtLeast(minimum)(data)\n * @example\n * pipe([], hasAtLeast(4)); // => false\n *\n * const data = [[1,2], [3], [4,5]];\n * pipe(\n * data,\n * filter(hasAtLeast(2)),\n * map(([, second]) => second),\n * ); // => [2,5], with type `number[]`\n * @dataLast\n * @category Array\n */\nexport function hasAtLeast(\n minimum: IsNumericLiteral extends true ? N : never,\n): (\n data: IterableContainer | T,\n) => data is ArrayRequiredPrefix;\nexport function hasAtLeast(\n minimum: number,\n): (data: IterableContainer) => boolean;\n\nexport function hasAtLeast(...args: readonly unknown[]): unknown {\n return purry(hasAtLeastImplementation, args);\n}\n\nconst hasAtLeastImplementation = (\n data: IterableContainer,\n minimum: number,\n): boolean => data.length >= minimum;\n", "/**\n * An efficient hack to swap the values at two indices in an array *in-place*.\n */\nexport function swapInPlace(\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types -- Intentional\n data: unknown[],\n i: number,\n j: number,\n): void {\n // We use destructuring to perform an in-place swap *without* needing a\n // temporary variable\n [data[i], data[j]] = [data[j], data[i]];\n}\n", "/**\n * Heap related utilities.\n */\n\nimport { hasAtLeast } from \"../hasAtLeast\";\nimport { swapInPlace } from \"./swapInPlace\";\nimport type { CompareFunction } from \"./types/CompareFunction\";\n\n/**\n * Mutates an array into a \"max\"-heap based on `compareFn` so that for any `item` in the heap, `compareFn(heap[0], item) > 0`.\n *\n * @param heap - The array to be heapified. The array would be mutated!\n * @param compareFn - The comparator used to order items in the heap. Use the\n * same function in all calls mutating the same heap otherwise you'd get\n * unexpected results.\n */\nexport function heapify(\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types -- Intentional!\n heap: T[],\n compareFn: CompareFunction,\n): void {\n for (let i = Math.floor(heap.length / 2) - 1; i >= 0; i--) {\n heapSiftDown(heap, i, compareFn);\n }\n}\n\n/**\n * Insert an item into a heap if it's \"smaller\" (in regards to `compareFn`) than\n * the current head of the heap (which is the \"largest\" value in the heap). If\n * the item is inserted, the previous head of the heap is returned, otherwise\n * `undefined` is returned and the heap is unchanged.\n *\n * @param heap - A *mutable* array representing a heap (see `heapify`).\n * @param compareFn - The comparator used to order items in the heap. Use the.\n * @param item - The item to be inserted into the heap.\n * @returns `undefined` if the heap is unchanged, or the previous head of the\n * heap if the item was inserted.\n */\nexport function heapMaybeInsert(\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types -- Intentional!\n heap: T[],\n compareFn: CompareFunction,\n item: T,\n): T | undefined {\n if (!hasAtLeast(heap, 1)) {\n return undefined;\n }\n\n const [head] = heap;\n\n if (compareFn(item, head) >= 0) {\n // The item shouldn't be inserted into the heap, the heap is unchanged.\n return undefined;\n }\n\n heap[0] = item;\n heapSiftDown(heap, 0, compareFn);\n return head;\n}\n\n/**\n * The main heap operation. Takes a `heap` and an `index` and sifts the item\n * down the heap until it reaches the correct position based on `compareFn`,\n * swapping other items in the process.\n */\nfunction heapSiftDown(\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types -- Intentional!\n heap: T[],\n index: number,\n compareFn: CompareFunction,\n): void {\n let currentIndex = index;\n\n // The loop continues while the currentIndex has children in the heap.\n while (currentIndex * 2 + 1 < heap.length) {\n const firstChildIndex = currentIndex * 2 + 1;\n\n let swapIndex =\n compareFn(heap[currentIndex]!, heap[firstChildIndex]!) < 0\n ? // Is the parent \"smaller\" (in regards to `compareFn`) to its child?\n firstChildIndex\n : currentIndex;\n\n const secondChildIndex = firstChildIndex + 1;\n if (\n secondChildIndex < heap.length &&\n compareFn(heap[swapIndex]!, heap[secondChildIndex]!) < 0\n ) {\n // Is there a second child? Is it the smallest of the three?\n swapIndex = secondChildIndex;\n }\n\n if (swapIndex === currentIndex) {\n // We assume the array is a heap and the existing order of items satisfies\n // the compareFn so we can stop here.\n return;\n }\n\n swapInPlace(heap, currentIndex, swapIndex);\n\n currentIndex = swapIndex;\n }\n}\n", "import type { CompareFunction } from \"./types/CompareFunction\";\nimport type { NonEmptyArray } from \"./types/NonEmptyArray\";\n\n// We define the comparators in a global const so that they are only\n// instantiated once, and so we can couple a label (string) for them that could\n// be used in runtime to refer to them (e.g. \"asc\", \"desc\").\nconst COMPARATORS = {\n asc: (x: T, y: T) => x > y,\n desc: (x: T, y: T) => x < y,\n} as const;\n\n/**\n * An order rule defines a projection/extractor that returns a comparable from\n * the data being compared. It would be run on each item being compared, and a\n * comparator would then be used on the results to determine the order.\n *\n * There are 2 forms of the order rule, a simple one which only provides the\n * projection function and assumes ordering is ascending, and a 2-tuple where\n * the first element is the projection function and the second is the direction;\n * this allows changing the direction without defining a more complex projection\n * to simply negate the value (e.g. `(x) => -x`).\n *\n * We rely on the javascript implementation of `<` and `>` for comparison, which\n * will attempt to transform both operands into a primitive comparable value via\n * the built in `valueOf` function (and then `toString`). It's up to the caller\n * to make sure that the projection is returning a value that makes sense for\n * this logic.\n *\n * It's important to note that there is no built-in caching/memoization of\n * projection function and therefore no guarantee that it would only be called\n * once.\n */\nexport type OrderRule =\n | Projection\n | readonly [projection: Projection, direction: keyof typeof COMPARATORS];\n\ntype Projection = (x: T) => Comparable;\n\n// We define the Comparable based on how JS coerces values into primitives when\n// used with the `<` and `>` operators.\n// @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#type_coercion\ntype Comparable =\n | ComparablePrimitive\n | { [Symbol.toPrimitive]: (hint: string) => ComparablePrimitive }\n | { toString: () => string }\n | { valueOf: () => ComparablePrimitive };\n\n// Notice that `boolean` is special in that it is coerced as a number (0 for\n// `false`, 1 for `true`) implicitly.\ntype ComparablePrimitive = bigint | boolean | number | string;\n\n/**\n * Allows functions that want to handle a variadic number of order rules a\n * a simplified API that hides most of the implementation details. The only\n * thing users of this function need to do is provide a function that would take\n * the data, and a compare function that can be used to determine the order\n * between the items of the array.\n * This functions takes care of the rest; it will parse rules, built the\n * comparer, and manage the purrying of the input arguments.\n */\nexport function purryOrderRules(\n func: (data: readonly T[], compareFn: CompareFunction) => unknown,\n inputArgs: readonly unknown[],\n): unknown {\n // We rely on casting blindly here, but we rely on casting blindly everywhere\n // else when we call purry so it's fine...\n const [dataOrRule, ...rules] = inputArgs as\n | Readonly>>\n | [\n data: OrderRule | readonly T[],\n ...rules: Readonly>>,\n ];\n\n if (!isOrderRule(dataOrRule)) {\n // dataFirst!\n\n // @ts-expect-error [ts2556]: Typescript is failing to infer the type of rules\n // correctly here after the type refinement above, rules should be non-empty\n // when we get here.\n const compareFn = orderRuleComparer(...rules);\n return func(dataOrRule, compareFn);\n }\n\n // dataLast!\n\n // Important: initialize the comparer outside of the returned function so it\n // it's constructed and shared everywhere (it's stateless so should be safe\n // if used multiple times).\n const compareFn = orderRuleComparer(dataOrRule, ...rules);\n return (data: readonly T[]) => func(data, compareFn);\n}\n\n/**\n * Some functions need an extra number argument, this helps facilitate that.\n */\nexport function purryOrderRulesWithArgument(\n func: (\n data: readonly T[],\n compareFn: CompareFunction,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Function inference in typescript relies on `any` to work, it doesn't work with `unknown`\n arg: any,\n ) => unknown,\n [first, second, ...rest]: readonly unknown[],\n): unknown {\n // We need to pull the `n` argument out to make it work with purryOrderRules.\n let arg: unknown;\n let argRemoved: readonly unknown[];\n if (isOrderRule(second)) {\n // dataLast!\n arg = first;\n argRemoved = [second, ...rest];\n } else {\n // dataFirst!\n arg = second;\n argRemoved = [first, ...rest];\n }\n\n return purryOrderRules((...args) => func(...args, arg), argRemoved);\n}\n\nfunction orderRuleComparer(\n primaryRule: OrderRule,\n secondaryRule?: OrderRule,\n ...otherRules: readonly OrderRule[]\n): (a: T, b: T) => number {\n const projector =\n typeof primaryRule === \"function\" ? primaryRule : primaryRule[0];\n\n const direction = typeof primaryRule === \"function\" ? \"asc\" : primaryRule[1];\n const { [direction]: comparator } = COMPARATORS;\n\n const nextComparer =\n secondaryRule === undefined\n ? undefined\n : orderRuleComparer(secondaryRule, ...otherRules);\n\n return (a, b) => {\n const projectedA = projector(a);\n const projectedB = projector(b);\n\n if (comparator(projectedA, projectedB)) {\n return 1;\n }\n\n if (comparator(projectedB, projectedA)) {\n return -1;\n }\n\n // The elements are equal base on the current comparator and projection. So\n // we need to check the elements using the next comparer, if one exists,\n // otherwise we consider them as true equal (returning 0).\n return nextComparer?.(a, b) ?? 0;\n };\n}\n\nfunction isOrderRule(x: unknown): x is OrderRule {\n if (isProjection(x)) {\n return true;\n }\n\n if (typeof x !== \"object\" || !Array.isArray(x)) {\n return false;\n }\n\n const [maybeProjection, maybeDirection, ...rest] = x as readonly unknown[];\n\n return (\n isProjection(maybeProjection) &&\n typeof maybeDirection === \"string\" &&\n maybeDirection in COMPARATORS &&\n // Has to be a 2-tuple\n rest.length === 0\n );\n}\n\nconst isProjection = (x: unknown): x is Projection =>\n typeof x === \"function\" && x.length === 1;\n", "import { heapify, heapMaybeInsert } from \"./internal/heap\";\nimport {\n purryOrderRulesWithArgument,\n type OrderRule,\n} from \"./internal/purryOrderRules\";\nimport type { CompareFunction } from \"./internal/types/CompareFunction\";\nimport type { NonEmptyArray } from \"./internal/types/NonEmptyArray\";\n\n/**\n * Drop the first `n` items from `data` based on the provided ordering criteria. This allows you to avoid sorting the array before dropping the items. The complexity of this function is *O(Nlogn)* where `N` is the length of the array.\n *\n * For the opposite operation (to keep `n` elements) see `takeFirstBy`.\n *\n * @param data - The input array.\n * @param n - The number of items to drop. If `n` is non-positive no items would be dropped and a *clone* of the input would be returned, if `n` is bigger then data.length no items would be returned.\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns A subset of the input array.\n * @signature\n * dropFirstBy(data, n, ...rules);\n * @example\n * dropFirstBy(['aa', 'aaaa', 'a', 'aaa'], 2, x => x.length); // => ['aaa', 'aaaa']\n * @dataFirst\n * @category Array\n */\nexport function dropFirstBy(\n data: readonly T[],\n n: number,\n ...rules: Readonly>>\n): T[];\n\n/**\n * Drop the first `n` items from `data` based on the provided ordering criteria. This allows you to avoid sorting the array before dropping the items. The complexity of this function is *O(Nlogn)* where `N` is the length of the array.\n *\n * For the opposite operation (to keep `n` elements) see `takeFirstBy`.\n *\n * @param n - The number of items to drop. If `n` is non-positive no items would be dropped and a *clone* of the input would be returned, if `n` is bigger then data.length no items would be returned.\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns A subset of the input array.\n * @signature\n * dropFirstBy(n, ...rules)(data);\n * @example\n * pipe(['aa', 'aaaa', 'a', 'aaa'], dropFirstBy(2, x => x.length)); // => ['aaa', 'aaaa']\n * @dataLast\n * @category Array\n */\nexport function dropFirstBy(\n n: number,\n ...rules: Readonly>>\n): (data: readonly T[]) => T[];\n\nexport function dropFirstBy(...args: readonly unknown[]): unknown {\n return purryOrderRulesWithArgument(dropFirstByImplementation, args);\n}\n\nfunction dropFirstByImplementation(\n data: readonly T[],\n compareFn: CompareFunction,\n n: number,\n): T[] {\n if (n >= data.length) {\n return [];\n }\n\n if (n <= 0) {\n return [...data];\n }\n\n const heap = data.slice(0, n);\n heapify(heap, compareFn);\n\n const out = [];\n\n const rest = data.slice(n);\n for (const item of rest) {\n const previousHead = heapMaybeInsert(heap, compareFn, item);\n out.push(previousHead ?? item);\n }\n\n return out;\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n/**\n * Removes last `n` elements from the `array`.\n *\n * @param array - The target array.\n * @param n - The number of elements to skip.\n * @signature\n * dropLast(array, n)\n * @example\n * dropLast([1, 2, 3, 4, 5], 2) // => [1, 2, 3]\n * @dataFirst\n * @category Array\n */\nexport function dropLast(\n array: T,\n n: number,\n): T[number][];\n\n/**\n * Removes last `n` elements from the `array`.\n *\n * @param n - The number of elements to skip.\n * @signature\n * dropLast(n)(array)\n * @example\n * dropLast(2)([1, 2, 3, 4, 5]) // => [1, 2, 3]\n * @dataLast\n * @category Array\n */\nexport function dropLast(\n n: number,\n): (array: T) => T[number][];\n\nexport function dropLast(...args: readonly unknown[]): unknown {\n return purry(dropLastImplementation, args);\n}\n\nconst dropLastImplementation = (\n array: T,\n n: number,\n): T[number][] =>\n n > 0 ? array.slice(0, Math.max(0, array.length - n)) : [...array];\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n/**\n * Removes elements from the end of the array until the predicate returns false.\n *\n * The predicate is applied to each element in the array starting from the end and moving towards the beginning, until the predicate returns false. The returned array includes elements from the beginning of the array, up to and including the element that produced false for the predicate.\n *\n * @param data - The array.\n * @param predicate - The predicate.\n * @signature\n * dropLastWhile(data, predicate)\n * @example\n * dropLastWhile([1, 2, 10, 3, 4], x => x < 10) // => [1, 2, 10]\n * @dataFirst\n * @category Array\n */\nexport function dropLastWhile(\n data: T,\n predicate: (item: T[number], index: number, data: T) => boolean,\n): T[number][];\n\n/**\n * Removes elements from the end of the array until the predicate returns false.\n *\n * The predicate is applied to each element in the array starting from the end and moving towards the beginning, until the predicate returns false. The returned array includes elements from the beginning of the array, up to and including the element that produced false for the predicate.\n *\n * @param predicate - The predicate.\n * @signature\n * dropLastWhile(predicate)(data)\n * @example\n * pipe([1, 2, 10, 3, 4], dropLastWhile(x => x < 10)) // => [1, 2, 10]\n * @dataLast\n * @category Array\n */\nexport function dropLastWhile(\n predicate: (item: T[number], index: number, data: T) => boolean,\n): (data: T) => T[number][];\n\nexport function dropLastWhile(...args: readonly unknown[]): unknown {\n return purry(dropLastWhileImplementation, args);\n}\n\nfunction dropLastWhileImplementation(\n data: T,\n predicate: (item: T[number], index: number, data: T) => boolean,\n): T[number][] {\n for (let i = data.length - 1; i >= 0; i--) {\n if (!predicate(data[i], i, data)) {\n return data.slice(0, i + 1);\n }\n }\n return [];\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n/**\n * Removes elements from the beginning of the array until the predicate returns false.\n *\n * The predicate is applied to each element in the array, until the predicate returns false. The returned array includes the rest of the elements, starting with the element that produced false for the predicate.\n *\n * @param data - The array.\n * @param predicate - The predicate.\n * @signature\n * dropWhile(data, predicate)\n * @example\n * dropWhile([1, 2, 10, 3, 4], x => x < 10) // => [10, 3, 4]\n * @dataFirst\n * @category Array\n */\nexport function dropWhile(\n data: T,\n predicate: (item: T[number], index: number, data: T) => boolean,\n): T[number][];\n\n/**\n * Removes elements from the beginning of the array until the predicate returns false.\n *\n * The predicate is applied to each element in the array, until the predicate returns false. The returned array includes the rest of the elements, starting with the element that produced false for the predicate.\n *\n * @param predicate - The predicate.\n * @signature\n * dropWhile(predicate)(data)\n * @example\n * pipe([1, 2, 10, 3, 4], dropWhile(x => x < 10)) // => [10, 3, 4]\n * @dataLast\n * @category Array\n */\nexport function dropWhile(\n predicate: (item: T[number], index: number, data: T) => boolean,\n): (data: T) => T[number][];\n\nexport function dropWhile(...args: readonly unknown[]): unknown {\n return purry(dropWhileImplementation, args);\n}\n\nfunction dropWhileImplementation(\n data: T,\n predicate: (item: T[number], index: number, data: T) => boolean,\n): T[number][] {\n for (const [index, item] of data.entries()) {\n if (!predicate(item, index, data)) {\n return data.slice(index);\n }\n }\n return [];\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Determines whether a string ends with the provided suffix, and refines the\n * output type if possible.\n *\n * This function is a wrapper around the built-in [`String.prototype.endsWith`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith)\n * method, but doesn't expose the `endPosition` parameter. To check only up to a\n * specific position, use `endsWith(sliceString(data, 0, endPosition), suffix)`.\n *\n * @param data - The input string.\n * @param suffix - The string to check for at the end.\n * @signature\n * endsWith(data, suffix);\n * @example\n * endsWith(\"hello world\", \"hello\"); // false\n * endsWith(\"hello world\", \"world\"); // true\n * @dataFirst\n * @category String\n */\nexport function endsWith(\n data: T,\n suffix: string extends Suffix ? never : Suffix,\n): data is T & `${string}${Suffix}`;\nexport function endsWith(data: string, suffix: string): boolean;\n\n/**\n * Determines whether a string ends with the provided suffix, and refines the\n * output type if possible.\n *\n * This function is a wrapper around the built-in [`String.prototype.endsWith`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith)\n * method, but doesn't expose the `endPosition` parameter. To check only up to a\n * specific position, use `endsWith(sliceString(data, 0, endPosition), suffix)`.\n *\n * @param suffix - The string to check for at the end.\n * @signature\n * endsWith(suffix)(data);\n * @example\n * pipe(\"hello world\", endsWith(\"hello\")); // false\n * pipe(\"hello world\", endsWith(\"world\")); // true\n * @dataLast\n * @category String\n */\nexport function endsWith(\n suffix: string extends Suffix ? never : Suffix,\n): (data: T) => data is T & `${string}${Suffix}`;\nexport function endsWith(suffix: string): (data: string) => boolean;\n\nexport function endsWith(...args: readonly unknown[]): unknown {\n return purry(endsWithImplementation, args);\n}\n\nconst endsWithImplementation = (data: string, suffix: string): boolean =>\n data.endsWith(suffix);\n", "/* eslint-disable @typescript-eslint/no-empty-object-type --\n * We want to match the typing of the built-in Object.entries as much as\n * possible!\n */\nimport type { Simplify, ValueOf } from \"type-fest\";\nimport { purry } from \"./purry\";\nimport type { ToString } from \"./internal/types/ToString\";\n\ntype Entry = Simplify<\n ValueOf<{\n // `Object.entries` only returns enumerable keys, skipping symbols.\n [P in Exclude]-?: [\n // and all keys are converted to strings.\n key: ToString

,\n // Optionality doesn't play a factor in the result of entries because its\n // a typing thing, not a runtime thing. We need to remove any `undefined`\n // added just because the prop is optional.\n value: Required[P],\n ];\n }>\n>;\n\n/**\n * Returns an array of key/values of the enumerable properties of an object.\n *\n * @param data - Object to return keys and values of.\n * @signature\n * entries(object)\n * @example\n * entries({ a: 1, b: 2, c: 3 }); // => [['a', 1], ['b', 2], ['c', 3]]\n * @dataFirst\n * @category Object\n */\nexport function entries(data: T): Entry[];\n\n/**\n * Returns an array of key/values of the enumerable properties of an object.\n *\n * @signature\n * entries()(object)\n * @example\n * pipe({ a: 1, b: 2, c: 3 }, entries()); // => [['a', 1], ['b', 2], ['c', 3]]\n * @dataLast\n * @category Object\n */\nexport function entries(): (data: T) => Entry[];\n\nexport function entries(...args: readonly unknown[]): unknown {\n return purry(Object.entries, args);\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n/**\n * Basic structure of `evolver` parameter of the function `evolve`.\n */\ntype GenericEvolver = {\n readonly [P in string]: GenericEvolver | ((data: unknown) => unknown);\n};\n\n/**\n * Creates an assumed `evolver` type from the type of `data` argument.\n *\n * @example\n * interface Data {\n * id: number;\n * quartile: number[];\n * time?: { elapsed: number; remaining?: number };\n * }\n * type Nested = Evolver; // => type Nested = {\n * // id?: ((data: number) => unknown) | undefined;\n * // quartile?: ((data: number[]) => unknown) | undefined;\n * // time?:\n * // | ((data: { elapsed: number; remaining?: number | undefined }) => unknown)\n * // | {\n * // elapsed?: ((data: number) => unknown) | undefined;\n * // remaining?: ((data: number) => unknown) | undefined;\n * // }\n * // | undefined;\n * // };\n */\ntype Evolver = T extends object\n ? T extends IterableContainer\n ? never\n : {\n readonly [K in keyof T]?: K extends symbol\n ? never\n : Evolver | ((data: Required[K]) => unknown);\n }\n : never;\n\n/**\n * Creates return type from the type of arguments of `evolve`.\n */\ntype Evolved = T extends object\n ? {\n -readonly [K in keyof T]: K extends keyof E\n ? E[K] extends (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Functions aren't inferred correctly when using `unknown` for the params.\n ...arg: any\n ) => infer R\n ? R\n : Evolved\n : Required[K];\n }\n : T;\n\n/**\n * Creates a new object by applying functions that is included in `evolver` object parameter\n * to the `data` object parameter according to their corresponding path.\n *\n * Functions included in `evolver` object will not be invoked\n * if its corresponding key does not exist in the `data` object.\n * Also, values included in `data` object will be kept as is\n * if its corresponding key does not exist in the `evolver` object.\n *\n * @param object - Object whose value is applied to the corresponding function\n * that is defined in `evolver` at the same path.\n * @param evolver - Object that include functions that is applied to\n * the corresponding value of `data` object at the same path.\n * @signature\n * evolve(data, evolver)\n * @example\n * const evolver = {\n * count: add(1),\n * time: { elapsed: add(1), remaining: add(-1) },\n * };\n * const data = {\n * id: 10,\n * count: 10,\n * time: { elapsed: 100, remaining: 1400 },\n * };\n * evolve(data, evolver)\n * // => {\n * // id: 10,\n * // count: 11,\n * // time: { elapsed: 101, remaining: 1399 },\n * // }\n * @dataFirst\n * @category Object\n */\nexport function evolve>(\n object: T,\n evolver: E,\n): Evolved;\n\n/**\n * Creates a new object by applying functions that is included in `evolver` object parameter\n * to the `data` object parameter according to their corresponding path.\n *\n * Functions included in `evolver` object will not be invoked\n * if its corresponding key does not exist in the `data` object.\n * Also, values included in `data` object will not be used\n * if its corresponding key does not exist in the `evolver` object.\n *\n * @param evolver - Object that include functions that is applied to\n * the corresponding value of `data` object at the same path.\n * @signature\n * evolve(evolver)(data)\n * @example\n * const evolver = {\n * count: add(1),\n * time: { elapsed: add(1), remaining: add(-1) },\n * };\n * const data = {\n * id: 10,\n * count: 10,\n * time: { elapsed: 100, remaining: 1400 },\n * };\n * pipe(data, evolve(evolver))\n * // => {\n * // id: 10,\n * // count: 11,\n * // time: { elapsed: 101, remaining: 1399 },\n * // }\n * @dataLast\n * @category Object\n */\nexport function evolve>(\n evolver: E,\n): (object: T) => Evolved;\n\nexport function evolve(...args: readonly unknown[]): unknown {\n return purry(evolveImplementation, args);\n}\n\nfunction evolveImplementation(data: unknown, evolver: GenericEvolver): unknown {\n if (typeof data !== \"object\" || data === null) {\n return data;\n }\n\n const out: Record = { ...data };\n\n for (const [key, value] of Object.entries(evolver)) {\n if (key in out) {\n out[key] =\n typeof value === \"function\"\n ? value(out[key])\n : evolveImplementation(out[key], value);\n }\n }\n\n return out;\n}\n", "import type { Writable } from \"type-fest\";\nimport type { FilteredArray } from \"./internal/types/FilteredArray\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { SKIP_ITEM } from \"./internal/utilityEvaluators\";\nimport { purry } from \"./purry\";\n\n// When the predicate used for filter isn't refining (like a type-predicate) we\n// can narrow the result slightly if it's also trivial (it returns the same\n// result for all items). This is uncommon, but can be useful to \"short-circuit\"\n// the filter.\ntype NonRefinedFilteredArray<\n T extends IterableContainer,\n IsItemIncluded extends boolean,\n> = boolean extends IsItemIncluded\n ? // We don't know which items of the array the predicate would allow in the\n // output so we can only safely say that the result is an array with items\n // from the input array.\n // TODO: Theoretically we could build an output shape that would take into account the **order** of elements in the input array by reconstructing it with every single element in it either included or not, but this type can grow to a union of as much as 2^n options which might not be usable in practice.\n T[number][]\n : IsItemIncluded extends true\n ? // If the predicate is always true we return a shallow copy of the array.\n // If it was originally readonly we need to strip that away.\n Writable\n : // If the predicate is always false we will always return an empty\n // array.\n [];\n\n/**\n * Creates a shallow copy of a portion of a given array, filtered down to just\n * the elements from the given array that pass the test implemented by the\n * provided function. Equivalent to `Array.prototype.filter`.\n *\n * @param data - The array to filter.\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to keep the element in the resulting array, and `false`\n * otherwise. A type-predicate can also be used to narrow the result.\n * @returns A shallow copy of the given array containing just the elements that\n * pass the test. If no elements pass the test, an empty array is returned.\n * @signature\n * filter(data, predicate)\n * @example\n * filter([1, 2, 3], x => x % 2 === 1) // => [1, 3]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function filter<\n T extends IterableContainer,\n Condition extends T[number],\n>(\n data: T,\n predicate: (value: T[number], index: number, data: T) => value is Condition,\n): FilteredArray;\nexport function filter<\n T extends IterableContainer,\n IsItemIncluded extends boolean,\n>(\n data: T,\n predicate: (value: T[number], index: number, data: T) => IsItemIncluded,\n): NonRefinedFilteredArray;\n\n/**\n * Creates a shallow copy of a portion of a given array, filtered down to just\n * the elements from the given array that pass the test implemented by the\n * provided function. Equivalent to `Array.prototype.filter`.\n *\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to keep the element in the resulting array, and `false`\n * otherwise.\n * @returns A shallow copy of the given array containing just the elements that\n * pass the test. If no elements pass the test, an empty array is returned.\n * @signature\n * filter(predicate)(data)\n * @example\n * pipe([1, 2, 3], filter(x => x % 2 === 1)) // => [1, 3]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function filter<\n T extends IterableContainer,\n Condition extends T[number],\n>(\n predicate: (value: T[number], index: number, data: T) => value is Condition,\n): (data: T) => FilteredArray;\nexport function filter<\n T extends IterableContainer,\n IsItemIncluded extends boolean,\n>(\n predicate: (value: T[number], index: number, data: T) => IsItemIncluded,\n): (data: T) => NonRefinedFilteredArray;\n\nexport function filter(...args: readonly unknown[]): unknown {\n return purry(filterImplementation, args, lazyImplementation);\n}\n\nconst filterImplementation = (\n data: readonly T[],\n predicate: (value: T, index: number, array: readonly T[]) => boolean,\n): T[] => data.filter(predicate);\n\nconst lazyImplementation =\n (\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n ): LazyEvaluator =>\n (value, index, data) =>\n predicate(value, index, data)\n ? { done: false, hasNext: true, next: value }\n : SKIP_ITEM;\n", "import type { StrictFunction } from \"./types/StrictFunction\";\n\ntype Single = Func & { readonly single: true };\n\nexport const toSingle = (fn: Func): Single =>\n Object.assign(fn, { single: true as const });\n", "import { toSingle } from \"./internal/toSingle\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { SKIP_ITEM } from \"./internal/utilityEvaluators\";\nimport { purry } from \"./purry\";\n\n/**\n * Returns the first element in the provided array that satisfies the provided\n * testing function. If no values satisfy the testing function, `undefined` is\n * returned.\n *\n * Similar functions:\n * * `findLast` - If you need the last element that satisfies the provided testing function.\n * * `findIndex` - If you need the index of the found element in the array.\n * * `indexOf` - If you need to find the index of a value.\n * * `includes` - If you need to find if a value exists in an array.\n * * `some` - If you need to find if any element satisfies the provided testing function.\n * * `filter` - If you need to find all elements that satisfy the provided testing function.\n *\n * @param data - The items to search in.\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to indicate a matching element has been found, and\n * `false` otherwise. A type-predicate can also be used to narrow the result.\n * @returns The first element in the array that satisfies the provided testing\n * function. Otherwise, `undefined` is returned.\n * @signature\n * find(data, predicate)\n * @example\n * find([1, 3, 4, 6], n => n % 2 === 0) // => 4\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function find(\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n): S | undefined;\nexport function find(\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): T | undefined;\n\n/**\n * Returns the first element in the provided array that satisfies the provided\n * testing function. If no values satisfy the testing function, `undefined` is\n * returned.\n *\n * Similar functions:\n * * `findLast` - If you need the last element that satisfies the provided testing function.\n * * `findIndex` - If you need the index of the found element in the array.\n * * `indexOf` - If you need to find the index of a value.\n * * `includes` - If you need to find if a value exists in an array.\n * * `some` - If you need to find if any element satisfies the provided testing function.\n * * `filter` - If you need to find all elements that satisfy the provided testing function.\n *\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to indicate a matching element has been found, and\n * `false` otherwise. A type-predicate can also be used to narrow the result.\n * @returns The first element in the array that satisfies the provided testing\n * function. Otherwise, `undefined` is returned.\n * @signature\n * find(predicate)(data)\n * @example\n * pipe(\n * [1, 3, 4, 6],\n * find(n => n % 2 === 0)\n * ) // => 4\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function find(\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n): (data: readonly T[]) => S | undefined;\nexport function find(\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): (data: readonly T[]) => T | undefined;\n\nexport function find(...args: readonly unknown[]): unknown {\n return purry(findImplementation, args, toSingle(lazyImplementation));\n}\n\nconst findImplementation = (\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n): S | undefined => data.find(predicate);\n\nconst lazyImplementation =\n (\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n ): LazyEvaluator =>\n (value, index, data) =>\n predicate(value, index, data)\n ? { done: true, hasNext: true, next: value }\n : SKIP_ITEM;\n", "import { purry } from \"./purry\";\n\n/**\n * Returns the index of the first element in an array that satisfies the\n * provided testing function. If no elements satisfy the testing function, -1 is\n * returned.\n *\n * See also the `find` method, which returns the first element that satisfies\n * the testing function (rather than its index).\n *\n * @param data - The items to search in.\n * @param predicate - A function to execute for each element in the array. It\n * should return a `true` to indicate a matching element has been found, and a\n * `false` otherwise.\n * @returns The index of the first element in the array that passes the test.\n * Otherwise, -1.\n * @signature\n * findIndex(data, predicate)\n * @example\n * findIndex([1, 3, 4, 6], n => n % 2 === 0) // => 2\n * @dataFirst\n * @category Array\n */\nexport function findIndex(\n data: readonly T[],\n predicate: (value: T, index: number, obj: readonly T[]) => boolean,\n): number;\n\n/**\n * Returns the index of the first element in an array that satisfies the\n * provided testing function. If no elements satisfy the testing function, -1 is\n * returned.\n *\n * See also the `find` method, which returns the first element that satisfies\n * the testing function (rather than its index).\n *\n * @param predicate - A function to execute for each element in the array. It\n * should return a `true` to indicate a matching element has been found, and a\n * `false` otherwise.\n * @returns The index of the first element in the array that passes the test.\n * Otherwise, -1.\n * @signature\n * findIndex(predicate)(data)\n * @example\n * pipe(\n * [1, 3, 4, 6],\n * findIndex(n => n % 2 === 0)\n * ); // => 2\n * @dataLast\n * @category Array\n */\nexport function findIndex(\n predicate: (value: T, index: number, obj: readonly T[]) => boolean,\n): (data: readonly T[]) => number;\n\nexport function findIndex(...args: readonly unknown[]): unknown {\n return purry(findIndexImplementation, args);\n}\n\nconst findIndexImplementation = (\n data: readonly T[],\n predicate: (value: T, index: number, obj: readonly T[]) => boolean,\n): number => data.findIndex(predicate);\n", "import { purry } from \"./purry\";\n\n/**\n * Iterates the array in reverse order and returns the value of the first\n * element that satisfies the provided testing function. If no elements satisfy\n * the testing function, undefined is returned.\n *\n * Similar functions:\n * * `find` - If you need the first element that satisfies the provided testing function.\n * * `findLastIndex` - If you need the index of the found element in the array.\n * * `lastIndexOf` - If you need to find the index of a value.\n * * `includes` - If you need to find if a value exists in an array.\n * * `some` - If you need to find if any element satisfies the provided testing function.\n * * `filter` - If you need to find all elements that satisfy the provided testing function.\n *\n * @param data - The items to search in.\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to indicate a matching element has been found, and\n * `false` otherwise. A type-predicate can also be used to narrow the result.\n * @returns The last (highest-index) element in the array that satisfies the\n * provided testing function; undefined if no matching element is found.\n * @signature\n * findLast(data, predicate)\n * @example\n * findLast([1, 3, 4, 6], n => n % 2 === 1) // => 3\n * @dataFirst\n * @category Array\n */\nexport function findLast(\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n): S | undefined;\nexport function findLast(\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): T | undefined;\n\n/**\n * Iterates the array in reverse order and returns the value of the first\n * element that satisfies the provided testing function. If no elements satisfy\n * the testing function, undefined is returned.\n *\n * Similar functions:\n * * `find` - If you need the first element that satisfies the provided testing function.\n * * `findLastIndex` - If you need the index of the found element in the array.\n * * `lastIndexOf` - If you need to find the index of a value.\n * * `includes` - If you need to find if a value exists in an array.\n * * `some` - If you need to find if any element satisfies the provided testing function.\n * * `filter` - If you need to find all elements that satisfy the provided testing function.\n *\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to indicate a matching element has been found, and\n * `false` otherwise. A type-predicate can also be used to narrow the result.\n * @returns The last (highest-index) element in the array that satisfies the\n * provided testing function; undefined if no matching element is found.\n * @signature\n * findLast(predicate)(data)\n * @example\n * pipe(\n * [1, 3, 4, 6],\n * findLast(n => n % 2 === 1)\n * ) // => 3\n * @dataLast\n * @category Array\n */\nexport function findLast(\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n): (data: readonly T[]) => S | undefined;\nexport function findLast(\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): (data: readonly T[]) => T | undefined;\n\nexport function findLast(...args: readonly unknown[]): unknown {\n return purry(findLastImplementation, args);\n}\n\nconst findLastImplementation = (\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n): S | undefined => {\n // TODO [>2]: When node 18 reaches end-of-life bump target lib to ES2023+ and use `Array.prototype.findLast` here.\n\n for (let i = data.length - 1; i >= 0; i--) {\n const item = data[i]!;\n if (predicate(item, i, data)) {\n return item;\n }\n }\n\n return undefined;\n};\n", "import { purry } from \"./purry\";\n\n/**\n * Iterates the array in reverse order and returns the index of the first\n * element that satisfies the provided testing function. If no elements satisfy\n * the testing function, -1 is returned.\n *\n * See also `findLast` which returns the value of last element that satisfies\n * the testing function (rather than its index).\n *\n * @param data - The items to search in.\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to indicate a matching element has been found, and\n * `false` otherwise.\n * @returns The index of the last (highest-index) element in the array that\n * passes the test. Otherwise -1 if no matching element is found.\n * @signature\n * findLastIndex(data, predicate)\n * @example\n * findLastIndex([1, 3, 4, 6], n => n % 2 === 1) // => 1\n * @dataFirst\n * @category Array\n */\nexport function findLastIndex(\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): number;\n\n/**\n * Iterates the array in reverse order and returns the index of the first\n * element that satisfies the provided testing function. If no elements satisfy\n * the testing function, -1 is returned.\n *\n * See also `findLast` which returns the value of last element that satisfies\n * the testing function (rather than its index).\n *\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to indicate a matching element has been found, and\n * `false` otherwise.\n * @returns The index of the last (highest-index) element in the array that\n * passes the test. Otherwise -1 if no matching element is found.\n * @signature\n * findLastIndex(fn)(items)\n * @example\n * pipe(\n * [1, 3, 4, 6],\n * findLastIndex(n => n % 2 === 1)\n * ) // => 1\n * @dataLast\n * @category Array\n */\nexport function findLastIndex(\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): (array: readonly T[]) => number;\n\nexport function findLastIndex(...args: readonly unknown[]): unknown {\n return purry(findLastIndexImplementation, args);\n}\n\nconst findLastIndexImplementation = (\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): number => {\n // TODO [>2]: When node 18 reaches end-of-life bump target lib to ES2023+ and use `Array.prototype.findLastIndex` here.\n\n for (let i = data.length - 1; i >= 0; i--) {\n if (predicate(data[i]!, i, data)) {\n return i;\n }\n }\n\n return -1;\n};\n", "import { toSingle } from \"./internal/toSingle\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { purry } from \"./purry\";\n\ntype First = T extends []\n ? undefined\n : T extends readonly [unknown, ...unknown[]]\n ? T[0]\n : T extends readonly [...infer Pre, infer Last]\n ? Last | Pre[0]\n : T[0] | undefined;\n\n/**\n * Gets the first element of `array`.\n *\n * @param data - The array.\n * @returns The first element of the array.\n * @signature\n * first(array)\n * @example\n * first([1, 2, 3]) // => 1\n * first([]) // => undefined\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function first(data: T): First;\n\n/**\n * Gets the first element of `array`.\n *\n * @returns The first element of the array.\n * @signature\n * first()(array)\n * @example\n * pipe(\n * [1, 2, 4, 8, 16],\n * filter(x => x > 3),\n * first(),\n * x => x + 1\n * ); // => 5\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function first(): (data: T) => First;\n\nexport function first(...args: readonly unknown[]): unknown {\n return purry(firstImplementation, args, toSingle(lazyImplementation));\n}\n\nconst firstImplementation = ([item]: readonly T[]): T | undefined => item;\n\nconst lazyImplementation = (): LazyEvaluator => firstLazy;\n\nconst firstLazy = (value: T) =>\n ({ hasNext: true, next: value, done: true }) as const;\n", "import { hasAtLeast } from \"./hasAtLeast\";\nimport { purryOrderRules, type OrderRule } from \"./internal/purryOrderRules\";\nimport type { CompareFunction } from \"./internal/types/CompareFunction\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { NonEmptyArray } from \"./internal/types/NonEmptyArray\";\n\ntype FirstBy =\n | T[number]\n | (T extends readonly [unknown, ...(readonly unknown[])]\n ? never\n : T extends readonly [...(readonly unknown[]), unknown]\n ? never\n : undefined);\n\n/**\n * Find the first element in the array that adheres to the order rules provided. This is a superset of what a typical `maxBy` or `minBy` function would do as it allows defining \"tie-breaker\" rules when values are equal, and allows comparing items using any logic. This function is equivalent to calling `first(sortBy(...))` but runs at *O(n)* instead of *O(nlogn)*.\n *\n * Use `nthBy` if you need an element other that the first, or `takeFirstBy` if you more than just the first element.\n *\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns The first element by the order criteria, or `undefined` if the array\n * is empty. (The function provides strong typing if the input type assures the\n * array isn't empty).\n * @signature\n * firstBy(...rules)(data);\n * @example\n * const max = pipe([1,2,3], firstBy([identity(), \"desc\"])); // => 3;\n * const min = pipe([1,2,3], firstBy(identity())); // => 1;\n *\n * const data = [{ a: \"a\" }, { a: \"aa\" }, { a: \"aaa\" }] as const;\n * const maxBy = pipe(data, firstBy([(item) => item.a.length, \"desc\"])); // => { a: \"aaa\" };\n * const minBy = pipe(data, firstBy((item) => item.a.length)); // => { a: \"a\" };\n *\n * const data = [{type: \"cat\", size: 1}, {type: \"cat\", size: 2}, {type: \"dog\", size: 3}] as const;\n * const multi = pipe(data, firstBy(prop('type'), [prop('size'), 'desc'])); // => {type: \"cat\", size: 2}\n * @dataLast\n * @category Array\n */\nexport function firstBy(\n ...rules: Readonly>>\n): (data: T) => FirstBy;\n\n/**\n * Find the first element in the array that adheres to the order rules provided. This is a superset of what a typical `maxBy` or `minBy` function would do as it allows defining \"tie-breaker\" rules when values are equal, and allows comparing items using any logic. This function is equivalent to calling `first(sortBy(...))` but runs at *O(n)* instead of *O(nlogn)*.\n *\n * Use `nthBy` if you need an element other that the first, or `takeFirstBy` if you more than just the first element.\n *\n * @param data - An array of items.\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns The first element by the order criteria, or `undefined` if the array\n * is empty. (The function provides strong typing if the input type assures the\n * array isn't empty).\n * @signature\n * firstBy(data, ...rules);\n * @example\n * const max = firstBy([1,2,3], [identity(), \"desc\"]); // => 3;\n * const min = firstBy([1,2,3], identity()); // => 1;\n *\n * const data = [{ a: \"a\" }, { a: \"aa\" }, { a: \"aaa\" }] as const;\n * const maxBy = firstBy(data, [(item) => item.a.length, \"desc\"]); // => { a: \"aaa\" };\n * const minBy = firstBy(data, (item) => item.a.length); // => { a: \"a\" };\n *\n * const data = [{type: \"cat\", size: 1}, {type: \"cat\", size: 2}, {type: \"dog\", size: 3}] as const;\n * const multi = firstBy(data, prop('type'), [prop('size'), 'desc']); // => {type: \"cat\", size: 2}\n * @dataFirst\n * @category Array\n */\nexport function firstBy(\n data: T,\n ...rules: Readonly>>\n): FirstBy;\n\nexport function firstBy(...args: readonly unknown[]): unknown {\n return purryOrderRules(firstByImplementation, args);\n}\n\nfunction firstByImplementation(\n data: readonly T[],\n compareFn: CompareFunction,\n): T | undefined {\n if (!hasAtLeast(data, 2)) {\n // If we have 0 or 1 item we simply return the trivial result.\n return data[0];\n }\n\n let [currentFirst] = data;\n\n // Remove the first item, we won't compare it with itself.\n const [, ...rest] = data;\n for (const item of rest) {\n if (compareFn(item, currentFirst) < 0) {\n // item comes before currentFirst in the order.\n currentFirst = item;\n }\n }\n\n return currentFirst;\n}\n", "import type { IsNumericLiteral } from \"type-fest\";\nimport { lazyDataLastImpl } from \"./internal/lazyDataLastImpl\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport type { LazyResult } from \"./internal/types/LazyResult\";\nimport { lazyIdentityEvaluator } from \"./internal/utilityEvaluators\";\n\ntype FlatArray<\n T,\n Depth extends number,\n Iteration extends readonly unknown[] = [],\n> = Depth extends Iteration[\"length\"]\n ? // Stopping condition for the recursion when the array is a tuple.\n T\n : T extends readonly []\n ? // Trivial result when the array is empty.\n []\n : T extends readonly [infer Item, ...infer Rest]\n ? // Tuples could be special-cased by \"iterating\" over each item\n // separately so that we maintain more information from the input type,\n // instead of putting all values in a union.\n [\n ...(Item extends IterableContainer\n ? // If the item itself is an array we continue going deeper\n FlatArray\n : // But if it isn't we add it to the output tuple\n [Item]),\n // And we merge this with the result from the rest of the tuple.\n ...FlatArray,\n ]\n : // For simple arrays we compute the item type, and wrap it with an\n // array.\n FlatSimpleArrayItems[];\n\n// This type is based on the built-in type for `Array.prototype.flat` from the\n// ES2019 Array typescript library, but we improved it to handle any depth\n// (avoiding the fixed `20` in the built-in type).\n// @see https://github.com/microsoft/TypeScript/blob/main/src/lib/es2019.array.d.ts#L1-L5\ntype FlatSimpleArrayItems<\n T,\n Depth extends number,\n Iteration extends readonly unknown[] = [],\n IsDone extends boolean = false,\n> = {\n done: T;\n recur: T extends readonly (infer InnerArr)[]\n ? FlatSimpleArrayItems<\n InnerArr,\n Depth,\n [...Iteration, unknown],\n // This trick allows us to continue 1 iteration more than the depth,\n // which is required to flatten the array up to depth.\n Iteration[\"length\"] extends Depth ? true : false\n >\n : T;\n}[IsDone extends true ? \"done\" : \"recur\"];\n\n/**\n * Creates a new array with all sub-array elements concatenated into it\n * recursively up to the specified depth. Equivalent to the built-in\n * `Array.prototype.flat` method.\n *\n * @param data - The items to flatten.\n * @param depth - The depth level specifying how deep a nested array structure\n * should be flattened. Defaults to 1. Non literal values (those typed as\n * `number`cannot be used. `Infinity`, `Number.POSITIVE_INFINITY` and\n * `Number.MAX_VALUE` are all typed as `number` and can't be used either. For\n * \"unlimited\" depth use a literal value that would exceed your expected\n * practical maximum nesting level.\n * @signature\n * flat(data)\n * flat(data, depth)\n * @example\n * flat([[1, 2], [3, 4], [5], [[6]]]); // => [1, 2, 3, 4, 5, [6]]\n * flat([[[1]], [[2]]], 2); // => [1, 2]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function flat(\n data: T,\n depth?: IsNumericLiteral extends true ? Depth : never,\n): FlatArray;\n\n/**\n * Creates a new array with all sub-array elements concatenated into it\n * recursively up to the specified depth. Equivalent to the built-in\n * `Array.prototype.flat` method.\n *\n * @param depth - The depth level specifying how deep a nested array structure\n * should be flattened. Defaults to 1.\n * @signature\n * flat()(data)\n * flat(depth)(data)\n * @example\n * pipe([[1, 2], [3, 4], [5], [[6]]], flat()); // => [1, 2, 3, 4, 5, [6]]\n * pipe([[[1]], [[2]]], flat(2)); // => [1, 2]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function flat(\n depth?: IsNumericLiteral extends true ? Depth : never,\n): (data: T) => FlatArray;\n\nexport function flat(\n dataOrDepth?: IterableContainer | number,\n depth?: number,\n): unknown {\n if (typeof dataOrDepth === \"object\") {\n return flatImplementation(dataOrDepth, depth);\n }\n\n return lazyDataLastImpl(\n flatImplementation,\n dataOrDepth === undefined ? [] : [dataOrDepth],\n lazyImplementation,\n );\n}\n\nconst flatImplementation = (\n data: IterableContainer,\n depth?: number,\n): IterableContainer => (depth === undefined ? data.flat() : data.flat(depth));\n\nconst lazyImplementation = (depth?: number): LazyEvaluator =>\n depth === undefined || depth === 1\n ? lazyShallow\n : depth <= 0\n ? lazyIdentityEvaluator\n : (value) =>\n Array.isArray(value)\n ? {\n next: value.flat(depth - 1),\n hasNext: true,\n hasMany: true,\n done: false,\n }\n : { next: value, hasNext: true, done: false };\n\n// This function is pulled out so that we don't generate a new arrow function\n// each time. Because it doesn't need to run with recursion it could be pulled\n// out from the lazyImplementation and be reused for all invocations.\nconst lazyShallow = (value: T): LazyResult =>\n Array.isArray(value)\n ? { next: value, hasNext: true, hasMany: true, done: false }\n : { next: value, hasNext: true, done: false };\n", "import type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { purry } from \"./purry\";\n\n/**\n * Returns a new array formed by applying a given callback function to each\n * element of the array, and then flattening the result by one level. It is\n * identical to a `map` followed by a `flat` of depth 1\n * (`flat(map(data, ...args))`), but slightly more efficient than calling those\n * two methods separately. Equivalent to `Array.prototype.flatMap`.\n *\n * @param data - The items to map and flatten.\n * @param callbackfn - A function to execute for each element in the array. It\n * should return an array containing new elements of the new array, or a single\n * non-array value to be added to the new array.\n * @returns A new array with each element being the result of the callback\n * function and flattened by a depth of 1.\n * @signature\n * flatMap(data, callbackfn)\n * @example\n * flatMap([1, 2, 3], x => [x, x * 10]) // => [1, 10, 2, 20, 3, 30]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function flatMap(\n data: readonly T[],\n callbackfn: (input: T, index: number, data: readonly T[]) => readonly U[] | U,\n): U[];\n\n/**\n * Returns a new array formed by applying a given callback function to each\n * element of the array, and then flattening the result by one level. It is\n * identical to a `map` followed by a `flat` of depth 1\n * (`flat(map(data, ...args))`), but slightly more efficient than calling those\n * two methods separately. Equivalent to `Array.prototype.flatMap`.\n *\n * @param callbackfn - A function to execute for each element in the array. It\n * should return an array containing new elements of the new array, or a single\n * non-array value to be added to the new array.\n * @returns A new array with each element being the result of the callback\n * function and flattened by a depth of 1.\n * @signature\n * flatMap(callbackfn)(data)\n * @example\n * pipe([1, 2, 3], flatMap(x => [x, x * 10])) // => [1, 10, 2, 20, 3, 30]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function flatMap(\n callbackfn: (input: T, index: number, data: readonly T[]) => readonly U[] | U,\n): (data: readonly T[]) => U[];\n\nexport function flatMap(...args: readonly unknown[]): unknown {\n return purry(flatMapImplementation, args, lazyImplementation);\n}\n\nconst flatMapImplementation = (\n data: readonly T[],\n callbackfn: (value: T, index: number, data: readonly T[]) => readonly U[] | U,\n): U[] => data.flatMap(callbackfn);\n\nconst lazyImplementation =\n (\n callbackfn: (\n input: T,\n index: number,\n data: readonly T[],\n ) => K | readonly K[],\n ): LazyEvaluator =>\n // @ts-expect-error [ts2322] - We need to make LazyMany better so it accommodate the typing here...\n (value, index, data) => {\n const next = callbackfn(value, index, data);\n return Array.isArray(next)\n ? { done: false, hasNext: true, hasMany: true, next }\n : { done: false, hasNext: true, next };\n };\n", "import { withPrecision } from \"./internal/withPrecision\";\nimport { purry } from \"./purry\";\n\n/**\n * Rounds down a given number to a specific precision.\n * If you'd like to round down to an integer (i.e. use this function with constant `precision === 0`),\n * use `Math.floor` instead, as it won't incur the additional library overhead.\n *\n * @param value - The number to round down.\n * @param precision - The precision to round down to. Must be an integer between -15 and 15.\n * @signature\n * floor(value, precision);\n * @example\n * floor(123.9876, 3) // => 123.987\n * floor(483.22243, 1) // => 483.2\n * floor(8541, -1) // => 8540\n * floor(456789, -3) // => 456000\n * @dataFirst\n * @category Number\n */\nexport function floor(value: number, precision: number): number;\n\n/**\n * Rounds down a given number to a specific precision.\n * If you'd like to round down to an integer (i.e. use this function with constant `precision === 0`),\n * use `Math.floor` instead, as it won't incur the additional library overhead.\n *\n * @param precision - The precision to round down to. Must be an integer between -15 and 15.\n * @signature\n * floor(precision)(value);\n * @example\n * floor(3)(123.9876) // => 123.987\n * floor(1)(483.22243) // => 483.2\n * floor(-1)(8541) // => 8540\n * floor(-3)(456789) // => 456000\n * @dataLast\n * @category Number\n */\nexport function floor(precision: number): (value: number) => number;\n\nexport function floor(...args: readonly unknown[]): unknown {\n return purry(withPrecision(Math.floor), args);\n}\n", "import type { Writable } from \"type-fest\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { purry } from \"./purry\";\n\n/**\n * Executes a provided function once for each array element. Equivalent to\n * `Array.prototype.forEach`.\n *\n * The dataLast version returns the original array (instead of not returning\n * anything (`void`)) to allow using it in a pipe. When not used in a `pipe` the\n * returned array is equal to the input array (by reference), and not a shallow\n * copy of it!\n *\n * @param data - The values that would be iterated on.\n * @param callbackfn - A function to execute for each element in the array.\n * @signature\n * forEach(data, callbackfn)\n * @example\n * forEach([1, 2, 3], x => {\n * console.log(x)\n * });\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function forEach(\n data: T,\n callbackfn: (value: T[number], index: number, data: T) => void,\n): void;\n\n/**\n * Executes a provided function once for each array element. Equivalent to\n * `Array.prototype.forEach`.\n *\n * The dataLast version returns the original array (instead of not returning\n * anything (`void`)) to allow using it in a pipe. The returned array is the\n * same reference as the input array, and not a shallow copy of it!\n *\n * @param callbackfn - A function to execute for each element in the array.\n * @returns The original array (the ref itself, not a shallow copy of it).\n * @signature\n * forEach(callbackfn)(data)\n * @example\n * pipe(\n * [1, 2, 3],\n * forEach(x => {\n * console.log(x)\n * })\n * ) // => [1, 2, 3]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function forEach(\n callbackfn: (value: T[number], index: number, data: T) => void,\n): (data: T) => Writable;\n\nexport function forEach(...args: readonly unknown[]): unknown {\n return purry(forEachImplementation, args, lazyImplementation);\n}\n\nfunction forEachImplementation(\n data: readonly T[],\n callbackfn: (value: T, index: number, data: readonly T[]) => void,\n): T[] {\n // eslint-disable-next-line unicorn/no-array-for-each -- We are intentionally proxying the built in forEach, it's up to the user to decide if they want to use a for loop instead.\n data.forEach(callbackfn);\n // @ts-expect-error [ts4104] - Because the dataFirst signature returns void this is only a problem when the dataLast function is used **outside** of a pipe; for these cases we warn the user that this is happening.\n return data;\n}\n\nconst lazyImplementation =\n (\n callbackfn: (value: T, index: number, data: readonly T[]) => void,\n ): LazyEvaluator =>\n (value, index, data) => {\n callbackfn(value, index, data);\n return { done: false, hasNext: true, next: value };\n };\n", "import type { EnumerableStringKeyOf } from \"./internal/types/EnumerableStringKeyOf\";\nimport type { EnumerableStringKeyedValueOf } from \"./internal/types/EnumerableStringKeyedValueOf\";\nimport { purry } from \"./purry\";\n\n/**\n * Iterate an object using a defined callback function.\n *\n * The dataLast version returns the original object (instead of not returning\n * anything (`void`)) to allow using it in a pipe. The returned object is the\n * same reference as the input object, and not a shallow copy of it!\n *\n * @param data - The object who'se entries would be iterated on.\n * @param callbackfn - A function to execute for each element in the array.\n * @signature\n * forEachObj(object, fn)\n * @example\n * forEachObj({a: 1}, (val, key, obj) => {\n * console.log(`${key}: ${val}`)\n * }) // \"a: 1\"\n * @dataFirst\n * @category Object\n */\nexport function forEachObj(\n data: T,\n callbackfn: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n obj: T,\n ) => void,\n): void;\n\n/**\n * Iterate an object using a defined callback function.\n *\n * The dataLast version returns the original object (instead of not returning\n * anything (`void`)) to allow using it in a pipe. The returned object is the\n * same reference as the input object, and not a shallow copy of it!\n *\n * @param callbackfn - A function to execute for each element in the array.\n * @returns The original object (the ref itself, not a shallow copy of it).\n * @signature\n * forEachObj(fn)(object)\n * @example\n * pipe(\n * {a: 1},\n * forEachObj((val, key) => console.log(`${key}: ${val}`))\n * ) // \"a: 1\"\n * @dataLast\n * @category Object\n */\nexport function forEachObj(\n callbackfn: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n obj: T,\n ) => void,\n): (object: T) => T;\n\nexport function forEachObj(...args: readonly unknown[]): unknown {\n return purry(forEachObjImplementation, args);\n}\n\nfunction forEachObjImplementation(\n data: T,\n fn: (value: unknown, key: string, data: T) => void,\n): T {\n for (const [key, value] of Object.entries(data)) {\n fn(value, key, data);\n }\n return data;\n}\n", "import type { Simplify } from \"type-fest\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { RemedaTypeError } from \"./internal/types/RemedaTypeError\";\nimport { purry } from \"./purry\";\n\ntype FromEntriesError = RemedaTypeError<\n \"fromEntries\",\n Message\n>;\n\ntype Entry = readonly [\n key: Key,\n value: Value,\n];\n\n// The 2 kinds of arrays we accept result in different kinds of outputs:\n// 1. If the input is a *tuple*, we know exactly what entries it would hold,\n// and thus can type the result so that the keys are required. We will then run\n// recursively on the rest of the tuple.\n// 2. If the input is an *array* then any keys defined in the array might not\n// actually show up in runtime, and thus need to be optional. (e.g. if the input\n// is an empty array).\ntype FromEntries = Entries extends readonly [\n infer First,\n ...infer Tail,\n]\n ? FromEntriesTuple\n : Entries extends readonly [...infer Head, infer Last]\n ? FromEntriesTuple\n : Entries extends IterableContainer\n ? FromEntriesArray\n : FromEntriesError<\"Entries array-like could not be inferred\">;\n\n// For strict tuples we build the result by intersecting each entry as a record\n// between it's key and value, recursively. The recursion goes through our main\n// type so that we support tuples which also contain rest parts.\ntype FromEntriesTuple = E extends Entry\n ? FromEntries & Record\n : FromEntriesError<\"Array-like contains a non-entry element\">;\n\n// For the array case we also need to handle what kind of keys it defines:\n// 1. If it defines a *broad* key (one that has an infinite set of values, like\n// number or string) then the result is a simple record.\n// 2. If the keys are *literals* then we need to make the record partial\n// (because those props are explicit), and we need to match each key it's\n// specific possible value, as defined by the entries.\n//\n// Note that this destination between keys is the result of how typescript\n// considers Record to be **implicitly** partial, whereas\n// Record<\"a\", unknown> is not.\ntype FromEntriesArray> =\n string extends AllKeys\n ? Record\n : number extends AllKeys\n ? Record\n : symbol extends AllKeys\n ? Record\n : FromEntriesArrayWithLiteralKeys;\n\n// This type is largely copied from `objectFromEntries` in the repo:\n// *sindresorhus/ts-extras* but makes all properties of the output optional,\n// which is more correct because we can't assure that an entry will exist for\n// every possible prop/key of the input.\n// @see https://github.com/sindresorhus/ts-extras/blob/44f57392c5f027268330771996c4fdf9260b22d6/source/object-from-entries.ts)\ntype FromEntriesArrayWithLiteralKeys> =\n {\n [P in AllKeys]?: ValueForKey;\n };\n\ntype AllKeys> = Extract<\n Entries[number],\n Entry\n>[0];\n\n// I tried and failed to simplify the type here! What the ternary does here is\n// to support the cases where the entries are defined by a single type that\n// defines all entries, but it defines the keys as a union of literals\n// (`['a' | 'b', number]`); which is different from the output of toPairs\n// which would define a separate tuple literal for each key (`['a', number] |\n// ['b', number]`). We need to support both cases!\ntype ValueForKey<\n Entries extends IterableContainer,\n K extends PropertyKey,\n> = (Extract> extends never\n ? Entries[number]\n : Extract>)[1];\n\n/**\n * Creates a new object from an array of tuples by pairing up first and second elements as {[key]: value}.\n * If a tuple is not supplied for any element in the array, the element will be ignored\n * If duplicate keys exist, the tuple with the greatest index in the input array will be preferred.\n *\n * The strict option supports more sophisticated use-cases like those that would\n * result when calling the strict `toPairs` function.\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * * `fromKeys` - Builds an object from an array of *keys* and a mapper for values.\n * * `indexBy` - Builds an object from an array of *values* and a mapper for keys.\n * * `pullObject` - Builds an object from an array of items with mappers for *both* keys and values.\n * Refer to the docs for more details.\n *\n * @param entries - An array of key-value pairs.\n * @signature\n * fromEntries(tuples)\n * @example\n * fromEntries([['a', 'b'], ['c', 'd']]); // => {a: 'b', c: 'd'}\n * @dataFirst\n * @category Object\n */\nexport function fromEntries>(\n entries: Entries,\n): Simplify>;\n\n/**\n * Creates a new object from an array of tuples by pairing up first and second elements as {[key]: value}.\n * If a tuple is not supplied for any element in the array, the element will be ignored\n * If duplicate keys exist, the tuple with the greatest index in the input array will be preferred.\n *\n * The strict option supports more sophisticated use-cases like those that would\n * result when calling the strict `toPairs` function.\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * * `fromKeys` - Builds an object from an array of *keys* and a mapper for values.\n * * `indexBy` - Builds an object from an array of *values* and a mapper for keys.\n * * `pullObject` - Builds an object from an array of items with mappers for *both* keys and values.\n * Refer to the docs for more details.\n *\n * @signature\n * fromEntries()(tuples)\n * @example\n * pipe(\n * [['a', 'b'], ['c', 'd']] as const,\n * fromEntries(),\n * ); // => {a: 'b', c: 'd'}\n * @dataLast\n * @category Object\n */\nexport function fromEntries(): >(\n entries: Entries,\n) => Simplify>;\n\nexport function fromEntries(...args: readonly unknown[]): unknown {\n return purry(Object.fromEntries, args);\n}\n", "import type { Simplify } from \"type-fest\";\nimport type { BoundedPartial } from \"./internal/types/BoundedPartial\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n// Takes a union of literals and creates a union of records with the value V for\n// each key **separately**\n// @example ExactlyOneKey<\"cat\" | \"dog\", boolean> // { cat: boolean } | { dog: boolean }\ntype ExactlyOneKey = T extends PropertyKey ? Record : never;\n\ntype FromKeys = T extends readonly []\n ? // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- We want to return an empty object type here, but it's not trivial to build that in Typescript, other fixer suggestions like Record or Record both break our type tests so they don't do what we need here. Because the result is mutable this might be the correct type after all...\n {}\n : T extends readonly [infer Head, ...infer Rest]\n ? ExactlyOneKey & FromKeys\n : T[number] extends PropertyKey\n ? BoundedPartial>\n : never;\n\n/**\n * Creates an object that maps each key in `data` to the result of `mapper` for\n * that key. Duplicate keys are overwritten, guaranteeing that `mapper` is run\n * for each item in `data`.\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * * `indexBy` - Builds an object from an array of *values* and a mapper for keys.\n * * `pullObject` - Builds an object from an array of items with mappers for *both* keys and values.\n * * `fromEntries` - Builds an object from an array of key-value pairs.\n * Refer to the docs for more details.\n *\n * @param data - An array of keys of the output object. All items in the array\n * would be keys in the output array.\n * @param mapper - Takes a key and returns the value that would be associated\n * with that key.\n * @signature\n * fromKeys(data, mapper);\n * @example\n * fromKeys([\"cat\", \"dog\"], length()); // { cat: 3, dog: 3 } (typed as Partial>)\n * fromKeys([1, 2], add(1)); // { 1: 2, 2: 3 } (typed as Partial>)\n * @dataFirst\n * @category Object\n */\nexport function fromKeys, V>(\n data: T,\n mapper: (item: T[number], index: number, data: T) => V,\n): Simplify>;\n\n/**\n * Creates an object that maps each key in `data` to the result of `mapper` for\n * that key. Duplicate keys are overwritten, guaranteeing that `mapper` is run\n * for each item in `data`.\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * * `indexBy` - Builds an object from an array of *values* and a mapper for keys.\n * * `pullObject` - Builds an object from an array of items with mappers for *both* keys and values.\n * * `fromEntries` - Builds an object from an array of key-value pairs.\n * Refer to the docs for more details.\n *\n * @param mapper - Takes a key and returns the value that would be associated\n * with that key.\n * @signature\n * fromKeys(mapper)(data);\n * @example\n * pipe([\"cat\", \"dog\"], fromKeys(length())); // { cat: 3, dog: 3 } (typed as Partial>)\n * pipe([1, 2], fromKeys(add(1))); // { 1: 2, 2: 3 } (typed as Partial>)\n * @dataLast\n * @category Object\n */\nexport function fromKeys, V>(\n mapper: (item: T[number], index: number, data: T) => V,\n): (data: T) => Simplify>;\n\nexport function fromKeys(...args: readonly unknown[]): unknown {\n return purry(fromKeysImplementation, args);\n}\n\nfunction fromKeysImplementation, V>(\n data: T,\n mapper: (item: T[number], index: number, data: T) => V,\n): FromKeys {\n const result: Partial> = {};\n\n for (const [index, key] of data.entries()) {\n // @ts-expect-error [ts7053] - There's no easy way to make Typescript aware that the items in T would be keys in the output object because it's type is built recursively and the \"being an item of an array\" property of a type is not \"carried over\" in the recursive type definition.\n result[key] = mapper(key, index, data);\n }\n\n return result as FromKeys;\n}\n", "import type { RequireAtLeastOne } from \"type-fest\";\n\n// We use the value provided by the reducer to also determine if a call\n// was done during a timeout period. This means that even when no reducer\n// is provided, we still need a dummy reducer that would return something\n// other than `undefined`. It is safe to cast this to R (which might be\n// anything) because the callback would never use it as it would be typed\n// as a zero-args function.\nconst VOID_REDUCER_SYMBOL = Symbol(\"funnel/voidReducer\");\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Intentional, so that it could be used as a default value above.\nconst voidReducer = (): R => VOID_REDUCER_SYMBOL as R;\n\ntype FunnelOptions = {\n readonly reducer?: (accumulator: R | undefined, ...params: Args) => R;\n} & FunnelTimingOptions;\n\n// Not all combinations of timing options are valid, there are dependencies\n// between them to ensure users can't configure the funnel in a way which would\n// cause it to never trigger.\ntype FunnelTimingOptions =\n | ({ readonly triggerAt?: \"end\" } & (\n | ({ readonly minGapMs: number } & RequireAtLeastOne<{\n readonly minQuietPeriodMs: number;\n readonly maxBurstDurationMs: number;\n }>)\n | {\n readonly minQuietPeriodMs?: number;\n readonly maxBurstDurationMs?: number;\n readonly minGapMs?: never;\n }\n ))\n | {\n readonly triggerAt: \"start\" | \"both\";\n readonly minQuietPeriodMs?: number;\n readonly maxBurstDurationMs?: number;\n readonly minGapMs?: number;\n };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- TypeScript has some quirks with generic function types, and works best with `any` and not `unknown`. This follows the typing of built-in utilities like `ReturnType` and `Parameters`.\ntype RestArguments = any[];\n\ntype Funnel = {\n /**\n * Call the function. This might result in the `execute` function being called\n * now or later, depending on it's configuration and it's current state.\n *\n * @param args - The args are defined by the `reducer` function.\n */\n\n readonly call: (...args: Args) => void;\n\n /**\n * Resets the funnel to it's initial state. Any calls made since the last\n * invocation will be discarded.\n */\n readonly cancel: () => void;\n\n /**\n * Triggers an invocation regardless of the current state of the funnel.\n * Like any other invocation, The funnel will also be reset to it's initial\n * state afterwards.\n */\n readonly flush: () => void;\n\n /**\n * The funnel is in it's initial state (there are no active timeouts).\n */\n readonly isIdle: boolean;\n};\n\n/**\n * Creates a funnel that controls the timing and execution of `callback`. Its\n * main purpose is to manage multiple consecutive (usually fast-paced) calls,\n * reshaping them according to a defined batching strategy and timing policy.\n * This is useful when handling uncontrolled call rates, such as DOM events or\n * network traffic. It can implement strategies like debouncing, throttling,\n * batching, and more.\n *\n * An optional `reducer` function can be provided to allow passing data to the\n * callback via calls to `call` (otherwise the signature of `call` takes no\n * arguments).\n *\n * Typing is inferred from `callback`s param, and from the rest params that\n * the optional `reducer` function accepts. Use **explicit** types for these\n * to ensure that everything _else_ is well-typed.\n *\n * Notice that this function constructs a funnel **object**, and does **not**\n * execute anything when called. The returned object should be used to execute\n * the funnel via the its `call` method.\n *\n * - Debouncing: use `minQuietPeriodMs` and any `triggerAt`.\n * - Throttling: use `minGapMs` and `triggerAt: \"start\"` or `\"both\"`.\n * - Batching: See the reference implementation in [`funnel.reference-batch.test.ts`](https://github.com/remeda/remeda/blob/main/packages/remeda/src/funnel.reference-batch.test.ts).\n *\n * @param callback - The main function that would be invoked periodically based\n * on `options`. The function would take the latest result of the `reducer`; if\n * no calls where made since the last time it was invoked it will not be\n * invoked. (If a return value is needed, it should be passed via a reference or\n * via closure to the outer scope of the funnel).\n * @param options - An object that defines when `execute` should be invoked,\n * relative to the calls of `call`. An empty/missing options object is\n * equivalent to setting `minQuietPeriodMs` to `0`.\n * @param options.reducer - Combines the arguments passed to `call` with the\n * value computed on the previous call (or `undefined` on the first time). The\n * goal of the function is to extract and summarize the data needed for\n * `callback`. It should be fast and simple as it is called often and should\n * defer heavy operations to the `execute` function. If the final value\n * is `undefined`, `callback` will not be called.\n * @param options.triggerAt - At what \"edges\" of the funnel's burst window\n * would `execute` invoke:\n * - `start` - the function will be invoked immediately (within the **same**\n * execution frame!), and any subsequent calls would be ignored until the funnel\n * is idle again. During this period `reducer` will also not be called.\n * - `end` - the function will **not** be invoked initially but the timer will\n * be started. Any calls during this time would be passed to the reducer, and\n * when the timers are done, the reduced result would trigger an invocation.\n * - `both` - the function will be invoked immediately, and then the funnel\n * would behave as if it was in the 'end' state. Default: 'end'.\n * @param options.minQuietPeriodMs - The burst timer prevents subsequent calls\n * in short succession to cause excessive invocations (aka \"debounce\"). This\n * duration represents the **minimum** amount of time that needs to pass\n * between calls (the \"quiet\" part) in order for the subsequent call to **not**\n * be considered part of the burst. In other words, as long as calls are faster\n * than this, they are considered part of the burst and the burst is extended.\n * @param options.maxBurstDurationMs - Bursts are extended every time a call is\n * made within the burst period. This means that the burst period could be\n * extended indefinitely. To prevent such cases, a maximum burst duration could\n * be defined. When `minQuietPeriodMs` is not defined and this option is, they\n * will both share the same value.\n * @param options.minGapMs - A minimum duration between calls of `execute`.\n * This is maintained regardless of the shape of the burst and is ensured even\n * if the `maxBurstDurationMs` is reached before it. (aka \"throttle\").\n * @returns A funnel with a `call` function that is used to trigger invocations.\n * In addition to it the funnel also comes with the following functions and\n * properties:\n * - `cancel` - Resets the funnel to it's initial state, discarding the current\n * `reducer` result without calling `execute` on it.\n * - `flush` - Triggers an invocation even if there are active timeouts, and\n * then resets the funnel to it's initial state.\n * - `isIdle` - Checks if there are any active timeouts.\n * @signature\n * funnel(callback, options);\n * @example\n * const debouncer = funnel(\n * () => {\n * console.log(\"Callback executed!\");\n * },\n * { minQuietPeriodMs: 100 },\n * );\n * debouncer.call();\n * debouncer.call();\n *\n * const throttle = funnel(\n * () => {\n * console.log(\"Callback executed!\");\n * },\n * { minGapMs: 100, triggerAt: \"start\" },\n * );\n * throttle.call();\n * throttle.call();\n * @category Function\n */\nexport function funnel(\n callback: (data: R) => void,\n {\n triggerAt = \"end\",\n minQuietPeriodMs,\n maxBurstDurationMs,\n minGapMs,\n reducer = voidReducer,\n }: FunnelOptions,\n): Funnel {\n // We manage execution via 2 timeouts, one to track bursts of calls, and one\n // to track the interval between invocations. Together we refer to the period\n // where any of these are active as a \"cool-down period\".\n let burstTimeoutId: ReturnType | undefined;\n let intervalTimeoutId: ReturnType | undefined;\n\n // Until invoked, all calls are reduced into a single value that would be sent\n // to the executor on invocation.\n let preparedData: R | undefined;\n\n // In order to be able to limit the total size of the burst (when\n // `maxBurstDurationMs` is used) we need to track when the burst started.\n let burstStartTimestamp: number | undefined;\n\n const invoke = (): void => {\n const param = preparedData;\n if (param === undefined) {\n // There were no calls during both cool-down periods.\n return;\n }\n\n // Make sure the args aren't accidentally used again\n preparedData = undefined;\n\n if (param === VOID_REDUCER_SYMBOL) {\n // @ts-expect-error [ts2554] -- R is typed as `never` because we hide the\n // symbol that `voidReducer` returns; there's no way to make TypeScript\n // aware of this.\n callback();\n } else {\n callback(param);\n }\n\n if (minGapMs !== undefined) {\n intervalTimeoutId = setTimeout(handleIntervalEnd, minGapMs);\n }\n };\n\n const handleIntervalEnd = (): void => {\n // When called via a timeout the timeout is already cleared, but when called\n // via `flush` we need to manually clear it.\n clearTimeout(intervalTimeoutId);\n intervalTimeoutId = undefined;\n\n if (burstTimeoutId !== undefined) {\n // As long as one of the timeouts is active we don't invoke the function.\n // Each timeout's end event handler has a call to invoke, so we are\n // guaranteed to invoke the function eventually.\n return;\n }\n\n invoke();\n };\n\n const handleBurstEnd = (): void => {\n // When called via a timeout the timeout is already cleared, but when called\n // via `flush` we need to manually clear it.\n clearTimeout(burstTimeoutId);\n burstTimeoutId = undefined;\n burstStartTimestamp = undefined;\n\n if (intervalTimeoutId !== undefined) {\n // As long as one of the timeouts is active we don't invoke the function.\n // Each timeout's end event handler has a call to invoke, so we are\n // guaranteed to invoke the function eventually.\n return;\n }\n\n invoke();\n };\n\n return {\n call: (...args) => {\n // We act based on the initial state of the timeouts before the call is\n // handled and causes the timeouts to change.\n const wasIdle =\n burstTimeoutId === undefined && intervalTimeoutId === undefined;\n\n if (triggerAt !== \"start\" || wasIdle) {\n preparedData = reducer(preparedData, ...args);\n }\n\n if (burstTimeoutId === undefined && !wasIdle) {\n // We are not in an active burst period but in an interval period. We\n // don't start a new burst window until the next invoke.\n return;\n }\n\n if (\n minQuietPeriodMs !== undefined ||\n maxBurstDurationMs !== undefined ||\n minGapMs === undefined\n ) {\n // The timeout tracking the burst period needs to be reset every time\n // another call is made so that it waits the full cool-down duration\n // before it is released.\n clearTimeout(burstTimeoutId);\n\n const now = Date.now();\n\n burstStartTimestamp ??= now;\n\n const burstRemainingMs =\n maxBurstDurationMs === undefined\n ? (minQuietPeriodMs ?? 0)\n : Math.min(\n minQuietPeriodMs ?? maxBurstDurationMs,\n // We need to account for the time already spent so that we\n // don't wait longer than the maxDelay.\n Math.max(0, maxBurstDurationMs - (now - burstStartTimestamp)),\n );\n\n burstTimeoutId = setTimeout(handleBurstEnd, burstRemainingMs);\n }\n\n if (triggerAt !== \"end\" && wasIdle) {\n invoke();\n }\n },\n\n cancel: () => {\n clearTimeout(burstTimeoutId);\n burstTimeoutId = undefined;\n burstStartTimestamp = undefined;\n\n clearTimeout(intervalTimeoutId);\n intervalTimeoutId = undefined;\n\n preparedData = undefined;\n },\n\n flush: () => {\n handleBurstEnd();\n handleIntervalEnd();\n },\n\n get isIdle() {\n return burstTimeoutId === undefined && intervalTimeoutId === undefined;\n },\n };\n}\n", "import type { BoundedPartial } from \"./internal/types/BoundedPartial\";\nimport type { NonEmptyArray } from \"./internal/types/NonEmptyArray\";\nimport { purry } from \"./purry\";\n\n/**\n * Groups the elements of a given iterable according to the string values\n * returned by a provided callback function. The returned object has separate\n * properties for each group, containing arrays with the elements in the group.\n * Unlike the built in `Object.groupBy` this function also allows the callback to\n * return `undefined` in order to exclude the item from being added to any\n * group.\n *\n * If you are grouping objects by a property of theirs (e.g.\n * `groupBy(data, ({ myProp }) => myProp)` or `groupBy(data, prop('myProp'))`)\n * consider using `groupByProp` (e.g. `groupByProp(data, 'myProp')`) instead,\n * as it would provide better typing.\n *\n * @param data - The items to group.\n * @param callbackfn - A function to execute for each element in the iterable.\n * It should return a value indicating the group of the current element, or\n * `undefined` when the item should be excluded from any group.\n * @returns An object with properties for all groups, each assigned to an array\n * containing the elements of the associated group.\n * @signature\n * groupBy(data, callbackfn)\n * @example\n * groupBy([{a: 'cat'}, {a: 'dog'}] as const, prop('a')) // => {cat: [{a: 'cat'}], dog: [{a: 'dog'}]}\n * groupBy([0, 1], x => x % 2 === 0 ? 'even' : undefined) // => {even: [0]}\n * @dataFirst\n * @category Array\n */\nexport function groupBy(\n data: readonly T[],\n callbackfn: (value: T, index: number, data: readonly T[]) => Key | undefined,\n): BoundedPartial>>;\n\n/**\n * Groups the elements of a given iterable according to the string values\n * returned by a provided callback function. The returned object has separate\n * properties for each group, containing arrays with the elements in the group.\n * Unlike the built in `Object.groupBy` this function also allows the callback to\n * return `undefined` in order to exclude the item from being added to any\n * group.\n *\n * If you are grouping objects by a property of theirs (e.g.\n * `groupBy(data, ({ myProp }) => myProp)` or `groupBy(data, prop('myProp'))`)\n * consider using `groupByProp` (e.g. `groupByProp(data, 'myProp')`) instead,\n * as it would provide better typing.\n *\n * @param callbackfn - A function to execute for each element in the iterable.\n * It should return a value indicating the group of the current element, or\n * `undefined` when the item should be excluded from any group.\n * @returns An object with properties for all groups, each assigned to an array\n * containing the elements of the associated group.\n * @signature\n * groupBy(callbackfn)(data);\n * @example\n * pipe(\n * [{a: 'cat'}, {a: 'dog'}] as const,\n * groupBy(prop('a')),\n * ); // => {cat: [{a: 'cat'}], dog: [{a: 'dog'}]}\n * pipe(\n * [0, 1],\n * groupBy(x => x % 2 === 0 ? 'even' : undefined),\n * ); // => {even: [0]}\n * @dataLast\n * @category Array\n */\nexport function groupBy(\n callbackfn: (value: T, index: number, data: readonly T[]) => Key | undefined,\n): (items: readonly T[]) => BoundedPartial>>;\n\nexport function groupBy(...args: readonly unknown[]): unknown {\n return purry(groupByImplementation, args);\n}\n\nconst groupByImplementation = (\n data: readonly T[],\n callbackfn: (value: T, index: number, data: readonly T[]) => Key | undefined,\n): BoundedPartial>> => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Using Object.create(null) allows us to remove everything from the prototype chain, leaving it as a pure object that only has the keys *we* add to it. This prevents issues like the one raised in #1046\n const output: BoundedPartial>> =\n Object.create(null);\n\n for (let index = 0; index < data.length; index++) {\n // Accessing the object directly instead of via an iterator on the `entries` showed significant performance benefits while benchmarking.\n const item = data[index];\n\n // @ts-expect-error [ts2345] -- TypeScript is not able to infer that the index wouldn't overflow the array and that it shouldn't add `undefined` to the type. We don't want to use the `!` operator here because it's semantics are different because it changes the type of `item` to `NonNullable` which is inaccurate because T itself could have `undefined` as a valid value.\n const key = callbackfn(item, index, data);\n if (key !== undefined) {\n // Once the prototype chain is fixed, it is safe to access the prop directly without needing to check existence or types.\n const items = output[key];\n\n if (items === undefined) {\n // It is more performant to create a 1-element array over creating an empty array and falling through to a unified the push. It is also more performant to mutate the existing object over using spread to continually create new objects on every unique key.\n // @ts-expect-error [ts2322] -- In addition to the typing issue we have for `item`, this line also creates a typing issue for the whole object, as TypeScript is having a hard time inferring what values could be adding to the object.\n output[key] = [item];\n } else {\n // It is more performant to add the items to an existing array over continually creating a new array every time we add an item to it.\n // @ts-expect-error [ts2345] -- See comment above about the effective typing for `item` here.\n items.push(item);\n }\n }\n }\n\n // Set the prototype as if we initialized our object as a normal object (e.g. `{}`). Without this none of the built-in object methods like `toString` would work on this object and it would act differently than expected.\n Object.setPrototypeOf(output, Object.prototype);\n\n return output;\n};\n", "import type {\n AllUnionFields,\n ConditionalKeys,\n EmptyObject,\n IsNever,\n Or,\n Simplify,\n} from \"type-fest\";\nimport type { ArrayRequiredPrefix } from \"./internal/types/ArrayRequiredPrefix\";\nimport type { BoundedPartial } from \"./internal/types/BoundedPartial\";\nimport type { FilteredArray } from \"./internal/types/FilteredArray\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { TupleParts } from \"./internal/types/TupleParts\";\nimport { purry } from \"./purry\";\n\ntype GroupByProp> =\n // Distribute unions.\n T extends unknown\n ? FixEmptyObject>>\n : never;\n\n// For each possible value of the prop we filter the input tuple with the prop\n// assigned to the value, e.g. `{ type: \"cat\" }`\ntype GroupByPropRaw<\n T extends IterableContainer,\n Prop extends GroupableProps,\n> = {\n [Value in AllPropValues]: FilteredArray>;\n};\n\n// We can only group by props that only have values that could be used to key\n// an object (i.e. PropertyKey), or if they are undefined (which would filter\n// them out of the grouping).\ntype GroupableProps = ConditionalKeys<\n ItemsSuperObject,\n PropertyKey | undefined\n>;\n\n// The union of all possible values that the prop could have within the tuple.\ntype AllPropValues<\n T extends IterableContainer,\n Prop extends GroupableProps,\n> = Extract[Prop], PropertyKey>;\n\n// Creates a singular object type that all items in the tuple would extend. This\n// provides us a way to check, for each prop, what are all values it would\n// have within the tuple. We use this to map which props are candidates for\n// grouping, and when a prop is selected, the full list of values that would\n// exist in the output. For example:\n// `{ a: number, b: \"cat\", c: string } | { b: \"dog\", c: Date }` is groupable\n// by 'a' and 'b', but not 'c', and when selecting by 'b', the output would\n// have a prop for \"cat\" and a prop for \"dog\".\ntype ItemsSuperObject = AllUnionFields<\n // If the input tuple contains optional elements they would add `undefined` to\n // T[number] (and could technically show up in the array itself). Because\n // undefined breaks AllUnionFields we need to remove it from the union. This\n // is OK because we handle this in the implementation too.\n Exclude\n>;\n\n// When the input array is empty the constructed result type would be `{}`\n// because our mapped type would never run; but this doesn't represent the\n// semantics of the return value for that case, because it effectively means\n// \"any object\" and not \"empty object\". This can happen in 2 situations:\n// A union of tuples where one of the tuples doesn't have any item with the\n// groupable prop, or when the groupable prop has a value of `undefined` for\n// all items. The former is extra problematic because it would add `| {}` to the\n// result type which effectively cancels out all other parts of the union.\ntype FixEmptyObject = IsNever extends true ? EmptyObject : T;\n\n// Group by can never return an empty tuple but our filtered arrays might not\n// represent that. We need to reshape the tuples so that they always have at\n// least one item in them.\ntype EnsureValuesAreNonEmpty> =\n Simplify<\n Omit> &\n BoundedPartial>>>\n >;\n\n// Go over the keys the object and return those that their value can accept an\n// empty array.\ntype PossiblyEmptyArrayKeys> =\n keyof T extends infer Key extends unknown\n ? Key extends keyof T\n ? IsNonEmptyArray extends true\n ? never\n : Key\n : never\n : never;\n\n// An array is non-empty if any of the fixed parts are non-empty.\ntype IsNonEmptyArray = Or<\n IsNonEmptyFixedTuple[\"required\"]>,\n IsNonEmptyFixedTuple[\"suffix\"]>\n>;\n\n// A fixed tuple (one without optional or a rest element in it) is non-empty if\n// we can't extract the empty tuple from it.\ntype IsNonEmptyFixedTuple = IsNever>;\n\n// We coerce the arbitrary array values to have a prefix of at least one item.\ntype CoercedNonEmptyValues> = {\n [P in keyof T]: ArrayRequiredPrefix;\n};\n\n/**\n * Groups the elements of an array of objects based on the values of a\n * specified property of those objects. The result would contain a property for\n * each unique value of the specific property, with it's value being the input\n * array filtered to only items that have that property set to that value.\n * For any object where the property is missing, or if it's value is\n * `undefined` the item would be filtered out.\n *\n * The grouping property is enforced at the type level to exist in at least one\n * item and to never have a value that cannot be used as an object key (e.g. it\n * must be `PropertyKey | undefined`).\n *\n * The resulting arrays are filtered with the prop and it's value as a\n * type-guard, effectively narrowing the items in each output arrays. This\n * means that when the grouping property is the discriminator of a\n * discriminated union type each output array would contain just the subtype for\n * that value.\n *\n * If you need more control over the grouping you should use `groupBy` instead.\n *\n * @param data - The items to group.\n * @param prop - The property name to group by.\n * @signature\n * groupByProp(data, prop)\n * @example\n * const result = groupByProp(\n * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }\n * [{ a: 'cat' }, { a: 'dog' }] as const,\n * 'a',\n * );\n * @dataFirst\n * @category Array\n */\nexport function groupByProp<\n T extends IterableContainer,\n const Prop extends GroupableProps,\n>(data: T, prop: Prop): GroupByProp;\n\n/**\n * Groups the elements of an array of objects based on the values of a\n * specified property of those objects. The result would contain a property for\n * each unique value of the specific property, with it's value being the input\n * array filtered to only items that have that property set to that value.\n * For any object where the property is missing, or if it's value is\n * `undefined` the item would be filtered out.\n *\n * The grouping property is enforced at the type level to exist in at least one\n * item and to never have a value that cannot be used as an object key (e.g. it\n * must be `PropertyKey | undefined`).\n *\n * The resulting arrays are filtered with the prop and it's value as a\n * type-guard, effectively narrowing the items in each output arrays. This\n * means that when the grouping property is the discriminator of a\n * discriminated union type each output array would contain just the subtype for\n * that value.\n *\n * If you need more control over the grouping you should use `groupBy` instead.\n *\n * @param prop - The property name to group by.\n * @signature\n * groupByProp(prop)(data);\n * @example\n * const result = pipe(\n * // ^? { cat: [{ a: 'cat' }], dog: [{ a: 'dog' }] }\n * [{ a: 'cat' }, { a: 'dog' }] as const,\n * groupByProp('a'),\n * );\n * @dataLast\n * @category Array\n */\nexport function groupByProp<\n T extends IterableContainer,\n const Prop extends GroupableProps,\n>(prop: Prop): (data: T) => GroupByProp;\n\nexport function groupByProp(...args: readonly unknown[]): unknown {\n return purry(groupByPropImplementation, args);\n}\n\nfunction groupByPropImplementation<\n T extends IterableContainer,\n Prop extends GroupableProps,\n>(data: T, prop: Prop): GroupByProp {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Using Object.create(null) allows us to remove everything from the prototype chain, leaving it as a pure object that only has the keys *we* add to it. This prevents issues like the one raised in #1046\n const output: BoundedPartial, T[number][]>> =\n Object.create(null);\n\n for (const item of data) {\n const key = item?.[prop];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- This is incorrect and a result of TypeScript not inferring the type of `key` correctly. It stems from a chain of bad inferences which start with `item` being inferred eagerly as `unknown` (because of: https://github.com/microsoft/TypeScript/issues/61750). When accessing a prop on `unknown` TypeScript then infers the result as `{}[Prop] | undefined`. What follows is that `{}[Prop]` is inferred as `never` (because we are accessing an object with no props defined on it), leading the union to simplify to just `undefined`. The correct type should have been `AllPropValues | undefined`.\n if (key !== undefined) {\n // Once the prototype chain is fixed, it is safe to access the prop\n // directly without needing to check existence or types.\n const items = output[key];\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Following the problem above, TypeScript then thinks that `key` is `never`, and also types `items` as `never`.\n if (items === undefined) {\n // It is more performant to create a 1-element array over creating an\n // empty array and falling through to a unified the push. It is also\n // more performant to mutate the existing object over using spread to\n // continually create new objects on every unique key.\n // @ts-expect-error [ts7053] -- For the same reasons as mentioned above, TypeScript isn't inferring `key` correctly, and therefore is erroring when trying to access the output object using it.\n output[key] = [item];\n } else {\n // It is more performant to add the items to an existing array instead\n // of creating a new array via spreading every time we add an item to\n // it (e.g., `[...current, item]`).\n // @ts-expect-error [ts2339] -- And again here `items` is still `never`.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- See above.\n items.push(item);\n }\n }\n }\n\n // Set the prototype as if we initialized our object as a normal object (e.g.\n // `{}`). Without this none of the built-in object methods like `toString`\n // would work on this object and it would act differently than expected.\n Object.setPrototypeOf(output, Object.prototype);\n\n // @ts-expect-error [ts2322] -- This is fine! We use a broader type for output while we build it because it more accurately represents the shape of the object *while it is being built*. TypeScript can't tell that we finished building the object so can't ensure that output matches the expected output at this point.\n return output;\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Performs a *deep structural* comparison between two values to determine if\n * they are equivalent. For primitive values this is equivalent to `===`, for\n * arrays the check would be performed on every item recursively, in order, and\n * for objects all props will be compared recursively.\n *\n * The built-in Date and RegExp are special-cased and will be compared by their\n * values.\n *\n * !IMPORTANT: TypedArrays and symbol properties of objects are not supported\n * right now and might result in unexpected behavior. Please open an issue in\n * the Remeda github project if you need support for these types.\n *\n * The result would be narrowed to the second value so that the function can be\n * used as a type guard.\n *\n * See:\n * - `isStrictEqual` if you don't need a deep comparison and just want to\n * check for simple (`===`, `Object.is`) equality.\n * - `isShallowEqual` if you need to compare arrays and objects \"by-value\" but\n * don't want to recurse into their values.\n *\n * @param data - The first value to compare.\n * @param other - The second value to compare.\n * @signature\n * isDeepEqual(data, other)\n * @example\n * isDeepEqual(1, 1) //=> true\n * isDeepEqual(1, '1') //=> false\n * isDeepEqual([1, 2, 3], [1, 2, 3]) //=> true\n * @dataFirst\n * @category Guard\n */\nexport function isDeepEqual(\n data: T,\n other: T extends Exclude ? S : never,\n): data is S;\nexport function isDeepEqual(data: T, other: T): boolean;\n\n/**\n * Performs a *deep structural* comparison between two values to determine if\n * they are equivalent. For primitive values this is equivalent to `===`, for\n * arrays the check would be performed on every item recursively, in order, and\n * for objects all props will be compared recursively.\n *\n * The built-in Date and RegExp are special-cased and will be compared by their\n * values.\n *\n * !IMPORTANT: TypedArrays and symbol properties of objects are not supported\n * right now and might result in unexpected behavior. Please open an issue in\n * the Remeda github project if you need support for these types.\n *\n * The result would be narrowed to the second value so that the function can be\n * used as a type guard.\n *\n * See:\n * - `isStrictEqual` if you don't need a deep comparison and just want to\n * check for simple (`===`, `Object.is`) equality.\n * - `isShallowEqual` if you need to compare arrays and objects \"by-value\" but\n * don't want to recurse into their values.\n *\n * @param other - The second value to compare.\n * @signature\n * isDeepEqual(other)(data)\n * @example\n * pipe(1, isDeepEqual(1)); //=> true\n * pipe(1, isDeepEqual('1')); //=> false\n * pipe([1, 2, 3], isDeepEqual([1, 2, 3])); //=> true\n * @dataLast\n * @category Guard\n */\nexport function isDeepEqual(\n other: T extends Exclude ? S : never,\n): (data: T) => data is S;\nexport function isDeepEqual(other: T): (data: T) => boolean;\n\nexport function isDeepEqual(...args: readonly unknown[]): unknown {\n return purry(isDeepEqualImplementation, args);\n}\n\nfunction isDeepEqualImplementation(data: unknown, other: T): data is T {\n if (data === other) {\n return true;\n }\n\n if (Object.is(data, other)) {\n // We want to ignore the slight differences between `===` and `Object.is` as\n // both of them largely define equality from a semantic point-of-view.\n return true;\n }\n\n if (typeof data !== \"object\" || typeof other !== \"object\") {\n return false;\n }\n\n if (data === null || other === null) {\n return false;\n }\n\n if (Object.getPrototypeOf(data) !== Object.getPrototypeOf(other)) {\n // If the objects don't share a prototype it's unlikely that they are\n // semantically equal. It is technically possible to build 2 prototypes that\n // act the same but are not equal (at the reference level, checked via\n // `===`) and then create 2 objects that are equal although we would fail on\n // them. Because this is so unlikely, the optimization we gain here for the\n // rest of the function by assuming that `other` is of the same type as\n // `data` is more than worth it.\n return false;\n }\n\n if (Array.isArray(data)) {\n return isDeepEqualArrays(data, other as unknown as readonly unknown[]);\n }\n\n if (data instanceof Map) {\n return isDeepEqualMaps(data, other as unknown as Map);\n }\n\n if (data instanceof Set) {\n return isDeepEqualSets(data, other as unknown as Set);\n }\n\n if (data instanceof Date) {\n return data.getTime() === (other as unknown as Date).getTime();\n }\n\n if (data instanceof RegExp) {\n return data.toString() === (other as unknown as RegExp).toString();\n }\n\n // At this point we only know that the 2 objects share a prototype and are not\n // any of the previous types. They could be plain objects (Object.prototype),\n // they could be classes, they could be other built-ins, or they could be\n // something weird. We assume that comparing values by keys is enough to judge\n // their equality.\n\n if (Object.keys(data).length !== Object.keys(other).length) {\n return false;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (!(key in other)) {\n return false;\n }\n\n if (\n !isDeepEqualImplementation(\n value,\n // @ts-expect-error [ts7053] - We already checked that `other` has `key`\n other[key],\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isDeepEqualArrays(\n data: readonly unknown[],\n other: readonly unknown[],\n): boolean {\n if (data.length !== other.length) {\n return false;\n }\n\n for (const [index, item] of data.entries()) {\n if (!isDeepEqualImplementation(item, other[index])) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isDeepEqualMaps(\n data: ReadonlyMap,\n other: ReadonlyMap,\n): boolean {\n if (data.size !== other.size) {\n return false;\n }\n\n for (const [key, value] of data.entries()) {\n if (!other.has(key)) {\n return false;\n }\n\n if (!isDeepEqualImplementation(value, other.get(key))) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isDeepEqualSets(\n data: ReadonlySet,\n other: ReadonlySet,\n): boolean {\n if (data.size !== other.size) {\n return false;\n }\n\n // To ensure we only count each item once we need to \"remember\" which items of\n // the other set we've already matched against. We do this by creating a copy\n // of the other set and removing items from it as we find them in the data\n // set.\n const otherCopy = [...other];\n\n for (const dataItem of data) {\n let isFound = false;\n\n for (const [index, otherItem] of otherCopy.entries()) {\n if (isDeepEqualImplementation(dataItem, otherItem)) {\n isFound = true;\n otherCopy.splice(index, 1);\n break;\n }\n }\n\n if (!isFound) {\n return false;\n }\n }\n\n return true;\n}\n", "import type { Simplify, Tagged } from \"type-fest\";\nimport { isDeepEqual } from \"./isDeepEqual\";\nimport { purry } from \"./purry\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars -- We want to confine the typing to a specific symbol\ndeclare const HAS_SUB_OBJECT_BRAND: unique symbol;\n\ntype HasSubObjectGuard = Simplify<\n Tagged\n>;\n\ntype HasSubObjectObjectValue = Partial<{\n [Key in keyof A & keyof B]: A[Key] & B[Key] extends never\n ? B[Key]\n : A[Key] | B[Key] extends object\n ? HasSubObjectObjectValue\n : A[Key] & B[Key] extends object\n ? B[Key]\n : A[Key];\n}> & {\n [Key in\n | Exclude\n | Exclude]: Key extends keyof B ? B[Key] : never;\n};\n\ntype HasSubObjectData<\n Data,\n SubObject,\n RData = Required,\n RSubObject = Required,\n> = Partial<{\n [Key in keyof RData & keyof RSubObject]: RData[Key] &\n RSubObject[Key] extends never\n ? RSubObject[Key]\n : RData[Key] | RSubObject[Key] extends object\n ? HasSubObjectObjectValue\n : RData[Key] & RSubObject[Key] extends object\n ? RSubObject[Key]\n : RData[Key];\n}> & {\n [Key in Exclude]: SubObject[Key];\n};\n\ntype HasSubObjectSubObject<\n SubObject,\n Data,\n RSubObject = Required,\n RData = Required,\n> = Partial<{\n [Key in keyof RData & keyof RSubObject]: RData[Key] &\n RSubObject[Key] extends never\n ? RData[Key]\n : RData[Key] | RSubObject[Key] extends object\n ? HasSubObjectObjectValue\n : RData[Key] & RSubObject[Key] extends object\n ? RData[Key]\n : RSubObject[Key];\n}> &\n Record, never>;\n\n/**\n * Checks if `subObject` is a sub-object of `object`, which means for every\n * property and value in `subObject`, there's the same property in `object`\n * with an equal value. Equality is checked with `isDeepEqual`.\n *\n * @param data - The object to test.\n * @param subObject - The sub-object to test against.\n * @signature\n * hasSubObject(data, subObject)\n * @example\n * hasSubObject({ a: 1, b: 2, c: 3 }, { a: 1, c: 3 }) //=> true\n * hasSubObject({ a: 1, b: 2, c: 3 }, { b: 4 }) //=> false\n * hasSubObject({ a: 1, b: 2, c: 3 }, {}) //=> true\n * @dataFirst\n * @category Guard\n */\nexport function hasSubObject<\n T extends object,\n S extends HasSubObjectSubObject,\n>(data: T, subObject: S): data is HasSubObjectGuard;\n\n/**\n * Checks if `subObject` is a sub-object of `object`, which means for every\n * property and value in `subObject`, there's the same property in `object`\n * with an equal value. Equality is checked with `isDeepEqual`.\n *\n * @param subObject - The sub-object to test against.\n * @signature\n * hasSubObject(subObject)(data)\n * @example\n * hasSubObject({ a: 1, c: 3 })({ a: 1, b: 2, c: 3 }) //=> true\n * hasSubObject({ b: 4 })({ a: 1, b: 2, c: 3 }) //=> false\n * hasSubObject({})({ a: 1, b: 2, c: 3 }) //=> true\n * @dataLast\n * @category Guard\n */\nexport function hasSubObject(\n subObject: S,\n): >(\n data: T,\n) => data is HasSubObjectGuard;\n\nexport function hasSubObject(...args: readonly unknown[]): unknown {\n return purry(hasSubObjectImplementation, args);\n}\n\nfunction hasSubObjectImplementation<\n T extends Record,\n S extends Record,\n>(data: T, subObject: S): data is HasSubObjectGuard {\n for (const [key, value] of Object.entries(subObject)) {\n if (!Object.hasOwn(data, key)) {\n return false;\n }\n\n if (!isDeepEqual(value, data[key])) {\n return false;\n }\n }\n\n return true;\n}\n", "// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Accept functions with more than a single parameter too, we use `any` because that catches all possible cases.\ntype IdentityFunction = (firstParameter: T, ...rest: any) => T;\n\n/**\n * A function that returns the first argument passed to it.\n *\n * Notice that this is a dataLast impl where the function needs to be invoked\n * to get the \"do nothing\" function.\n *\n * See also:\n * * `doNothing` - A function that doesn't return anything.\n * * `constant` - A function that ignores the input arguments and returns the same value on every invocation.\n *\n * @signature\n * identity();\n * @example\n * map([1,2,3], identity()); // => [1,2,3]\n * @category Function\n */\nexport function identity(): IdentityFunction {\n // Notice that the exported identity function is just the \"factory\" for the\n // identity function. We do it this way so that all \"Function\" utilities have\n // a similar API where the function is called, and not just used \"headless\".\n // e.g. `identity()` and not `identity`, just like the API for `constant(1)`.\n return identityImplementation;\n}\n\nconst identityImplementation: IdentityFunction = (firstParameter) =>\n firstParameter;\n", "import type { BoundedPartial } from \"./internal/types/BoundedPartial\";\nimport { purry } from \"./purry\";\n\n/**\n * Converts a list of objects into an object indexing the objects by the given\n * key.\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * * `fromKeys` - Builds an object from an array of *keys* and a mapper for values.\n * * `pullObject` - Builds an object from an array of items with mappers for *both* keys and values.\n * * `fromEntries` - Builds an object from an array of key-value pairs.\n * Refer to the docs for more details.\n *\n * @param data - The array.\n * @param mapper - The indexing function.\n * @signature\n * indexBy(array, fn)\n * @example\n * indexBy(['one', 'two', 'three'], x => x.length) // => {3: 'two', 5: 'three'}\n * @dataFirst\n * @category Array\n */\nexport function indexBy(\n data: readonly T[],\n mapper: (item: T, index: number, data: readonly T[]) => K,\n): BoundedPartial>;\n\n/**\n * Converts a list of objects into an object indexing the objects by the given\n * key.\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * * `fromKeys` - Builds an object from an array of *keys* and a mapper for values.\n * * `pullObject` - Builds an object from an array of items with mappers for *both* keys and values.\n * * `fromEntries` - Builds an object from an array of key-value pairs.\n * Refer to the docs for more details.\n *\n * @param mapper - The indexing function.\n * @signature\n * indexBy(fn)(array)\n * @example\n * pipe(\n * ['one', 'two', 'three'],\n * indexBy(x => x.length)\n * ) // => {3: 'two', 5: 'three'}\n * @dataLast\n * @category Array\n */\nexport function indexBy(\n mapper: (item: T, index: number, data: readonly T[]) => K,\n): (data: readonly T[]) => BoundedPartial>;\n\nexport function indexBy(...args: readonly unknown[]): unknown {\n return purry(indexByImplementation, args);\n}\n\nfunction indexByImplementation(\n data: readonly T[],\n mapper: (item: T, index: number, data: readonly T[]) => K,\n): BoundedPartial> {\n const out: Partial> = {};\n\n for (const [index, item] of data.entries()) {\n const key = mapper(item, index, data);\n out[key] = item;\n }\n\n return out as BoundedPartial>;\n}\n", "import { purryFromLazy } from \"./internal/purryFromLazy\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { SKIP_ITEM, lazyEmptyEvaluator } from \"./internal/utilityEvaluators\";\n\n/**\n * Returns a list of elements that exist in both array. The output maintains the\n * same order as the input. The inputs are treated as multi-sets/bags (multiple\n * copies of items are treated as unique items).\n *\n * @param data - The input items.\n * @param other - The items to compare against.\n * @signature\n * intersection(data, other)\n * @example\n * intersection([1, 2, 3], [2, 3, 5]); // => [2, 3]\n * intersection([1, 1, 2, 2], [1]); // => [1]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function intersection(\n data: readonly T[],\n other: readonly S[],\n): (S & T)[];\n\n/**\n * Returns a list of elements that exist in both array. The output maintains the\n * same order as the input. The inputs are treated as multi-sets/bags (multiple\n * copies of items are treated as unique items).\n *\n * @param other - The items to compare against.\n * @signature\n * intersection(other)(data)\n * @example\n * pipe([1, 2, 3], intersection([2, 3, 5])); // => [2, 3]\n * pipe([1, 1, 2, 2], intersection([1])); // => [1]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function intersection(\n other: readonly S[],\n): (data: readonly T[]) => (S & T)[];\n\nexport function intersection(...args: readonly unknown[]): unknown {\n return purryFromLazy(lazyImplementation, args);\n}\n\nfunction lazyImplementation(\n other: readonly S[],\n): LazyEvaluator {\n if (other.length === 0) {\n return lazyEmptyEvaluator;\n }\n\n // We need to build a more efficient data structure that would allow us to\n // keep track of the number of times we've seen a value in the other array.\n const remaining = new Map();\n for (const value of other) {\n remaining.set(value, (remaining.get(value) ?? 0) + 1);\n }\n\n return (value) => {\n const copies = remaining.get(value);\n\n if (copies === undefined || copies === 0) {\n // The item is either not part of the other array or we've \"used\" enough\n // copies of it so we skip the remaining values.\n return SKIP_ITEM;\n }\n\n // The item is equal to an item in the other array and there are still\n // copies of it to \"account\" for so we return this one and remove it from\n // our ongoing tally.\n if (copies === 1) {\n remaining.delete(value);\n } else {\n remaining.set(value, copies - 1);\n }\n\n return {\n hasNext: true,\n // We can safely cast here because if value was in the `remaining` map, it\n // has to be of type S (that's just how we built it).\n next: value as S & T,\n // We can stop the iteration if the remaining map is empty.\n done: remaining.size === 0,\n };\n };\n}\n", "import { purryFromLazy } from \"./internal/purryFromLazy\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { SKIP_ITEM } from \"./internal/utilityEvaluators\";\n\ntype Comparator = (a: TFirst, b: TSecond) => boolean;\n\n/**\n * Returns a list of intersecting values based on a custom\n * comparator function that compares elements of both arrays.\n *\n * @param array - The source array.\n * @param other - The second array.\n * @param comparator - The custom comparator.\n * @signature\n * intersectionWith(array, other, comparator)\n * @example\n * intersectionWith(\n * [\n * { id: 1, name: 'Ryan' },\n * { id: 3, name: 'Emma' },\n * ],\n * [3, 5],\n * (a, b) => a.id === b,\n * ) // => [{ id: 3, name: 'Emma' }]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function intersectionWith(\n array: readonly TFirst[],\n other: readonly TSecond[],\n comparator: Comparator,\n): TFirst[];\n\n/**\n * Returns a list of intersecting values based on a custom\n * comparator function that compares elements of both arrays.\n *\n * @param other - The second array.\n * @param comparator - The custom comparator.\n * @signature\n * intersectionWith(other, comparator)(array)\n * @example\n * intersectionWith(\n * [3, 5],\n * (a, b) => a.id === b\n * )([\n * { id: 1, name: 'Ryan' },\n * { id: 3, name: 'Emma' },\n * ]); // => [{ id: 3, name: 'Emma' }]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function intersectionWith(\n other: readonly TSecond[],\n /**\n * Type inference doesn't work properly for the comparator's first parameter\n * in data last variant.\n */\n comparator: Comparator,\n): (array: readonly TFirst[]) => TFirst[];\n\nexport function intersectionWith(...args: readonly unknown[]): unknown {\n return purryFromLazy(lazyImplementation, args);\n}\n\nconst lazyImplementation =\n (\n other: readonly TSecond[],\n comparator: Comparator,\n ): LazyEvaluator =>\n (value) =>\n other.some((otherValue) => comparator(value, otherValue))\n ? { done: false, hasNext: true, next: value }\n : SKIP_ITEM;\n", "import type { Simplify } from \"type-fest\";\nimport { purry } from \"./purry\";\nimport type { ToString } from \"./internal/types/ToString\";\n\ntype Inverted = Simplify<{\n -readonly [K in keyof T as K extends number | string\n ? Required[K] extends PropertyKey\n ? Required[K]\n : never\n : never]: ToString;\n}>;\n\n/**\n * Returns an object whose keys and values are swapped. If the object contains duplicate values,\n * subsequent values will overwrite previous values.\n *\n * @param object - The object.\n * @signature\n * invert(object)\n * @example\n * invert({ a: \"d\", b: \"e\", c: \"f\" }) // => { d: \"a\", e: \"b\", f: \"c\" }\n * @dataFirst\n * @category Object\n */\nexport function invert(object: T): Inverted;\n\n/**\n * Returns an object whose keys and values are swapped. If the object contains duplicate values,\n * subsequent values will overwrite previous values.\n *\n * @signature\n * invert()(object)\n * @example\n * pipe({ a: \"d\", b: \"e\", c: \"f\" }, invert()); // => { d: \"a\", e: \"b\", f: \"c\" }\n * @dataLast\n * @category Object\n */\nexport function invert(): (object: T) => Inverted;\n\nexport function invert(...args: readonly unknown[]): unknown {\n return purry(invertImplementation, args);\n}\n\nfunction invertImplementation(\n data: Readonly>,\n): Record {\n const result: Record = {};\n\n for (const [key, value] of Object.entries(data)) {\n result[value] = key;\n }\n\n return result;\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * A function that checks if the passed parameter is an Array and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is an Array, false otherwise.\n * @signature\n * isArray(data)\n * @example\n * isArray([5]) //=> true\n * isArray([]) //=> true\n * isArray('somethingElse') //=> false\n * @category Guard\n */\nexport function isArray(\n data: ArrayLike | T,\n): data is NarrowedTo {\n return Array.isArray(data);\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * A function that checks if the passed parameter is a bigint and narrows its\n * type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is a number, false otherwise.\n * @signature\n * isBigInt(data)\n * @example\n * isBigInt(1n); // => true\n * isBigInt(1); // => false\n * isBigInt('notANumber'); // => false\n * @category Guard\n */\nexport function isBigInt(data: T | bigint): data is NarrowedTo {\n return typeof data === \"bigint\";\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * A function that checks if the passed parameter is a boolean and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is a boolean, false otherwise.\n * @signature\n * isBoolean(data)\n * @example\n * isBoolean(true) //=> true\n * isBoolean(false) //=> true\n * isBoolean('somethingElse') //=> false\n * @category Guard\n */\nexport function isBoolean(\n data: T | boolean,\n): data is NarrowedTo {\n return typeof data === \"boolean\";\n}\n", "/**\n * A function that checks if the passed parameter is a Date and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is a Date, false otherwise.\n * @signature\n * isDate(data)\n * @example\n * isDate(new Date()) //=> true\n * isDate('somethingElse') //=> false\n * @category Guard\n */\nexport function isDate(data: unknown): data is Date {\n return data instanceof Date;\n}\n", "/**\n * A function that checks if the passed parameter is defined (`!== undefined`)\n * and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is defined, false otherwise.\n * @signature\n * isDefined(data)\n * @example\n * isDefined('string') //=> true\n * isDefined(null) //=> true\n * isDefined(undefined) //=> false\n * @category Guard\n */\nexport function isDefined(data: T | undefined): data is T {\n return data !== undefined;\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\n\n/**\n * A function that checks if the passed parameter is empty.\n *\n * This function has *limited* utility at the type level because **negating** it\n * does not yield a useful type in most cases because of TypeScript\n * limitations. Additionally, utilities which accept a narrower input type\n * provide better type-safety on their inputs. In most cases, you should use\n * one of the following functions instead:\n * * `isEmptyish` - supports a wider range of cases, accepts any input including nullish values, and does a better job at narrowing the result.\n * * `hasAtLeast` - when the input is just an array/tuple.\n * * `isStrictEqual` - when you just need to check for a specific literal value.\n * * `isNullish` - when you just care about `null` and `undefined`.\n * * `isTruthy` - when you need to also filter `number` and `boolean`.\n *\n * @param data - The variable to check.\n * @signature\n * isEmpty(data)\n * @example\n * isEmpty(''); //=> true\n * isEmpty([]); //=> true\n * isEmpty({}); //=> true\n *\n * isEmpty('test'); //=> false\n * isEmpty([1, 2, 3]); //=> false\n * isEmpty({ a: \"hello\" }); //=> false\n *\n * isEmpty(undefined); // Deprecated: use `isEmptyish`\n * @category Guard\n */\nexport function isEmpty(data: IterableContainer): data is [];\nexport function isEmpty(\n data: T,\n): data is Record;\nexport function isEmpty(\n data: T,\n): data is \"\" extends T ? \"\" : never;\n\n// TODO [>2]: remove this overload once we stop supporting `undefined`.\n// eslint-disable-next-line jsdoc/require-example, jsdoc/require-param, jsdoc/require-description\n/**\n * @deprecated Use `isEmptyish` instead!\n */\nexport function isEmpty(\n data: T,\n): data is\n | (\"\" extends T ? \"\" : never)\n | (undefined extends T ? undefined : never);\n\nexport function isEmpty(data: object | string | undefined): boolean {\n if (\n data === \"\" ||\n // TODO [>2]: remove `undefined` support! (don't forget to update the jsdoc example too!)\n data === undefined\n ) {\n return true;\n }\n\n if (Array.isArray(data)) {\n return data.length === 0;\n }\n\n return Object.keys(data).length === 0;\n}\n", "import type {\n And,\n HasRequiredKeys,\n IsAny,\n IsEqual,\n IsNever,\n IsNumericLiteral,\n IsUnknown,\n OmitIndexSignature,\n Or,\n Tagged,\n ValueOf,\n} from \"type-fest\";\nimport type { HasWritableKeys } from \"./internal/types/HasWritableKeys\";\nimport type { TupleParts } from \"./internal/types/TupleParts\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars -- we use a non-exported unique symbol to prevent users from faking our return type.\ndeclare const EMPTYISH_BRAND: unique symbol;\n\n// Because our function is a type-predicate and it narrows the input based on\n// the result of our type, we sometimes need a way to \"turn off\" narrowing while\n// still returning the input type. By tagging/branding our return type we stop\n// TypeScript from narrowing it while still allowing it to be used as if it was\n// the input type (because it still extends the type).\ntype Empty = Tagged;\n\n// The goal of this type is to return the empty \"view\" of the input type. This\n// makes it possible for TypeScript to narrow it precisely.\ntype Emptyish =\n // There are effectively 4 types that can be empty:\n | (T extends string ? \"\" : never)\n | (T extends object ? EmptyishObjectLike : never)\n | (T extends null ? null : never)\n | (T extends undefined ? undefined : never);\n\n// Because of TypeScript's duck-typing, a lot of sub-types of `object` can\n// extend each other so we need to cascade between the different \"kinds\" of\n// objects.\ntype EmptyishObjectLike = T extends readonly unknown[]\n ? EmptyishArray\n : T extends ReadonlyMap\n ? T extends Map\n ? // Mutable maps should remain mutable so we can't narrow them down.\n Empty\n : // But immutable maps could be rewritten to prevent any mutations.\n ReadonlyMap\n : T extends ReadonlySet\n ? T extends Set\n ? // Mutable sets should remain mutable so we can't narrow them down.\n Empty\n : // But immutable sets could be rewritten to prevent any mutations.\n ReadonlySet\n : EmptyishObject;\n\ntype EmptyishArray = T extends readonly []\n ? // By returning T we effectively narrow the \"else\" branch to `never`.\n T\n : And<\n IsEqual[\"required\"], []>,\n IsEqual[\"suffix\"], []>\n > extends true\n ? T extends unknown[]\n ? // A mutable array should remain mutable so we can't narrow it down.\n Empty\n : // But immutable arrays could be rewritten to prevent any mutations.\n readonly []\n : // An array with a required prefix or suffix would never be empty, we can\n // use that fact to narrow the \"if\" branch to `never`.\n never;\n\ntype EmptyishObject = T extends {\n length: infer Length extends number;\n}\n ? T extends string\n ? // When a string is tagged/branded it also extends `object` and also has\n // a `length` prop so we need to prevent handling it because it's\n // irrelevant here!\n never\n : // Because of how the implementation works, we need to consider any object\n // with a `length` prop as potentially \"empty\".\n EmptyishArbitrary\n : T extends { size: infer Size extends number }\n ? // Because of how the implementation works, we need to consider any object\n // with a `size` prop as potentially \"empty\".\n EmptyishArbitrary\n : IsNever> extends true\n ? // This handles empty objects; by returning T we effectively narrow the\n // \"else\" branch to `never`.\n T\n : HasRequiredKeys> extends true\n ? // If the object has required keys it can never be empty, we can use\n // that fact to narrow the \"if\" branch to `never`.\n never\n : HasWritableKeys extends true\n ? // A mutable object should remain mutable so we can't narrow it\n // down.\n Empty\n : // But immutable objects could be rewritten to prevent any\n // mutations.\n { readonly [P in keyof T]: never };\n\n// We use certain props to check for emptiness effectively, but that means we\n// will return those values for any object that has them. Because we don't know\n// anything about those objects we need to be careful about narrowing.\ntype EmptyishArbitrary =\n IsNumericLiteral extends true\n ? [0] extends [N]\n ? [N] extends [0]\n ? // If the prop is a literal 0 the object is and always will be empty\n // so we can return it to narrow the \"else\" branch as `never`.\n T\n : // If it accepts 0, but might accept other values too we need to\n // consider the object mutable and not narrow it down.\n Empty\n : // If the prop will never be 0 we can say it will never be empty and can\n // return `never` for the \"if\" branch.\n never\n : // If the prop isn't a literal value we don't know enough about the object\n // and should consider it mutable.\n Empty;\n\n// Overly generic types interfere with our already pretty complex return type.\n// To make our lives easier we can filter them out at the function declaration\n// step and we never need to think about them again.\ntype ShouldNotNarrow = Or<\n Or, IsUnknown>,\n IsEqual<\n T,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n {}\n >\n>;\n\n/**\n * A function that checks if the input is empty. Empty is defined as anything\n * exposing a numerical `length`, or `size` property that is equal to `0`. This\n * definition covers strings, arrays, Maps, Sets, plain objects, and custom\n * classes. Additionally, `null` and `undefined` are also considered empty.\n *\n * `number`, `bigint`, `boolean`, `symbol`, and `function` will always return\n * `false`. `RegExp`, `Date`, and weak collections will always return `true`.\n * Classes and Errors are treated as plain objects: if they expose any public\n * property they would be considered non-empty, unless they expose a numerical\n * `length` or `size` property, which defines their emptiness regardless of\n * other properties.\n *\n * This function has *limited* utility at the type level because **negating** it\n * does not yield a useful type in most cases because of TypeScript\n * limitations. Additionally, utilities which accept a narrower input type\n * provide better type-safety on their inputs. In most cases, you should use\n * one of the following functions instead:\n * * `isEmpty` - provides better type-safety on inputs by accepting a narrower set of cases.\n * * `hasAtLeast` - when the input is just an array/tuple.\n * * `isStrictEqual` - when you just need to check for a specific literal value.\n * * `isNullish` - when you just care about `null` and `undefined`.\n * * `isTruthy` - when you need to also filter `number` and `boolean`.\n *\n * @param data - The variable to check.\n * @signature\n * isEmptyish(data)\n * @example\n * isEmptyish(undefined); //=> true\n * isEmptyish(null); //=> true\n * isEmptyish(''); //=> true\n * isEmptyish([]); //=> true\n * isEmptyish({}); //=> true\n * isEmptyish(new Map()); //=> true\n * isEmptyish(new Set()); //=> true\n * isEmptyish({ a: \"hello\", size: 0 }); //=> true\n * isEmptyish(/abc/); //=> true\n * isEmptyish(new Date()); //=> true\n * isEmptyish(new WeakMap()); //=> true\n *\n * isEmptyish('test'); //=> false\n * isEmptyish([1, 2, 3]); //=> false\n * isEmptyish({ a: \"hello\" }); //=> false\n * isEmptyish({ length: 1 }); //=> false\n * isEmptyish(0); //=> false\n * isEmptyish(true); //=> false\n * isEmptyish(() => {}); //=> false\n * @category Guard\n */\nexport function isEmptyish(\n data: ShouldNotNarrow extends true\n ? never\n : T | Readonly>>,\n): data is ShouldNotNarrow extends true\n ? never\n : T extends unknown\n ? Emptyish>\n : never;\nexport function isEmptyish(data: unknown): boolean;\n\nexport function isEmptyish(data: unknown): boolean {\n // eslint-disable-next-line eqeqeq -- Less code to ship...\n if (data == undefined || data === \"\") {\n // These are the only literal values that are considered emptyish.\n return true;\n }\n\n if (typeof data !== \"object\") {\n // There are no non-object types that could be empty at this point...\n return false;\n }\n\n if (\"length\" in data && typeof data.length === \"number\") {\n // Arrays and array-likes.\n return data.length === 0;\n }\n\n if (\"size\" in data && typeof data.size === \"number\") {\n // Maps and Sets.\n return data.size === 0;\n }\n\n // eslint-disable-next-line guard-for-in, no-unreachable-loop -- Instead of taking Object.keys just to check its length, which will be inefficient if the object has a lot of keys, we have a backdoor into an iterator of the object's properties via the `for...in` loop.\n for (const _ in data) {\n return false;\n }\n\n // We can't do a similar optimization for symbol props, so we leave them for\n // the very last check when the object is practically empty. Assuming that\n // even if an object has a symbol prop, it probably doesn't have thousands of\n // them.\n return Object.getOwnPropertySymbols(data).length === 0;\n}\n", "type DefinitelyError =\n Extract extends never ? Error : Extract;\n/**\n * A function that checks if the passed parameter is an Error and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is an Error, false otherwise.\n * @signature\n * isError(data)\n * @example\n * isError(new Error('message')) //=> true\n * isError('somethingElse') //=> false\n * @category Guard\n */\nexport function isError(data: Error | T): data is DefinitelyError {\n return data instanceof Error;\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\nimport type { StrictFunction } from \"./internal/types/StrictFunction\";\n\n/**\n * A function that checks if the passed parameter is a Function and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is a Function, false otherwise.\n * @signature\n * isFunction(data)\n * @example\n * isFunction(() => {}) //=> true\n * isFunction('somethingElse') //=> false\n * @category Guard\n */\nexport const isFunction = (\n data: StrictFunction | T,\n): data is NarrowedTo => typeof data === \"function\";\n", "import type { IsLiteral, IsUnion } from \"type-fest\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\n\n/**\n * A \"constant\" tuple is a type that has a single runtime value that can fulfil\n * it. This means that it doesn't have any variadic/rest/spread/array parts, and\n * that all it's values are singular (non-union) literals.\n *\n * We use this type to allow narrowing when checking against a set of values\n * defined as a const.\n *\n * @example\n * type T1 = IsConstantTuple<[\"cat\", \"dog\", 3, true]>; // => true;\n * type T2 = IsConstantTuple<[\"cat\" | \"dog\"]>; // false;\n * type T2 = IsConstantTuple<[\"cat\", ...\"cat\"[]]>; // false;\n */\ntype IsConstantTuple = T extends readonly []\n ? true\n : T extends readonly [infer Head, ...infer Rest]\n ? IsUnion extends true\n ? false\n : IsConstantTuple\n : false;\n\n/**\n * There is no way to tell Typescript to only narrow the \"accepted\" side of a\n * type-predicate and so in many cases the negated side is also affected, this\n * results in over-narrowing in many cases, breaking typing. For this reason we\n * only want to use the type-predicate variant of `isIncludedIn` when we can\n * assume the result represents the expected types (closely enough). This is not\n * and ideal solution and we will still generate wrong types in some cases (see\n * tests), but it reduces the surface of this problem significantly, while still\n * keeping the utility of `isIncludedIn` for the common cases.\n *\n * TL;DR - The types are narrowable when: T is literal and S is a pure tuple, or\n * when T isn't a literal, but S is.\n *\n * @example\n * const data = 1 as 1 | 2 | 3;\n * const container = [] as (1 | 2)[];\n * if (isIncludedIn(data, container)) {\n * ... it makes sense to narrow data to `1 | 2` as the value `3` is not part\n * ... of the typing of container, so will never result in being true.\n * } else {\n * ... but it doesn't make sense to narrow the value to 3 here, because 1\n * ... and 2 are still valid values for data, when container doesn't include\n * ... them **at runtime**.\n * ... Typescript narrows the _rejected_ branch based on how it narrowed the\n * ... _accepted_ clause, and we can't control that; because our input type\n * ... is `1 | 2 | 3` and the accepted side is `1 | 2`, the rejected side is\n * ... typed `Exclude<1 | 2 | 3, 1 | 2>`, which is `3`.\n * }\n * }\n */\ntype IsNarrowable> =\n IsLiteral extends true\n ? // When T is literal (i.g. it isn't a primitive type like `string` or\n // `number`) then the criteria for narrowing is that the container is a\n // \"pure\" tuple because we *assume* that S represents a constant set of\n // values, and that it's typing also represents it's runtime content 1-\n // for-1. If S isn't a pure tuple it means we can't tell from the typing\n // which of it's values are actually present in runtime so can't use them\n // to narrow correctly.\n IsConstantTuple\n : // When T isn't a literal type but the items in S are we can narrow the\n // type because it won't affect the negated side (`Exclude`\n // is still `number`).\n IsLiteral;\n\n/**\n * Checks if the item is included in the container. This is a wrapper around\n * `Array.prototype.includes` and `Set.prototype.has` and thus relies on the\n * same equality checks that those functions do (which is reference equality,\n * e.g. `===`). In some cases the input's type is also narrowed to the\n * container's item types.\n *\n * Notice that unlike most functions, this function takes a generic item as it's\n * data and **an array** as it's parameter.\n *\n * @param data - The item that is checked.\n * @param container - The items that are checked against.\n * @returns `true` if the item is in the container, or `false` otherwise. In\n * cases the type of `data` is also narrowed down.\n * @signature\n * isIncludedIn(data, container);\n * @example\n * isIncludedIn(2, [1, 2, 3]); // => true\n * isIncludedIn(4, [1, 2, 3]); // => false\n *\n * const data = \"cat\" as \"cat\" | \"dog\" | \"mouse\";\n * isIncludedIn(data, [\"cat\", \"dog\"] as const); // true (typed \"cat\" | \"dog\");\n * @dataFirst\n * @category Guard\n */\nexport function isIncludedIn>(\n data: T,\n container: IsNarrowable extends true ? S : never,\n): data is S[number];\nexport function isIncludedIn(\n data: T,\n container: IterableContainer,\n): boolean;\n\n/**\n * Checks if the item is included in the container. This is a wrapper around\n * `Array.prototype.includes` and `Set.prototype.has` and thus relies on the\n * same equality checks that those functions do (which is reference equality,\n * e.g. `===`). In some cases the input's type is also narrowed to the\n * container's item types.\n *\n * Notice that unlike most functions, this function takes a generic item as it's\n * data and **an array** as it's parameter.\n *\n * @param container - The items that are checked against.\n * @returns `true` if the item is in the container, or `false` otherwise. In\n * cases the type of `data` is also narrowed down.\n * @signature\n * isIncludedIn(container)(data);\n * @example\n * pipe(2, isIncludedIn([1, 2, 3])); // => true\n * pipe(4, isIncludedIn([1, 2, 3])); // => false\n *\n * const data = \"cat\" as \"cat\" | \"dog\" | \"mouse\";\n * pipe(\n * data,\n * isIncludedIn([\"cat\", \"dog\"] as const),\n * ); // => true (typed \"cat\" | \"dog\");\n * @dataLast\n * @category Guard\n */\nexport function isIncludedIn>(\n container: IsNarrowable extends true ? S : never,\n): (data: T) => data is S[number];\nexport function isIncludedIn(\n container: IterableContainer,\n): (data: T) => boolean;\n\nexport function isIncludedIn(\n dataOrContainer: unknown,\n container?: readonly unknown[],\n): unknown {\n if (container === undefined) {\n // === dataLast ===\n // We don't use purry here because we can optimize the dataLast case by\n // memoizing a set and accessing it in O(1) time instead of scanning the\n // array **each time** (O(n)) each time.\n const asSet = new Set(dataOrContainer as readonly unknown[]);\n return (data: unknown) => asSet.has(data);\n }\n\n // === dataFirst ===\n return container.includes(dataOrContainer);\n}\n", "/**\n * A function that checks if the passed parameter is not `null` and narrows its type accordingly.\n * Notice that `undefined` is not null!\n *\n * @param data - The variable to check.\n * @returns True if the passed input is defined, false otherwise.\n * @signature\n * isNonNull(data)\n * @example\n * isNonNull('string') //=> true\n * isNonNull(null) //=> false\n * isNonNull(undefined) //=> true\n * @category Guard\n */\nexport function isNonNull(data: T | null): data is T {\n return data !== null;\n}\n", "/**\n * A function that checks if the passed parameter is defined *AND* isn't `null`\n * and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is defined and isn't `null`, false\n * otherwise.\n * @signature\n * isNonNullish(data)\n * @example\n * isNonNullish('string') //=> true\n * isNonNullish(null) //=> false\n * isNonNullish(undefined) //=> false\n * @category Guard\n */\nexport function isNonNullish(data: T): data is NonNullable {\n return data !== undefined && data !== null;\n}\n", "/**\n * A function that takes a guard function as predicate and returns a guard that negates it.\n *\n * @param predicate - The guard function to negate.\n * @returns Function A guard function.\n * @signature\n * isNot(isTruthy)(data)\n * @example\n * isNot(isTruthy)(false) //=> true\n * isNot(isTruthy)(true) //=> false\n * @dataLast\n * @category Guard\n */\nexport function isNot(\n predicate: (data: T) => data is S,\n): (data: T) => data is Exclude;\nexport function isNot(predicate: (data: T) => boolean): (data: T) => boolean;\n\nexport function isNot(predicate: (data: T) => boolean) {\n return (data: T): boolean => !predicate(data);\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * A function that checks if the passed parameter is either `null` or\n * `undefined` and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is either `null` or `undefined`, false\n * otherwise.\n * @signature\n * isNullish(data)\n * @example\n * isNullish(undefined) //=> true\n * isNullish(null) //=> true\n * isNullish('somethingElse') //=> false\n * @category Guard\n */\nexport function isNullish(\n data: T | null | undefined,\n): data is NarrowedTo {\n return data === null || data === undefined;\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * A function that checks if the passed parameter is a number and narrows its\n * type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is a number, false otherwise.\n * @signature\n * isNumber(data)\n * @example\n * isNumber(1); // => true\n * isNumber(1n); // => false\n * isNumber('notANumber'); // => false\n * @category Guard\n */\nexport function isNumber(data: T | number): data is NarrowedTo {\n return typeof data === \"number\" && !Number.isNaN(data);\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * Checks if the given parameter is of type `\"object\"` via `typeof`, excluding `null`.\n *\n * It's important to note that in JavaScript, many entities are considered objects, like Arrays, Classes, RegExps, Maps, Sets, Dates, URLs, Promise, Errors, and more. Although technically an object too, `null` is not considered an object by this function, so that its easier to narrow nullables.\n *\n * For a more specific check that is limited to plain objects (simple struct/shape/record-like objects), consider using `isPlainObject` instead. For a simpler check that only removes `null` from the type prefer `isNonNull` or `isDefined`.\n *\n * @param data - The variable to be checked for being an object type.\n * @returns The input type, narrowed to only objects.\n * @signature\n * isObjectType(data)\n * @example\n * // true\n * isObjectType({}) //=> true\n * isObjectType([]) //=> true\n * isObjectType(Promise.resolve(\"something\")) //=> true\n * isObjectType(new Date()) //=> true\n * isObjectType(new Error(\"error\")) //=> true\n *\n * // false\n * isObjectType('somethingElse') //=> false\n * isObjectType(null) //=> false\n * @dataFirst\n * @category Guard\n */\nexport function isObjectType(\n data: T | object,\n): data is NarrowedTo {\n return typeof data === \"object\" && data !== null;\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * Checks if `data` is a \"plain\" object. A plain object is defined as an object with string keys and values of any type, including primitives, other objects, functions, classes, etc (aka struct/shape/record/simple). Technically, a plain object is one whose prototype is either `Object.prototype` or `null`, ensuring it does not inherit properties or methods from other object types.\n *\n * This function is narrower in scope than `isObjectType`, which accepts any entity considered an `\"object\"` by JavaScript's `typeof`.\n *\n * Note that Maps, Arrays, and Sets are not considered plain objects and would return `false`.\n *\n * @param data - The variable to check.\n * @returns The input type, narrowed to only plain objects.\n * @signature\n * isPlainObject(data)\n * @example\n * // true\n * isPlainObject({}) //=> true\n * isPlainObject({ a: 123 }) //=> true\n *\n * // false\n * isPlainObject([]) //=> false\n * isPlainObject(Promise.resolve(\"something\")) //=> false\n * isPlainObject(new Date()) //=> false\n * isPlainObject(new Error(\"error\")) //=> false\n * isPlainObject('somethingElse') //=> false\n * isPlainObject(null) //=> false\n * @category Guard\n */\nexport function isPlainObject(\n data: Readonly> | T,\n): data is NarrowedTo> {\n if (typeof data !== \"object\" || data === null) {\n return false;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- This is a low-level check, we can't avoid it being typed as `any`.\n const proto = Object.getPrototypeOf(data);\n return proto === null || proto === Object.prototype;\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * A function that checks if the passed parameter is a Promise and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is a Promise, false otherwise.\n * @signature\n * isPromise(data)\n * @example\n * isPromise(Promise.resolve(5)) //=> true\n * isPromise(Promise.reject(5)) //=> true\n * isPromise('somethingElse') //=> false\n * @category Guard\n */\nexport function isPromise(\n data: Readonly> | T,\n): data is NarrowedTo> {\n return data instanceof Promise;\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Performs a *shallow structural* comparison between two values to determine if\n * they are equivalent. For primitive values this is equivalent to `===`, for\n * arrays a **strict equality** check would be performed on every item, in\n * order, and for objects props will be matched and checked for **strict\n * equality**; Unlike `isDeepEqual` where the function also *recurses* into each\n * item and value.\n *\n * !IMPORTANT: symbol properties of objects are not supported right now and\n * might result in unexpected behavior. Please open an issue in the Remeda\n * github project if you need support for these types.\n *\n * !IMPORTANT: Promise, Date, and RegExp, are shallowly equal, even when they\n * are semantically different (e.g. resolved promises); but `isDeepEqual` does\n * compare the latter 2 semantically by-value.\n *\n * The result would be narrowed to the second value so that the function can be\n * used as a type guard.\n *\n * See:\n * - `isStrictEqual` if you don't need a deep comparison and just want to check\n * for simple (`===`, `Object.is`) equality.\n * - `isDeepEqual` for a recursively deep check of arrays and objects.\n *\n * @param data - The first value to compare.\n * @param other - The second value to compare.\n * @signature\n * isShallowEqual(data, other)\n * @example\n * isShallowEqual(1, 1) //=> true\n * isShallowEqual(1, '1') //=> false\n * isShallowEqual([1, 2, 3], [1, 2, 3]) //=> true\n * isShallowEqual([[1], [2], [3]], [[1], [2], [3]]) //=> false\n * @dataFirst\n * @category Guard\n */\nexport function isShallowEqual(\n data: T,\n other: T extends Exclude ? S : never,\n): data is S;\nexport function isShallowEqual(data: T, other: T): boolean;\n\n/**\n * Performs a *shallow structural* comparison between two values to determine if\n * they are equivalent. For primitive values this is equivalent to `===`, for\n * arrays a **strict equality** check would be performed on every item, in\n * order, and for objects props will be matched and checked for **strict\n * equality**; Unlike `isDeepEqual` where the function also *recurses* into each\n * item and value.\n *\n * !IMPORTANT: symbol properties of objects are not supported right now and\n * might result in unexpected behavior. Please open an issue in the Remeda\n * github project if you need support for these types.\n *\n * !IMPORTANT: All built-in objects (Promise, Date, RegExp) are shallowly equal,\n * even when they are semantically different (e.g. resolved promises). Use\n * `isDeepEqual` instead.\n *\n * The result would be narrowed to the second value so that the function can be\n * used as a type guard.\n *\n * See:\n * - `isStrictEqual` if you don't need a deep comparison and just want to check\n * for simple (`===`, `Object.is`) equality.\n * - `isDeepEqual` for a recursively deep check of arrays and objects.\n *\n * @param other - The second value to compare.\n * @signature\n * isShallowEqual(other)(data)\n * @example\n * pipe(1, isShallowEqual(1)) //=> true\n * pipe(1, isShallowEqual('1')) //=> false\n * pipe([1, 2, 3], isShallowEqual([1, 2, 3])) //=> true\n * pipe([[1], [2], [3]], isShallowEqual([[1], [2], [3]])) //=> false\n * @dataFirst\n * @category Guard\n */\nexport function isShallowEqual(\n other: T extends Exclude ? S : never,\n): (data: T) => data is S;\nexport function isShallowEqual(other: T): (data: T) => boolean;\n\nexport function isShallowEqual(...args: readonly unknown[]): unknown {\n return purry(isShallowEqualImplementation, args);\n}\n\nfunction isShallowEqualImplementation(a: T, b: T): boolean {\n if (a === b || Object.is(a, b)) {\n return true;\n }\n\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n if (a instanceof Map && b instanceof Map) {\n return isMapShallowEqual(a, b);\n }\n\n if (a instanceof Set && b instanceof Set) {\n return isSetShallowEqual(a, b);\n }\n\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key of keys) {\n if (!Object.hasOwn(b, key)) {\n return false;\n }\n\n const { [key as keyof T]: valueA } = a;\n const { [key as keyof T]: valueB } = b;\n\n if (valueA !== valueB || !Object.is(valueA, valueB)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isMapShallowEqual(\n a: ReadonlyMap,\n b: ReadonlyMap,\n): boolean {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const [key, value] of a) {\n const valueB = b.get(key);\n if (value !== valueB || !Object.is(value, valueB)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isSetShallowEqual(\n a: ReadonlySet,\n b: ReadonlySet,\n): boolean {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const value of a) {\n if (!b.has(value)) {\n return false;\n }\n }\n\n return true;\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Determines whether two values are *functionally identical* in all contexts.\n * For primitive values (string, number), this is done by-value, and for objects\n * it is done by-reference (i.e., they point to the same object in memory).\n *\n * Under the hood we use **both** the [`===` operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Strict_equality)\n * and [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). This means that `isStrictEqual(NaN, NaN) === true`\n * (whereas `NaN !== NaN`), and `isStrictEqual(-0, 0) === true` (whereas\n * `Object.is(-0, 0) === false`).\n *\n * The result would be narrowed to the second value so that the function can be\n * used as a type guard.\n *\n * See:\n * - `isDeepEqual` for a semantic comparison that allows comparing arrays and\n * objects \"by-value\", and recurses for every item.\n * - `isShallowEqual` if you need to compare arrays and objects \"by-value\" but\n * don't want to recurse into their values.\n *\n * @param data - The first value to compare.\n * @param other - The second value to compare.\n * @signature\n * isStrictEqual(data, other)\n * @example\n * isStrictEqual(1, 1) //=> true\n * isStrictEqual(1, '1') //=> false\n * isStrictEqual([1, 2, 3], [1, 2, 3]) //=> false\n * @dataFirst\n * @category Guard\n */\nexport function isStrictEqual(\n data: T,\n other: T extends Exclude ? S : never,\n): data is S;\nexport function isStrictEqual(data: T, other: T): boolean;\n\n/**\n * Determines whether two values are *functionally identical* in all contexts.\n * For primitive values (string, number), this is done by-value, and for objects\n * it is done by-reference (i.e., they point to the same object in memory).\n *\n * Under the hood we use **both** the [`===` operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Strict_equality)\n * and [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). This means that `isStrictEqual(NaN, NaN) === true`\n * (whereas `NaN !== NaN`), and `isStrictEqual(-0, 0) === true` (whereas\n * `Object.is(-0, 0) === false`).\n *\n * The result would be narrowed to the second value so that the function can be\n * used as a type guard.\n *\n * See:\n * - `isDeepEqual` for a semantic comparison that allows comparing arrays and\n * objects \"by-value\", and recurses for every item.\n * - `isShallowEqual` if you need to compare arrays and objects \"by-value\" but\n * don't want to recurse into their values.\n *\n * @param other - The second value to compare.\n * @signature\n * isStrictEqual(other)(data)\n * @example\n * pipe(1, isStrictEqual(1)); //=> true\n * pipe(1, isStrictEqual('1')); //=> false\n * pipe([1, 2, 3], isStrictEqual([1, 2, 3])); //=> false\n * @dataLast\n * @category Guard\n */\nexport function isStrictEqual(\n other: T extends Exclude ? S : never,\n): (data: T) => data is S;\nexport function isStrictEqual(other: T): (data: T) => boolean;\n\nexport function isStrictEqual(...args: readonly unknown[]): unknown {\n return purry(isStrictlyEqualImplementation, args);\n}\n\nconst isStrictlyEqualImplementation = (data: unknown, other: T): data is T =>\n data === other || Object.is(data, other);\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * A function that checks if the passed parameter is a string and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is a string, false otherwise.\n * @signature\n * isString(data)\n * @example\n * isString('string') //=> true\n * isString(1) //=> false\n * @category Guard\n */\nexport function isString(data: T | string): data is NarrowedTo {\n return typeof data === \"string\";\n}\n", "import type { NarrowedTo } from \"./internal/types/NarrowedTo\";\n\n/**\n * A function that checks if the passed parameter is a symbol and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is a symbol, false otherwise.\n * @signature\n * isSymbol(data)\n * @example\n * isSymbol(Symbol('foo')) //=> true\n * isSymbol(1) //=> false\n * @category Guard\n */\nexport function isSymbol(data: T | symbol): data is NarrowedTo {\n return typeof data === \"symbol\";\n}\n", "/**\n * A function that checks if the passed parameter is truthy and narrows its type accordingly.\n *\n * @param data - The variable to check.\n * @returns True if the passed input is truthy, false otherwise.\n * @signature\n * isTruthy(data)\n * @example\n * isTruthy('somethingElse') //=> true\n * isTruthy(null) //=> false\n * isTruthy(undefined) //=> false\n * isTruthy(false) //=> false\n * isTruthy(0) //=> false\n * isTruthy('') //=> false\n * @category Guard\n */\n// eslint-disable-next-line unicorn/prefer-native-coercion-functions -- This is not entirely correct, our isTruthy also coerces the type.\nexport function isTruthy(\n data: T,\n): data is Exclude {\n return Boolean(data);\n}\n", "import type { Join } from \"type-fest\";\nimport { purry } from \"./purry\";\n\n// Copied from type-fest, from the Join type.\ntype JoinableItem = bigint | boolean | number | string | null | undefined;\n\n/**\n * Joins the elements of the array by: casting them to a string and\n * concatenating them one to the other, with the provided glue string in between\n * every two elements.\n *\n * When called on a tuple and with stricter item types (union of literal values,\n * the result is strictly typed to the tuples shape and it's item types).\n *\n * @param data - The array to join.\n * @param glue - The string to put in between every two elements.\n * @signature\n * join(data, glue)\n * @example\n * join([1,2,3], \",\") // => \"1,2,3\" (typed `string`)\n * join(['a','b','c'], \"\") // => \"abc\" (typed `string`)\n * join(['hello', 'world'] as const, \" \") // => \"hello world\" (typed `hello world`)\n * @dataFirst\n * @category Array\n */\nexport function join<\n T extends readonly JoinableItem[] | [],\n Glue extends string,\n>(data: T, glue: Glue): Join;\n\n/**\n * Joins the elements of the array by: casting them to a string and\n * concatenating them one to the other, with the provided glue string in between\n * every two elements.\n *\n * When called on a tuple and with stricter item types (union of literal values,\n * the result is strictly typed to the tuples shape and it's item types).\n *\n * @param glue - The string to put in between every two elements.\n * @signature\n * join(glue)(data)\n * @example\n * pipe([1,2,3], join(\",\")) // => \"1,2,3\" (typed `string`)\n * pipe(['a','b','c'], join(\"\")) // => \"abc\" (typed `string`)\n * pipe(['hello', 'world'] as const, join(\" \")) // => \"hello world\" (typed `hello world`)\n * @dataLast\n * @category Array\n */\nexport function join<\n T extends readonly JoinableItem[] | [],\n Glue extends string,\n>(glue: Glue): (data: T) => Join;\n\nexport function join(...args: readonly unknown[]): unknown {\n return purry(joinImplementation, args);\n}\n\nconst joinImplementation = (data: readonly unknown[], glue: string): string =>\n data.join(glue);\n", "import type { EnumerableStringKeyOf } from \"./internal/types/EnumerableStringKeyOf\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { ToString } from \"./internal/types/ToString\";\nimport { purry } from \"./purry\";\n\ntype Keys = T extends IterableContainer ? ArrayKeys : ObjectKeys;\n\n// The keys output can mirror the input when it is an array/tuple. We do this by\n// \"mapping\" each item \"key\" (which is actually an index) as its own value. This\n// would maintain the shape, even including labels.\ntype ArrayKeys = {\n -readonly [Index in keyof T]: Index extends number | string\n ? // Notice that we coalesce the values as strings, this is because in JS,\n // Object.keys always returns strings, even for arrays.\n ToString extends true ? number : Index>\n : // Index is typed as a symbol, this can't happen, but we need to guard\n // against it for typescript.\n never;\n};\n\ntype IsIndexAfterSpread<\n T extends IterableContainer,\n Index extends number | string,\n> =\n IndicesAfterSpread extends never\n ? false\n : Index extends `${IndicesAfterSpread}`\n ? true\n : false;\n\n// Find the index of the tuple where a spread item is located, and return all\n// indices in the tuple which are located after it. The tuple could be prefixed\n// by any number of literal items. If the input is a simple array it would\n// return 0 (as expected), and if the tuple doesn't contain a spread element it\n// would return never.\ntype IndicesAfterSpread<\n T extends readonly unknown[] | [],\n // We use this type to count how many items we consumed, it's just a pseudo-\n // element that is used for its length.\n Iterations extends readonly unknown[] = [],\n> = T[number] extends never\n ? never\n : T extends readonly [unknown, ...infer Tail]\n ? IndicesAfterSpread\n : T extends readonly [...infer Head, unknown]\n ?\n | IndicesAfterSpread\n | Iterations[\"length\"]\n : Iterations[\"length\"];\n\ntype ObjectKeys =\n T extends Record ? [] : EnumerableStringKeyOf[];\n\n/**\n * Returns a new array containing the keys of the array or object.\n *\n * @param data - Either an array or an object.\n * @signature\n * keys(source)\n * @example\n * keys(['x', 'y', 'z']); // => ['0', '1', '2']\n * keys({ a: 'x', b: 'y', 5: 'z' }); // => ['a', 'b', '5']\n * @dataFirst\n * @category Object\n */\nexport function keys(data: T): Keys;\n\n/**\n * Returns a new array containing the keys of the array or object.\n *\n * @signature\n * keys()(source)\n * @example\n * pipe(['x', 'y', 'z'], keys()); // => ['0', '1', '2']\n * pipe({ a: 'x', b: 'y', 5: 'z' } as const, keys()) // => ['a', 'b', '5']\n * @dataLast\n * @category Object\n */\nexport function keys(): (data: T) => Keys;\n\nexport function keys(...args: readonly unknown[]): unknown {\n return purry(Object.keys, args);\n}\n", "import type { LastArrayElement } from \"type-fest\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\ntype Last = LastArrayElement<\n T,\n // Type-fest's LastArrayElement assumes a looser typescript configuration\n // where `noUncheckedIndexedAccess` is disabled. To support the stricter\n // configuration we assume we need to assign the \"LastArrayElement\" param to\n // `undefined`, but only if the array isn't empty.\n T extends readonly [] ? never : undefined\n>;\n\n/**\n * Gets the last element of `array`.\n *\n * @param data - The array.\n * @signature\n * last(array)\n * @example\n * last([1, 2, 3]) // => 3\n * last([]) // => undefined\n * @dataFirst\n * @category Array\n */\nexport function last(data: T): Last;\n\n/**\n * Gets the last element of `array`.\n *\n * @signature\n * last()(array)\n * @example\n * pipe(\n * [1, 2, 4, 8, 16],\n * filter(x => x > 3),\n * last(),\n * x => x + 1\n * ); // => 17\n * @dataLast\n * @category Array\n */\nexport function last(): (data: T) => Last;\n\nexport function last(...args: readonly unknown[]): unknown {\n return purry(lastImplementation, args);\n}\n\nconst lastImplementation = (array: readonly T[]): T | undefined =>\n array.at(-1);\n", "import { purry } from \"./purry\";\n\ntype Enumerable = ArrayLike | Iterable;\n\n/**\n * Counts values of the collection or iterable.\n *\n * @param items - The input data.\n * @signature\n * length(array)\n * @example\n * length([1, 2, 3]) // => 3\n * @dataFirst\n * @category Array\n */\nexport function length(items: Enumerable): number;\n\n/**\n * Counts values of the collection or iterable.\n *\n * @signature\n * length()(array)\n * @example\n * pipe([1, 2, 3], length()) // => 3\n * @dataLast\n * @category Array\n */\nexport function length(): (items: Enumerable) => number;\n\nexport function length(...args: readonly unknown[]): unknown {\n return purry(lengthImplementation, args);\n}\n\nconst lengthImplementation = (items: Enumerable): number =>\n \"length\" in items ? items.length : [...items].length;\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport type { Mapped } from \"./internal/types/Mapped\";\nimport { purry } from \"./purry\";\n\n/**\n * Creates a new array populated with the results of calling a provided function\n * on every element in the calling array. Equivalent to `Array.prototype.map`.\n *\n * @param data - The array to map.\n * @param callbackfn - A function to execute for each element in the array. Its\n * return value is added as a single element in the new array.\n * @returns A new array with each element being the result of the callback\n * function.\n * @signature\n * map(data, callbackfn)\n * @example\n * map([1, 2, 3], multiply(2)); // => [2, 4, 6]\n * map([0, 0], add(1)); // => [1, 1]\n * map([0, 0], (value, index) => value + index); // => [0, 1]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function map(\n data: T,\n callbackfn: (value: T[number], index: number, data: T) => U,\n): Mapped;\n\n/**\n * Creates a new array populated with the results of calling a provided function\n * on every element in the calling array. Equivalent to `Array.prototype.map`.\n *\n * @param callbackfn - A function to execute for each element in the array. Its\n * return value is added as a single element in the new array.\n * @returns A new array with each element being the result of the callback\n * function.\n * @signature\n * map(callbackfn)(data)\n * @example\n * pipe([1, 2, 3], map(multiply(2))); // => [2, 4, 6]\n * pipe([0, 0], map(add(1))); // => [1, 1]\n * pipe([0, 0], map((value, index) => value + index)); // => [0, 1]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function map(\n callbackfn: (value: T[number], index: number, data: T) => U,\n): (data: T) => Mapped;\n\nexport function map(...args: readonly unknown[]): unknown {\n return purry(mapImplementation, args, lazyImplementation);\n}\n\nconst mapImplementation = (\n data: readonly T[],\n callbackfn: (value: T, index: number, data: readonly T[]) => U,\n): U[] => data.map(callbackfn);\n\nconst lazyImplementation =\n (\n callbackfn: (value: T, index: number, data: readonly T[]) => U,\n ): LazyEvaluator =>\n (value, index, data) => ({\n done: false,\n hasNext: true,\n next: callbackfn(value, index, data),\n });\n", "/* eslint-disable @typescript-eslint/no-empty-object-type --\n * We want to match the typing of the built-in Object.entries as much as\n * possible!\n */\n\nimport type { And, IsUnion, Or } from \"type-fest\";\nimport type { EnumerableStringKeyedValueOf } from \"./internal/types/EnumerableStringKeyedValueOf\";\nimport type { EnumerableStringKeyOf } from \"./internal/types/EnumerableStringKeyOf\";\nimport type { IsBounded } from \"./internal/types/IsBounded\";\nimport { purry } from \"./purry\";\n\ntype MappedKeys = MaybePartial<\n T,\n Key,\n // We re-key `T` using `Key`, but because we can't infer at the type level\n // how the mapper would map each specific input key we assign all props the\n // same value, made of all possible values of `T`.\n Record>\n>;\n\n/**\n * This type is very similar to `BoundedPartial` simplified to the case where\n * we reconstruct the Record using a known `Key` type.\n *\n * @see BoundedPartial\n */\ntype MaybePartial =\n And, Or, CouldBeEmpty>> extends true\n ? // When keys are bounded we need to consider what assurances we can make\n // about the presence of keys in the output; mainly if there is more than\n // one possible result from the mapper (so we can't know what it would\n // return for a specific input, at the type level), or if object itself\n // might be empty and thus also the output object.\n Partial\n : // If keys are not bounded TypeScript treats the Record as implicitly\n // Partial so we don't need to do that here.\n Output;\n\n/**\n * Types that are extendable by `{}` are also satisfied by an empty object and\n * thus _could be empty_.\n */\ntype CouldBeEmpty = {} extends T ? true : false;\n\n/**\n * Maps keys of `object` and keeps the same values.\n *\n * @param data - The object to map.\n * @param keyMapper - The mapping function.\n * @signature\n * mapKeys(object, fn)\n * @example\n * mapKeys({a: 1, b: 2}, (key, value) => key + value) // => { a1: 1, b2: 2 }\n * @dataFirst\n * @category Object\n */\nexport function mapKeys(\n data: T,\n keyMapper: (\n key: EnumerableStringKeyOf,\n value: EnumerableStringKeyedValueOf,\n data: T,\n ) => Key,\n): MappedKeys;\n\n/**\n * Maps keys of `object` and keeps the same values.\n *\n * @param keyMapper - The mapping function.\n * @signature\n * mapKeys(fn)(object)\n * @example\n * pipe({a: 1, b: 2}, mapKeys((key, value) => key + value)) // => { a1: 1, b2: 2 }\n * @dataLast\n * @category Object\n */\nexport function mapKeys(\n keyMapper: (\n key: EnumerableStringKeyOf,\n value: EnumerableStringKeyedValueOf,\n data: T,\n ) => Key,\n): (data: T) => MappedKeys;\n\nexport function mapKeys(...args: readonly unknown[]): unknown {\n return purry(mapKeysImplementation, args);\n}\n\nfunction mapKeysImplementation(\n data: T,\n keyMapper: (key: string, value: unknown, data: T) => Key,\n): Partial> {\n const out: Partial> = {};\n\n for (const [key, value] of Object.entries(data)) {\n const mappedKey = keyMapper(key, value, data);\n out[mappedKey] = value;\n }\n\n return out;\n}\n", "import { purry } from \"./purry\";\n\n// TODO [>2]: Once we allow fromEntries to run lazily on iterables we need to remove this utility as it's completely replaceable by `fromEntries(map(...))`.\n/**\n * Map each element of an array into an object using a defined mapper that\n * converts each item into an object entry (a tuple of `[, ]`).\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * - `fromKeys` - Builds an object from an array of *keys* and a mapper for\n * values.\n * - `indexBy` - Builds an object from an array of *values* and a mapper for\n * keys.\n * - `pullObject` - Builds an object from an array of items with a mapper for\n * values and another mapper for keys.\n * - `fromEntries` - Builds an object from an array of key-value pairs.\n *\n * **Warning**: We strongly advise against using this function unless it is\n * used with a huge input array and your app has stringent memory/gc\n * constraints. We recommend that in most cases you should use `pullObject`,\n * or the composition `fromEntries(map(array, fn))`. This function will be\n * deprecated and **removed** in future versions of the library!\n *\n * @param array - The array to map.\n * @param fn - The mapping function, which should return a tuple of [key, value], similar to Object.fromEntries.\n * @returns The new mapped object.\n * @signature\n * mapToObj(array, fn)\n * @example\n * mapToObj([1, 2, 3], x => [String(x), x * 2]) // => {1: 2, 2: 4, 3: 6}\n * @dataFirst\n * @category Array\n */\nexport function mapToObj(\n array: readonly T[],\n fn: (value: T, index: number, data: readonly T[]) => [K, V],\n): Record;\n\n// TODO [>2]: Once we allow fromEntries to run lazily on iterables we need to remove this utility as it's completely replaceable by `fromEntries(map(...))`.\n/**\n * Map each element of an array into an object using a defined mapper that\n * converts each item into an object entry (a tuple of `[, ]`).\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * - `fromKeys` - Builds an object from an array of *keys* and a mapper for\n * values.\n * - `indexBy` - Builds an object from an array of *values* and a mapper for\n * keys.\n * - `pullObject` - Builds an object from an array of items with a mapper for\n * values and another mapper for keys.\n * - `fromEntries` - Builds an object from an array of key-value pairs.\n *\n * **Warning**: We strongly advise against using this function unless it is\n * used with a huge input array and your app has stringent memory/gc\n * constraints. We recommend that in most cases you should use `pullObject`,\n * or the composition `fromEntries(map(array, fn))`. This function will be\n * deprecated and **removed** in future versions of the library!\n *\n * @param fn - The mapping function, which should return a tuple of [key, value], similar to Object.fromEntries.\n * @returns The new mapped object.\n * @signature\n * mapToObj(fn)(array)\n * @example\n * pipe(\n * [1, 2, 3],\n * mapToObj(x => [String(x), x * 2])\n * ) // => {1: 2, 2: 4, 3: 6}\n * @dataLast\n * @category Array\n */\nexport function mapToObj(\n fn: (value: T, index: number, data: readonly T[]) => [K, V],\n): (array: readonly T[]) => Record;\n\nexport function mapToObj(...args: readonly unknown[]): unknown {\n return purry(mapToObjImplementation, args);\n}\n\nfunction mapToObjImplementation(\n array: readonly unknown[],\n fn: (\n value: unknown,\n index: number,\n data: readonly unknown[],\n ) => [PropertyKey, unknown],\n): Record {\n const out: Record = {};\n\n for (const [index, element] of array.entries()) {\n const [key, value] = fn(element, index, array);\n out[key] = value;\n }\n\n return out;\n}\n", "import type { Simplify } from \"type-fest\";\nimport type { EnumerableStringKeyOf } from \"./internal/types/EnumerableStringKeyOf\";\nimport type { EnumerableStringKeyedValueOf } from \"./internal/types/EnumerableStringKeyedValueOf\";\nimport { purry } from \"./purry\";\n\ntype MappedValues = Simplify<{\n -readonly [P in keyof T as P extends number | string ? P : never]: Value;\n}>;\n\n/**\n * Maps values of `object` and keeps the same keys. Symbol keys are not passed\n * to the mapper and will be removed from the output object.\n *\n * To also copy the symbol keys to the output use merge:\n * `merge(data, mapValues(data, mapper))`).\n *\n * @param data - The object to map.\n * @param valueMapper - The mapping function.\n * @signature\n * mapValues(data, mapper)\n * @example\n * mapValues({a: 1, b: 2}, (value, key) => value + key) // => {a: '1a', b: '2b'}\n * @dataFirst\n * @category Object\n */\nexport function mapValues(\n data: T,\n valueMapper: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => Value,\n): MappedValues;\n\n/**\n * Maps values of `object` and keeps the same keys. Symbol keys are not passed\n * to the mapper and will be removed from the output object.\n *\n * To also copy the symbol keys to the output use merge:\n * `merge(data, mapValues(data, mapper))`).\n *\n * @param valueMapper - The mapping function.\n * @signature\n * mapValues(mapper)(data)\n * @example\n * pipe({a: 1, b: 2}, mapValues((value, key) => value + key)) // => {a: '1a', b: '2b'}\n * @dataLast\n * @category Object\n */\nexport function mapValues(\n valueMapper: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => Value,\n): (data: T) => MappedValues;\n\nexport function mapValues(...args: readonly unknown[]): unknown {\n return purry(mapValuesImplementation, args);\n}\n\nfunction mapValuesImplementation(\n data: T,\n valueMapper: (value: unknown, key: string, data: T) => Value,\n): Record {\n const out: Record = {};\n\n for (const [key, value] of Object.entries(data)) {\n const mappedValue = valueMapper(value, key, data);\n out[key] = mappedValue;\n }\n\n return out;\n}\n", "import { purryFromLazy } from \"./internal/purryFromLazy\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport type { Mapped } from \"./internal/types/Mapped\";\n\n/**\n * Applies a function on each element of the array, using the result of the\n * previous application, and returns an array of the successively computed\n * values.\n *\n * @param data - The array to map over.\n * @param callbackfn - The callback function that receives the previous value,\n * the current element.\n * @param initialValue - The initial value to start the computation with.\n * @returns An array of successively computed values from the left side of the\n * array.\n * @signature\n * mapWithFeedback(data, callbackfn, initialValue);\n * @example\n * mapWithFeedback(\n * [1, 2, 3, 4, 5],\n * (prev, x) => prev + x,\n * 100,\n * ); // => [101, 103, 106, 110, 115]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function mapWithFeedback(\n data: T,\n callbackfn: (\n previousValue: U,\n currentValue: T[number],\n currentIndex: number,\n data: T,\n ) => U,\n initialValue: U,\n): Mapped;\n\n/**\n * Applies a function on each element of the array, using the result of the\n * previous application, and returns an array of the successively computed\n * values.\n *\n * @param callbackfn - The callback function that receives the previous value,\n * the current element.\n * @param initialValue - The initial value to start the computation with.\n * @returns An array of successively computed values from the left side of the\n * array.\n * @signature\n * mapWithFeedback(callbackfn, initialValue)(data);\n * @example\n * pipe(\n * [1, 2, 3, 4, 5],\n * mapWithFeedback((prev, x) => prev + x, 100),\n * ); // => [101, 103, 106, 110, 115]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function mapWithFeedback(\n callbackfn: (\n previousValue: U,\n currentValue: T[number],\n currentIndex: number,\n data: T,\n ) => U,\n initialValue: U,\n): (data: T) => Mapped;\n\nexport function mapWithFeedback(...args: readonly unknown[]): unknown {\n return purryFromLazy(lazyImplementation, args);\n}\n\nconst lazyImplementation = (\n reducer: (\n previousValue: U,\n currentValue: T,\n index: number,\n data: readonly T[],\n ) => U,\n initialValue: U,\n): LazyEvaluator => {\n let previousValue = initialValue;\n return (currentValue, index, data) => {\n previousValue = reducer(previousValue, currentValue, index, data);\n return { done: false, hasNext: true, next: previousValue };\n };\n};\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\ntype Sum | IterableContainer> =\n // Empty arrays would always result in a sum of (a non-bigint) 0.\n T extends readonly []\n ? 0\n : // Non-empty bigint arrays will always result in a bigint sum.\n T extends readonly [bigint, ...(readonly unknown[])]\n ? bigint\n : // But an empty bigint array would result in a non-bigint 0.\n T[number] extends bigint\n ? bigint | 0\n : // Non-bigint arrays are always handled correctly.\n number;\n\n/**\n * Sums the numbers in the array, or return 0 for an empty array.\n *\n * Works for both `number` and `bigint` arrays, but not arrays that contain both\n * types.\n *\n * IMPORTANT: The result for empty arrays would be 0 (`number`) regardless of\n * the type of the array; to avoid adding this to the return type for cases\n * where the array is known to be non-empty you can use `hasAtLeast` or\n * `isEmpty` to guard against this case.\n *\n * @param data - The array of numbers.\n * @signature\n * sum(data);\n * @example\n * sum([1, 2, 3]); // => 6\n * sum([1n, 2n, 3n]); // => 6n\n * sum([]); // => 0\n * @dataFirst\n * @category Number\n */\nexport function sum<\n T extends IterableContainer | IterableContainer,\n>(data: T): Sum;\n\n/**\n * Sums the numbers in the array, or return 0 for an empty array.\n *\n * Works for both `number` and `bigint` arrays, but not arrays that contain both\n * types.\n *\n * IMPORTANT: The result for empty arrays would be 0 (`number`) regardless of\n * the type of the array; to avoid adding this to the return type for cases\n * where the array is known to be non-empty you can use `hasAtLeast` or\n * `isEmpty`to guard against this case.\n *\n * @signature\n * sum()(data);\n * @example\n * pipe([1, 2, 3], sum()); // => 6\n * pipe([1n, 2n, 3n], sum()); // => 6n\n * pipe([], sum()); // => 0\n * @dataLast\n * @category Number\n */\nexport function sum(): <\n T extends IterableContainer | IterableContainer,\n>(\n data: T,\n) => Sum;\n\nexport function sum(...args: readonly unknown[]): unknown {\n return purry(sumImplementation, args);\n}\n\nfunction sumImplementation<\n T extends IterableContainer | IterableContainer,\n>(data: T): T[number] {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers -- The rule differentiates 0 and 0n :(\n let out = typeof data[0] === \"bigint\" ? 0n : 0;\n for (const value of data) {\n // @ts-expect-error [ts2365] -- Typescript can't infer that all elements will be a number of the same type.\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n out += value;\n }\n return out;\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\nimport { sum } from \"./sum\";\n\ntype Mean> =\n | (T extends readonly [] ? never : number)\n | (T extends readonly [unknown, ...unknown[]] ? never : undefined);\n\n/**\n * Returns the mean of the elements of an array.\n *\n * Only `number` arrays are supported, as `bigint` is unable to represent fractional values.\n *\n * IMPORTANT: The result for empty arrays would be `undefined`, regardless of\n * the type of the array. This approach improves type-checking and ensures that\n * cases where `NaN` might occur are handled properly. To avoid adding this to\n * the return type for cases where the array is known to be non-empty you can use\n * `hasAtLeast` or `isEmpty` to guard against this case.\n *\n * @param data - The array of numbers.\n * @signature\n * mean(data);\n * @example\n * mean([1, 2, 3]); // => 2\n * mean([]); // => undefined\n * @dataFirst\n * @category Number\n */\nexport function mean>(data: T): Mean;\n\n/**\n * Returns the mean of the elements of an array.\n *\n * Only `number` arrays are supported, as `bigint` is unable to represent fractional values.\n *\n * IMPORTANT: The result for empty arrays would be `undefined`, regardless of\n * the type of the array. This approach improves type-checking and ensures that\n * cases where `NaN` might occur are handled properly. To avoid adding this to\n * the return type for cases where the array is known to be non-empty you can use\n * `hasAtLeast` or `isEmpty` to guard against this case.\n *\n * @signature\n * mean()(data);\n * @example\n * pipe([1, 2, 3], mean()); // => 2\n * pipe([], mean()); // => undefined\n * @dataLast\n * @category Number\n */\nexport function mean(): >(\n data: T,\n) => Mean;\n\nexport function mean(...args: readonly unknown[]): unknown {\n return purry(meanImplementation, args);\n}\n\nfunction meanImplementation>(\n data: T,\n): T[number] | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n return sum(data) / data.length;\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Returns the mean of the elements of an array using the provided predicate.\n *\n * @param fn - Predicate function.\n * @signature\n * meanBy(fn)(array)\n * @example\n * pipe(\n * [{a: 5}, {a: 1}, {a: 3}],\n * meanBy(x => x.a)\n * ) // 3\n * @dataLast\n * @category Array\n */\n\nexport function meanBy(\n fn: (value: T, index: number, data: readonly T[]) => number,\n): (items: readonly T[]) => number;\n\n/**\n * Returns the mean of the elements of an array using the provided predicate.\n *\n * @param items - The array.\n * @param fn - Predicate function.\n * @signature\n * meanBy(array, fn)\n * @example\n * meanBy(\n * [{a: 5}, {a: 1}, {a: 3}],\n * x => x.a\n * ) // 3\n * @dataFirst\n * @category Array\n */\n\nexport function meanBy(\n items: readonly T[],\n fn: (value: T, index: number, data: readonly T[]) => number,\n): number;\n\nexport function meanBy(...args: readonly unknown[]): unknown {\n return purry(meanByImplementation, args);\n}\n\nconst meanByImplementation = (\n array: readonly T[],\n fn: (value: T, index: number, data: readonly T[]) => number,\n): number => {\n if (array.length === 0) {\n return Number.NaN;\n }\n\n let sum = 0;\n\n for (const [index, item] of array.entries()) {\n sum += fn(item, index, array);\n }\n\n return sum / array.length;\n};\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\ntype Median> =\n | (T extends readonly [] ? never : number)\n | (T extends readonly [unknown, ...unknown[]] ? never : undefined);\n\n/**\n * Returns the median of the elements of an array.\n *\n * Only `number` arrays are supported, as `bigint` is unable to represent fractional values.\n *\n * IMPORTANT: The result for empty arrays would be `undefined`, regardless of\n * the type of the array. This approach improves type-checking and ensures that\n * cases where `NaN` might occur are handled properly. To avoid adding this to\n * the return type for cases where the array is known to be non-empty you can use\n * `hasAtLeast` or `isEmpty` to guard against this case.\n *\n * @param data - The array of numbers.\n * @signature\n * median(data);\n * @example\n * pipe([6, 10, 11], median()); // => 10\n * median([]); // => undefined\n * @dataFirst\n * @category Number\n */\nexport function median>(data: T): Median;\n\n/**\n * Returns the median of the elements of an array.\n *\n * Only `number` arrays are supported, as `bigint` is unable to represent fractional values.\n *\n * IMPORTANT: The result for empty arrays would be `undefined`, regardless of\n * the type of the array. This approach improves type-checking and ensures that\n * cases where `NaN` might occur are handled properly. To avoid adding this to\n * the return type for cases where the array is known to be non-empty you can use\n * `hasAtLeast` or `isEmpty` to guard against this case.\n *\n * @signature\n * median()(data);\n * @example\n * pipe([6, 10, 11], median()); // => 10\n * pipe([], median()); // => undefined\n * @dataLast\n * @category Number\n */\nexport function median(): >(\n data: T,\n) => Median;\n\nexport function median(...args: readonly unknown[]): unknown {\n return purry(medianImplementation, args);\n}\n\nconst numberComparator = (a: number, b: number): number => a - b;\n\nfunction medianImplementation>(\n data: T,\n): T[number] | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n // TODO [>2]: When node 18 reaches end-of-life bump target lib to ES2023+ and use `Array.prototype.toSorted` here.\n const sortedData = [...data].sort(numberComparator);\n\n // For odd length, return the middle element\n if (sortedData.length % 2 !== 0) {\n return sortedData[(sortedData.length - 1) / 2];\n }\n\n // For even length, return the mean of the two middle elements\n const middleIndex = sortedData.length / 2;\n\n return (sortedData[middleIndex]! + sortedData[middleIndex - 1]!) / 2;\n}\n", "import type { Merge } from \"type-fest\";\nimport { purry } from \"./purry\";\n\n/**\n * Merges two objects into one by combining their properties, effectively\n * creating a new object that incorporates elements from both. The merge\n * operation prioritizes the second object's properties, allowing them to\n * overwrite those from the first object with the same names.\n *\n * Equivalent to `{ ...data, ...source }`.\n *\n * @param data - The destination object, serving as the basis for the merge.\n * Properties from this object are included in the new object, but will be\n * overwritten by properties from the source object with matching keys.\n * @param source - The source object, whose properties will be included in the\n * new object. If properties in this object share keys with properties in the\n * destination object, the values from the source object will be used in the\n * new object.\n * @returns An object fully containing `source`, and any properties from `data`\n * that don't share a name with any property in `source`.\n * @signature\n * merge(data, source)\n * @example\n * merge({ x: 1, y: 2 }, { y: 10, z: 2 }) // => { x: 1, y: 10, z: 2 }\n * @dataFirst\n * @category Object\n */\nexport function merge(data: T, source: Source): Merge;\n\n/**\n * Merges two objects into one by combining their properties, effectively\n * creating a new object that incorporates elements from both. The merge\n * operation prioritizes the second object's properties, allowing them to\n * overwrite those from the first object with the same names.\n *\n * Equivalent to `{ ...data, ...source }`.\n *\n * @param source - The source object, whose properties will be included in the\n * new object. If properties in this object share keys with properties in the\n * destination object, the values from the source object will be used in the\n * new object.\n * @returns An object fully containing `source`, and any properties from `data`\n * that don't share a name with any property in `source`.\n * @signature\n * merge(source)(data)\n * @example\n * pipe(\n * { x: 1, y: 2 },\n * merge({ y: 10, z: 2 }),\n * ); // => { x: 1, y: 10, z: 2 }\n * @dataLast\n * @category Object\n */\nexport function merge(source: Source): (data: T) => Merge;\n\nexport function merge(...args: readonly unknown[]): unknown {\n return purry(mergeImplementation, args);\n}\n\nconst mergeImplementation = (\n data: T,\n source: Source,\n // @ts-expect-error [ts2322] - TypeScript is failing to infer that the result of spreading the two objects satisfies the more complex Merge type.\n): Merge => ({ ...data, ...source });\n", "import type {\n EmptyObject,\n Merge,\n SharedUnionFields,\n Simplify,\n} from \"type-fest\";\nimport type { DisjointUnionFields } from \"./internal/types/DisjointUnionFields\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { NonEmptyArray } from \"./internal/types/NonEmptyArray\";\nimport type { TupleParts } from \"./internal/types/TupleParts\";\n\n/**\n * Merge a tuple of object types, where props from later objects override earlier props.\n */\ntype MergeTuple<\n T extends IterableContainer,\n Result = object, // no-op for the first iteration in the successive merges, also infers object as type by default if an empty tuple is used\n> = T extends readonly [infer Head, ...infer Rest]\n ? MergeTuple>\n : Result;\n\n// In the context of a heterogeneous array, the array may not have objects from every type of the union.\n// This means some fields may be missing in the final object, so we make them optional.\n// If there is a non-optional field shared among all members of the union, then we know that if the array is not empty, the field must be present and avoid becoming optional.\n// If the field is already optional, this doesn't really matter.\n// If the array is empty, we know that the loop won't run so we'll just get the empty object.\n// Since we don't know the order of the items in the array, when we merge common fields, we don't know what the final type for the field will be, but we do know that it is one of the many possible types that are available across the members of the union for that field.\n// We represent these possibilities by combining the field's different types across the union members into a union.\ntype MergeUnion = Simplify<\n SharedUnionFields & Partial>\n>;\n\ntype MergeAll> =\n // determine if it's a tuple or array\n TupleParts extends { item: never }\n ? T extends readonly []\n ? EmptyObject\n : MergeTuple\n : MergeUnion | EmptyObject;\n\n/**\n * Merges a list of objects into a single object.\n *\n * @param objects - The array of objects.\n * @returns A new object merged with all of the objects in the list. If the list is empty, an empty object is returned.\n * @signature\n * mergeAll(objects)\n * @example\n * mergeAll([{ a: 1, b: 1 }, { b: 2, c: 3 }, { d: 10 }]) // => { a: 1, b: 2, c: 3, d: 10 }\n * mergeAll([]) // => {}\n * @dataFirst\n * @category Array\n */\nexport function mergeAll(\n objects: Readonly>,\n): MergeUnion;\nexport function mergeAll>(\n objects: T,\n): MergeAll;\nexport function mergeAll(objects: readonly object[]): object {\n let out = {};\n\n for (const item of objects) {\n out = { ...out, ...item };\n }\n\n return out;\n}\n", "import type { MergeDeep } from \"type-fest\";\nimport { isPlainObject } from \"./isPlainObject\";\nimport { purry } from \"./purry\";\n\n/**\n * Merges the `source` object into the `destination` object. The merge is similar to performing `{ ...destination, ... source }` (where disjoint values from each object would be copied as-is, and for any overlapping props the value from `source` would be used); But for *each prop* (`p`), if **both** `destination` and `source` have a **plain-object** as a value, the value would be taken as the result of recursively deepMerging them (`result.p === deepMerge(destination.p, source.p)`).\n *\n * @param destination - The object to merge into. In general, this object would have it's values overridden.\n * @param source - The object to merge from. In general, shared keys would be taken from this object.\n * @returns The merged object.\n * @signature\n * mergeDeep(destination, source)\n * @example\n * mergeDeep({ foo: 'bar', x: 1 }, { foo: 'baz', y: 2 }) // => { foo: 'baz', x: 1, y: 2 }\n * @dataFirst\n * @category Object\n */\nexport function mergeDeep(\n destination: Destination,\n source: Source,\n): MergeDeep;\n\n/**\n * Merges the `source` object into the `destination` object. The merge is similar to performing `{ ...destination, ... source }` (where disjoint values from each object would be copied as-is, and for any overlapping props the value from `source` would be used); But for *each prop* (`p`), if **both** `destination` and `source` have a **plain-object** as a value, the value would be taken as the result of recursively deepMerging them (`result.p === deepMerge(destination.p, source.p)`).\n *\n * @param source - The object to merge from. In general, shared keys would be taken from this object.\n * @returns The merged object.\n * @signature\n * mergeDeep(source)(destination)\n * @example\n * pipe(\n * { foo: 'bar', x: 1 },\n * mergeDeep({ foo: 'baz', y: 2 }),\n * ); // => { foo: 'baz', x: 1, y: 2 }\n * @dataLast\n * @category Object\n */\nexport function mergeDeep(\n source: Source,\n): (\n target: Destination,\n) => MergeDeep;\n\nexport function mergeDeep(...args: readonly unknown[]): unknown {\n return purry(mergeDeepImplementation, args);\n}\n\nfunction mergeDeepImplementation<\n Destination extends object,\n Source extends object,\n>(destination: Destination, source: Source): MergeDeep {\n // At this point the output is already merged, simply not deeply merged.\n const output = { ...destination, ...source } as Record<\n keyof Destination | keyof Source,\n unknown\n >;\n\n // now just scan the output and look for values that should have been deep-\n // merged\n for (const key in source) {\n if (!(key in destination)) {\n // They don't share this key.\n continue;\n }\n\n const { [key]: destinationValue } = destination;\n if (!isPlainObject(destinationValue)) {\n // The value in destination is not a mergeable object so the value from\n // source (which was already copied in the shallow merge) would be used\n // as-is.\n continue;\n }\n\n const { [key]: sourceValue } = source;\n if (!isPlainObject(sourceValue)) {\n // The value in source is not a mergeable object either, so it will\n // override the object in destination.\n continue;\n }\n\n // Both destination and source have a mergeable object for this key, so we\n // recursively merge them.\n // @ts-expect-error [ts2590] - We build the output object iteratively, I don't think it's possible to improve the types here so that typescript infers this correctly.\n output[key] = mergeDeepImplementation(destinationValue, sourceValue);\n }\n\n // @ts-expect-error [ts2322] - We build the output object iteratively, I don't think it's possible to improve the types here so that typescript infers this correctly.\n return output;\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Multiplies two numbers.\n *\n * @param value - The number.\n * @param multiplicand - The number to multiply the value by.\n * @signature\n * multiply(value, multiplicand);\n * @example\n * multiply(3, 4) // => 12\n * reduce([1, 2, 3, 4], multiply, 1) // => 24\n * @dataFirst\n * @category Number\n */\nexport function multiply(value: bigint, multiplicand: bigint): bigint;\nexport function multiply(value: number, multiplicand: number): number;\n\n/**\n * Multiplies two numbers.\n *\n * @param multiplicand - The number to multiply the value by.\n * @signature\n * multiply(multiplicand)(value);\n * @example\n * multiply(4)(3) // => 12\n * map([1, 2, 3, 4], multiply(2)) // => [2, 4, 6, 8]\n * @dataLast\n * @category Number\n */\nexport function multiply(multiplicand: bigint): (value: bigint) => bigint;\nexport function multiply(multiplicand: number): (value: number) => number;\n\nexport function multiply(...args: readonly unknown[]): unknown {\n return purry(multiplyImplementation, args);\n}\n\n// The implementation only uses `number` types, but that's just because it's\n// hard to tell typescript that both value and multiplicand would be of the same\n// type.\nconst multiplyImplementation = (value: number, multiplicand: number): number =>\n value * multiplicand;\n", "/**\n * A simple implementation of the *QuickSelect* algorithm.\n *\n * @see https://en.wikipedia.org/wiki/Quickselect\n */\n\nimport { swapInPlace } from \"./swapInPlace\";\nimport type { CompareFunction } from \"./types/CompareFunction\";\n\n/**\n * Perform QuickSelect on the given data. Notice that the data would be cloned\n * shallowly so that it could be mutated in-place, and then discarded once the\n * algorithm is done. This means that running this function multiple times on\n * the same array might be slower then sorting the array before.\n *\n * @param data - The data to perform the selection on.\n * @param index - The index of the item we are looking for.\n * @param compareFn - The compare function to use for sorting.\n * @returns The item at the given index, or `undefined` if the index is out-of-\n * bounds.\n */\nexport const quickSelect = (\n data: readonly T[],\n index: number,\n compareFn: CompareFunction,\n): T | undefined =>\n index < 0 || index >= data.length\n ? // Quickselect doesn't work with out-of-bound indices\n undefined\n : quickSelectImplementation(\n // We need to clone the array because quickSelect mutates it in-place.\n [...data],\n 0 /* left */,\n data.length - 1 /* right */,\n index,\n compareFn,\n );\n\n/**\n * The actual implementation, called recursively.\n */\nfunction quickSelectImplementation(\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types -- Intentional!\n data: T[],\n left: number,\n right: number,\n index: number,\n compareFn: CompareFunction,\n): T {\n if (left === right) {\n return data[left]!;\n }\n\n const pivotIndex = partition(data, left, right, compareFn);\n\n return index === pivotIndex\n ? // Once a pivot is chosen it's location is final, so if it matches the\n // index we found out item!\n data[index]!\n : quickSelectImplementation(\n data,\n // We continue by recursing into the partition where index would be\n index < pivotIndex ? left : pivotIndex + 1,\n index < pivotIndex ? pivotIndex - 1 : right,\n index,\n compareFn,\n );\n}\n\nfunction partition(\n // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types -- Intentional!\n data: T[],\n left: number,\n right: number,\n compareFn: CompareFunction,\n): number {\n const pivot = data[right]!;\n\n let i = left;\n for (let j = left; j < right; j++) {\n if (compareFn(data[j]!, pivot) < 0) {\n // Move items smaller then the pivot to the start of the array.\n swapInPlace(data, i, j);\n i += 1;\n }\n }\n\n swapInPlace(data, i, right);\n\n // The location of the pivot by the end of the partition function.\n return i;\n}\n", "import {\n purryOrderRulesWithArgument,\n type OrderRule,\n} from \"./internal/purryOrderRules\";\nimport { quickSelect } from \"./internal/quickSelect\";\nimport type { CompareFunction } from \"./internal/types/CompareFunction\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { NonEmptyArray } from \"./internal/types/NonEmptyArray\";\n\n/**\n * Retrieves the element that would be at the given index if the array were sorted according to specified rules. This function uses the *QuickSelect* algorithm running at an average complexity of *O(n)*. Semantically it is equivalent to `sortBy(data, ...rules).at(index)` which would run at *O(nlogn)*.\n *\n * See also `firstBy` which provides an even more efficient algorithm and a stricter return type, but only for `index === 0`. See `takeFirstBy` to get all the elements up to and including `index`.\n *\n * @param data - The input array.\n * @param index - The zero-based index for selecting the element in the sorted order. Negative indices count backwards from the end.\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns The element at the specified index in the sorted order, or `undefined` if the index is out of bounds.\n * @signature\n * nthBy(data, index, ...rules);\n * @example\n * nthBy([2,1,4,5,3,], 2, identity()); // => 3\n * @dataFirst\n * @category Array\n */\nexport function nthBy(\n data: T,\n index: number,\n ...rules: Readonly>>\n): T[number] | undefined;\n\n/**\n * Retrieves the element that would be at the given index if the array were sorted according to specified rules. This function uses the *QuickSelect* algorithm running at an average complexity of *O(n)*. Semantically it is equivalent to `sortBy(data, ...rules)[index]` which would run at *O(nlogn)*.\n *\n * See also `firstBy` which provides an even more efficient algorithm and a stricter return type, but only for `index === 0`. See `takeFirstBy` to get all the elements up to and including `index`.\n *\n * @param index - The zero-based index for selecting the element in the sorted order. Negative indices count backwards from the end.\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns The element at the specified index in the sorted order, or `undefined` if the index is out of bounds.\n * @signature\n * nthBy(index, ...rules)(data);\n * @example\n * pipe([2,1,4,5,3,], nthBy(2, identity())); // => 3\n * @dataLast\n * @category Array\n */\nexport function nthBy(\n index: number,\n ...rules: Readonly>>\n): (data: T) => T[number] | undefined;\n\nexport function nthBy(...args: readonly unknown[]): unknown {\n return purryOrderRulesWithArgument(nthByImplementation, args);\n}\n\nconst nthByImplementation = (\n data: readonly T[],\n compareFn: CompareFunction,\n index: number,\n): T | undefined =>\n quickSelect(\n data,\n // Allow negative indices gracefully\n index >= 0 ? index : data.length + index,\n compareFn,\n );\n", "import { purry } from \"./purry\";\n\n/**\n * Creates an object containing a single `key:value` pair.\n *\n * @param value - The object value.\n * @param key - The property name.\n * @signature\n * objOf(value, key)\n * @example\n * objOf(10, 'a') // => { a: 10 }\n * @category Object\n */\nexport function objOf(value: T, key: K): Record;\n\n/**\n * Creates an object containing a single `key:value` pair.\n *\n * @param key - The property name.\n * @signature\n * objOf(key)(value)\n * @example\n * pipe(10, objOf('a')) // => { a: 10 }\n * @category Object\n */\nexport function objOf(key: K): (value: T) => Record;\n\nexport function objOf(...args: readonly unknown[]): unknown {\n return purry(objOfImplementation, args);\n}\n\nconst objOfImplementation = (\n value: T,\n key: K,\n): Record =>\n // @ts-expect-error [ts2322] - I'm not sure how to get the type right here...\n ({ [key]: value });\n", "import type { EmptyObject, IsNever, KeysOfUnion } from \"type-fest\";\nimport { hasAtLeast } from \"./hasAtLeast\";\nimport type { IsBounded } from \"./internal/types/IsBounded\";\nimport type { IsBoundedRecord } from \"./internal/types/IsBoundedRecord\";\nimport type { PartitionByUnion } from \"./internal/types/PartitionByUnion\";\nimport type { SimplifiedWritable } from \"./internal/types/SimplifiedWritable\";\nimport type { TupleParts } from \"./internal/types/TupleParts\";\nimport { purry } from \"./purry\";\n\ntype OmitFromArray =\n // Distribute unions for both object types and key arrays.\n T extends unknown\n ? Keys extends unknown\n ? // The output is always writable because we always create a new object!\n SimplifiedWritable<\n IsNever> extends true\n ? // When none of the keys belong to T we can short-circuit and\n // simply return T as-is because `omit` would do nothing.\n T\n : IsBoundedRecord extends true\n ? OmitBounded\n : OmitUnbounded\n >\n : never\n : never;\n\ntype OmitBounded =\n // We build our output by first considering any key present in the keys array\n // as being omitted. This object would contain all keys that are unaffected at\n // all by this omit operation.\n FixEmpty> &\n // But we might be missing keys that are optional in the keys tuple (and\n // thus might not be removed). Because these keys are optional, their props\n // in the output also need to be optional.\n Partial<\n Pick<\n T,\n Exclude<\n // Find all keys that can either be omitted or not, these are all keys\n // in unions in the required parts of the keys tuple (the prefix and\n // the suffix), as well as all keys in the optional parts and the rest\n // item.\n | PartitionByUnion[\"required\"]>[\"union\"]\n | TupleParts[\"optional\"][number]\n | TupleParts[\"item\"]\n | PartitionByUnion[\"suffix\"]>[\"union\"],\n // We then need to remove from these any items which *also* are\n // ensured to always exist in the keys tuple, these are the elements\n // of the required parts of the tuple which are singular (not unions).\n | PartitionByUnion[\"required\"]>[\"singular\"]\n | PartitionByUnion[\"suffix\"]>[\"singular\"]\n >\n >\n >;\n\n/**\n * The built-in `Omit` type doesn't handle unbounded records correctly! When\n * omitting an unbounded key the result should be untouched as we can't tell\n * what got removed, and can't represent an object that had \"something\" removed\n * from it, but instead it returns `{}`(?!) The same thing applies when a key\n * is only optionally omitted for the same reasons. This is why we don't use\n * `Omit` at all for the unbounded case.\n *\n * @see https://www.typescriptlang.org/play/?#code/C4TwDgpgBAqgdgIwPYFc4BMLqgXigeQFsBLYAHgCUIBjJAJ3TIGdg7i4BzAGigCIALCABshSXgD4eLNp3EBuAFAB6JVDUA9APxA\n */\ntype OmitUnbounded = T &\n // Any key we know for sure is being omitted needs to become \"impossible\" to\n // access; for an unbounded record this means merging it with a bounded record\n // with `never` value for these keys.\n Record<\n Bounded<\n | PartitionByUnion[\"required\"]>[\"singular\"]\n | PartitionByUnion[\"suffix\"]>[\"singular\"]\n >,\n never\n >;\n\n/**\n * When `Omit` omits **all** keys from a bounded record it results in `{}` which\n * doesn't match what we'd expect to be returned in terms of a useful type as\n * the output of `Omit`.\n */\ntype FixEmpty = IsNever extends true ? EmptyObject : T;\n\n/**\n * Filter a union of types, leaving only those that are bounded. e.g.,\n * `Bounded<\"a\" | number>` results in `\"a\"`.\n */\ntype Bounded = T extends unknown\n ? IsBounded extends true\n ? T\n : never\n : never;\n\n/**\n * Returns a partial copy of an object omitting the keys specified.\n *\n * @param keys - The property names.\n * @signature\n * omit(keys)(obj);\n * @example\n * pipe({ a: 1, b: 2, c: 3, d: 4 }, omit(['a', 'd'])) // => { b: 2, c: 3 }\n * @dataLast\n * @category Object\n */\nexport function omit[]>(\n keys: Keys,\n): (data: T) => OmitFromArray;\n\n/**\n * Returns a partial copy of an object omitting the keys specified.\n *\n * @param data - The object.\n * @param keys - The property names.\n * @signature\n * omit(obj, keys);\n * @example\n * omit({ a: 1, b: 2, c: 3, d: 4 }, ['a', 'd']) // => { b: 2, c: 3 }\n * @dataFirst\n * @category Object\n */\nexport function omit[]>(\n data: T,\n keys: Keys,\n): OmitFromArray;\n\nexport function omit(...args: readonly unknown[]): unknown {\n return purry(omitImplementation, args);\n}\n\nfunction omitImplementation<\n T extends object,\n Keys extends readonly (keyof T)[],\n>(data: T, keys: Keys): OmitFromArray {\n if (!hasAtLeast(keys, 1)) {\n // No props to omit at all!\n // @ts-expect-error [ts2322] - TypeScript can't connect the fact that the\n // keys array is empty and infer the expected output, and then infer that we\n // return it correctly here.\n return { ...data };\n }\n\n if (!hasAtLeast(keys, 2)) {\n // Only one prop to omit so we can let the runtime engine deal with\n // removing it efficiently.\n const { [keys[0]]: _omitted, ...remaining } = data;\n\n // @ts-expect-error [ts2322] - TypeScript can't compute the expected output\n // correctly and then infer that we return it correctly here.\n return remaining;\n }\n\n // Multiple props to omit so we have to use a loop to omit all of them.\n const out = { ...data };\n for (const key of keys) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete -- This is intentional! It is the most effective way to allow the runtime engine to optimize the object without creating excessive copies for every omitted key.\n delete out[key];\n }\n\n // @ts-expect-error [ts2322] - The type is too complex and TypeScript can't\n // \"follow\" the iterative algorithm to ensure the output makes sense.\n return out;\n}\n", "import type { IsNever, Or, Simplify } from \"type-fest\";\nimport type { EnumerableStringKeyOf } from \"./internal/types/EnumerableStringKeyOf\";\nimport type { EnumerableStringKeyedValueOf } from \"./internal/types/EnumerableStringKeyedValueOf\";\nimport type { IsBoundedRecord } from \"./internal/types/IsBoundedRecord\";\nimport { purry } from \"./purry\";\n\n// Symbols are not passed to the predicate (because they can't be enumerated\n// with the `Object.entries` function) and the output object is built from a\n// shallow copy of the input; meaning symbols would just be passed through as-\n// is.\ntype PickSymbolKeys = {\n -readonly [P in keyof T as P extends symbol ? P : never]: T[P];\n};\n\n// When we don't use a type-predicate we can't say anything about what props\n// would be omitted from the output, so we need to assume any of them could be\n// filtered out. This means that we effectively make all (enumerable) keys\n// optional.\ntype PartialEnumerableKeys =\n // `extends unknown` is always going to be the case and is used to convert any\n // union into a [distributive conditional type](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#distributive-conditional-types).\n T extends unknown\n ? Simplify<\n IsBoundedRecord extends true\n ? PickSymbolKeys & {\n -readonly [P in keyof T as P extends symbol\n ? never\n : P]?: Required[P];\n }\n : // This is the type you'd get from doing:\n // `Object.fromEntries(Object.entries(x))`.\n Record, EnumerableStringKeyedValueOf>\n >\n : never;\n\n// When the predicate is a type-guard we have more information to work with when\n// constructing the type of the output object. We can safely remove any property\n// which value would always be true for the predicate, AND we can also\n// assume that properties that are rejected by the predicate perfectly would\n// **always** show up in the output object. Hence to build the output object we\n// need to build and merge 2 output objects: One for the properties which have a\n// value of at type that would always yield a `false` result from the predicate,\n// these are the \"matches\", which would not change the \"optionality\" of the\n// input object's props, and one for partial matches which would also make the\n// props optional (as they could have a value that would be filtered out).\ntype PartialEnumerableKeysNarrowed = Simplify<\n ExactProps & PartialProps & PickSymbolKeys\n>;\n\n// The exact case, props here would always be part of the output object\ntype ExactProps = {\n -readonly [P in keyof T as IsExactProp extends true\n ? P\n : never]: Exclude;\n};\n\n// The partial case, props here might be part of the output object, but might\n// not be, hence they are optional.\ntype PartialProps = {\n -readonly [P in keyof T as IsPartialProp extends true\n ? P\n : never]?: Exclude;\n};\n\n// If the input object's value type extends itself when the type-guard is\n// excluded from it we can safely assume that the predicate would always return\n// `false` for any value of that property.\ntype IsExactProp = P extends symbol\n ? // Symbols are passed through via the PickSymbolKeys type\n false\n : T[P] extends Exclude\n ? S extends T[P]\n ? // If S extends the T[P] it means the type the predicate is narrowing to\n // can't narrow the rejected value any further, so we can't say what\n // would happen for a concrete value in runtime (e.g. if T[P] is\n // `number` and S is `1`: `Exclude === number`.\n false\n : true\n : false;\n\n// ...and if the input object's value type isn't an exact match, but still has\n// some partial match (i.g. the extracted type-guard isn't completely disjoint)\n// then we can assume that the property can sometimes return true, and sometimes\n// false when passed to the predicate, hence it should be optional in the\n// output.\ntype IsPartialProp = P extends symbol\n ? // Symbols are passed through via the PickSymbolKeys type\n false\n : Or, IsNever[P], S>>> extends true\n ? false\n : true;\n\n/**\n * Creates a shallow copy of the data, and then removes any keys that the\n * predicate rejects. Symbol keys are not passed to the predicate and would be\n * passed through to the output as-is.\n *\n * See `pickBy` for a complementary function which starts with an empty object\n * and adds the entries that the predicate accepts. Because it is additive,\n * symbol keys will not be passed through to the output object.\n *\n * @param data - The target object.\n * @param predicate - A function that takes the value, key, and the data itself\n * and returns `true` if the entry shouldn't be part of the output object, or\n * `false` to keep it. If the function is a type-guard on the value the output\n * type would be narrowed accordingly.\n * @returns A shallow copy of the input object with the rejected entries\n * removed.\n * @signature omitBy(data, predicate)\n * @example\n * omitBy({a: 1, b: 2, A: 3, B: 4}, (val, key) => key.toUpperCase() === key) // => {a: 1, b: 2}\n * @dataFirst\n * @category Object\n */\nexport function omitBy<\n T extends object,\n S extends EnumerableStringKeyedValueOf,\n>(\n data: T,\n predicate: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => value is S,\n): PartialEnumerableKeysNarrowed;\nexport function omitBy(\n data: T,\n predicate: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => boolean,\n): PartialEnumerableKeys;\n\n/**\n * Returns a partial copy of an object omitting the keys matching predicate.\n *\n * @param predicate - The predicate.\n * @signature omitBy(fn)(object)\n * @example\n * omitBy((val, key) => key.toUpperCase() === key)({a: 1, b: 2, A: 3, B: 4}) // => {a: 1, b: 2}\n * @dataLast\n * @category Object\n */\nexport function omitBy<\n T extends object,\n S extends EnumerableStringKeyedValueOf,\n>(\n predicate: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => value is S,\n): (data: T) => PartialEnumerableKeysNarrowed;\nexport function omitBy(\n predicate: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => boolean,\n): (data: T) => PartialEnumerableKeys;\n\nexport function omitBy(...args: readonly unknown[]): unknown {\n return purry(omitByImplementation, args);\n}\n\nfunction omitByImplementation(\n data: T,\n predicate: (value: unknown, key: string, data: T) => boolean,\n): Record {\n const out: Partial> = { ...data };\n\n for (const [key, value] of Object.entries(out)) {\n if (predicate(value, key, data)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete -- This is the best way to do it!\n delete out[key];\n }\n }\n\n return out;\n}\n", "/**\n * Creates a function that is restricted to invoking `func` once. Repeat calls to the function return the value of the first invocation.\n *\n * @param fn - The function to wrap.\n * @signature once(fn)\n * @example\n * const initialize = once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n * @category Function\n */\nexport function once(fn: () => T): () => T {\n let called = false;\n let ret: T;\n return () => {\n if (!called) {\n ret = fn();\n called = true;\n }\n return ret;\n };\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\ntype Only = T extends\n | readonly [...unknown[], unknown, unknown]\n | readonly []\n | readonly [unknown, ...unknown[], unknown]\n | readonly [unknown, unknown, ...unknown[]]\n ? undefined\n : T extends readonly [unknown]\n ? T[number]\n : T[number] | undefined;\n\n/**\n * Returns the first and only element of `array`, or undefined otherwise.\n *\n * @param array - The target array.\n * @signature\n * only(array)\n * @example\n * only([]) // => undefined\n * only([1]) // => 1\n * only([1, 2]) // => undefined\n * @dataFirst\n * @category Array\n */\nexport function only(array: Readonly): Only;\n\n/**\n * Returns the first and only element of `array`, or undefined otherwise.\n *\n * @signature\n * only()(array)\n * @example\n * pipe([], only()); // => undefined\n * pipe([1], only()); // => 1\n * pipe([1, 2], only()); // => undefined\n * @dataLast\n * @category Array\n */\nexport function only(): (\n array: Readonly,\n) => Only;\n\nexport function only(...args: readonly unknown[]): unknown {\n return purry(onlyImplementation, args);\n}\n\nconst onlyImplementation = (array: readonly T[]): T | undefined =>\n array.length === 1 ? array[0] : undefined;\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { RemedaTypeError } from \"./internal/types/RemedaTypeError\";\nimport type { StrictFunction } from \"./internal/types/StrictFunction\";\nimport type { TupleSplits } from \"./internal/types/TupleSplits\";\n\ntype PartialBindError<\n Message extends string,\n Metadata = never,\n> = RemedaTypeError<\"partialBind\", Message, { metadata: Metadata }>;\n\ntype TuplePrefix = TupleSplits[\"left\"];\n\ntype RemovePrefix<\n T extends IterableContainer,\n Prefix extends TuplePrefix,\n> = Prefix extends readonly []\n ? T\n : T extends readonly [infer THead, ...infer TRest]\n ? Prefix extends readonly [infer _PrefixHead, ...infer PrefixRest]\n ? // PrefixHead extends THead.\n RemovePrefix\n : // Prefix (as a whole) extends readonly THead[].\n // Prefix could possibly be empty, so this has to be THead?.\n [THead?, ...RemovePrefix]\n : // T has an optional or rest parameter last. If T is a parameter list,\n // this can only happen if we have optional arguments or a rest param;\n // both cases are similar.\n T extends readonly [(infer _THead)?, ...infer TRest]\n ? Prefix extends readonly [infer _PrefixHead, ...infer PrefixRest]\n ? // PrefixHead extends THead.\n RemovePrefix\n : // Prefix (as a whole) extends [THead?, ...TRest].\n TRest\n : // We got passed a parameter list that isn't what we expected; this is\n // an internal error.\n PartialBindError<\"Function parameter list has unexpected shape\", T>;\n\n/**\n * Creates a function that calls `func` with `partial` put before the arguments\n * it receives.\n *\n * Can be thought of as \"freezing\" some portion of a function's arguments,\n * resulting in a new function with a simplified signature.\n *\n * @param func - The function to wrap.\n * @param partial - The arguments to put before.\n * @returns A partially bound function.\n * @signature\n * partialBind(func, ...partial);\n * @example\n * const fn = (x: number, y: number, z: number) => x * 100 + y * 10 + z;\n * const partialFn = partialBind(fn, 1, 2);\n * partialFn(3); //=> 123\n *\n * const logWithPrefix = partialBind(console.log, \"[prefix]\");\n * logWithPrefix(\"hello\"); //=> \"[prefix] hello\"\n * @dataFirst\n * @category Function\n * @see partialLastBind\n */\nexport function partialBind<\n F extends StrictFunction,\n PrefixArgs extends TuplePrefix>,\n RemovedPrefix extends RemovePrefix, PrefixArgs>,\n>(\n func: F,\n ...partial: PrefixArgs\n): (\n ...rest: RemovedPrefix extends IterableContainer ? RemovedPrefix : never\n) => ReturnType {\n // @ts-expect-error [ts2345, ts2322] -- TypeScript infers the generic sub-\n // types too eagerly, making itself blind to the fact that the types match\n // here.\n return (...rest) => func(...partial, ...rest);\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { RemedaTypeError } from \"./internal/types/RemedaTypeError\";\nimport type { StrictFunction } from \"./internal/types/StrictFunction\";\nimport type { TupleSplits } from \"./internal/types/TupleSplits\";\n\ntype PartialLastBindError<\n Message extends string,\n Metadata = never,\n> = RemedaTypeError<\"partialLastBind\", Message, { metadata: Metadata }>;\n\ntype TupleSuffix = TupleSplits[\"right\"];\n\ntype RemoveSuffix<\n T extends IterableContainer,\n Suffix extends TupleSuffix,\n> = Suffix extends readonly []\n ? T\n : T extends readonly [...infer TRest, infer TLast]\n ? Suffix extends readonly [...infer SuffixRest, infer _SuffixLast]\n ? // SuffixLast extends TLast.\n RemoveSuffix\n : // Suffix (as a whole) extends readonly TLast[].\n // Suffix could possibly be empty, so this has to be TLast?.\n [...RemoveSuffix, TLast?]\n : // T has an optional or rest parameter last. If T is a parameter list,\n // this can only happen if we have optional arguments or a rest param;\n // both cases are similar.\n T extends readonly [...infer TRest, (infer _TLast)?]\n ? Suffix extends readonly [...infer SuffixRest, infer _SuffixLast]\n ? // SuffixLast extends TLast.\n RemoveSuffix\n : // Suffix (as a whole) extends [...TRest, TLast?].\n TRest\n : // We got passed a parameter list that isn't what we expected; this\n // is an internal error.\n PartialLastBindError<\"Function parameter list has unexpected shape\", T>;\n\n/**\n * Creates a function that calls `func` with `partial` put after the arguments\n * it receives. Note that this doesn't support functions with both optional\n * and rest parameters.\n *\n * Can be thought of as \"freezing\" some portion of a function's arguments,\n * resulting in a new function with a simplified signature.\n *\n * Useful for converting a data-first function to a data-last one.\n *\n * @param func - The function to wrap.\n * @param partial - The arguments to put after.\n * @returns A partially bound function.\n * @signature\n * partialLastBind(func, ...partial);\n * @example\n * const fn = (x: number, y: number, z: number) => x * 100 + y * 10 + z;\n * const partialFn = partialLastBind(fn, 2, 3);\n * partialFn(1); //=> 123\n *\n * const parseBinary = partialLastBind(parseInt, \"2\");\n * parseBinary(\"101\"); //=> 5\n *\n * pipe(\n * { a: 1 },\n * // instead of (arg) => JSON.stringify(arg, null, 2)\n * partialLastBind(JSON.stringify, null, 2),\n * ); //=> '{\\n \"a\": 1\\n}'\n * @dataFirst\n * @category Function\n * @see partialBind\n */\nexport function partialLastBind<\n F extends StrictFunction,\n SuffixArgs extends TupleSuffix>,\n RemovedSuffix extends RemoveSuffix, SuffixArgs>,\n>(\n func: F,\n ...partial: SuffixArgs\n): (\n ...rest: RemovedSuffix extends IterableContainer ? RemovedSuffix : never\n) => ReturnType {\n // @ts-expect-error [ts2345, ts2322] -- TypeScript infers the generic sub-\n // types too eagerly, making itself blind to the fact that the types match\n // here.\n return (...rest) => func(...rest, ...partial);\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Splits a collection into two groups, the first of which contains elements the\n * `predicate` type guard passes, and the second one containing the rest.\n *\n * @param data - The items to split.\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to add the element to the first partition, and and\n * `false` to add the element to the other partition. A type-predicate can also\n * be used to narrow the result.\n * @returns A 2-tuple of arrays where the first array contains the elements that\n * passed the predicate, and the second array contains the elements that did\n * not. The items are in the same order as they were in the original array.\n * @signature\n * partition(data, predicate)\n * @example\n * partition(\n * ['one', 'two', 'forty two'],\n * x => x.length === 3,\n * ); // => [['one', 'two'], ['forty two']]\n * @dataFirst\n * @category Array\n */\nexport function partition(\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n): [S[], Exclude[]];\nexport function partition(\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): [T[], T[]];\n\n/**\n * Splits a collection into two groups, the first of which contains elements the\n * `predicate` type guard passes, and the second one containing the rest.\n *\n * @param predicate - A function to execute for each element in the array. It\n * should return `true` to add the element to the first partition, and and\n * `false` to add the element to the other partition. A type-predicate can also\n * be used to narrow the result.\n * @returns A 2-tuple of arrays where the first array contains the elements that\n * passed the predicate, and the second array contains the elements that did\n * not. The items are in the same order as they were in the original array.\n * @signature\n * partition(predicate)(data)\n * @example\n * pipe(\n * ['one', 'two', 'forty two'],\n * partition(x => x.length === 3),\n * ); // => [['one', 'two'], ['forty two']]\n * @dataLast\n * @category Array\n */\nexport function partition(\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n): (data: readonly T[]) => [S[], Exclude[]];\nexport function partition(\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): (data: readonly T[]) => [T[], T[]];\n\nexport function partition(...args: readonly unknown[]): unknown {\n return purry(partitionImplementation, args);\n}\n\nconst partitionImplementation = (\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => value is S,\n): [S[], T[]] => {\n const ret: [S[], T[]] = [[], []];\n for (const [index, item] of data.entries()) {\n if (predicate(item, index, data)) {\n ret[0].push(item);\n } else {\n ret[1].push(item);\n }\n }\n return ret;\n};\n", "/* eslint-disable jsdoc/require-param, jsdoc/require-example, jsdoc/require-description -- allow us to deprecate all overloads of the function, not just those that have the docblock directly above them. */\n\nimport { purry } from \"./purry\";\n\n/**\n * Given a union of indexable types `T`, we derive an indexable type\n * containing all of the keys of each variant of `T`. If a key is\n * present in multiple variants of `T`, then the corresponding type in\n * `Pathable` will be the intersection of all types for that key.\n *\n * @example\n * type T1 = Pathable<{a: number} | {a: string; b: boolean}>\n * // {a: number | string; b: boolean}\n *\n * type T2 = Pathable<{a?: {b: string}}\n * // {a: {b: string} | undefined}\n *\n * type T3 = Pathable<{a: string} | number>\n * // {a: string}\n *\n * type T4 = Pathable<{a: number} | {a: string} | {b: boolean}>\n * // {a: number | string; b: boolean}\n *\n * This type lets us answer the questions:\n * - Given some object of type `T`, what keys might this object have?\n * - If this object did happen to have a particular key, what values\n * might that key have?\n */\ntype Pathable = { [K in AllKeys]: TypesForKey };\n\ntype AllKeys = T extends infer I ? keyof I : never;\ntype TypesForKey = T extends infer I\n ? K extends keyof I\n ? I[K]\n : never\n : never;\n\n// Like Required, but also removes explicit null and undefined typings */\ntype StrictlyRequired = { [K in keyof T]-?: NonNullable };\n\n/**\n * Given some `A` which is a key of at least one variant of `T`, derive\n * `T[A]` for the cases where `A` is present in `T`, and `T[A]` is not\n * null or undefined.\n */\ntype PathValue1> = StrictlyRequired<\n Pathable\n>[A];\n/** All possible options after successfully reaching `T[A]`. */\ntype Pathable1> = Pathable>;\n\n/** As `PathValue1`, but for `T[A][B]`. */\ntype PathValue2<\n T,\n A extends keyof Pathable,\n B extends keyof Pathable1,\n> = StrictlyRequired>[B];\n/** As `Pathable1`, but for `T[A][B]`. */\ntype Pathable2<\n T,\n A extends keyof Pathable,\n B extends keyof Pathable1,\n> = Pathable>;\n\n/** As `PathValue1`, but for `T[A][B][C]`. */\ntype PathValue3<\n T,\n A extends keyof Pathable,\n B extends keyof Pathable1,\n C extends keyof Pathable2,\n> = StrictlyRequired>[C];\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is `null` or `undefined`, the `defaultValue` is returned in its place.\n *\n * **DEPRECATED**: Use `defaultTo(prop(object, ...path), defaultValue)`\n * instead!\n *\n * @param object - The target object.\n * @param path - The path of the property to get.\n * @param defaultValue - The default value.\n * @signature pathOr(object, array, defaultValue)\n * @example\n * pathOr({x: 10}, ['y'], 2) // 2\n * pathOr({y: 10}, ['y'], 2) // 10\n * @dataFirst\n * @category Object\n * @deprecated Use `defaultTo(prop(object, ...path), defaultValue)` instead.\n */\nexport function pathOr>(\n object: T,\n path: readonly [A],\n defaultValue: PathValue1,\n): PathValue1;\n\n/**\n * @deprecated Use `defaultTo(prop(object, ...path), defaultValue)` instead.\n */\nexport function pathOr<\n T,\n A extends keyof Pathable,\n B extends keyof Pathable1,\n>(\n object: T,\n path: readonly [A, B],\n defaultValue: PathValue2,\n): PathValue2;\n\n/**\n * @deprecated Use `defaultTo(prop(object, ...path), defaultValue)` instead.\n */\nexport function pathOr<\n T,\n A extends keyof Pathable,\n B extends keyof Pathable1,\n C extends keyof Pathable2,\n>(\n object: T,\n path: readonly [A, B, C],\n defaultValue: PathValue3,\n): PathValue3;\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is `undefined`, the `defaultValue` is returned in its place.\n *\n * **DEPRECATED**: Use `($) => defaultTo(prop($, ...path), defaultValue)`\n * instead, or if already inside a `pipe`, replace the call to `pathOr` with:\n * `pipe(..., prop(...path), defaultTo(defaultValue), ...)`.\n *\n * @param path - The path of the property to get.\n * @param defaultValue - The default value.\n * @signature pathOr(array, defaultValue)(object)\n * @example\n * pipe({x: 10}, pathOr(['y'], 2)) // 2\n * pipe({y: 10}, pathOr(['y'], 2)) // 10\n * @dataLast\n * @category Object\n * @deprecated Use `($) => defaultTo(prop($, ...path), defaultValue)` instead,\n * or if already inside a `pipe`, replace the call to `pathOr` with:\n * `pipe(..., prop(...path), defaultTo(defaultValue), ...)`.\n */\nexport function pathOr>(\n path: readonly [A],\n defaultValue: PathValue1,\n): (object: T) => PathValue1;\n\n/**\n * @deprecated Use `($) => defaultTo(prop($, ...path), defaultValue)` instead,\n * or if already inside a `pipe`, replace the call to `pathOr` with:\n * `pipe(..., prop(...path), defaultTo(defaultValue), ...)`.\n */\nexport function pathOr<\n T,\n A extends keyof Pathable,\n B extends keyof Pathable1,\n>(\n path: readonly [A, B],\n defaultValue: PathValue2,\n): (object: T) => PathValue2;\n\n/**\n * @deprecated Use `($) => defaultTo(prop($, ...path), defaultValue)` instead,\n * or if already inside a `pipe`, replace the call to `pathOr` with:\n * `pipe(..., prop(...path), defaultTo(defaultValue), ...)`.\n */\nexport function pathOr<\n T,\n A extends keyof Pathable,\n B extends keyof Pathable1,\n C extends keyof Pathable2,\n>(\n path: readonly [A, B, C],\n defaultValue: PathValue3,\n): (object: T) => PathValue3;\n\n// TODO [>2]: Remove this function!\nexport function pathOr(...args: readonly unknown[]): unknown {\n return purry(pathOrImplementation, args);\n}\n\nfunction pathOrImplementation(\n data: unknown,\n path: readonly PropertyKey[],\n defaultValue: unknown,\n): unknown {\n let current = data;\n for (const prop of path) {\n if (current === null || current === undefined) {\n break;\n }\n current = (current as Record)[prop];\n }\n\n return current ?? defaultValue;\n}\n", "import type { EmptyObject, IsNever, KeysOfUnion, Writable } from \"type-fest\";\nimport type { IsBounded } from \"./internal/types/IsBounded\";\nimport type { IsBoundedRecord } from \"./internal/types/IsBoundedRecord\";\nimport type { PartitionByUnion } from \"./internal/types/PartitionByUnion\";\nimport type { TupleParts } from \"./internal/types/TupleParts\";\nimport { purry } from \"./purry\";\n\ntype PickFromArray[]> =\n // Distribute unions for both object types and key arrays.\n T extends unknown\n ? Keys extends unknown\n ? // When T is a union (or when Keys is empty) the picked props might\n // not exist in some of its sub-types, e.g.,\n // `pick(... as { a: string } | { b: number }, ['a'])`,\n // if we simply let the regular \"constructive\" logic run, the\n // resulting type would be `{}` which doesn't behave like an empty\n // object! instead, we want to use a more explicit *empty* type.\n IsNever> extends true\n ? EmptyObject\n : // Remove `readonly` modifiers from picked props since we return a\n // new, mutable, object. We don't wrap the result with `Simplify` to\n // flatten it because `Writable` does the same thing implicitly.\n Writable<\n IsBoundedRecord extends true\n ? PickBoundedFromArray\n : PickUnbounded>\n >\n : never\n : never;\n\n/**\n * Bounded records have bounded keys and result in a bounded output. The only\n * question left is whether to add the prop as-is, or make it optional. This\n * can be determined by the part of the keys array the prop is defined in, and\n * the way that element is defined: if the array contains a singular literal\n * key in either the required prefix or the suffix, we know that prop should be\n * picked as-is, otherwise, the key might not be present in the keys array so it\n * can only be picked optionally.\n */\ntype PickBoundedFromArray[]> =\n // Literal keys in the prefix/suffix are guaranteed present.\n Pick<\n T,\n // When T is a union the keys need to be narrowed to just those that are\n // keys of the specific sub-type being built\n Extract<\n | PartitionByUnion[\"required\"]>[\"singular\"]\n | PartitionByUnion[\"suffix\"]>[\"singular\"],\n keyof T\n >\n > &\n // Union keys, optional elements, and rest elements are optional.\n Partial<\n Pick<\n T,\n // When T is a union the keys need to be narrowed to just those that are\n // keys of the specific sub-type being built.\n Extract<\n | PartitionByUnion[\"required\"]>[\"union\"]\n // TODO: the optional part of the keys array will always be empty because its impossible to provide the pick function with a tuple with optional elements; this is because optional elements are always implicitly `undefined` too; which breaks the constraint that all keys are keys of T (`undefined` is not a key of anything). We can lift this restriction by supporting `undefined` in the runtime and relaxing the type constraint to allow it, but this relaxed constraint enables a niche feature (optional tuple elements) at the expense of better type-safety for the more common cases of fixed tuples and arrays. Anyway... if we ever change it, this part of the output type will ensure the output is still correct:\n | TupleParts[\"optional\"][number]\n | TupleParts[\"item\"]\n | PartitionByUnion[\"suffix\"]>[\"union\"],\n keyof T\n >\n >\n >;\n\n/**\n * The built-in `Pick` is weird when it comes to picking bounded keys from\n * unbounded records. It reconstructs the output object regardless of the shape\n * of the input: `Pick, \"hello\">` results in the type\n * `{ hello: \"world\" }`, but you'd expect it to be optional because we don't\n * know if the record contains a `hello` prop or not!\n *\n * !Important: We assume T is unbounded and don't test for it!\n *\n * See: https://www.typescriptlang.org/play/?#code/PTAEE0HsFcHIBNQFMAeAHJBjALqAGqNpKAEZKigAGA3qABZIA2jkA-AFygBEA7pAE6N4XUAF9KAGlLRcAQ0ayAzgChsATwz5QAXlAAFAJaYA1gB4ASlgHxTi7PwMA7AOZTeAoVwB8bhs0jeANzKIBSgAHqsykA.\n */\ntype PickUnbounded =\n IsBounded extends true ? Partial> : Pick;\n\n/**\n * Creates an object composed of the picked `data` properties.\n *\n * @param keys - The property names.\n * @signature pick([prop1, prop2])(object)\n * @example\n * pipe({ a: 1, b: 2, c: 3, d: 4 }, pick(['a', 'd'])) // => { a: 1, d: 4 }\n * @dataLast\n * @category Object\n */\nexport function pick<\n T extends object,\n const Keys extends readonly KeysOfUnion[],\n>(keys: Keys): (data: T) => PickFromArray;\n\n/**\n * Creates an object composed of the picked `data` properties.\n *\n * @param data - The target object.\n * @param keys - The property names.\n * @signature pick(object, [prop1, prop2])\n * @example\n * pick({ a: 1, b: 2, c: 3, d: 4 }, ['a', 'd']) // => { a: 1, d: 4 }\n * @dataFirst\n * @category Object\n */\nexport function pick<\n T extends object,\n const Keys extends readonly KeysOfUnion[],\n>(data: T, keys: Keys): PickFromArray;\n\nexport function pick(...args: readonly unknown[]): unknown {\n return purry(pickImplementation, args);\n}\n\nfunction pickImplementation<\n T extends object,\n Keys extends readonly (keyof T)[],\n>(object: T, keys: Keys): PickFromArray {\n const out: Partial> = {};\n for (const key of keys) {\n if (key in object) {\n out[key] = object[key];\n }\n }\n // @ts-expect-error [ts2322] - We build the type incrementally, there's no way to make typescript infer that we \"finished\" building the object and to treat it as such.\n return out;\n}\n", "import type { IsNever, Simplify } from \"type-fest\";\nimport type { EnumerableStringKeyOf } from \"./internal/types/EnumerableStringKeyOf\";\nimport type { EnumerableStringKeyedValueOf } from \"./internal/types/EnumerableStringKeyedValueOf\";\nimport type { IsBoundedRecord } from \"./internal/types/IsBoundedRecord\";\nimport type { ToString } from \"./internal/types/ToString\";\nimport { purry } from \"./purry\";\n\n// When the predicate isn't a type-guard we don't know which properties would be\n// part of the output and which wouldn't so we can only safely downgrade the\n// whole object to a Partial of the input.\ntype EnumeratedPartial = T extends unknown\n ? Simplify<\n IsBoundedRecord extends true\n ? {\n // Object.entries returns keys as strings.\n -readonly [P in keyof T as ToString

]?: Required[P];\n }\n : // For unbounded records (a simple Record with primitive `string` or\n // `number` keys) the return type here could technically be T; but for\n // cases where the record is unbounded but is more complex (like\n // `symbol` keys) we want to \"reconstruct\" the record from just its\n // enumerable components (which are the ones accessible via\n // `Object.entries`).\n Record, EnumerableStringKeyedValueOf>\n >\n : never;\n\n// When the predicate is a type-guard we have more information to work with when\n// constructing the type of the output object. We can safely remove any property\n// which value would never come up true for the predicate, AND we can also\n// assume that properties that match the predicate perfectly would **always**\n// show up in the output object. Hence to build the output object we need to\n// build and merge 2 output objects: One for the properties which have a value\n// of at type that would always yield a `true` result from the predicate, these\n// are the \"matches\", which would not change the \"optionality\" of the input\n// object's props, and one for partial matches which would also make the props\n// optional (as they could have a value that would be filtered out).\ntype EnumeratedPartialNarrowed = T extends unknown\n ? Simplify<\n IsBoundedRecord extends true\n ? ExactProps & PartialProps\n : // For unbounded records we need to \"reconstruct\" the record and\n // narrow the value types. Similar to the non-narrowed case, we need\n // to also ignore `symbol` keys and any values that are only relevant\n // to them.\n Record<\n EnumerableStringKeyOf,\n Extract, S>\n >\n >\n : never;\n\n// The exact case, props here would always be part of the output object\ntype ExactProps = {\n // Object.entries returns keys as strings.\n -readonly [P in keyof T as ToString<\n IsExactProp extends true ? P : never\n >]: Extract[P], S>;\n};\n\n// The partial case, props here might be part of the output object, but might\n// not be, hence they are optional.\ntype PartialProps = {\n // Object.entries returns keys as strings.\n -readonly [P in keyof T as ToString<\n IsPartialProp extends true ? P : never\n >]?: IsNever> extends true\n ? // If the result of extracting S from T[P] is never but S still extends\n // it, it means that T[P] is too wide and S can't be extracted from it:\n // e.g. if T[P] is `number` S is `1` then `Extract === never`.\n // For these cases we can return S directly as the type as it's already\n // very narrowed compared to T[P].\n S extends T[P]\n ? S\n : never\n : Extract;\n};\n\n// If the input object's value type extends itself when the type-guard is\n// extracted from it we can safely assume that the predicate would always return\n// true for any value of that property.\ntype IsExactProp =\n T[P] extends Extract ? true : false;\n\n// ...and if the input object's value type isn't an exact match, but still has\n// some partial match (i.g. the extracted type-guard isn't completely disjoint)\n// then we can assume that the property can sometimes return true, and sometimes\n// false when passed to the predicate, hence it should be optional in the\n// output.\ntype IsPartialProp =\n IsExactProp extends true\n ? false\n : IsNever> extends true\n ? S extends T[P]\n ? // If the result of extracting S from T[P] is never but S still\n // extends it, it means that T[P] is too wide and S can't be\n // extracted from it: e.g. if T[P] is `number` S is `1` then\n // `Extract === never`, but `1` extends `number`. We need\n // to handle these cases when we extract the value too (see above).\n true\n : false\n : true;\n\n/**\n * Iterates over the entries of `data` and reconstructs the object using only\n * entries that `predicate` accepts. Symbol keys are not passed to the predicate\n * and would be filtered out from the output object.\n *\n * See `omitBy` for a complementary function which starts with a shallow copy of\n * the input object and removes the entries that the predicate rejects. Because\n * it is subtractive symbol keys would be copied over to the output object.\n * See also `entries`, `filter`, and `fromEntries` which could be used to build\n * your own version of `pickBy` if you need more control (though the resulting\n * type might be less precise).\n *\n * @param data - The target object.\n * @param predicate - A function that takes the value, key, and the data itself\n * and returns true if the entry should be part of the output object, or `false`\n * to remove it. If the function is a type-guard on the value the output type\n * would be narrowed accordingly.\n * @returns A shallow copy of the input object with the rejected entries\n * removed.\n * @signature pickBy(data, predicate)\n * @example\n * pickBy({a: 1, b: 2, A: 3, B: 4}, (val, key) => key.toUpperCase() === key) // => {A: 3, B: 4}\n * @dataFirst\n * @category Object\n */\nexport function pickBy<\n T extends object,\n S extends EnumerableStringKeyedValueOf,\n>(\n data: T,\n predicate: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => value is S,\n): EnumeratedPartialNarrowed;\nexport function pickBy(\n data: T,\n predicate: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => boolean,\n): EnumeratedPartial;\n\n/**\n * Iterates over the entries of `data` and reconstructs the object using only\n * entries that `predicate` accepts. Symbol keys are not passed to the predicate\n * and would be filtered out from the output object.\n *\n * See `omitBy` for a complementary function which starts with a shallow copy of\n * the input object and removes the entries that the predicate rejects. Because\n * it is subtractive symbol keys would be copied over to the output object.\n * See also `entries`, `filter`, and `fromEntries` which could be used to build\n * your own version of `pickBy` if you need more control (though the resulting\n * type might be less precise).\n *\n * @param predicate - A function that takes the value, key, and the data itself\n * and returns true if the entry should be part of the output object, or `false`\n * to remove it. If the function is a type-guard on the value the output type\n * would be narrowed accordingly.\n * @signature\n * pickBy(predicate)(data)\n * @example\n * pipe({a: 1, b: 2, A: 3, B: 4}, pickBy((val, key) => key.toUpperCase() === key)); // => {A: 3, B: 4}\n * @dataLast\n * @category Object\n */\nexport function pickBy<\n T extends object,\n S extends EnumerableStringKeyedValueOf,\n>(\n predicate: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => value is S,\n): (data: T) => EnumeratedPartialNarrowed;\nexport function pickBy(\n predicate: (\n value: EnumerableStringKeyedValueOf,\n key: EnumerableStringKeyOf,\n data: T,\n ) => boolean,\n): (data: T) => EnumeratedPartial;\n\nexport function pickBy(...args: readonly unknown[]): unknown {\n return purry(pickByImplementation, args);\n}\n\nfunction pickByImplementation(\n data: T,\n predicate: (value: unknown, key: string, data: T) => boolean,\n): Record {\n const out: Partial> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (predicate(value, key, data)) {\n out[key] = value;\n }\n }\n\n return out;\n}\n", "import { pipe } from \"./pipe\";\n\n/**\n * Data-last version of `pipe`. See `pipe` documentation for full details.\n *\n * Use `piped` when you need to pass a transformation as a callback to\n * functions like `map` and `filter`, where the data type can be inferred\n * from the call site.\n *\n * IMPORTANT: `piped` does not work as a \"function factory\" in order to create\n * standalone utility functions; because TypeScript cannot infer the input data\n * type (without requiring to explicitly define all type params for all\n * functions in the pipe). We recommend defining the function explicitly, and\n * then use `pipe` in its implementation.\n *\n * @signature\n * piped(...functions)(data);\n * @example\n * map(\n * [{ a: 1 }, { a: 2 }, { a: 3 }],\n * piped(prop('a'), add(1)),\n * ); //=> [2, 3, 4]\n * @dataLast\n * @category Function\n */\nexport function piped(): (data: A) => A;\n\nexport function piped(funcA: (input: A) => B): (data: A) => B;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n): (data: A) => C;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n): (data: A) => D;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n): (data: A) => E;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n): (data: A) => F;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n): (data: A) => G;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n): (data: A) => H;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n): (data: A) => I;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n): (data: A) => J;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n): (data: A) => K;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n): (data: A) => L;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n funcL: (input: L) => M,\n): (data: A) => M;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n funcL: (input: L) => M,\n funcM: (input: M) => N,\n): (data: A) => N;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n funcL: (input: L) => M,\n funcM: (input: M) => N,\n funcN: (input: N) => O,\n): (data: A) => O;\n\nexport function piped(\n funcA: (input: A) => B,\n funcB: (input: B) => C,\n funcC: (input: C) => D,\n funcD: (input: D) => E,\n funcE: (input: E) => F,\n funcF: (input: F) => G,\n funcG: (input: G) => H,\n funcH: (input: H) => I,\n funcI: (input: I) => J,\n funcJ: (input: J) => K,\n funcK: (input: K) => L,\n funcL: (input: L) => M,\n funcM: (input: M) => N,\n funcN: (input: N) => O,\n funcO: (input: O) => P,\n): (data: A) => P;\n\nexport function piped(...functions: readonly ((input: unknown) => unknown)[]) {\n return (value: unknown): unknown =>\n pipe(\n value,\n // @ts-expect-error [ts2556] - We can't avoid this error because pipe is typed for users and this is an internal function\n ...functions,\n );\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\ntype Product | IterableContainer> =\n // Empty arrays would always result in a product of (a non-bigint) 1\n T extends readonly []\n ? 1\n : // Non-empty bigint arrays will always result in a bigint product.\n T extends readonly [bigint, ...(readonly unknown[])]\n ? bigint\n : // But an empty bigint array would result in a non-bigint 1.\n T[number] extends bigint\n ? bigint | 1\n : // Non-bigint arrays are always handled correctly.\n number;\n\n/**\n * Compute the product of the numbers in the array, or return 1 for an empty\n * array.\n *\n * Works for both `number` and `bigint` arrays, but not arrays that contain both\n * types.\n *\n * IMPORTANT: The result for empty arrays would be 1 (`number`) regardless of\n * the type of the array; to avoid adding this to the return type for cases\n * where the array is known to be non-empty you can use `hasAtLeast` or\n * `isEmpty` to guard against this case.\n *\n * @param data - The array of numbers.\n * @signature\n * product(data);\n * @example\n * product([1, 2, 3]); // => 6\n * product([1n, 2n, 3n]); // => 6n\n * product([]); // => 1\n * @dataFirst\n * @category Number\n */\nexport function product<\n T extends IterableContainer | IterableContainer,\n>(data: T): Product;\n\n/**\n * Compute the product of the numbers in the array, or return 1 for an empty\n * array.\n *\n * Works for both `number` and `bigint` arrays, but not arrays that contain both\n * types.\n *\n * IMPORTANT: The result for empty arrays would be 1 (`number`) regardless of\n * the type of the array; to avoid adding this to the return type for cases\n * where the array is known to be non-empty you can use `hasAtLeast` or\n * `isEmpty` to guard against this case.\n *\n * @signature\n * product()(data);\n * @example\n * pipe([1, 2, 3], product()); // => 6\n * pipe([1n, 2n, 3n], product()); // => 6n\n * pipe([], product()); // => 1\n * @dataLast\n * @category Number\n */\nexport function product(): <\n T extends IterableContainer | IterableContainer,\n>(\n data: T,\n) => Product;\n\nexport function product(...args: readonly unknown[]): unknown {\n return purry(productImplementation, args);\n}\n\nfunction productImplementation<\n T extends IterableContainer | IterableContainer,\n>(data: T): T[number] {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers -- The rule differentiates 1 and 1n :(\n let out = typeof data[0] === \"bigint\" ? 1n : 1;\n for (const value of data) {\n // @ts-expect-error [ts2365] -- Typescript can't infer that all elements will be a number of the same type.\n out *= value;\n }\n return out;\n}\n", "import type { KeysOfUnion } from \"type-fest\";\nimport type { ArrayAt } from \"./internal/types/ArrayAt\";\n\n// Computes all possible keys of `T` at `Path` spread over unions, allowing\n// keys from any of the results, not just those **shared** by all of them.\ntype KeysDeep = KeysOfUnion<\n PropDeep\n>;\n\n// Recursively run `Prop` over `Path` to extract the deeply nested type.\ntype PropDeep = Path extends readonly [\n infer Key,\n ...infer Rest,\n]\n ? PropDeep, Rest>\n : // Keys is a fixed tuple so we know we reach here only when we've reached\n // the output object.\n T;\n\n// Expanding on the built-in `T[Key]` operator to support arrays and unions.\ntype Prop =\n // Distribute the union to support unions of keys.\n T extends unknown\n ? // In a distributed union some of the union members might not be keys of a\n // specific object within a union of objects, those cases don't contribute\n // to the output type.\n Key extends keyof T\n ? T extends readonly unknown[]\n ? ArrayAt\n : T[Key]\n : undefined\n : never;\n\n// Currying relies on us being able to differentiate between data-first and\n// data-last invocations at runtime, but because the function takes a variadic\n// array of keys we can't rely on it's shape or length to do that. Instead, we\n// can limit the types we accept for `data` so that looking at the first\n// parameter's type is enough to make the call. From a practical standpoint\n// this means we accept in any `object`, `null,` or `undefined`, and that we\n// don't accept `string`. All other types (`boolean` and `bigint`) don't\n// have properties, so are incompatible with our `key` parameters anyway.\ntype NonPropertyKey = object | null | undefined;\n\n/**\n * Gets the value of the given property from an object. Nested properties can\n * be accessed by providing a variadic array of keys that define the path from\n * the root to the desired property. Arrays can be accessed by using numeric\n * keys. Unions and optional properties are handled gracefully by returning\n * `undefined` early for any non-existing property on the path. Paths are\n * validated against the object type to provide stronger type safety, better\n * compile-time errors, and to enable autocompletion in IDEs.\n *\n * @param data - The object or array to access.\n * @param key - The key(s) for the property to extract.\n * @signature\n * prop(data, ...keys);\n * @example\n * prop({ foo: { bar: 'baz' } }, 'foo'); //=> { bar: 'baz' }\n * prop({ foo: { bar: 'baz' } }, 'foo', 'bar'); //=> 'baz'\n * prop([\"cat\", \"dog\"], 1); //=> 'dog'\n * @dataFirst\n * @category Object\n */\nexport function prop>(\n data: T,\n key: Key,\n): NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n>(data: T, key0: Key0, key1: Key1): NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n>(\n data: T,\n key0: Key0,\n key1: Key1,\n key2: Key2,\n): NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n>(\n data: T,\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n): NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n>(\n data: T,\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n): NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n>(\n data: T,\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n): NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n Key6 extends KeysDeep,\n>(\n data: T,\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n key6: Key6,\n): NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n Key6 extends KeysDeep,\n Key7 extends KeysDeep,\n>(\n data: T,\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n key6: Key6,\n key7: Key7,\n): NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n Key6 extends KeysDeep,\n Key7 extends KeysDeep,\n Key8 extends KeysDeep,\n>(\n data: T,\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n key6: Key6,\n key7: Key7,\n key8: Key8,\n): NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n Key6 extends KeysDeep,\n Key7 extends KeysDeep,\n Key8 extends KeysDeep,\n Key9 extends KeysDeep<\n T,\n [Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8]\n >,\n AdditionalKeys extends readonly PropertyKey[] = [],\n>(\n data: T,\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n key6: Key6,\n key7: Key7,\n key8: Key8,\n key9: Key9,\n ...additionalKeys: AdditionalKeys\n): NoInfer<\n PropDeep<\n T,\n [\n Key0,\n Key1,\n Key2,\n Key3,\n Key4,\n Key5,\n Key6,\n Key7,\n Key8,\n Key9,\n ...AdditionalKeys,\n ]\n >\n>;\n\n/**\n * Gets the value of the given property from an object. Nested properties can\n * be accessed by providing a variadic array of keys that define the path from\n * the root to the desired property. Arrays can be accessed by using numeric\n * keys. Unions and optional properties are handled gracefully by returning\n * `undefined` early for any non-existing property on the path. Paths are\n * validated against the object type to provide stronger type safety, better\n * compile-time errors, and to enable autocompletion in IDEs.\n *\n * @param key - The key(s) for the property to extract.\n * @signature\n * prop(...keys)(data);\n * @example\n * pipe({ foo: { bar: 'baz' } }, prop('foo')); //=> { bar: 'baz' }\n * pipe({ foo: { bar: 'baz' } }, prop('foo', 'bar')); //=> 'baz'\n * pipe([\"cat\", \"dog\"], prop(1)); //=> 'dog'\n * @dataLast\n * @category Object\n */\nexport function prop>(\n key: Key,\n): (data: T) => NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n>(key0: Key0, key1: Key1): (data: T) => NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n>(\n key0: Key0,\n key1: Key1,\n key2: Key2,\n): (data: T) => NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n>(\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n): (data: T) => NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n>(\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n): (data: T) => NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n>(\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n): (data: T) => NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n Key6 extends KeysDeep,\n>(\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n key6: Key6,\n): (\n data: T,\n) => NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n Key6 extends KeysDeep,\n Key7 extends KeysDeep,\n>(\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n key6: Key6,\n key7: Key7,\n): (\n data: T,\n) => NoInfer>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n Key6 extends KeysDeep,\n Key7 extends KeysDeep,\n Key8 extends KeysDeep,\n>(\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n key6: Key6,\n key7: Key7,\n key8: Key8,\n): (\n data: T,\n) => NoInfer<\n PropDeep\n>;\nexport function prop<\n T extends NonPropertyKey,\n Key0 extends KeysDeep,\n Key1 extends KeysDeep,\n Key2 extends KeysDeep,\n Key3 extends KeysDeep,\n Key4 extends KeysDeep,\n Key5 extends KeysDeep,\n Key6 extends KeysDeep,\n Key7 extends KeysDeep,\n Key8 extends KeysDeep,\n Key9 extends KeysDeep<\n T,\n [Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8]\n >,\n AdditionalKeys extends readonly PropertyKey[] = [],\n>(\n key0: Key0,\n key1: Key1,\n key2: Key2,\n key3: Key3,\n key4: Key4,\n key5: Key5,\n key6: Key6,\n key7: Key7,\n key8: Key8,\n key9: Key9,\n ...additionalKeys: AdditionalKeys\n): (\n data: T,\n) => NoInfer<\n PropDeep<\n T,\n [\n Key0,\n Key1,\n Key2,\n Key3,\n Key4,\n Key5,\n Key6,\n Key7,\n Key8,\n Key9,\n ...AdditionalKeys,\n ]\n >\n>;\n\nexport function prop(\n key: K,\n): >>(data: T) => T[K];\n\nexport function prop(\n maybeData: NonPropertyKey | PropertyKey,\n ...args: readonly PropertyKey[]\n): unknown {\n return typeof maybeData === \"string\" ||\n typeof maybeData === \"number\" ||\n typeof maybeData === \"symbol\"\n ? (data: NonPropertyKey) => propImplementation(data, maybeData, ...args)\n : propImplementation(maybeData, ...args);\n}\n\nfunction propImplementation(\n data: NonPropertyKey,\n ...keys: readonly PropertyKey[]\n): unknown {\n let output: unknown = data;\n for (const key of keys) {\n if (output === undefined || output === null) {\n return undefined;\n }\n // @ts-expect-error [ts7053] -- This is fine, the types are really dynamic\n // here and TypeScript doesn't have a chance to infer them correctly.\n output = output[key];\n }\n return output;\n}\n", "import type { BoundedPartial } from \"./internal/types/BoundedPartial\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n/**\n * Creates an object that maps the result of `valueExtractor` with a key\n * resulting from running `keyExtractor` on each item in `data`. Duplicate keys\n * are overwritten, guaranteeing that the extractor functions are run on each\n * item in `data`.\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * * `fromKeys` - Builds an object from an array of *keys* and a mapper for values.\n * * `indexBy` - Builds an object from an array of *values* and a mapper for keys.\n * * `fromEntries` - Builds an object from an array of key-value pairs.\n * Refer to the docs for more details.\n *\n * @param data - The items used to pull/extract the keys and values from.\n * @param keyExtractor - Computes the key for item.\n * @param valueExtractor - Computes the value for the item.\n * @signature\n * pullObject(data, keyExtractor, valueExtractor);\n * @example\n * pullObject(\n * [\n * { name: \"john\", email: \"john@remedajs.com\" },\n * { name: \"jane\", email: \"jane@remedajs.com\" }\n * ],\n * prop(\"name\"),\n * prop(\"email\"),\n * ); // => { john: \"john@remedajs.com\", jane: \"jane@remedajs.com\" }\n * @dataFirst\n * @category Object\n */\nexport function pullObject<\n T extends IterableContainer,\n K extends PropertyKey,\n V,\n>(\n data: T,\n keyExtractor: (item: T[number], index: number, data: T) => K,\n valueExtractor: (item: T[number], index: number, data: T) => V,\n): BoundedPartial>;\n\n/**\n * Creates an object that maps the result of `valueExtractor` with a key\n * resulting from running `keyExtractor` on each item in `data`. Duplicate keys\n * are overwritten, guaranteeing that the extractor functions are run on each\n * item in `data`.\n *\n * There are several other functions that could be used to build an object from\n * an array:\n * * `fromKeys` - Builds an object from an array of *keys* and a mapper for values.\n * * `indexBy` - Builds an object from an array of *values* and a mapper for keys.\n * * `fromEntries` - Builds an object from an array of key-value pairs.\n * Refer to the docs for more details.\n *\n * @param keyExtractor - Computes the key for item.\n * @param valueExtractor - Computes the value for the item.\n * @signature\n * pullObject(keyExtractor, valueExtractor)(data);\n * @example\n * pipe(\n * [\n * { name: \"john\", email: \"john@remedajs.com\" },\n * { name: \"jane\", email: \"jane@remedajs.com\" }\n * ],\n * pullObject(prop(\"name\"), prop(\"email\")),\n * ); // => { john: \"john@remedajs.com\", jane: \"jane@remedajs.com\" }\n * @dataLast\n * @category Object\n */\nexport function pullObject<\n T extends IterableContainer,\n K extends PropertyKey,\n V,\n>(\n keyExtractor: (item: T[number], index: number, data: T) => K,\n valueExtractor: (item: T[number], index: number, data: T) => V,\n): (data: T) => BoundedPartial>;\n\nexport function pullObject(...args: readonly unknown[]): unknown {\n return purry(pullObjectImplementation, args);\n}\n\nfunction pullObjectImplementation<\n T extends IterableContainer,\n K extends PropertyKey,\n V,\n>(\n data: T,\n keyExtractor: (item: T[number], index: number, data: T) => K,\n valueExtractor: (item: T[number], index: number, data: T) => V,\n): Partial> {\n const result: Partial> = {};\n\n for (const [index, item] of data.entries()) {\n const key = keyExtractor(item, index, data);\n const value = valueExtractor(item, index, data);\n result[key] = value;\n }\n\n return result;\n}\n", "/* eslint-disable no-bitwise, @typescript-eslint/no-magic-numbers --\n * We randomize the bigint using randomized bitmaps, we have to use bitwise\n * operations to manipulate them.\n */\n\n/**\n * Generate a random `bigint` between `from` and `to` (inclusive).\n *\n * ! Important: In most environments this function uses\n * [`crypto.getRandomValues()`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues)\n * under-the-hood which **is** cryptographically strong. When the WebCrypto API\n * isn't available (Node 18) we fallback to an implementation that uses\n * [`Math.random()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)\n * which is **NOT** cryptographically secure.\n *\n * @param from - The minimum value.\n * @param to - The maximum value.\n * @returns The random integer.\n * @signature\n * randomBigInt(from, to)\n * @example\n * randomBigInt(1n, 10n) // => 5n\n * @dataFirst\n * @category Number\n */\nexport function randomBigInt(from: bigint, to: bigint): bigint {\n if (to < from) {\n throw new RangeError(\n `randomBigInt: The range [${from.toString()},${to.toString()}] is empty.`,\n );\n }\n\n const range = to - from;\n\n // Get the max number of bits needed to encode the result. We will generate\n // this number of random bits. A radix of 2 would give us the binary\n // representation of the number.\n const { length: maxBits } = range.toString(2 /* radix */);\n\n // We can only generate random data in bytes, not bits, so we need to generate\n // enough bytes to cover the required number of bits.\n const maxBytes = Math.ceil(maxBits / 8);\n\n // The number of bits we need to ignore in the random bitmap we generate.\n const excessBits = BigInt(8 - (maxBits % 8));\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- It's more readable than using a do..while loop.\n while (true) {\n // We use `crypto` for our RNG, it should be supported in all modern\n // environments we support.\n const randomBytes = random(maxBytes);\n\n const raw = asBigInt(randomBytes);\n\n // Shift the number back to our range, this effectively sets the excess bits\n // to 0.\n const result = raw >> excessBits;\n\n // The generated number might overflow when `range < 2 ** maxBits - 1`, so\n // it can't be returned. To ensure that all possible results have the same\n // probability, we ignore the value entirely and try again (instead of\n // trying to adapt it to the output range somehow).\n if (result <= range) {\n return result + from;\n }\n }\n}\n\nfunction asBigInt(bytes: Iterable): bigint {\n let result = 0n;\n for (const byte of bytes) {\n // We build the bigint by shifting the current value by a byte, and putting\n // the next byte in that \"slot\".\n result = (result << 8n) + BigInt(byte);\n }\n return result;\n}\n\nfunction random(numBytes: number): Uint8Array {\n const output = new Uint8Array(numBytes);\n\n if (typeof crypto === \"undefined\") {\n // Polyfill for environments without `crypto` support. The only env which\n // requires this and we support is Node 18; once we drop support for it we\n // can drop the polyfill.\n for (let index = 0; index < numBytes; index += 1) {\n output[index] = Math.floor(Math.random() * 256);\n }\n } else {\n crypto.getRandomValues(output);\n }\n\n return output;\n}\n", "import type {\n GreaterThan,\n GreaterThanOrEqual,\n IsEqual,\n IsNever,\n NonNegativeInteger,\n Or,\n} from \"type-fest\";\nimport type { IntRangeInclusive } from \"./internal/types/IntRangeInclusive\";\n\n// This limitation is defined by type-fest\ntype MaxLiteral = 1000;\n\ntype RandomInteger =\n Or<\n IsNever>,\n IsNever>\n > extends true\n ? number\n : IsEqual extends true\n ? From\n : GreaterThan extends true\n ? never\n : GreaterThanOrEqual extends true\n ? number\n : IntRangeInclusive;\n\n/**\n * Generate a random integer between `from` and `to` (inclusive).\n *\n * !Important: This function uses [`Math.random()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random) under-the-hood, which has two major limitations:\n * 1. It generates 2^52 possible values, so the bigger the range, the less\n * uniform the distribution of values would be, and at ranges larger than that\n * some values would never come up.\n * 2. It is not cryptographically secure and should not be used for security\n * scenarios.\n *\n * @param from - The minimum value.\n * @param to - The maximum value.\n * @returns The random integer.\n * @signature\n * randomInteger(from, to)\n * @example\n * randomInteger(1, 10) // => 5\n * randomInteger(1.5, 2.6) // => 2\n * @dataFirst\n * @category Number\n */\nexport function randomInteger(\n from: From,\n to: To,\n): RandomInteger {\n const fromCeiled = Math.ceil(from);\n const toFloored = Math.floor(to);\n\n if (toFloored < fromCeiled) {\n throw new RangeError(\n `randomInteger: The range [${from.toString()},${to.toString()}] contains no integer`,\n );\n }\n\n return Math.floor(\n Math.random() * (toFloored - fromCeiled + 1) + fromCeiled,\n ) as RandomInteger;\n}\n", "import { purry } from \"./purry\";\n\nconst ALPHABET =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n/**\n * A [pseudo-random](https://en.wikipedia.org/wiki/Pseudorandom_number_generator) [alpha-numeric](https://en.wikipedia.org/wiki/Alphanumericals)\n * [string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String).\n *\n * It is not [cryptographically secure](https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator)!\n *\n * @param length - The length of the random string.\n * @returns The random string.\n * @signature\n * randomString(length)\n * @example\n * randomString(5) // => aB92J\n * @dataFirst\n * @category String\n */\nexport function randomString(length: number): string;\n\n/**\n * A [pseudo-random](https://en.wikipedia.org/wiki/Pseudorandom_number_generator) [alpha-numeric](https://en.wikipedia.org/wiki/Alphanumericals)\n * [string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String).\n *\n * It is not [cryptographically secure](https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator)!\n *\n * @returns The random string.\n * @signature\n * randomString()(length)\n * @example\n * pipe(5, randomString()) // => aB92J\n * @dataLast\n * @category String\n */\nexport function randomString(): (length: number) => string;\n\nexport function randomString(...args: readonly unknown[]): unknown {\n return purry(randomStringImplementation, args);\n}\n\nfunction randomStringImplementation(length: number): string {\n const out: string[] = [];\n for (let iteration = 0; iteration < length; iteration++) {\n const randomChar = ALPHABET[Math.floor(Math.random() * ALPHABET.length)]!;\n out.push(randomChar);\n }\n return out.join(\"\");\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Returns a list of numbers from `start` (inclusive) to `end` (exclusive).\n *\n * @param start - The start number.\n * @param end - The end number.\n * @signature range(start, end)\n * @example\n * range(1, 5) // => [1, 2, 3, 4]\n * @dataFirst\n * @category Array\n */\nexport function range(start: number, end: number): number[];\n\n/**\n * Returns a list of numbers from `start` (inclusive) to `end` (exclusive).\n *\n * @param end - The end number.\n * @signature range(end)(start)\n * @example\n * range(5)(1) // => [1, 2, 3, 4]\n * @dataLast\n * @category Array\n */\nexport function range(end: number): (start: number) => number[];\n\nexport function range(...args: readonly unknown[]): unknown {\n return purry(rangeImplementation, args);\n}\n\nfunction rangeImplementation(start: number, end: number): number[] {\n const ret: number[] = [];\n for (let i = start; i < end; i++) {\n ret.push(i);\n }\n return ret;\n}\n", "import {\n purryOrderRulesWithArgument,\n type OrderRule,\n} from \"./internal/purryOrderRules\";\nimport type { CompareFunction } from \"./internal/types/CompareFunction\";\nimport type { NonEmptyArray } from \"./internal/types/NonEmptyArray\";\n\n/**\n * Calculates the rank of an item in an array based on `rules`. The rank is the position where the item would appear in the sorted array. This function provides an efficient way to determine the rank in *O(n)* time, compared to *O(nlogn)* for the equivalent `sortedIndex(sortBy(data, ...rules), item)`.\n *\n * @param data - The input array.\n * @param item - The item whose rank is to be determined.\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns The rank of the item in the sorted array in the range [0..data.length].\n * @signature\n * rankBy(data, item, ...rules)\n * @example\n * const DATA = [{ a: 5 }, { a: 1 }, { a: 3 }] as const;\n * rankBy(DATA, 0, prop('a')) // => 0\n * rankBy(DATA, 1, prop('a')) // => 1\n * rankBy(DATA, 2, prop('a')) // => 1\n * rankBy(DATA, 3, prop('a')) // => 2\n * @dataFirst\n * @category Array\n */\nexport function rankBy(\n data: readonly T[],\n item: T,\n ...rules: Readonly>>\n): number;\n\n/**\n * Calculates the rank of an item in an array based on `rules`. The rank is the position where the item would appear in the sorted array. This function provides an efficient way to determine the rank in *O(n)* time, compared to *O(nlogn)* for the equivalent `sortedIndex(sortBy(data, ...rules), item)`.\n *\n * @param item - The item whose rank is to be determined.\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns The rank of the item in the sorted array in the range [0..data.length].\n * @signature\n * rankBy(item, ...rules)(data)\n * @example\n * const DATA = [{ a: 5 }, { a: 1 }, { a: 3 }] as const;\n * pipe(DATA, rankBy(0, prop('a'))) // => 0\n * pipe(DATA, rankBy(1, prop('a'))) // => 1\n * pipe(DATA, rankBy(2, prop('a'))) // => 1\n * pipe(DATA, rankBy(3, prop('a'))) // => 2\n * @dataLast\n * @category Array\n */\nexport function rankBy(\n item: T,\n ...rules: Readonly>>\n): (data: readonly T[]) => number;\n\nexport function rankBy(...args: readonly unknown[]): unknown {\n return purryOrderRulesWithArgument(rankByImplementation, args);\n}\n\nfunction rankByImplementation(\n data: readonly T[],\n compareFn: CompareFunction,\n targetItem: T,\n): number {\n let rank = 0;\n for (const item of data) {\n if (compareFn(targetItem, item) > 0) {\n // The rank of the item is equivalent to the number of items that would\n // come before it if the array was sorted. We assume that the\n rank += 1;\n }\n }\n return rank;\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Executes a user-supplied \"reducer\" callback function on each element of the\n * array, in order, passing in the return value from the calculation on the\n * preceding element. The final result of running the reducer across all\n * elements of the array is a single value. Equivalent to\n * `Array.prototype.reduce`.\n *\n * @param data - The items to reduce.\n * @param callbackfn - A function to execute for each element in the array. Its\n * return value becomes the value of the accumulator parameter on the next\n * invocation of callbackFn. For the last invocation, the return value becomes\n * the return value of reduce().\n * @param initialValue - A value to which accumulator is initialized the first\n * time the callback is called. CallbackFn starts executing with the first value\n * in the array as currentValue.\n * @returns The value that results from running the \"reducer\" callback function\n * to completion over the entire array.\n * @signature\n * reduce(data, callbackfn, initialValue)\n * @example\n * reduce([1, 2, 3, 4, 5], (acc, x) => acc + x, 100) // => 115\n * @dataFirst\n * @category Array\n */\nexport function reduce(\n data: readonly T[],\n callbackfn: (\n previousValue: U,\n currentValue: T,\n currentIndex: number,\n data: readonly T[],\n ) => U,\n initialValue: U,\n): U;\n\n/**\n * Executes a user-supplied \"reducer\" callback function on each element of the\n * array, in order, passing in the return value from the calculation on the\n * preceding element. The final result of running the reducer across all\n * elements of the array is a single value. Equivalent to\n * `Array.prototype.reduce`.\n *\n * @param callbackfn - A function to execute for each element in the array. Its\n * return value becomes the value of the accumulator parameter on the next\n * invocation of callbackFn. For the last invocation, the return value becomes\n * the return value of reduce().\n * @param initialValue - A value to which accumulator is initialized the first\n * time the callback is called. CallbackFn starts executing with the first value\n * in the array as currentValue.\n * @returns The value that results from running the \"reducer\" callback function\n * to completion over the entire array.\n * @signature\n * reduce(fn, initialValue)(array)\n * @example\n * pipe([1, 2, 3, 4, 5], reduce((acc, x) => acc + x, 100)) // => 115\n * @dataLast\n * @category Array\n */\nexport function reduce(\n callbackfn: (\n previousValue: U,\n currentValue: T,\n currentIndex: number,\n data: readonly T[],\n ) => U,\n initialValue: U,\n): (data: readonly T[]) => U;\n\nexport function reduce(...args: readonly unknown[]): unknown {\n return purry(reduceImplementation, args);\n}\n\nconst reduceImplementation = (\n data: readonly T[],\n callbackfn: (\n previousValue: U,\n currentValue: T,\n currentIndex: number,\n data: readonly T[],\n ) => U,\n initialValue: U,\n): U =>\n // eslint-disable-next-line unicorn/no-array-reduce -- Our function wraps the built-in reduce.\n data.reduce(callbackfn, initialValue);\n", "import { purry } from \"./purry\";\n\ntype Reverse<\n T extends readonly unknown[],\n R extends readonly unknown[] = [],\n> = ReturnType<\n T extends IsNoTuple\n ? () => [...T, ...R]\n : T extends readonly [infer F, ...infer L]\n ? () => Reverse\n : () => R\n>;\n\ntype IsNoTuple = T extends readonly [unknown, ...unknown[]] ? never : T;\n\n/**\n * Reverses array.\n *\n * @param array - The array.\n * @signature\n * reverse(arr);\n * @example\n * reverse([1, 2, 3]) // [3, 2, 1]\n * @dataFirst\n * @category Array\n */\nexport function reverse(array: T): Reverse;\n\n/**\n * Reverses array.\n *\n * @signature\n * reverse()(array);\n * @example\n * reverse()([1, 2, 3]) // [3, 2, 1]\n * @dataLast\n * @category Array\n */\nexport function reverse(): (\n array: T,\n) => Reverse;\n\nexport function reverse(...args: readonly unknown[]): unknown {\n return purry(reverseImplementation, args);\n}\n\nfunction reverseImplementation(array: readonly T[]): T[] {\n // TODO [>2]: When node 18 reaches end-of-life bump target lib to ES2023+ and use `Array.prototype.toReversed` here.\n // eslint-disable-next-line unicorn/no-array-reverse -- See TODO above.\n return [...array].reverse();\n}\n", "import { withPrecision } from \"./internal/withPrecision\";\nimport { purry } from \"./purry\";\n\n/**\n * Rounds a given number to a specific precision.\n * If you'd like to round to an integer (i.e. use this function with constant `precision === 0`),\n * use `Math.round` instead, as it won't incur the additional library overhead.\n *\n * @param value - The number to round.\n * @param precision - The precision to round to. Must be an integer between -15 and 15.\n * @signature\n * round(value, precision);\n * @example\n * round(123.9876, 3) // => 123.988\n * round(483.22243, 1) // => 483.2\n * round(8541, -1) // => 8540\n * round(456789, -3) // => 457000\n * @dataFirst\n * @category Number\n */\nexport function round(value: number, precision: number): number;\n\n/**\n * Rounds a given number to a specific precision.\n * If you'd like to round to an integer (i.e. use this function with constant `precision === 0`),\n * use `Math.round` instead, as it won't incur the additional library overhead.\n *\n * @param precision - The precision to round to. Must be an integer between -15 and 15.\n * @signature\n * round(precision)(value);\n * @example\n * round(3)(123.9876) // => 123.988\n * round(1)(483.22243) // => 483.2\n * round(-1)(8541) // => 8540\n * round(-3)(456789) // => 457000\n * @dataLast\n * @category Number\n */\nexport function round(precision: number): (value: number) => number;\n\nexport function round(...args: readonly unknown[]): unknown {\n return purry(withPrecision(Math.round), args);\n}\n", "import type {\n FixedLengthArray,\n IsEqual,\n IsNever,\n NonNegativeInteger,\n Or,\n Writable,\n} from \"type-fest\";\nimport type { CoercedArray } from \"./internal/types/CoercedArray\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { NTuple } from \"./internal/types/NTuple\";\nimport type { PartialArray } from \"./internal/types/PartialArray\";\nimport type { TupleParts } from \"./internal/types/TupleParts\";\nimport { purry } from \"./purry\";\n\ntype Sampled =\n Or, IsEqual> extends true\n ? // Short-circuit on trivial inputs.\n []\n : IsNever> extends true\n ? SampledPrimitive\n : IsLongerThan extends true\n ? SampledLiteral\n : // If our tuple can never fulfil the sample size the only valid sample\n // is the whole input tuple. Because it's a shallow clone we also\n // strip any readonly-ness.\n Writable;\n\n/**\n * When N is not a non-negative integer **literal** we can't use it in our\n * reconstructing logic so we fallback to a simpler definition of the output of\n * sample, which is any sub-tuple shape of T, of **any length**.\n */\ntype SampledPrimitive = [\n ...FixedSubTuples[\"required\"]>,\n // TODO: This might be accurate, but We currently have no tests that check optional elements!\n ...PartialArray[\"optional\"]>>,\n ...CoercedArray[\"item\"]>,\n ...FixedSubTuples[\"suffix\"]>,\n];\n\n/**\n * Knowing N is a non-negative literal integer we can construct all sub-tuples\n * of T that are exactly N elements long.\n */\ntype SampledLiteral =\n | Extract<\n FixedSubTuples<\n [\n ...TupleParts[\"required\"],\n // TODO: This deliberately ignores optional elements which we don't have tests for either. In order to handle optional elements we can treat the \"optional\" tuple-part as more required elements.\n // We add N elements of the `item` type to the tuple so that we\n // consider any combination possible of elements of the prefix items,\n // any amount of rest items, and suffix items.\n ...(IsNever[\"item\"]> extends true\n ? []\n : NTuple[\"item\"], N>),\n ...TupleParts[\"suffix\"],\n ]\n >,\n // This is just [unknown, unknown, ..., unknown] with N elements.\n FixedLengthArray\n >\n // In addition to all sub-tuples of length N, we also need to consider all\n // tuples where the input is shorter than N. This will contribute exactly\n // one sub-tuple at each length from the minimum length of T and up to N-1.\n | SubSampled<\n TupleParts[\"required\"],\n // TODO: This deliberately ignores optional elements which we don't have tests for either. In order to handle optional elements we can treat the \"optional\" tuple-part as more required elements.\n TupleParts[\"item\"],\n TupleParts[\"suffix\"],\n N\n >;\n\n// We want to create a union of all sub-tuples where we incrementally add an\n// additional element of the type of the rest element in the middle between the\n// prefix and suffix until we \"fill\" the tuple to size N.\ntype SubSampled<\n Prefix extends readonly unknown[],\n Item,\n Suffix extends readonly unknown[],\n N extends number,\n> =\n IsLongerThan<[...Prefix, ...Suffix], N> extends true\n ? // We need to prevent overflows in case Prefix and Suffix are already long\n // enough\n never\n : [...Prefix, ...Suffix][\"length\"] extends N\n ? never\n : [...Prefix, ...Suffix] | SubSampled<[...Prefix, Item], Item, Suffix, N>;\n\ntype IsLongerThan =\n // Checking for `undefined` is a neat trick to avoid needing to compare\n // integer literals because if N overflows the tuple then the type for that\n // element will be `undefined`. This only works for fixed tuples!\n IsEqual extends true ? false : true;\n\n// Assuming T is a fixed tuple we build all it's possible sub-tuples.\ntype FixedSubTuples = T extends readonly [infer Head, ...infer Rest]\n ? // For each element we either take it or skip it, and recurse over the rest.\n FixedSubTuples | [Head, ...FixedSubTuples]\n : [];\n\n/**\n * Returns a random subset of size `sampleSize` from `array`.\n *\n * Maintains and infers most of the typing information that could be passed\n * along to the output. This means that when using tuples, the output will be\n * a tuple too, and when using literals, those literals would be preserved.\n *\n * The items in the result are kept in the same order as they are in the input.\n * If you need to get a shuffled response you can pipe the shuffle function\n * after this one.\n *\n * @param data - The array.\n * @param sampleSize - The number of elements to take.\n * @signature\n * sample(array, sampleSize)\n * @example\n * sample([\"hello\", \"world\"], 1); // => [\"hello\"] // typed string[]\n * sample([\"hello\", \"world\"] as const, 1); // => [\"world\"] // typed [\"hello\" | \"world\"]\n * @dataFirst\n * @category Array\n */\nexport function sample(\n data: T,\n sampleSize: N,\n): Sampled;\n\n/**\n * Returns a random subset of size `sampleSize` from `array`.\n *\n * Maintains and infers most of the typing information that could be passed\n * along to the output. This means that when using tuples, the output will be\n * a tuple too, and when using literals, those literals would be preserved.\n *\n * The items in the result are kept in the same order as they are in the input.\n * If you need to get a shuffled response you can pipe the shuffle function\n * after this one.\n *\n * @param sampleSize - The number of elements to take.\n * @signature\n * sample(sampleSize)(array)\n * @example\n * sample(1)([\"hello\", \"world\"]); // => [\"hello\"] // typed string[]\n * sample(1)([\"hello\", \"world\"] as const); // => [\"world\"] // typed [\"hello\" | \"world\"]\n * @dataLast\n * @category Array\n */\nexport function sample(\n sampleSize: N,\n): (data: T) => Sampled;\n\nexport function sample(...args: readonly unknown[]): unknown {\n return purry(sampleImplementation, args);\n}\n\nfunction sampleImplementation(data: readonly T[], sampleSize: number): T[] {\n if (sampleSize <= 0) {\n // Trivial\n return [];\n }\n\n if (sampleSize >= data.length) {\n // Trivial\n return [...data];\n }\n\n // We have 2 modes of sampling, depending on the size of the sample requested.\n // 1. If sampleSize is _small_, we generate indices that we then use to\n // *EXTRACT* individual elements from the array.\n // 2. If sampleSize is _large_, we instead generate indices to *EXCLUDE* from\n // a full scan of the input array (via filtering).\n //\n // This allows us 2 optimizations that are the core of how this function\n // works:\n // 1. It is hard to generate a large number of unique indices, as the more\n // indices we generate the more likely we are to generate one that is already\n // in the set, which would require more iterations of the generation loop.\n // Capping our effective sampleSize at n/2 would put an upper limit to the\n // average number of iterations required (as a function of n).\n // 2. If sample size is small enough, we never need to actually iterate over\n // the full input array at all; instead we simply project the values we need\n // via random access into the array. This means that for sampleSize (K) less\n // than n/2, we run at O(klogk). For large sampleSize we need to iterate over\n // the full input array, but we don't need to sort the indices because we can\n // use the Set's 'has' method, so we effectively run at O(n).\n const actualSampleSize = Math.min(sampleSize, data.length - sampleSize);\n\n const sampleIndices = new Set();\n while (sampleIndices.size < actualSampleSize) {\n const randomIndex = Math.floor(Math.random() * data.length);\n sampleIndices.add(randomIndex);\n }\n\n if (sampleSize === actualSampleSize) {\n return [...sampleIndices]\n .sort((a, b) => a - b)\n .map((index) => data[index]!);\n }\n\n return data.filter((_, index) => !sampleIndices.has(index));\n}\n", "import type { UpsertProp } from \"./internal/types/UpsertProp\";\nimport { purry } from \"./purry\";\n\n/**\n * Sets the `value` at `prop` of `object`.\n *\n * To add a new property to an object, or to override its type, use `addProp`\n * instead, and to set a property within a nested object use `setPath`.\n *\n * @param obj - The target method.\n * @param prop - The property name.\n * @param value - The value to set.\n * @signature\n * set(obj, prop, value)\n * @example\n * set({ a: 1 }, 'a', 2) // => { a: 2 }\n * @dataFirst\n * @category Object\n */\nexport function set[K]>(\n obj: T,\n prop: K,\n value: V,\n): UpsertProp;\n\n/**\n * Sets the `value` at `prop` of `object`.\n *\n * To add a new property to an object, or to override it's type use `addProp`\n * instead.\n *\n * @param prop - The property name.\n * @param value - The value to set.\n * @signature\n * set(prop, value)(obj)\n * @example\n * pipe({ a: 1 }, set('a', 2)) // => { a: 2 }\n * @dataLast\n * @category Object\n */\nexport function set[K]>(\n prop: K,\n value: V,\n): (obj: T) => UpsertProp;\n\nexport function set(...args: readonly unknown[]): unknown {\n return purry(setImplementation, args);\n}\n\nconst setImplementation = [K]>(\n obj: T,\n prop: K,\n value: V,\n): UpsertProp =>\n // @ts-expect-error [ts2322] - Hard to type\n ({ ...obj, [prop]: value });\n", "import type { ValueOf } from \"type-fest\";\nimport type { RemedaTypeError } from \"./internal/types/RemedaTypeError\";\nimport { purry } from \"./purry\";\n\ntype Paths =\n | Prefix\n | (T extends object\n ? ValueOf<{\n [K in ProperKeyOf]-?: Paths;\n }>\n : RemedaTypeError<\n \"setPath\",\n \"Can only compute paths objects\",\n { type: never; metadata: T }\n >) extends infer Path\n ? // The Paths type is used to define the path param in `setPath`. In order\n // for both mutable arrays and readonly arrays to be supported we need to\n // make all results `readonly` (because mutable arrays extend readonly\n // arrays, but not the other way around). Because the result of Paths is\n // a union of arrays we need to distribute Result so that the operator is\n // applied to each member separately.\n Readonly\n : never;\n\n/**\n * Array objects have all Array.prototype keys in their \"keyof\" type, which\n * is not what we'd expect from the operator. We only want the numeric keys\n * which represent proper elements of the array.\n */\ntype ProperKeyOf = Extract<\n keyof T,\n T extends readonly unknown[] ? number : keyof T\n>;\n\ntype ValueAtPath = Path extends readonly [\n infer Head extends keyof T,\n ...infer Rest,\n]\n ? ValueAtPath\n : T;\n\n/**\n * Sets the value at `path` of `object`.\n *\n * For simple cases where the path is only one level deep, prefer `set` instead.\n *\n * @param data - The target method.\n * @param path - The array of properties.\n * @param value - The value to set.\n * @signature\n * setPath(obj, path, value)\n * @example\n * setPath({ a: { b: 1 } }, ['a', 'b'], 2) // => { a: { b: 2 } }\n * @dataFirst\n * @category Object\n */\nexport function setPath>(\n data: T,\n path: Path,\n value: ValueAtPath,\n): T;\n\n/**\n * Sets the value at `path` of `object`.\n *\n * @param path - The array of properties.\n * @param value - The value to set.\n * @signature\n * setPath(path, value)(obj)\n * @example\n * pipe({ a: { b: 1 } }, setPath(['a', 'b'], 2)) // { a: { b: 2 } }\n * @dataLast\n * @category Object\n */\nexport function setPath<\n T,\n Path extends Paths,\n // TODO [>2] -- TODO: The following eslint is solvable by inlining Value and wrapping the T parameter with `NoInfer` (e.g. `ValueAtPath, TPath>); to prevent typescript from inferring it as `unknown`. This is only available in TS 5.4, which is above what we currently support (5.1).\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- See TODO above...\n Value extends ValueAtPath,\n>(path: Path, value: Value): (data: T) => T;\n\nexport function setPath(...args: readonly unknown[]): unknown {\n return purry(setPathImplementation, args);\n}\n\nfunction setPathImplementation(\n data: unknown,\n path: readonly PropertyKey[],\n value: unknown,\n): unknown {\n const [pivot, ...rest] = path;\n if (pivot === undefined) {\n return value;\n }\n\n if (Array.isArray(data)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const copy = [...data];\n copy[pivot as number] = setPathImplementation(\n data[pivot as number],\n rest,\n value,\n );\n return copy;\n }\n\n const { [pivot]: currentValue, ...remaining } = data as Record<\n PropertyKey,\n unknown\n >;\n\n return {\n ...remaining,\n [pivot]: setPathImplementation(currentValue, rest, value),\n };\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { ReorderedArray } from \"./internal/types/ReorderedArray\";\nimport { purry } from \"./purry\";\n\n/**\n * Shuffles the input array, returning a new array with the same elements in a random order.\n *\n * @param items - The array to shuffle.\n * @signature\n * shuffle(array)\n * @example\n * shuffle([4, 2, 7, 5]) // => [7, 5, 4, 2]\n * @dataFirst\n * @category Array\n */\nexport function shuffle(\n items: T,\n): ReorderedArray;\n\n/**\n * Shuffles the input array, returning a new array with the same elements in a random order.\n *\n * @signature\n * shuffle()(array)\n * @example\n * pipe([4, 2, 7, 5], shuffle()) // => [7, 5, 4, 2]\n * @dataLast\n * @category Array\n */\nexport function shuffle(): (\n items: T,\n) => ReorderedArray;\n\nexport function shuffle(...args: readonly unknown[]): unknown {\n return purry(shuffleImplementation, args);\n}\n\nfunction shuffleImplementation(items: readonly T[]): T[] {\n const result = [...items];\n for (let index = 0; index < items.length; index++) {\n const rand = index + Math.floor(Math.random() * (items.length - index));\n const value = result[rand]!;\n result[rand] = result[index]!;\n result[index] = value;\n }\n return result;\n}\n", "/**\n * Extracts a section of a string between two indices.\n *\n * This function is a wrapper around the built-in [`String.prototype.slice`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice)\n * method.\n *\n * @param data - The string to extract from.\n * @param indexStart - The index of the first character to include in the\n * returned substring.\n * @param indexEnd - The index of the first character to exclude from the\n * returned substring.\n * @returns A new string containing the extracted section of the string.\n * @signature\n * sliceString(data, indexStart, indexEnd)\n * @example\n * sliceString(\"abcdefghijkl\", 1) // => `bcdefghijkl`\n * sliceString(\"abcdefghijkl\", 4, 7) // => `efg`\n * @dataFirst\n * @category String\n */\nexport function sliceString(\n data: string,\n indexStart: number,\n indexEnd?: number,\n): string;\n\n/**\n * Extracts a section of a string between two indices.\n *\n * This function is a wrapper around the built-in [`String.prototype.slice`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice)\n * method.\n *\n * @param indexStart - The index of the first character to include in the\n * returned substring.\n * @param indexEnd - The index of the first character to exclude from the\n * returned substring, or `undefined` for the rest of the string.\n * @returns A new string containing the extracted section of the string.\n * @signature\n * sliceString(indexStart, indexEnd)(string)\n * @example\n * sliceString(1)(\"abcdefghijkl\") // => `bcdefghijkl`\n * sliceString(4, 7)(\"abcdefghijkl\") // => `efg`\n * @dataLast\n * @category String\n */\nexport function sliceString(\n indexStart: number,\n indexEnd?: number,\n): (data: string) => string;\n\nexport function sliceString(\n dataOrIndexStart: number | string,\n indexStartOrIndexEnd?: number,\n indexEnd?: number,\n): unknown {\n return typeof dataOrIndexStart === \"string\"\n ? dataOrIndexStart.slice(indexStartOrIndexEnd, indexEnd)\n : (data: string) => data.slice(dataOrIndexStart, indexStartOrIndexEnd);\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { ReorderedArray } from \"./internal/types/ReorderedArray\";\nimport { purry } from \"./purry\";\n\n/**\n * Sorts an array. The comparator function should accept two values at a time\n * and return a negative number if the first value is smaller, a positive number\n * if it's larger, and zero if they are equal. Sorting is based on a native\n * `sort` function.\n *\n * @param items - The array to sort.\n * @param cmp - The comparator function.\n * @signature\n * sort(items, cmp)\n * @example\n * sort([4, 2, 7, 5], (a, b) => a - b); // => [2, 4, 5, 7]\n * @dataFirst\n * @category Array\n */\nexport function sort(\n items: T,\n cmp: (a: T[number], b: T[number]) => number,\n): ReorderedArray;\n\n/**\n * Sorts an array. The comparator function should accept two values at a time\n * and return a negative number if the first value is smaller, a positive number\n * if it's larger, and zero if they are equal. Sorting is based on a native\n * `sort` function.\n *\n * @param cmp - The comparator function.\n * @signature\n * sort(cmp)(items)\n * @example\n * pipe([4, 2, 7, 5], sort((a, b) => a - b)) // => [2, 4, 5, 7]\n * @dataLast\n * @category Array\n */\nexport function sort(\n cmp: (a: T[number], b: T[number]) => number,\n): (items: T) => ReorderedArray;\n\nexport function sort(...args: readonly unknown[]): unknown {\n return purry(sortImplementation, args);\n}\n\nfunction sortImplementation(\n items: T,\n cmp: (a: T[number], b: T[number]) => number,\n): ReorderedArray {\n const ret = [...items];\n ret.sort(cmp);\n return ret as ReorderedArray;\n}\n", "import { purryOrderRules, type OrderRule } from \"./internal/purryOrderRules\";\nimport type { CompareFunction } from \"./internal/types/CompareFunction\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { NonEmptyArray } from \"./internal/types/NonEmptyArray\";\nimport type { ReorderedArray } from \"./internal/types/ReorderedArray\";\n\n/**\n * Sorts `data` using the provided ordering rules. The `sort` is done via the\n * native `Array.prototype.sort` but is performed on a shallow copy of the array\n * to avoid mutating the original data.\n *\n * There are several other functions that take order rules and **bypass** the\n * need to sort the array first (in *O(nlogn)* time):\n * * `firstBy` === `first(sortBy(data, ...rules))`, O(n).\n * * `takeFirstBy` === `take(sortBy(data, ...rules), k)`, O(nlogk).\n * * `dropFirstBy` === `drop(sortBy(data, ...rules), k)`, O(nlogk).\n * * `nthBy` === `sortBy(data, ...rules).at(k)`, O(n).\n * * `rankBy` === `sortedIndex(sortBy(data, ...rules), item)`, O(n).\n * Refer to the docs for more details.\n *\n * @param sortRules - A variadic array of order rules defining the sorting\n * criteria. Each order rule is a projection function that extracts a comparable\n * value from the data. Sorting is based on these extracted values using the\n * native `<` and `>` operators. Earlier rules take precedence over later ones.\n * Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns A shallow copy of the input array sorted by the provided rules.\n * @signature\n * sortBy(...rules)(data)\n * @example\n * pipe(\n * [{ a: 1 }, { a: 3 }, { a: 7 }, { a: 2 }],\n * sortBy(prop('a')),\n * ); // => [{ a: 1 }, { a: 2 }, { a: 3 }, { a: 7 }]\n * @dataLast\n * @category Array\n */\nexport function sortBy(\n ...sortRules: Readonly>>\n): (array: T) => ReorderedArray;\n\n/**\n * Sorts `data` using the provided ordering rules. The `sort` is done via the\n * native `Array.prototype.sort` but is performed on a shallow copy of the array\n * to avoid mutating the original data.\n *\n * There are several other functions that take order rules and **bypass** the\n * need to sort the array first (in *O(nlogn)* time):\n * * `firstBy` === `first(sortBy(data, ...rules))`, O(n).\n * * `takeFirstBy` === `take(sortBy(data, ...rules), k)`, O(nlogk).\n * * `dropFirstBy` === `drop(sortBy(data, ...rules), k)`, O(nlogk).\n * * `nthBy` === `sortBy(data, ...rules).at(k)`, O(n).\n * * `rankBy` === `sortedIndex(sortBy(data, ...rules), item)`, O(n).\n * Refer to the docs for more details.\n *\n * @param array - The input array.\n * @param sortRules - A variadic array of order rules defining the sorting\n * criteria. Each order rule is a projection function that extracts a comparable\n * value from the data. Sorting is based on these extracted values using the\n * native `<` and `>` operators. Earlier rules take precedence over later ones.\n * Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns A shallow copy of the input array sorted by the provided rules.\n * @signature\n * sortBy(data, ...rules)\n * @example\n * sortBy(\n * [{ a: 1 }, { a: 3 }, { a: 7 }, { a: 2 }],\n * prop('a'),\n * ); // => [{ a: 1 }, { a: 2 }, { a: 3 }, { a: 7 }]\n * sortBy(\n * [\n * {color: 'red', weight: 2},\n * {color: 'blue', weight: 3},\n * {color: 'green', weight: 1},\n * {color: 'purple', weight: 1},\n * ],\n * [prop('weight'), 'asc'],\n * prop('color'),\n * ); // => [\n * // {color: 'green', weight: 1},\n * // {color: 'purple', weight: 1},\n * // {color: 'red', weight: 2},\n * // {color: 'blue', weight: 3},\n * // ]\n * @dataFirst\n * @category Array\n */\nexport function sortBy(\n array: T,\n ...sortRules: Readonly>>\n): ReorderedArray;\n\nexport function sortBy(...args: readonly unknown[]): unknown {\n return purryOrderRules(sortByImplementation, args);\n}\n\nconst sortByImplementation = (\n data: readonly T[],\n compareFn: CompareFunction,\n): T[] =>\n // TODO [>2]: When node 18 reaches end-of-life bump target lib to ES2023+ and use `Array.prototype.toSorted` here.\n [...data].sort(compareFn);\n", "/**\n * A binary search implementation that finds the index at which `predicate`\n * stops returning `true` and starts returning `false` (consistently) when run\n * on the items of the array. It **assumes** that mapping the array via the\n * predicate results in the shape `[...true[], ...false[]]`. *For any other case\n * the result is unpredictable*.\n *\n * This is the base implementation of the `sortedIndex` functions which define\n * the predicate for the user, for common use-cases.\n *\n * It is similar to `findIndex`, but runs at O(logN), whereas the latter is\n * general purpose function which runs on any array and predicate, but runs at\n * O(N) time.\n */\nexport function binarySearchCutoffIndex(\n array: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): number {\n let lowIndex = 0;\n let highIndex = array.length;\n\n while (lowIndex < highIndex) {\n // eslint-disable-next-line no-bitwise -- We use bitwise operator here as a way to find the mid-point and round it down using the same operation.\n const pivotIndex = (lowIndex + highIndex) >>> 1;\n const pivot = array[pivotIndex]!;\n\n if (predicate(pivot, pivotIndex, array)) {\n lowIndex = pivotIndex + 1;\n } else {\n highIndex = pivotIndex;\n }\n }\n\n return highIndex;\n}\n", "import { purry } from \"./purry\";\nimport { binarySearchCutoffIndex } from \"./internal/binarySearchCutoffIndex\";\n\n/**\n * Find the insertion position (index) of an item in an array with items sorted\n * in ascending order; so that `splice(sortedIndex, 0, item)` would result in\n * maintaining the array's sort-ness. The array can contain duplicates.\n * If the item already exists in the array the index would be of the *first*\n * occurrence of the item.\n *\n * Runs in O(logN) time.\n *\n * @param data - The (ascending) sorted array.\n * @param item - The item to insert.\n * @returns Insertion index (In the range 0..array.length).\n * @signature\n * sortedIndex(data, item)\n * @example\n * sortedIndex(['a','a','b','c','c'], 'c') // => 3\n * @dataFirst\n * @category Array\n * @see sortedIndexBy, sortedIndexWith, sortedLastIndex, sortedLastIndexBy\n */\nexport function sortedIndex(data: readonly T[], item: T): number;\n\n/**\n * Find the insertion position (index) of an item in an array with items sorted\n * in ascending order; so that `splice(sortedIndex, 0, item)` would result in\n * maintaining the array's sort-ness. The array can contain duplicates.\n * If the item already exists in the array the index would be of the *first*\n * occurrence of the item.\n *\n * Runs in O(logN) time.\n *\n * @param item - The item to insert.\n * @returns Insertion index (In the range 0..array.length).\n * @signature\n * sortedIndex(item)(data)\n * @example\n * pipe(['a','a','b','c','c'], sortedIndex('c')) // => 3\n * @dataLast\n * @category Array\n * @see sortedIndexBy, sortedIndexWith, sortedLastIndex, sortedLastIndexBy\n */\nexport function sortedIndex(item: T): (data: readonly T[]) => number;\n\nexport function sortedIndex(...args: readonly unknown[]): unknown {\n return purry(sortedIndexImplementation, args);\n}\n\nconst sortedIndexImplementation = (array: readonly T[], item: T): number =>\n binarySearchCutoffIndex(array, (pivot) => pivot < item);\n", "import { purry } from \"./purry\";\nimport { binarySearchCutoffIndex } from \"./internal/binarySearchCutoffIndex\";\n\n/**\n * Find the insertion position (index) of an item in an array with items sorted\n * in ascending order using a value function; so that\n * `splice(sortedIndex, 0, item)` would result in maintaining the arrays sort-\n * ness. The array can contain duplicates.\n * If the item already exists in the array the index would be of the *first*\n * occurrence of the item.\n *\n * Runs in O(logN) time.\n *\n * See also:\n * * `findIndex` - scans a possibly unsorted array in-order (linear search).\n * * `sortedIndex` - like this function, but doesn't take a callbackfn.\n * * `sortedLastIndexBy` - like this function, but finds the last suitable index.\n * * `sortedLastIndex` - like `sortedIndex`, but finds the last suitable index.\n * * `rankBy` - scans a possibly unsorted array in-order, returning the index based on a sorting criteria.\n *\n * @param data - The (ascending) sorted array.\n * @param item - The item to insert.\n * @param valueFunction - All comparisons would be performed on the result of\n * calling this function on each compared item. Preferably this function should\n * return a `number` or `string`. This function should be the same as the one\n * provided to sortBy to sort the array. The function is called exactly once on\n * each items that is compared against in the array, and once at the beginning\n * on `item`. When called on `item` the `index` argument is `undefined`.\n * @returns Insertion index (In the range 0..data.length).\n * @signature\n * sortedIndexBy(data, item, valueFunction)\n * @example\n * sortedIndexBy([{age:20},{age:22}],{age:21},prop('age')) // => 1\n * @dataFirst\n * @category Array\n */\nexport function sortedIndexBy(\n data: readonly T[],\n item: T,\n valueFunction: (\n item: T,\n index: number | undefined,\n data: readonly T[],\n ) => NonNullable,\n): number;\n\n/**\n * Find the insertion position (index) of an item in an array with items sorted\n * in ascending order using a value function; so that\n * `splice(sortedIndex, 0, item)` would result in maintaining the arrays sort-\n * ness. The array can contain duplicates.\n * If the item already exists in the array the index would be of the *first*\n * occurrence of the item.\n *\n * Runs in O(logN) time.\n *\n * See also:\n * * `findIndex` - scans a possibly unsorted array in-order (linear search).\n * * `sortedIndex` - like this function, but doesn't take a callbackfn.\n * * `sortedLastIndexBy` - like this function, but finds the last suitable index.\n * * `sortedLastIndex` - like `sortedIndex`, but finds the last suitable index.\n * * `rankBy` - scans a possibly unsorted array in-order, returning the index based on a sorting criteria.\n *\n * @param item - The item to insert.\n * @param valueFunction - All comparisons would be performed on the result of\n * calling this function on each compared item. Preferably this function should\n * return a `number` or `string`. This function should be the same as the one\n * provided to sortBy to sort the array. The function is called exactly once on\n * each items that is compared against in the array, and once at the beginning\n * on `item`. When called on `item` the `index` argument is `undefined`.\n * @signature\n * sortedIndexBy(data, item, valueFunction)\n * @example\n * sortedIndexBy([{age:20},{age:22}],{age:21},prop('age')) // => 1\n * @dataLast\n * @category Array\n */\nexport function sortedIndexBy(\n item: T,\n valueFunction: (\n item: T,\n index: number | undefined,\n data: readonly T[],\n ) => NonNullable,\n): (data: readonly T[]) => number;\n\nexport function sortedIndexBy(...args: readonly unknown[]): unknown {\n return purry(sortedIndexByImplementation, args);\n}\n\nfunction sortedIndexByImplementation(\n data: readonly T[],\n item: T,\n valueFunction: (\n item: T,\n index: number | undefined,\n data: readonly T[],\n ) => NonNullable,\n): number {\n const value = valueFunction(item, undefined /* index */, data);\n return binarySearchCutoffIndex(\n data,\n (pivot, index) => valueFunction(pivot, index, data) < value,\n );\n}\n", "import { purry } from \"./purry\";\nimport { binarySearchCutoffIndex } from \"./internal/binarySearchCutoffIndex\";\n\n/**\n * Performs a **binary search** for the index of the item at which the predicate\n * stops returning `true`. This function assumes that the array is \"sorted\" in\n * regards to the predicate, meaning that running the predicate as a mapper on\n * it would result in an array `[...true[], ...false[]]`.\n * This stricter requirement from the predicate provides us 2 benefits over\n * `findIndex` which does a similar thing:\n * 1. It would run at O(logN) time instead of O(N) time.\n * 2. It always returns a value (it would return `data.length` if the\n * predicate returns `true` for all items).\n *\n * This function is the basis for all other sortedIndex functions which search\n * for a specific item in a sorted array, and it could be used to perform\n * similar efficient searches.\n * * `sortedIndex` - scans a sorted array with a binary search, find the first suitable index.\n * * `sortedIndexBy` - like `sortedIndex`, but assumes sorting is based on a callbackfn.\n * * `sortedLastIndex` - scans a sorted array with a binary search, finding the last suitable index.\n * * `sortedLastIndexBy` - like `sortedLastIndex`, but assumes sorting is based on a callbackfn.\n *\n * See also:\n * * `findIndex` - scans a possibly unsorted array in-order (linear search).\n * * `rankBy` - scans a possibly unsorted array in-order, returning the index based on a sorting criteria.\n *\n * @param data - Array, \"sorted\" by `predicate`.\n * @param predicate - A predicate which also defines the array's order.\n * @returns Index (In the range 0..data.length).\n * @signature\n * sortedIndexWith(data, predicate)\n * @example\n * sortedIndexWith(['a','ab','abc'], (item) => item.length < 2) // => 1\n * @dataFirst\n * @category Array\n * @see findIndex, sortedIndex, sortedIndexBy, sortedLastIndex, sortedLastIndexBy\n */\nexport function sortedIndexWith(\n data: readonly T[],\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): number;\n\n/**\n * Performs a **binary search** for the index of the item at which the predicate\n * stops returning `true`. This function assumes that the array is \"sorted\" in\n * regards to the predicate, meaning that running the predicate as a mapper on\n * it would result in an array `[...true[], ...false[]]`.\n * This stricter requirement from the predicate provides us 2 benefits over\n * `findIndex` which does a similar thing:\n * 1. It would run at O(logN) time instead of O(N) time.\n * 2. It always returns a value (it would return `data.length` if the\n * predicate returns `true` for all items).\n *\n * This function is the basis for all other sortedIndex functions which search\n * for a specific item in a sorted array, and it could be used to perform\n * similar efficient searches.\n * * `sortedIndex` - scans a sorted array with a binary search, find the first suitable index.\n * * `sortedIndexBy` - like `sortedIndex`, but assumes sorting is based on a callbackfn.\n * * `sortedLastIndex` - scans a sorted array with a binary search, finding the last suitable index.\n * * `sortedLastIndexBy` - like `sortedLastIndex`, but assumes sorting is based on a callbackfn.\n *\n * See also:\n * * `findIndex` - scans a possibly unsorted array in-order (linear search).\n * * `rankBy` - scans a possibly unsorted array in-order, returning the index based on a sorting criteria.\n *\n * @param predicate - A predicate which also defines the array's order.\n * @returns Index (In the range 0..data.length).\n * @signature\n * sortedIndexWith(predicate)(data)\n * @example\n * pipe(['a','ab','abc'], sortedIndexWith((item) => item.length < 2)) // => 1\n * @dataLast\n * @category Array\n */\nexport function sortedIndexWith(\n predicate: (value: T, index: number, data: readonly T[]) => boolean,\n): (data: readonly T[]) => number;\n\nexport function sortedIndexWith(...args: readonly unknown[]): unknown {\n return purry(binarySearchCutoffIndex, args);\n}\n", "import { purry } from \"./purry\";\nimport { binarySearchCutoffIndex } from \"./internal/binarySearchCutoffIndex\";\n\n/**\n * Find the insertion position (index) of an item in an array with items sorted\n * in ascending order; so that `splice(sortedIndex, 0, item)` would result in\n * maintaining the array's sort-ness. The array can contain duplicates.\n * If the item already exists in the array the index would be of the *last*\n * occurrence of the item.\n *\n * Runs in O(logN) time.\n *\n * @param data - The (ascending) sorted array.\n * @param item - The item to insert.\n * @returns Insertion index (In the range 0..data.length).\n * @signature\n * sortedLastIndex(data, item)\n * @example\n * sortedLastIndex(['a','a','b','c','c'], 'c') // => 5\n * @dataFirst\n * @category Array\n * @see sortedIndex, sortedIndexBy, sortedIndexWith, sortedLastIndexBy\n */\nexport function sortedLastIndex(data: readonly T[], item: T): number;\n\n/**\n * Find the insertion position (index) of an item in an array with items sorted\n * in ascending order; so that `splice(sortedIndex, 0, item)` would result in\n * maintaining the array's sort-ness. The array can contain duplicates.\n * If the item already exists in the array the index would be of the *last*\n * occurrence of the item.\n *\n * Runs in O(logN) time.\n *\n * @param item - The item to insert.\n * @returns Insertion index (In the range 0..data.length).\n * @signature\n * sortedLastIndex(item)(data)\n * @example\n * pipe(['a','a','b','c','c'], sortedLastIndex('c')) // => 5\n * @dataLast\n * @category Array\n * @see sortedIndex, sortedIndexBy, sortedIndexWith, sortedLastIndexBy\n */\nexport function sortedLastIndex(item: T): (data: readonly T[]) => number;\n\nexport function sortedLastIndex(...args: readonly unknown[]): unknown {\n return purry(sortedLastIndexImplementation, args);\n}\n\nconst sortedLastIndexImplementation = (\n array: readonly T[],\n item: T,\n): number =>\n binarySearchCutoffIndex(\n array,\n // The only difference between the regular implementation and the \"last\"\n // variation is that we consider the pivot with equality too, so that we\n // skip all equal values in addition to the lower ones.\n (pivot) => pivot <= item,\n );\n", "import { purry } from \"./purry\";\nimport { binarySearchCutoffIndex } from \"./internal/binarySearchCutoffIndex\";\n\n/**\n * Find the insertion position (index) of an item in an array with items sorted\n * in ascending order using a value function; so that\n * `splice(sortedIndex, 0, item)` would result in maintaining the arrays sort-\n * ness. The array can contain duplicates.\n * If the item already exists in the array the index would be of the *last*\n * occurrence of the item.\n *\n * Runs in O(logN) time.\n *\n * See also:\n * * `findIndex` - scans a possibly unsorted array in-order (linear search).\n * * `sortedLastIndex` - a simplified version of this function, without a callbackfn.\n * * `sortedIndexBy` - like this function, but returns the first suitable index.\n * * `sortedIndex` - like `sortedLastIndex` but without a callbackfn.\n * * `rankBy` - scans a possibly unsorted array in-order, returning the index based on a sorting criteria.\n *\n * @param data - The (ascending) sorted array.\n * @param item - The item to insert.\n * @param valueFunction - All comparisons would be performed on the result of\n * calling this function on each compared item. Preferably this function should\n * return a `number` or `string`. This function should be the same as the one\n * provided to sortBy to sort the array. The function is called exactly once on\n * each items that is compared against in the array, and once at the beginning\n * on `item`. When called on `item` the `index` argument is `undefined`.\n * @returns Insertion index (In the range 0..data.length).\n * @signature\n * sortedLastIndexBy(data, item, valueFunction)\n * @example\n * sortedLastIndexBy([{age:20},{age:22}],{age:21},prop('age')) // => 1\n * @dataFirst\n * @category Array\n */\nexport function sortedLastIndexBy(\n data: readonly T[],\n item: T,\n valueFunction: (\n item: T,\n index: number | undefined,\n data: readonly T[],\n ) => NonNullable,\n): number;\n\n/**\n * Find the insertion position (index) of an item in an array with items sorted\n * in ascending order using a value function; so that\n * `splice(sortedIndex, 0, item)` would result in maintaining the arrays sort-\n * ness. The array can contain duplicates.\n * If the item already exists in the array the index would be of the *last*\n * occurrence of the item.\n *\n * Runs in O(logN) time.\n *\n * See also:\n * * `findIndex` - scans a possibly unsorted array in-order (linear search).\n * * `sortedLastIndex` - a simplified version of this function, without a callbackfn.\n * * `sortedIndexBy` - like this function, but returns the first suitable index.\n * * `sortedIndex` - like `sortedLastIndex` but without a callbackfn.\n * * `rankBy` - scans a possibly unsorted array in-order, returning the index based on a sorting criteria.\n *\n * @param item - The item to insert.\n * @param valueFunction - All comparisons would be performed on the result of\n * calling this function on each compared item. Preferably this function should\n * return a `number` or `string`. This function should be the same as the one\n * provided to sortBy to sort the array. The function is called exactly once on\n * each items that is compared against in the array, and once at the beginning\n * on `item`. When called on `item` the `index` argument is `undefined`.\n * @returns Insertion index (In the range 0..data.length).\n * @signature\n * sortedLastIndexBy(item, valueFunction)(data)\n * @example\n * pipe([{age:20},{age:22}],sortedLastIndexBy({age:21},prop('age'))) // => 1\n * @dataLast\n * @category Array\n * @see sortedIndex, sortedIndexBy, sortedIndexWith, sortedLastIndex\n */\nexport function sortedLastIndexBy(\n item: T,\n valueFunction: (\n item: T,\n index: number | undefined,\n data: readonly T[],\n ) => NonNullable,\n): (data: readonly T[]) => number;\n\nexport function sortedLastIndexBy(...args: readonly unknown[]): unknown {\n return purry(sortedLastIndexByImplementation, args);\n}\n\nfunction sortedLastIndexByImplementation(\n array: readonly T[],\n item: T,\n valueFunction: (\n item: T,\n index: number | undefined,\n data: readonly T[],\n ) => NonNullable,\n): number {\n const value = valueFunction(item, undefined /* index */, array);\n return binarySearchCutoffIndex(\n array,\n // The only difference between the regular implementation and the \"last\"\n // variation is that we consider the pivot with equality too, so that we\n // skip all equal values in addition to the lower ones.\n (pivot, index) => valueFunction(pivot, index, array) <= value,\n );\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Removes elements from an array and, inserts new elements in their place.\n *\n * @param items - The array to splice.\n * @param start - The index from which to start removing elements.\n * @param deleteCount - The number of elements to remove.\n * @param replacement - The elements to insert into the array in place of the deleted elements.\n * @signature\n * splice(items, start, deleteCount, replacement)\n * @example\n * splice([1,2,3,4,5,6,7,8], 2, 3, []); //=> [1,2,6,7,8]\n * splice([1,2,3,4,5,6,7,8], 2, 3, [9, 10]); //=> [1,2,9,10,6,7,8]\n * @dataFirst\n * @category Array\n */\nexport function splice(\n items: readonly T[],\n start: number,\n deleteCount: number,\n replacement: readonly T[],\n): T[];\n\n/**\n * Removes elements from an array and, inserts new elements in their place.\n *\n * @param start - The index from which to start removing elements.\n * @param deleteCount - The number of elements to remove.\n * @param replacement - The elements to insert into the array in place of the deleted elements.\n * @signature\n * splice(start, deleteCount, replacement)(items)\n * @example\n * pipe([1,2,3,4,5,6,7,8], splice(2, 3, [])) // => [1,2,6,7,8]\n * pipe([1,2,3,4,5,6,7,8], splice(2, 3, [9, 10])) // => [1,2,9,10,6,7,8]\n * @dataLast\n * @category Array\n */\nexport function splice(\n start: number,\n deleteCount: number,\n replacement: readonly T[],\n): (items: readonly T[]) => T[];\n\nexport function splice(...args: readonly unknown[]): unknown {\n return purry(spliceImplementation, args);\n}\n\nfunction spliceImplementation(\n items: readonly T[],\n start: number,\n deleteCount: number,\n replacement: readonly T[],\n): T[] {\n // TODO [>2]: When node 18 reaches end-of-life bump target lib to ES2023+ and use `Array.prototype.toSpliced` here.\n const result = [...items];\n result.splice(start, deleteCount, ...replacement);\n return result;\n}\n", "import type {\n ArraySlice,\n IsFloat,\n NonNegative,\n Split as SplitBase,\n} from \"type-fest\";\n\n// We can use the type-fest's split **only** if all the params are literals.\n// For all other cases it would return the wrong type so we use\n// `Array.prototype.split`s return type instead.\ntype BuiltInReturnType = ReturnType;\n\ntype Split<\n S extends string,\n Separator extends string,\n N extends number | undefined = undefined,\n> = string extends S\n ? BuiltInReturnType\n : string extends Separator\n ? BuiltInReturnType\n : number extends N\n ? BuiltInReturnType\n : // TODO: We need a way to \"floor\" non-integer numbers, until then we return a lower fidelity type instead.\n IsFloat extends true\n ? BuiltInReturnType\n : N extends number\n ? ArraySlice, 0, NonNegative>\n : SplitBase;\n\n/**\n * Splits a string into an array of substrings using a separator pattern.\n *\n * This function is a wrapper around the built-in [`String.prototype.split`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)\n * method.\n *\n * @param data - The string to split.\n * @param separator - The pattern describing where each split should occur. Can\n * be a string, or a regular expression.\n * @param limit - A non-negative integer specifying a limit on the number of\n * substrings to be included in the array. If provided, splits the string at\n * each occurrence of the specified separator, but stops when limit entries have\n * been placed in the array. Any leftover text is not included in the array at\n * all. The array may contain fewer entries than limit if the end of the string\n * is reached before the limit is reached. If limit is 0, [] is returned.\n * @returns An array of strings, split at each point where the separator occurs\n * in the given string.\n * @signature\n * split(data, separator, limit);\n * @example\n * split(\"a,b,c\", \",\"); //=> [\"a\", \"b\", \"c\"]\n * split(\"a,b,c\", \",\", 2); //=> [\"a\", \"b\"]\n * split(\"a1b2c3d\", /\\d/u); //=> [\"a\", \"b\", \"c\", \"d\"]\n * @dataFirst\n * @category String\n */\nexport function split(\n data: string,\n separator: RegExp,\n limit?: number,\n): string[];\nexport function split<\n S extends string,\n Separator extends string,\n N extends number | undefined = undefined,\n>(data: S, separator: Separator, limit?: N): Split;\n\n/**\n * Splits a string into an array of substrings using a separator pattern.\n *\n * This function is a wrapper around the built-in [`String.prototype.split`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)\n * method.\n *\n * @param separator - The pattern describing where each split should occur. Can\n * be a string, or a regular expression.\n * @param limit - A non-negative integer specifying a limit on the number of\n * substrings to be included in the array. If provided, splits the string at\n * each occurrence of the specified separator, but stops when limit entries have\n * been placed in the array. Any leftover text is not included in the array at\n * all. The array may contain fewer entries than limit if the end of the string\n * is reached before the limit is reached. If limit is 0, [] is returned.\n * @returns An array of strings, split at each point where the separator occurs\n * in the given string.\n * @signature\n * split(separator, limit)(data);\n * @example\n * pipe(\"a,b,c\", split(\",\")); //=> [\"a\", \"b\", \"c\"]\n * pipe(\"a,b,c\", split(\",\", 2)); //=> [\"a\", \"b\"]\n * pipe(\"a1b2c3d\", split(/\\d/u)); //=> [\"a\", \"b\", \"c\", \"d\"]\n * @dataLast\n * @category String\n */\nexport function split(\n separator: RegExp,\n limit?: number,\n): (data: string) => string[];\nexport function split<\n S extends string,\n Separator extends string,\n N extends number | undefined = undefined,\n>(separator: Separator, limit?: N): (data: S) => Split;\n\nexport function split(\n dataOrSeparator: RegExp | string,\n separatorOrLimit?: RegExp | number | string,\n limit?: number,\n): unknown {\n return typeof separatorOrLimit === \"number\" || separatorOrLimit === undefined\n ? // dataLast\n (data: string) => data.split(dataOrSeparator, separatorOrLimit)\n : // dataFirst\n (dataOrSeparator as string).split(separatorOrLimit, limit);\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Splits a given array at a given index.\n *\n * @param array - The array to split.\n * @param index - The index to split at.\n * @signature\n * splitAt(array, index)\n * @example\n * splitAt([1, 2, 3], 1) // => [[1], [2, 3]]\n * splitAt([1, 2, 3, 4, 5], -1) // => [[1, 2, 3, 4], [5]]\n * @dataFirst\n * @category Array\n */\nexport function splitAt(array: readonly T[], index: number): [T[], T[]];\n\n/**\n * Splits a given array at a given index.\n *\n * @param index - The index to split at.\n * @signature\n * splitAt(index)(array)\n * @example\n * splitAt(1)([1, 2, 3]) // => [[1], [2, 3]]\n * splitAt(-1)([1, 2, 3, 4, 5]) // => [[1, 2, 3, 4], [5]]\n * @dataLast\n * @category Array\n */\nexport function splitAt(index: number): (array: readonly T[]) => [T[], T[]];\n\nexport function splitAt(...args: readonly unknown[]): unknown {\n return purry(splitAtImplementation, args);\n}\n\nfunction splitAtImplementation(\n array: readonly T[],\n index: number,\n): [T[], T[]] {\n const effectiveIndex = Math.max(\n Math.min(index < 0 ? array.length + index : index, array.length),\n 0,\n );\n return [array.slice(0, effectiveIndex), array.slice(effectiveIndex)];\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Splits a given array at the first index where the given predicate returns true.\n *\n * @param data - The array to split.\n * @param predicate - The predicate.\n * @signature\n * splitWhen(array, fn)\n * @example\n * splitWhen([1, 2, 3], x => x === 2) // => [[1], [2, 3]]\n * @dataFirst\n * @category Array\n */\nexport function splitWhen(\n data: readonly T[],\n predicate: (item: T, index: number, data: readonly T[]) => boolean,\n): [T[], T[]];\n\n/**\n * Splits a given array at an index where the given predicate returns true.\n *\n * @param predicate - The predicate.\n * @signature\n * splitWhen(fn)(array)\n * @example\n * splitWhen(x => x === 2)([1, 2, 3]) // => [[1], [2, 3]]\n * @dataLast\n * @category Array\n */\nexport function splitWhen(\n predicate: (item: T, index: number, data: readonly T[]) => boolean,\n): (array: readonly T[]) => [T[], T[]];\n\nexport function splitWhen(...args: readonly unknown[]): unknown {\n return purry(splitWhenImplementation, args);\n}\n\nfunction splitWhenImplementation(\n data: readonly T[],\n predicate: (item: T, index: number, data: readonly T[]) => boolean,\n): [T[], T[]] {\n const index = data.findIndex(predicate);\n return index === -1\n ? [[...data], []]\n : [data.slice(0, index), data.slice(index)];\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Determines whether a string begins with the provided prefix, and refines the\n * output type if possible.\n *\n * This function is a wrapper around the built-in [`String.prototype.startsWith`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith)\n * method, but doesn't expose the `startPosition` parameter. To check from a\n * specific position, use\n * `startsWith(sliceString(data, startPosition), prefix)`.\n *\n * @param data - The input string.\n * @param prefix - The string to check for at the beginning.\n * @signature\n * startsWith(data, prefix);\n * @example\n * startsWith(\"hello world\", \"hello\"); // true\n * startsWith(\"hello world\", \"world\"); // false\n * @dataFirst\n * @category String\n */\nexport function startsWith(\n data: T,\n prefix: string extends Prefix ? never : Prefix,\n): data is T & `${Prefix}${string}`;\nexport function startsWith(data: string, prefix: string): boolean;\n\n/**\n * Determines whether a string begins with the provided prefix, and refines the\n * output type if possible.\n *\n * This function is a wrapper around the built-in [`String.prototype.startsWith`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith)\n * method, but doesn't expose the `startPosition` parameter. To check from a\n * specific position, use\n * `startsWith(sliceString(data, startPosition), prefix)`.\n *\n * @param prefix - The string to check for at the beginning.\n * @signature\n * startsWith(prefix)(data);\n * @example\n * pipe(\"hello world\", startsWith(\"hello\")); // true\n * pipe(\"hello world\", startsWith(\"world\")); // false\n * @dataLast\n * @category String\n */\nexport function startsWith(\n prefix: string extends Prefix ? never : Prefix,\n): (data: T) => data is T & `${Prefix}${string}`;\nexport function startsWith(prefix: string): (data: string) => boolean;\n\nexport function startsWith(...args: readonly unknown[]): unknown {\n return purry(startsWithImplementation, args);\n}\n\nconst startsWithImplementation = (data: string, prefix: string): boolean =>\n data.startsWith(prefix);\n", "import type { IsNumericLiteral, IsStringLiteral } from \"type-fest\";\n\n// This is the most efficient way to check an arbitrary string if it is a simple\n// non-negative integer. We use character ranges instead of the `\\d` character\n// class to avoid matching non-ascii digits (e.g. Arabic-Indic digits), while\n// maintaining that the regular expression supports unicode.\nconst NON_NEGATIVE_INTEGER_RE = /^(?:0|[1-9][0-9]*)$/u;\n\ntype StringToPath =\n // We can only compute the path type for literals that TypeScript can\n // break down further into parts.\n IsStringLiteral extends true ? StringToPathImpl : (string | number)[];\n\ntype StringToPathImpl =\n // We start by checking the 2 quoted variants of the square bracket access\n // syntax. We do this in a single check and not in a subsequent check that\n // would only extract the quoted part so that we can catch cases where the\n // quoted part itself contains square brackets. This allows TypeScript to be\n // \"greedy\" about what it infers into Quoted and DoubleQuoted.\n S extends `${infer Head}['${infer Quoted}']${infer Tail}`\n ? [...StringToPath, Quoted, ...StringToPath]\n : S extends `${infer Head}[\"${infer DoubleQuoted}\"]${infer Tail}`\n ? [...StringToPath, DoubleQuoted, ...StringToPath]\n : // If we have an unquoted property access we also need to run the\n // contents recursively too (unlike the quoted variants above).\n S extends `${infer Head}[${infer Unquoted}]${infer Tail}`\n ? [\n ...StringToPath,\n ...StringToPath,\n ...StringToPath,\n ]\n : // Finally, we process any dots one after the other from left to\n // right. TypeScript will be non-greedy here, putting *everything*\n // after the first dot into the Tail.\n S extends `${infer Head}.${infer Tail}`\n ? [...StringToPath, ...StringToPath]\n : // Finally we need to handle the few cases of simple literals.\n \"\" extends S\n ? // There are some edge-cases where Lodash will try to access an\n // empty property, but those seem nonsensical in practice so we\n // prefer just skipping these cases.\n []\n : // We differ from Lodash in the way we handle numbers. Lodash\n // returns everything in the path as a string, and relies on JS to\n // coerce array accessors to numbers (or the other way around in\n // practice, e.g., `myArray[123] === myArray['123']`), but from a\n // typing perspective the two are not the same and we need the\n // path to be accurate about it.\n S extends `${infer N extends number}`\n ? [\n // TypeScript considers \" 123 \" to still extend `${number}`,\n // but would type is as `string` instead of a literal. We\n // can use that fact to make sure we only consider simple\n // number literals as numbers, and take the rest as strings.\n IsNumericLiteral extends true ? N : S,\n ]\n : // This simplest form of a path is just a single string literal.\n [S];\n\n/**\n * A utility to allow JSONPath-like strings to be used in other utilities which\n * take an array of path segments as input (e.g. `prop`, `setPath`, etc...).\n * The main purpose of this utility is to act as a bridge between the runtime\n * implementation that converts the path to an array, and the type-system that\n * parses the path string **type** into an array **type**. This type allows us\n * to return fine-grained types and to enforce correctness at the type-level.\n *\n * We **discourage** using this utility for new code. This utility is for legacy\n * code that already contains path strings (which are accepted by Lodash). We\n * strongly recommend using *path arrays* instead as they provide better\n * developer experience via significantly faster type-checking, fine-grained\n * error messages, and automatic typeahead suggestions for each segment of the\n * path.\n *\n * *There are a bunch of limitations to this utility derived from the\n * limitations of the type itself, these are usually edge-cases around deeply\n * nested paths, escaping, whitespaces, and empty segments. This is true even\n * in cases where the runtime implementation can better handle them, this is\n * intentional. See the tests for this utility for more details and the\n * expected outputs*.\n *\n * @param path - A string path.\n * @signature\n * stringToPath(path)\n * @example\n * stringToPath('a.b[0].c') // => ['a', 'b', 0, 'c']\n * @dataFirst\n * @category Utility\n */\nexport function stringToPath(\n path: Path,\n): StringToPath {\n const result: (string | number)[] = [];\n\n // There are four possible ways to define a path segment::\n // - `propName`: is used to parse dot-notation paths, e.g. 'foo.bar.baz', we\n // allow multiple sequential dots because our type allows them, but they are\n // semantically meaningless. Note that this would also allow strings starting\n // with a dot, e.g. `.foo`, this is fine because the dot itself is just used\n // as a separator and is ignored in the final path.\n // - `quoted`, `doubleQuoted`: used within square bracket notation to prevent\n // any recursive parsing of their contents. As for the type itself, we only\n // allow quote symbols to appear immediately after the opening square bracket\n // and immediately before the closing square bracket, this allows us to handle\n // more gracefully cases where a quote symbol might appear within the quoted\n // part.\n // - `unquoted`: If the contents of the square brackets are not quoted they\n // will match this group (this is why the order is important here!). Contents\n // of this group get parsed *recursively*.\n //\n // NOTE: We limit all repeats to 4096 characters to avoid a possible attack\n // vector when the input to this function is controlled by the user. This is\n // due to a DoS timing attack because regex backtracking is non-linear.\n // @see: https://codeql.github.com/codeql-query-help/javascript/js-polynomial-redos/\n const pathSegmentRe =\n /\\.{0,4096}(?[^.[\\]]+)|\\['(?.{0,4096}?)'\\]|\\[\"(?.{0,4096}?)\"\\]|\\[(?.{0,4096}?)\\]/uy;\n\n let match: RegExpExecArray | null;\n while ((match = pathSegmentRe.exec(path)) !== null) {\n const { propName, quoted, doubleQuoted, unquoted } = match.groups!;\n\n if (unquoted !== undefined) {\n result.push(...stringToPath(unquoted));\n continue;\n }\n\n result.push(\n propName === undefined\n ? (quoted ?? doubleQuoted!)\n : // The only way to differentiate between array indices and properties\n // is to check if the property is a non-negative integer. In those\n // cases we perform the conversion (unlike Lodash).\n NON_NEGATIVE_INTEGER_RE.test(propName)\n ? Number(propName)\n : propName,\n );\n }\n\n return result;\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Subtracts two numbers.\n *\n * @param value - The number.\n * @param subtrahend - The number to subtract from the value.\n * @signature\n * subtract(value, subtrahend);\n * @example\n * subtract(10, 5) // => 5\n * subtract(10, -5) // => 15\n * reduce([1, 2, 3, 4], subtract, 20) // => 10\n * @dataFirst\n * @category Number\n */\nexport function subtract(value: bigint, subtrahend: bigint): bigint;\nexport function subtract(value: number, subtrahend: number): number;\n\n/**\n * Subtracts two numbers.\n *\n * @param subtrahend - The number to subtract from the value.\n * @signature\n * subtract(subtrahend)(value);\n * @example\n * subtract(5)(10) // => 5\n * subtract(-5)(10) // => 15\n * map([1, 2, 3, 4], subtract(1)) // => [0, 1, 2, 3]\n * @dataLast\n * @category Number\n */\nexport function subtract(subtrahend: bigint): (value: bigint) => bigint;\nexport function subtract(subtrahend: number): (value: number) => number;\n\nexport function subtract(...args: readonly unknown[]): unknown {\n return purry(subtractImplementation, args);\n}\n\n// The implementation only uses `number` types, but that's just because it's\n// hard to tell typescript that both value and subtrahend would be of the same\n// type.\nconst subtractImplementation = (value: number, subtrahend: number): number =>\n value - subtrahend;\n", "import { purry } from \"./purry\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\n\ntype SumBy<\n T extends IterableContainer,\n U extends bigint | number,\n> = T extends readonly []\n ? 0\n : T extends readonly [unknown, ...(readonly unknown[])]\n ? U\n : U | 0;\n\n/**\n * Returns the sum of the elements of an array using the provided mapper.\n *\n * Works for both `number` and `bigint` mappers, but not mappers that return both\n * types.\n *\n * IMPORTANT: The result for empty arrays would be 0 (`number`) regardless of\n * the type of the mapper; to avoid adding this to the return type for cases\n * where the array is known to be non-empty you can use `hasAtLeast` or\n * `isEmpty` to guard against this case.\n *\n * @param callbackfn - Predicate function.\n * @signature\n * sumBy(fn)(array)\n * @example\n * pipe(\n * [{a: 5}, {a: 1}, {a: 3}],\n * sumBy(x => x.a)\n * ) // 9\n *\n * pipe(\n * [{a: 5n}, {a: 1n}, {a: 3n}],\n * sumBy(x => x.a)\n * ) // 9n\n * @dataLast\n * @category Array\n */\nexport function sumBy(\n callbackfn: (value: T[number], index: number, data: T) => number,\n): (items: T) => SumBy;\nexport function sumBy(\n callbackfn: (value: T[number], index: number, data: T) => bigint,\n): (items: T) => SumBy;\n\n/**\n * Returns the sum of the elements of an array using the provided mapper.\n *\n * Works for both `number` and `bigint` mappers, but not mappers that can return both\n * types.\n *\n * IMPORTANT: The result for empty arrays would be 0 (`number`) regardless of\n * the type of the mapper; to avoid adding this to the return type for cases\n * where the array is known to be non-empty you can use `hasAtLeast` or\n * `isEmpty` to guard against this case.\n *\n * @param data - The array.\n * @param callbackfn - Predicate function.\n * @signature\n * sumBy(array, fn)\n * @example\n * sumBy(\n * [{a: 5}, {a: 1}, {a: 3}],\n * x => x.a\n * ) // 9\n * sumBy(\n * [{a: 5n}, {a: 1n}, {a: 3n}],\n * x => x.a\n * ) // 9n\n * @dataFirst\n * @category Array\n */\nexport function sumBy(\n data: T,\n callbackfn: (value: T[number], index: number, data: T) => number,\n): SumBy;\nexport function sumBy(\n data: T,\n callbackfn: (value: T[number], index: number, data: T) => bigint,\n): SumBy;\n\nexport function sumBy(...args: readonly unknown[]): unknown {\n return purry(sumByImplementation, args);\n}\n\nconst sumByImplementation = (\n array: readonly T[],\n callbackfn: (value: T, index: number, data: readonly T[]) => bigint | number,\n): bigint | number => {\n const iter = array.entries();\n\n const firstEntry = iter.next();\n if (\"done\" in firstEntry && firstEntry.done) {\n return 0;\n }\n\n const {\n value: [, firstValue],\n } = firstEntry;\n let sum = callbackfn(firstValue, 0, array);\n for (const [index, item] of iter) {\n const summand = callbackfn(item, index, array);\n\n // @ts-expect-error [ts2365] -- Typescript can't infer that all elements will be a number of the same type.\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n sum += summand;\n }\n return sum;\n};\n", "import type { And, IsEqual, Join } from \"type-fest\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\ntype Difference =\n TupleOfLength extends [...infer U, ...TupleOfLength]\n ? U[\"length\"]\n : never;\n\ntype isLessThan =\n IsEqual extends true\n ? false\n : 0 extends A\n ? true\n : 0 extends B\n ? false\n : isLessThan, Difference>;\n\ntype TupleOfLength<\n L extends number,\n T extends IterableContainer = [],\n> = T[\"length\"] extends L ? T : TupleOfLength;\n\ntype IsNonNegative = number extends T\n ? false\n : `${T}` extends `-${string}`\n ? false\n : true;\n\ntype CharactersTuple = string extends T\n ? string[]\n : T extends `${infer C}${infer R}`\n ? [C, ...CharactersTuple]\n : [];\n\ntype SwapArrayInternal<\n T extends IterableContainer,\n Index1 extends number,\n Index2 extends number,\n Position extends readonly unknown[] = [],\n Original extends IterableContainer = T,\n> = T extends readonly [infer AtPosition, ...infer Rest]\n ? [\n Position[\"length\"] extends Index1\n ? Original[Index2]\n : Position[\"length\"] extends Index2\n ? Original[Index1]\n : AtPosition,\n ...SwapArrayInternal<\n Rest,\n Index1,\n Index2,\n [unknown, ...Position],\n Original\n >,\n ]\n : T;\n\ntype SwapString = Join<\n SwapArray, K1, K2>,\n \"\"\n>;\n\ntype SwapArray<\n T extends IterableContainer,\n K1 extends number,\n K2 extends number,\n> =\n And, IsNonNegative> extends true\n ? And, isLessThan> extends true\n ? SwapArrayInternal\n : // If the indices are not within the input arrays range the result would\n // be trivially the same as the input array.\n T\n : // TODO [>3]: Because of limitations on the typescript version used in Remeda we can't build a proper Absolute number type so we can't implement proper typing for negative indices and have to opt for a less-strict type instead. Check out the history for the PR that introduced this TODO to see how it could be implemented.\n T[number][];\n\ntype SwappedIndices<\n T extends IterableContainer | string,\n K1 extends number,\n K2 extends number,\n> = T extends string\n ? SwapString\n : T extends IterableContainer\n ? SwapArray\n : never;\n\n/**\n * Swaps the positions of two elements in an array or string at the provided indices.\n *\n * Negative indices are supported and would be treated as an offset from the end of the array. The resulting type thought would be less strict than when using positive indices.\n *\n * If either index is out of bounds the result would be a shallow copy of the input, as-is.\n *\n * @param data - The item to be manipulated. This can be an array, or a string.\n * @param index1 - The first index.\n * @param index2 - The second index.\n * @returns Returns the manipulated array or string.\n * @signature\n * swapIndices(data, index1, index2)\n * @example\n * swapIndices(['a', 'b', 'c'], 0, 1) // => ['b', 'a', 'c']\n * swapIndices(['a', 'b', 'c'], 1, -1) // => ['a', 'c', 'b']\n * swapIndices('abc', 0, 1) // => 'bac'\n * @dataFirst\n * @category Array\n */\nexport function swapIndices<\n T extends IterableContainer | string,\n K1 extends number,\n K2 extends number,\n>(data: T, index1: K1, index2: K2): SwappedIndices;\n\n/**\n * Swaps the positions of two elements in an array or string at the provided indices.\n *\n * Negative indices are supported and would be treated as an offset from the end of the array. The resulting type thought would be less strict than when using positive indices.\n *\n * If either index is out of bounds the result would be a shallow copy of the input, as-is.\n *\n * @param index1 - The first index.\n * @param index2 - The second index.\n * @returns Returns the manipulated array or string.\n * @signature\n * swapIndices(index1, index2)(data)\n * @example\n * swapIndices(0, 1)(['a', 'b', 'c']) // => ['b', 'a', 'c']\n * swapIndices(0, -1)('abc') // => 'cba'\n * @dataLast\n * @category Array\n */\nexport function swapIndices(\n index1: K1,\n index2: K2,\n): (data: T) => SwappedIndices;\n\nexport function swapIndices(...args: readonly unknown[]): unknown {\n return purry(swapIndicesImplementation, args);\n}\n\nconst swapIndicesImplementation = (\n data: IterableContainer | string,\n index1: number,\n index2: number,\n): unknown =>\n typeof data === \"string\"\n ? // eslint-disable-next-line @typescript-eslint/no-misused-spread -- TODO: I'm not sure what the right way to split the string here, there are multiple \"correct\" answers and each one is meaningfully different: https://github.com/sindresorhus/eslint-plugin-unicorn/issues/2521\n swapArray([...data], index1, index2).join(\"\")\n : swapArray(data, index1, index2);\n\nfunction swapArray(\n data: readonly unknown[],\n index1: number,\n index2: number,\n): unknown[] {\n const result = [...data];\n\n if (Number.isNaN(index1) || Number.isNaN(index2)) {\n return result;\n }\n\n const positiveIndexA = index1 < 0 ? data.length + index1 : index1;\n const positiveIndexB = index2 < 0 ? data.length + index2 : index2;\n\n if (positiveIndexA < 0 || positiveIndexA > data.length) {\n return result;\n }\n\n if (positiveIndexB < 0 || positiveIndexB > data.length) {\n return result;\n }\n\n result[positiveIndexA] = data[positiveIndexB];\n result[positiveIndexB] = data[positiveIndexA];\n\n return result;\n}\n", "import { purry } from \"./purry\";\n\ntype SwappedProps = {\n [K in keyof T]: T[K1 extends K ? K2 : K2 extends K ? K1 : K];\n};\n\n/**\n * Swaps the values of two properties in an object based on the provided keys.\n *\n * @param data - The object to be manipulated.\n * @param key1 - The first property key.\n * @param key2 - The second property key.\n * @returns Returns the manipulated object.\n * @signature\n * swapProps(data, key1, key2)\n * @example\n * swapProps({a: 1, b: 2, c: 3}, 'a', 'b') // => {a: 2, b: 1, c: 3}\n * @dataFirst\n * @category Object\n */\nexport function swapProps<\n T extends object,\n K1 extends keyof T,\n K2 extends keyof T,\n>(data: T, key1: K1, key2: K2): SwappedProps;\n\n/**\n * Swaps the values of two properties in an object based on the provided keys.\n *\n * @param key1 - The first property key.\n * @param key2 - The second property key.\n * @returns Returns the manipulated object.\n * @signature\n * swapProps(key1, key2)(data)\n * @example\n * swapProps('a', 'b')({a: 1, b: 2, c: 3}) // => {a: 2, b: 1, c: 3}\n * @dataLast\n * @category Object\n */\nexport function swapProps<\n T extends object,\n K1 extends keyof T,\n K2 extends keyof T,\n>(key1: K1, key2: K2): (data: T) => SwappedProps;\n\nexport function swapProps(...args: readonly unknown[]): unknown {\n return purry(swapPropsImplementation, args);\n}\n\nfunction swapPropsImplementation(\n obj: T,\n key1: keyof T,\n key2: keyof T,\n): Record {\n const { [key1]: value1, [key2]: value2 } = obj;\n return {\n ...obj,\n [key1]: value2,\n [key2]: value1,\n };\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { lazyEmptyEvaluator } from \"./internal/utilityEvaluators\";\nimport { purry } from \"./purry\";\n\n/**\n * Returns the first `n` elements of `array`.\n *\n * @param array - The array.\n * @param n - The number of elements to take.\n * @signature\n * take(array, n)\n * @example\n * take([1, 2, 3, 4, 3, 2, 1], 3) // => [1, 2, 3]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function take(\n array: T,\n n: number,\n): T[number][];\n\n/**\n * Returns the first `n` elements of `array`.\n *\n * @param n - The number of elements to take.\n * @signature\n * take(n)(array)\n * @example\n * pipe([1, 2, 3, 4, 3, 2, 1], take(3)) // => [1, 2, 3]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function take(\n n: number,\n): (array: T) => T[number][];\n\nexport function take(...args: readonly unknown[]): unknown {\n return purry(takeImplementation, args, lazyImplementation);\n}\n\nconst takeImplementation = (\n array: T,\n n: number,\n): T[number][] => (n < 0 ? [] : array.slice(0, n));\n\nfunction lazyImplementation(n: number): LazyEvaluator {\n if (n <= 0) {\n return lazyEmptyEvaluator;\n }\n\n let remaining = n;\n return (value) => {\n remaining -= 1;\n return { done: remaining <= 0, hasNext: true, next: value };\n };\n}\n", "import { heapify, heapMaybeInsert } from \"./internal/heap\";\nimport {\n purryOrderRulesWithArgument,\n type OrderRule,\n} from \"./internal/purryOrderRules\";\nimport type { CompareFunction } from \"./internal/types/CompareFunction\";\nimport type { NonEmptyArray } from \"./internal/types/NonEmptyArray\";\n\n/**\n * Take the first `n` items from `data` based on the provided ordering criteria. This allows you to avoid sorting the array before taking the items. The complexity of this function is *O(Nlogn)* where `N` is the length of the array.\n *\n * For the opposite operation (to drop `n` elements) see `dropFirstBy`.\n *\n * @param data - The input array.\n * @param n - The number of items to take. If `n` is non-positive no items would be returned, if `n` is bigger then data.length a *clone* of `data` would be returned.\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns A subset of the input array.\n * @signature\n * takeFirstBy(data, n, ...rules);\n * @example\n * takeFirstBy(['aa', 'aaaa', 'a', 'aaa'], 2, x => x.length); // => ['a', 'aa']\n * @dataFirst\n * @category Array\n */\nexport function takeFirstBy(\n data: readonly T[],\n n: number,\n ...rules: Readonly>>\n): T[];\n\n/**\n * Take the first `n` items from `data` based on the provided ordering criteria. This allows you to avoid sorting the array before taking the items. The complexity of this function is *O(Nlogn)* where `N` is the length of the array.\n *\n * For the opposite operation (to drop `n` elements) see `dropFirstBy`.\n *\n * @param n - The number of items to take. If `n` is non-positive no items would be returned, if `n` is bigger then data.length a *clone* of `data` would be returned.\n * @param rules - A variadic array of order rules defining the sorting criteria. Each order rule is a projection function that extracts a comparable value from the data. Sorting is based on these extracted values using the native `<` and `>` operators. Earlier rules take precedence over later ones. Use the syntax `[projection, \"desc\"]` for descending order.\n * @returns A subset of the input array.\n * @signature\n * takeFirstBy(n, ...rules)(data);\n * @example\n * pipe(['aa', 'aaaa', 'a', 'aaa'], takeFirstBy(2, x => x.length)); // => ['a', 'aa']\n * @dataLast\n * @category Array\n */\nexport function takeFirstBy(\n n: number,\n ...rules: Readonly>>\n): (data: readonly T[]) => T[];\n\nexport function takeFirstBy(...args: readonly unknown[]): unknown {\n return purryOrderRulesWithArgument(takeFirstByImplementation, args);\n}\n\nfunction takeFirstByImplementation(\n data: readonly T[],\n compareFn: CompareFunction,\n n: number,\n): T[] {\n if (n <= 0) {\n return [];\n }\n\n if (n >= data.length) {\n return [...data];\n }\n\n const heap = data.slice(0, n);\n heapify(heap, compareFn);\n\n const rest = data.slice(n);\n for (const item of rest) {\n heapMaybeInsert(heap, compareFn, item);\n }\n\n return heap;\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n/**\n * Takes the last `n` elements from the `array`.\n *\n * @param array - The target array.\n * @param n - The number of elements to take.\n * @signature\n * takeLast(array, n)\n * @example\n * takeLast([1, 2, 3, 4, 5], 2) // => [4, 5]\n * @dataFirst\n * @category Array\n */\nexport function takeLast(\n array: T,\n n: number,\n): T[number][];\n\n/**\n * Take the last `n` elements from the `array`.\n *\n * @param n - The number of elements to take.\n * @signature\n * takeLast(n)(array)\n * @example\n * takeLast(2)([1, 2, 3, 4, 5]) // => [4, 5]\n * @dataLast\n * @category Array\n */\nexport function takeLast(\n n: number,\n): (array: T) => T[number][];\n\nexport function takeLast(...args: readonly unknown[]): unknown {\n return purry(takeLastImplementation, args);\n}\n\nconst takeLastImplementation = (\n array: T,\n n: number,\n): T[number][] => (n > 0 ? array.slice(Math.max(0, array.length - n)) : []);\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n/**\n * Returns elements from the end of the array until the predicate returns false.\n * The returned elements will be in the same order as in the original array.\n *\n * @param data - The array.\n * @param predicate - The predicate.\n * @signature\n * takeLastWhile(data, predicate)\n * @example\n * takeLastWhile([1, 2, 10, 3, 4, 5], x => x < 10) // => [3, 4, 5]\n * @dataFirst\n * @category Array\n */\nexport function takeLastWhile(\n data: T,\n predicate: (item: T[number], index: number, data: T) => item is S,\n): S[];\nexport function takeLastWhile(\n data: T,\n predicate: (item: T[number], index: number, data: T) => boolean,\n): T[number][];\n\n/**\n * Returns elements from the end of the array until the predicate returns false.\n * The returned elements will be in the same order as in the original array.\n *\n * @param predicate - The predicate.\n * @signature\n * takeLastWhile(predicate)(data)\n * @example\n * pipe([1, 2, 10, 3, 4, 5], takeLastWhile(x => x < 10)) // => [3, 4, 5]\n * @dataLast\n * @category Array\n */\nexport function takeLastWhile(\n predicate: (item: T[number], index: number, data: T) => item is S,\n): (array: T) => S[];\nexport function takeLastWhile(\n predicate: (item: T[number], index: number, data: T) => boolean,\n): (data: T) => T[number][];\n\nexport function takeLastWhile(...args: readonly unknown[]): unknown {\n return purry(takeLastWhileImplementation, args);\n}\n\nfunction takeLastWhileImplementation(\n data: T,\n predicate: (item: T[number], index: number, data: T) => boolean,\n): T[number][] {\n for (let i = data.length - 1; i >= 0; i--) {\n if (!predicate(data[i], i, data)) {\n return data.slice(i + 1);\n }\n }\n return [...data];\n}\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\n/**\n * Returns elements from the array until predicate returns false.\n *\n * @param data - The array.\n * @param predicate - The predicate.\n * @signature\n * takeWhile(data, predicate)\n * @example\n * takeWhile([1, 2, 3, 4, 3, 2, 1], x => x !== 4) // => [1, 2, 3]\n * @dataFirst\n * @category Array\n */\nexport function takeWhile(\n data: T,\n predicate: (item: T[number], index: number, data: T) => item is S,\n): S[];\nexport function takeWhile(\n data: T,\n predicate: (item: T[number], index: number, data: T) => boolean,\n): T[number][];\n\n/**\n * Returns elements from the array until predicate returns false.\n *\n * @param predicate - The predicate.\n * @signature\n * takeWhile(predicate)(data)\n * @example\n * pipe([1, 2, 3, 4, 3, 2, 1], takeWhile(x => x !== 4)) // => [1, 2, 3]\n * @dataLast\n * @category Array\n */\nexport function takeWhile(\n predicate: (item: T[number], index: number, data: T) => item is S,\n): (array: T) => S[];\nexport function takeWhile(\n predicate: (item: T[number], index: number, data: T) => boolean,\n): (array: T) => T[number][];\n\nexport function takeWhile(...args: readonly unknown[]): unknown {\n return purry(takeWhileImplementation, args);\n}\n\nfunction takeWhileImplementation(\n data: T,\n predicate: (item: T[number], index: number, data: T) => boolean,\n): T[number][] {\n const ret: T[number][] = [];\n for (const [index, item] of data.entries()) {\n if (!predicate(item, index, data)) {\n break;\n }\n ret.push(item);\n }\n return ret;\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Calls the given function with the given value, then returns the given value.\n * The return value of the provided function is ignored.\n *\n * This allows \"tapping into\" a function sequence in a pipe, to perform side\n * effects on intermediate results.\n *\n * @param value - The value to pass into the function.\n * @param fn - The function to call.\n * @signature\n * tap(value, fn)\n * @example\n * tap(\"foo\", console.log) // => \"foo\"\n * @dataFirst\n * @category Other\n */\nexport function tap(value: T, fn: (value: T) => void): T;\n\n/**\n * Calls the given function with the given value, then returns the given value.\n * The return value of the provided function is ignored.\n *\n * This allows \"tapping into\" a function sequence in a pipe, to perform side\n * effects on intermediate results.\n *\n * @param fn - The function to call.\n * @signature\n * tap(fn)(value)\n * @example\n * pipe(\n * [-5, -1, 2, 3],\n * filter(n => n > 0),\n * tap(console.log), // prints [2, 3]\n * map(n => n * 2)\n * ) // => [4, 6]\n * @dataLast\n * @category Other\n */\nexport function tap<\n T,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- TODO: This is solvable by inlining F and wrapping the T parameter with `NoInfer` (e.g. `(value: NoInfer) => unknown`); to prevent typescript from inferring it as `unknown`. This is only available in TS 5.4, which is above what we currently support (5.1).\n F extends (value: T) => unknown,\n>(fn: F): (value: T) => T;\n\nexport function tap(...args: readonly unknown[]): unknown {\n return purry(tapImplementation, args);\n}\n\nfunction tapImplementation(value: T, fn: (value: T) => void): T {\n fn(value);\n return value;\n}\n", "import type { GreaterThan } from \"type-fest\";\nimport { purry } from \"./purry\";\n\n// This number was picked by trial-and-error until typescript stops failing with\n// \"Type instantiation is excessively deep and possibly infinite. (ts2589)\".\n// See the type tests for more information.\ntype MAX_LITERAL_SIZE = 46;\n\ntype TimesArray<\n T,\n N extends number,\n Iteration extends readonly unknown[] = [],\n> = number extends N\n ? // N is not a literal number, we can't deduce the type\n T[]\n : `${N}` extends `-${number}`\n ? // N is non-positive, the mapper will never run\n []\n : `${N}` extends `${infer K extends number}.${number}`\n ? // N is not an integer, we \"floor\" the number.\n TimesArray\n : GreaterThan extends true\n ? // We can't build a literal tuple beyond this size, after that we\n // can't add more items to the tuple so we add a rest element instead.\n [...TimesArray, ...T[]]\n : N extends Iteration[\"length\"]\n ? // We finished building the output tuple\n []\n : // Add another item to the tuple and recurse.\n [T, ...TimesArray];\n\n/**\n * Calls an input function `n` times, returning an array containing the results\n * of those function calls.\n *\n * `fn` is passed one argument: The current value of `n`, which begins at `0`\n * and is gradually incremented to `n - 1`.\n *\n * @param count - A value between `0` and `n - 1`. Increments after each\n * function call.\n * @param fn - The function to invoke. Passed one argument, the current value of\n * `n`.\n * @returns An array containing the return values of all calls to `fn`.\n * @signature\n * times(count, fn)\n * @example\n * times(5, identity()); //=> [0, 1, 2, 3, 4]\n * @dataFirst\n * @category Array\n */\nexport function times(\n count: N,\n fn: (index: number) => T,\n): TimesArray;\n\n/**\n * Calls an input function `n` times, returning an array containing the results\n * of those function calls.\n *\n * `fn` is passed one argument: The current value of `n`, which begins at `0`\n * and is gradually incremented to `n - 1`.\n *\n * @param fn - The function to invoke. Passed one argument, the current value of\n * `n`.\n * @returns An array containing the return values of all calls to `fn`.\n * @signature\n * times(fn)(count)\n * @example\n * times(identity())(5); //=> [0, 1, 2, 3, 4]\n * @dataLast\n * @category Array\n */\nexport function times(\n fn: (index: number) => T,\n): (count: N) => TimesArray;\n\nexport function times(...args: readonly unknown[]): unknown {\n return purry(timesImplementation, args);\n}\n\nfunction timesImplementation(count: number, fn: (index: number) => T): T[] {\n if (count < 1) {\n // We prefer to return trivial results on trivial inputs vs throwing errors.\n return [];\n }\n\n // Non-integer numbers would cause `new Array` to throw, but it makes more\n // sense to simply round them down to the nearest integer instead; but\n // rounding has some performance implications so we only do it when we have to\n const length = Number.isInteger(count) ? count : Math.floor(count);\n\n // eslint-disable-next-line unicorn/no-new-array -- This is the most efficient way to create the array, check out the benchmarks in the PR that added this comment.\n const res = new Array(length);\n\n for (let i = 0; i < length; i++) {\n res[i] = fn(i);\n }\n\n return res;\n}\n", "import type { Words } from \"type-fest\";\n\n// @see https://github.com/sindresorhus/type-fest/blob/main/source/internal/characters.d.ts#L5-L31\nconst WHITESPACE = [\n \"\\u{9}\", // '\\t'\n \"\\u{A}\", // '\\n'\n \"\\u{B}\", // '\\v'\n \"\\u{C}\", // '\\f'\n \"\\u{D}\", // '\\r'\n \"\\u{20}\", // ' '\n \"\\u{85}\",\n \"\\u{A0}\",\n \"\\u{1680}\",\n \"\\u{2000}\",\n \"\\u{2001}\",\n \"\\u{2002}\",\n \"\\u{2003}\",\n \"\\u{2004}\",\n \"\\u{2005}\",\n \"\\u{2006}\",\n \"\\u{2007}\",\n \"\\u{2008}\",\n \"\\u{2009}\",\n \"\\u{200A}\",\n \"\\u{2028}\",\n \"\\u{2029}\",\n \"\\u{202F}\",\n \"\\u{205F}\",\n \"\\u{3000}\",\n \"\\u{FEFF}\",\n] as const;\n\n// @see https://github.com/sindresorhus/type-fest/blob/main/source/internal/characters.d.ts#L33\nconst WORD_SEPARATORS = new Set([\"-\", \"_\", ...WHITESPACE]);\n\nexport const words = (\n data: S,\n): string extends S ? string[] : Words => {\n const results: string[] = [];\n let word = \"\";\n\n const flush = (): void => {\n if (word.length > 0) {\n results.push(word);\n word = \"\";\n }\n };\n\n for (const character of data) {\n if (WORD_SEPARATORS.has(character)) {\n // Separator encountered; flush the current word & exclude the separator.\n flush();\n continue;\n }\n\n // Detect transitions:\n // 1. Lowercase to uppercase (e.g., \"helloWorld\")\n if (/[a-z]$/u.test(word) && /[A-Z]/u.test(character)) {\n flush();\n }\n // 2. Uppercase to lowercase following multiple uppercase letters (e.g., \"HELLOWorld\")\n // When the text transitions from 2 upper case letters to a lower case\n // letter. (one upper case letter is considered part of the word, e.g.\n // \"Dog\").\n else if (/[A-Z][A-Z]$/u.test(word) && /[a-z]/u.test(character)) {\n const lastCharacter = word.slice(-1);\n word = word.slice(0, -1);\n flush();\n word = lastCharacter;\n }\n // 3. Digit to non-digit or non-digit to digit (e.g., \"123abc\" or \"abc123\")\n else if (/\\d$/u.test(word) !== /\\d/u.test(character)) {\n flush();\n }\n\n // Add the current character to the current word.\n word += character;\n }\n\n // Flush any remaining word.\n flush();\n\n // @ts-expect-error [ts2322] -- TypeScript can't infer this type...\n return results;\n};\n", "import type {\n CamelCase,\n CamelCaseOptions as BaseCamelCaseOptions,\n} from \"type-fest\";\nimport type { OptionalOptionsWithDefaults } from \"./internal/types/OptionalOptionsWithDefaults\";\nimport { words } from \"./internal/words\";\n\nconst LOWER_CASE_CHARACTER_RE = /[a-z]/u;\n\nconst DEFAULT_PRESERVE_CONSECUTIVE_UPPERCASE = true;\n\ntype CamelCaseOptions = {\n readonly preserveConsecutiveUppercase?: boolean;\n};\n\ntype CamelCaseOptionsWithDefaults =\n OptionalOptionsWithDefaults<\n CamelCaseOptions,\n Options,\n {\n // We use the runtime const for the default type so they stay coupled.\n preserveConsecutiveUppercase: typeof DEFAULT_PRESERVE_CONSECUTIVE_UPPERCASE;\n }\n >;\n\n/**\n * Converts text to **camelCase** by splitting it into words, lowercasing the\n * first word, capitalizing the rest, then joining them back together.\n *\n * Because it uses the built-in case conversion methods, the function shares\n * their _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_\n * too, making it best suited for simple strings like identifiers and internal\n * keys. For linguistic text processing, use [`Intl.Segmenter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter)\n * with [`granularity: \"word\"`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter#parameters),\n * [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * and [`toLocaleUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase)\n * which are purpose-built to handle nuances in languages and locales.\n *\n * For other case manipulations see: `toLowerCase`, `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toKebabCase`, `toSnakeCase`, and `toTitleCase`.\n *\n * For *PascalCase* use `capitalize(toCamelCase(data))`.\n *\n * @param data - A string.\n * @param options - An _optional_ object with the _optional_ property\n * `preserveConsecutiveUppercase` that can be used to change the way consecutive\n * uppercase characters are handled. Defaults to `true`.\n * @signature\n * toCamelCase(data);\n * toCamelCase(data, { preserveConsecutiveUppercase });\n * @example\n * toCamelCase(\"hello world\"); // \"helloWorld\"\n * toCamelCase(\"__HELLO_WORLD__\"); // \"helloWorld\"\n * toCamelCase(\"HasHTML\"); // \"hasHTML\"\n * toCamelCase(\"HasHTML\", { preserveConsecutiveUppercase: false }); // \"hasHtml\"\n * @dataFirst\n * @category String\n */\nexport function toCamelCase(\n data: T,\n options?: Options,\n): CamelCase & BaseCamelCaseOptions>;\n\n/**\n * Converts text to **camelCase** by splitting it into words, lowercasing the\n * first word, capitalizing the rest, then joining them back together.\n *\n * Because it uses the built-in case conversion methods, the function shares\n * their _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_\n * too, making it best suited for simple strings like identifiers and internal\n * keys. For linguistic text processing, use [`Intl.Segmenter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter)\n * with [`granularity: \"word\"`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter#parameters),\n * [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * and [`toLocaleUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase)\n * which are purpose-built to handle nuances in languages and locales.\n *\n * For other case manipulations see: `toLowerCase`, `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toKebabCase`, `toSnakeCase`, and `toTitleCase`.\n *\n * For *PascalCase* use `capitalize(toCamelCase(data))`.\n *\n * @param options - An _optional_ object with the _optional_ property\n * `preserveConsecutiveUppercase` that can be used to change the way consecutive\n * uppercase characters are handled. Defaults to `true`.\n * @signature\n * toCamelCase()(data);\n * toCamelCase({ preserveConsecutiveUppercase })(data);\n * @example\n * pipe(\"hello world\", toCamelCase()); // \"helloWorld\"\n * pipe(\"__HELLO_WORLD__\", toCamelCase()); // \"helloWorld\"\n * pipe(\"HasHTML\", toCamelCase()); // \"hasHTML\"\n * pipe(\n * \"HasHTML\",\n * toCamelCase({ preserveConsecutiveUppercase: false }),\n * ); // \"hasHtml\"\n * @dataLast\n * @category String\n */\nexport function toCamelCase(\n options?: Options,\n): (\n data: T,\n) => CamelCase & BaseCamelCaseOptions>;\n\nexport function toCamelCase(\n dataOrOptions: CamelCaseOptions | string,\n options?: CamelCaseOptions,\n): unknown {\n return typeof dataOrOptions === \"string\"\n ? toCamelCaseImplementation(dataOrOptions, options)\n : (data: string) => toCamelCaseImplementation(data, dataOrOptions);\n}\n\n// Based on the type definition from type-fest.\n// @see https://github.com/sindresorhus/type-fest/blob/main/source/camel-case.d.ts#L76-L80\nconst toCamelCaseImplementation = (\n data: string,\n {\n preserveConsecutiveUppercase = DEFAULT_PRESERVE_CONSECUTIVE_UPPERCASE,\n }: CamelCaseOptions = {},\n): string =>\n words(\n LOWER_CASE_CHARACTER_RE.test(data)\n ? data\n : // If the text doesn't have **any** lower case characters we also lower\n // case everything, but if it does we need to maintain them as it\n // affects the word boundaries.\n data.toLowerCase(),\n )\n .map(\n (word, index) =>\n `${\n // The first word is uncapitalized, the rest are capitalized\n index === 0 ? word[0]!.toLowerCase() : word[0]!.toUpperCase()\n }${preserveConsecutiveUppercase ? word.slice(1) : word.slice(1).toLowerCase()}`,\n )\n .join(\"\");\n", "import type { Join, Words } from \"type-fest\";\nimport { words } from \"./internal/words\";\nimport { purry } from \"./purry\";\n\ntype KebabCase = string extends S\n ? string\n : Lowercase, \"-\">>;\n\n/**\n * Converts text to **kebab-case** by splitting it into words and joining them\n * back together with hyphens (`-`), then lowercasing the result.\n *\n * Because it uses [`toLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase),\n * the function shares its _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_\n * too, making it best suited for simple strings like identifiers and internal\n * keys. For linguistic text processing, use [`Intl.Segmenter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter)\n * with [`granularity: \"word\"`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter#parameters), and\n * [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * which are purpose-built to handle nuances in languages and locales.\n *\n * For other case manipulations see: `toLowerCase`, `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toSnakeCase`, and `toTitleCase`.\n *\n * For *COBOL-CASE* use `toUpperCase(toKebabCase(data))`.\n *\n * @param data - A string.\n * @signature\n * toKebabCase(data);\n * @example\n * toKebabCase(\"hello world\"); // \"hello-world\"\n * toKebabCase(\"__HELLO_WORLD__\"); // \"hello-world\"\n * @dataFirst\n * @category String\n */\nexport function toKebabCase(data: S): KebabCase;\n\n/**\n * Converts text to **kebab-case** by splitting it into words and joining them\n * back together with hyphens (`-`), then lowercasing the result.\n *\n * Because it uses [`toLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase),\n * the function shares its _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_\n * too, making it best suited for simple strings like identifiers and internal\n * keys. For linguistic text processing, use [`Intl.Segmenter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter)\n * with [`granularity: \"word\"`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter#parameters), and\n * [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * which are purpose-built to handle nuances in languages and locales.\n *\n * For other case manipulations see: `toLowerCase`, `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toSnakeCase`, and `toTitleCase`.\n *\n * For *COBOL-CASE* use `toUpperCase(toKebabCase(data))`.\n *\n * @signature\n * toKebabCase()(data);\n * @example\n * pipe(\"hello world\", toKebabCase()); // \"hello-world\"\n * pipe(\"__HELLO_WORLD__\", toKebabCase()); // \"hello-world\"\n * @dataLast\n * @category String\n */\nexport function toKebabCase(): (data: S) => KebabCase;\n\nexport function toKebabCase(...args: readonly unknown[]): unknown {\n return purry(toKebabCaseImplementation, args);\n}\n\nconst toKebabCaseImplementation = (data: S): KebabCase =>\n // @ts-expect-error [ts2322] -- To avoid importing our own utilities for this\n // we are using the built-in `join` and `toLowerCase` functions which aren't\n // typed as well. This is equivalent to `toLowerCase(join(words(data), \"-\"))`\n // which TypeScript infers correctly as KebabCase.\n words(data).join(\"-\").toLowerCase();\n", "import { purry } from \"./purry\";\n\n/**\n * Replaces all uppercase characters with their lowercase equivalents.\n *\n * This function is a wrapper around the built-in\n * [`String.prototype.toLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase)\n * method and shares its _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_.\n *\n * For a more linguistically accurate transformation use [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * and for display purposes use CSS [`text-transform: lowercase;`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-transform)\n * which *is* locale-aware.\n *\n * For other case manipulations see: `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, `toSnakeCase`, and\n * `toTitleCase`.\n *\n * @param data - A string.\n * @signature\n * toLowerCase(data);\n * @example\n * toLowerCase(\"Hello World\"); // \"hello world\"\n * @dataFirst\n * @category String\n */\nexport function toLowerCase(data: T): Lowercase;\n\n/**\n * Replaces all uppercase characters with their lowercase equivalents.\n *\n * This function is a wrapper around the built-in\n * [`String.prototype.toLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase)\n * method and shares its _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_.\n *\n * For a more linguistically accurate transformation use [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * and for display purposes use CSS [`text-transform: lowercase;`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-transform)\n * which *is* locale-aware.\n *\n * For other case manipulations see: `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, `toSnakeCase`, and\n * `toTitleCase`.\n *\n * @signature\n * toLowerCase()(data);\n * @example\n * pipe(\"Hello World\", toLowerCase()); // \"hello world\"\n * @dataLast\n * @category String\n */\nexport function toLowerCase(): (data: T) => Lowercase;\n\nexport function toLowerCase(...args: readonly unknown[]): unknown {\n return purry(toLowerCaseImplementation, args);\n}\n\nconst toLowerCaseImplementation = (data: T): Lowercase =>\n // @ts-expect-error [ts2322] -- TypeScript can't infer this from the code...\n data.toLowerCase();\n", "import type { Join, Words } from \"type-fest\";\nimport { words } from \"./internal/words\";\nimport { purry } from \"./purry\";\n\ntype SnakeCase = string extends S\n ? string\n : Lowercase, \"_\">>;\n\n/**\n * Converts text to **snake_case** by splitting it into words and joining them\n * back together with underscores (`_`), then lowercasing the result.\n *\n * Because it uses [`toLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase),\n * the function shares its _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_\n * too, making it best suited for simple strings like identifiers and internal\n * keys. For linguistic text processing, use [`Intl.Segmenter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter)\n * with [`granularity: \"word\"`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter#parameters), and\n * [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * which are purpose-built to handle nuances in languages and locales.\n *\n * For other case manipulations see: `toLowerCase`, `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, and `toTitleCase`.\n *\n * For *CONSTANT_CASE* use `toUpperCase(toSnakeCase(data))`.\n *\n * @param data - A string.\n * @signature\n * toSnakeCase(data);\n * @example\n * toSnakeCase(\"hello world\"); // \"hello_world\"\n * toSnakeCase(\"__HELLO_WORLD__\"); // \"hello_world\"\n * @dataFirst\n * @category String\n */\nexport function toSnakeCase(data: S): SnakeCase;\n\n/**\n * Converts text to **snake_case** by splitting it into words and joining them\n * back together with underscores (`_`), then lowercasing the result.\n *\n * Because it uses [`toLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase),\n * the function shares its _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_\n * too, making it best suited for simple strings like identifiers and internal\n * keys. For linguistic text processing, use [`Intl.Segmenter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter)\n * with [`granularity: \"word\"`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter#parameters), and\n * [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * which are purpose-built to handle nuances in languages and locales.\n *\n * For other case manipulations see: `toLowerCase`, `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, and `toTitleCase`.\n *\n * For *CONSTANT_CASE* use `toUpperCase(toSnakeCase(data))`.\n *\n * @signature\n * toSnakeCase()(data);\n * @example\n * pipe(\"hello world\", toSnakeCase()); // \"hello_world\"\n * pipe(\"__HELLO_WORLD__\", toSnakeCase()); // \"hello_world\"\n * @dataLast\n * @category String\n */\nexport function toSnakeCase(): (data: S) => SnakeCase;\n\nexport function toSnakeCase(...args: readonly unknown[]): unknown {\n return purry(toSnakeCaseImplementation, args);\n}\n\nconst toSnakeCaseImplementation = (data: S): SnakeCase =>\n // @ts-expect-error [ts2322] -- To avoid importing our own utilities for this\n // we are using the built-in `join` and `toLowerCase` functions which aren't\n // typed as well. This is equivalent to `toLowerCase(join(words(data), \"_\"))`\n // which TypeScript infers correctly as SnakeCase.\n words(data).join(\"_\").toLowerCase();\n", "import type { IsEqual, IsLiteral, Join, Words } from \"type-fest\";\nimport type { OptionalOptionsWithDefaults } from \"./internal/types/OptionalOptionsWithDefaults\";\nimport { words } from \"./internal/words\";\n\nconst LOWER_CASE_CHARACTER_RE = /[a-z]/u;\n\nconst DEFAULT_PRESERVE_CONSECUTIVE_UPPERCASE = true;\n\ntype TitleCaseOptions = {\n readonly preserveConsecutiveUppercase?: boolean;\n};\n\ntype TitleCaseOptionsWithDefaults =\n OptionalOptionsWithDefaults<\n TitleCaseOptions,\n Options,\n {\n // We use the runtime const for the default type so they stay coupled.\n preserveConsecutiveUppercase: typeof DEFAULT_PRESERVE_CONSECUTIVE_UPPERCASE;\n }\n >;\n\ntype TitleCase =\n IsLiteral extends true\n ? Join<\n TitleCasedArray<\n Words> extends true ? Lowercase : S>,\n TitleCaseOptionsWithDefaults\n >,\n \" \"\n >\n : string;\n\ntype TitleCasedArray<\n T extends readonly string[],\n Options extends TitleCaseOptions,\n> = {\n [I in keyof T]: Capitalize<\n Options[\"preserveConsecutiveUppercase\"] extends true\n ? T[I]\n : Lowercase\n >;\n};\n\n/**\n * Converts text to **Title Case** by splitting it into words, capitalizing the\n * first letter of each word, then joining them back together with spaces.\n *\n * Because it uses the built-in case conversion methods, the function shares\n * their _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_,\n * making it best suited for simple strings like identifiers and internal keys.\n * For linguistic text processing, use [`Intl.Segmenter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter)\n * with [`granularity: \"word\"`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter#parameters),\n * [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * and [`toLocaleUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase)\n * which are purpose-built to handle nuances in languages and locales.\n *\n * For other case manipulations see: `toLowerCase`, `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, and `toSnakeCase`.\n *\n * @param data - A string.\n * @param options - An _optional_ object with the _optional_ property\n * `preserveConsecutiveUppercase` that can be used to change the way consecutive\n * uppercase characters are handled. Defaults to `true`.\n * @signature\n * toTitleCase(data);\n * toTitleCase(data, { preserveConsecutiveUppercase });\n * @example\n * toTitleCase(\"hello world\"); // \"Hello World\"\n * toTitleCase(\"--foo-bar--\"); // \"Foo Bar\"\n * toTitleCase(\"fooBar\"); // \"Foo Bar\"\n * toTitleCase(\"__FOO_BAR__\"); // \"Foo Bar\"\n * toTitleCase(\"XMLHttpRequest\"); // \"XML Http Request\"\n * toTitleCase(\"XMLHttpRequest\", { preserveConsecutiveUppercase: false }); // \"Xml Http Request\"\n * @dataFirst\n * @category String\n */\nexport function toTitleCase(\n data: S,\n options?: Options,\n): TitleCase;\n\n/**\n * Converts text to **Title Case** by splitting it into words, capitalizing the\n * first letter of each word, then joining them back together with spaces.\n *\n * Because it uses the built-in case conversion methods, the function shares\n * their _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_,\n * making it best suited for simple strings like identifiers and internal keys.\n * For linguistic text processing, use [`Intl.Segmenter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter)\n * with [`granularity: \"word\"`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter#parameters),\n * [`toLocaleLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase),\n * and [`toLocaleUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase)\n * which are purpose-built to handle nuances in languages and locales.\n *\n * For other case manipulations see: `toLowerCase`, `toUpperCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, and `toSnakeCase`.\n *\n * @param options - An _optional_ object with the _optional_ property\n * `preserveConsecutiveUppercase` that can be used to change the way consecutive\n * uppercase characters are handled. Defaults to `true`.\n * @signature\n * toTitleCase()(data);\n * toTitleCase({ preserveConsecutiveUppercase })(data);\n * @example\n * pipe(\"hello world\", toTitleCase()); // \"Hello World\"\n * pipe(\"--foo-bar--\", toTitleCase()); // \"Foo Bar\"\n * pipe(\"fooBar\", toTitleCase()); // \"Foo Bar\"\n * pipe(\"__FOO_BAR__\", toTitleCase()); // \"Foo Bar\"\n * pipe(\"XMLHttpRequest\", toTitleCase()); // \"XML Http Request\"\n * pipe(\n * \"XMLHttpRequest\",\n * toTitleCase({ preserveConsecutiveUppercase: false }),\n * ); // \"Xml Http Request\"\n * @dataLast\n * @category String\n */\nexport function toTitleCase(\n options?: Options,\n): (data: S) => TitleCase;\n\nexport function toTitleCase(\n dataOrOptions?: TitleCaseOptions | string,\n options?: TitleCaseOptions,\n): unknown {\n return typeof dataOrOptions === \"string\"\n ? toTitleCaseImplementation(dataOrOptions, options)\n : (data: string) => toTitleCaseImplementation(data, dataOrOptions);\n}\n\n// Similar to the implementation used in toCamelCase\nconst toTitleCaseImplementation = (\n data: string,\n {\n preserveConsecutiveUppercase = DEFAULT_PRESERVE_CONSECUTIVE_UPPERCASE,\n }: TitleCaseOptions = {},\n): string =>\n words(\n LOWER_CASE_CHARACTER_RE.test(data)\n ? data\n : // If the text doesn't have **any** lowercase characters, we lowercase\n // everything; otherwise we maintain existing case as it affects word\n // boundaries.\n data.toLowerCase(),\n )\n .map(\n (word) =>\n `${word[0]!.toUpperCase()}${\n preserveConsecutiveUppercase\n ? word.slice(1)\n : word.slice(1).toLowerCase()\n }`,\n )\n .join(\" \");\n", "import { purry } from \"./purry\";\n\n/**\n * Replaces all lowercase characters with their uppercase equivalents.\n *\n * This function is a wrapper around the built-in\n * [`String.prototype.toUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase)\n * method and shares its _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase#description)_.\n *\n * For a more linguistically accurate transformation use [`toLocaleUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase),\n * and for display purposes use CSS [`text-transform: uppercase;`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-transform)\n * which *is* locale-aware.\n *\n * For other case manipulations see: `toLowerCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, `toSnakeCase`, and\n * `toTitleCase`.\n *\n * @param data - A string.\n * @signature\n * toUpperCase(data);\n * @example\n * toUpperCase(\"Hello World\"); // \"HELLO WORLD\"\n * @dataFirst\n * @category String\n */\nexport function toUpperCase(data: T): Uppercase;\n\n/**\n * Replaces all lowercase characters with their uppercase equivalents.\n *\n * This function is a wrapper around the built-in\n * [`String.prototype.toUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase)\n * method and shares its _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase#description)_.\n *\n * For a more linguistically accurate transformation use [`toLocaleUpperCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase),\n * and for display purposes use CSS [`text-transform: uppercase;`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-transform)\n * which *is* locale-aware.\n *\n * For other case manipulations see: `toLowerCase`, `capitalize`,\n * `uncapitalize`, `toCamelCase`, `toKebabCase`, `toSnakeCase`, and\n * `toTitleCase`.\n *\n * @signature\n * toUpperCase()(data);\n * @example\n * pipe(\"Hello World\", toUpperCase()); // \"HELLO WORLD\"\n * @dataLast\n * @category String\n */\nexport function toUpperCase(): (data: T) => Uppercase;\n\nexport function toUpperCase(...args: readonly unknown[]): unknown {\n return purry(toUpperCaseImplementation, args);\n}\n\nconst toUpperCaseImplementation = (data: T): Uppercase =>\n // @ts-expect-error [ts2322] -- TypeScript can't infer this from the code...\n data.toUpperCase();\n", "import type {\n And,\n IsEqual,\n IsNever,\n IsStringLiteral,\n NonNegativeInteger,\n} from \"type-fest\";\nimport type { ClampedIntegerSubtract } from \"./internal/types/ClampedIntegerSubtract\";\nimport type { StringLength } from \"./internal/types/StringLength\";\n\ntype TruncateOptions = {\n readonly omission?: string;\n readonly separator?: string | RegExp;\n};\n\nconst DEFAULT_OMISSION = \"...\";\n\ntype Truncate<\n S extends string,\n N extends number,\n Options extends TruncateOptions,\n> =\n IsNever> extends true\n ? // There's nothing we can say about the output without a literal, valid,\n // truncation length `N`.\n string\n : IsStringLiteral extends true\n ? TruncateWithOptions<\n S,\n N,\n // TODO: I don't like how I handled the default options object; I want to have everything coupled between the runtime and the type system, but this feels both brittle to changes, and over-verbose.\n Options extends Pick, \"omission\">\n ? Options[\"omission\"]\n : typeof DEFAULT_OMISSION,\n Options extends Pick, \"separator\">\n ? Options[\"separator\"]\n : undefined\n >\n : // There's nothing we can say about the output without a literal input\n // string `S`, the result would always be, at best, just a `string`.\n string;\n\ntype TruncateWithOptions<\n S extends string,\n N extends number,\n Omission extends string,\n Separator extends string | RegExp | undefined,\n> =\n // Distribute the result over unions.\n N extends unknown\n ? // We can short-circuit most of our logic when N is a literal 0.\n IsEqual extends true\n ? \"\"\n : // Distribute the result over unions.\n Omission extends unknown\n ? // When Omission isn't literal we don't know how long it is.\n IsStringLiteral extends true\n ? // This mirrors the runtime logic where if `n - omission.length`\n // is not positive then what we end up truncating is Omission\n // itself and not S.\n IsEqual<\n ClampedIntegerSubtract>,\n 0\n > extends true\n ? TruncateLiterals\n : And<\n // When S isn't literal the output wouldn't be literal\n // either.\n IsStringLiteral,\n // TODO: Handling non-trivial separators would add a ton of complexity to this type! It's possible (but hard!) to support string literals so I'm leaving this as a TODO; regular expressions are impossible because we can't get the type checker to run them.\n IsEqual\n > extends true\n ? TruncateLiterals\n : string\n : string\n : never\n : never;\n\n/**\n * This is the actual implementation of the truncation logic. It assumes all\n * its params are literals and valid.\n */\ntype TruncateLiterals<\n S extends string,\n N extends number,\n Omission extends string,\n Iteration extends readonly unknown[] = [],\n> = S extends `${infer Character}${infer Rest}`\n ? // The cutoff point N - omission.length leaves room for the omission.\n Iteration[\"length\"] extends ClampedIntegerSubtract<\n N,\n StringLength\n >\n ? // The string is only truncated if its total length is longer than N; at\n // the cutoff point this is simplified to comparing the remaining suffix\n // length to the omission length.\n IsLongerThan extends true\n ? Omission\n : S\n : // Reconstruct string character by character until cutoff.\n `${Character}${TruncateLiterals}`\n : // Empty input string results in empty output.\n \"\";\n\n/**\n * An optimized check that efficiently checks if the string A is longer than B.\n */\ntype IsLongerThan<\n A extends string,\n B extends string,\n> = A extends `${string}${infer RestA}`\n ? B extends `${string}${infer RestB}`\n ? IsLongerThan\n : // B is empty and A isn't!\n true\n : // A is empty, even if B is empty, A wouldn't be (strictly) longer.\n false;\n\n/**\n * Truncates strings to a maximum length, adding an ellipsis when truncated.\n *\n * Shorter strings are returned unchanged. If the omission marker is longer than\n * the maximum length, it will be truncated as well.\n *\n * The `separator` argument provides more control by optimistically searching\n * for a matching cutoff point, which could be used to avoid truncating in the\n * middle of a word or other semantic boundary.\n *\n * If you just need to limit the total length of the string, without adding an\n * `omission` or optimizing the cutoff point via `separator`, prefer\n * `sliceString` instead, which runs more efficiently.\n *\n * The function counts Unicode characters, not visual graphemes, and may split\n * emojis, denormalized diacritics, or combining characters, in the middle. For\n * display purposes, prefer CSS [`text-overflow: ellipsis`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow#ellipsis)\n * which is locale-aware and purpose-built for this task.\n *\n * @param data - The input string.\n * @param n - The maximum length of the output string. The output will **never**\n * exceed this length.\n * @param options - An optional options object.\n * @param options.omission - The string that is appended to the end of the\n * output *whenever the input string is truncated*. Default: '...'.\n * @param options.separator - A string or regular expression that defines a\n * cutoff point for the truncation. If multiple cutoff points are found, the one\n * closest to `n` will be used, and if no cutoff point is found then the\n * function will fallback to the trivial cutoff point. Regular expressions are\n * also supported. Default: (which is equivalent to `\"\"` or the regular\n * expression `/./`).\n * @signature\n * truncate(data, n, { omission, separator });\n * @example\n * truncate(\"Hello, world!\", 8); //=> \"Hello...\"\n * truncate(\n * \"cat, dog, mouse\",\n * 12,\n * { omission: \"__\", separator: \",\"},\n * ); //=> \"cat, dog__\"\n * @dataFirst\n * @category String\n */\nexport function truncate<\n S extends string,\n N extends number,\n const Options extends TruncateOptions,\n>(data: S, n: N, options?: Options): Truncate;\n\n/**\n * Truncates strings to a maximum length, adding an ellipsis when truncated.\n *\n * Shorter strings are returned unchanged. If the omission marker is longer than\n * the maximum length, it will be truncated as well.\n *\n * The `separator` argument provides more control by optimistically searching\n * for a matching cutoff point, which could be used to avoid truncating in the\n * middle of a word or other semantic boundary.\n *\n * If you just need to limit the total length of the string, without adding an\n * `omission` or optimizing the cutoff point via `separator`, prefer\n * `sliceString` instead, which runs more efficiently.\n *\n * The function counts Unicode characters, not visual graphemes, and may split\n * emojis, denormalized diacritics, or combining characters, in the middle. For\n * display purposes, prefer CSS [`text-overflow: ellipsis`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow#ellipsis)\n * which is locale-aware and purpose-built for this task.\n *\n * @param n - The maximum length of the output string. The output will **never**\n * exceed this length.\n * @param options - An optional options object.\n * @param options.omission - The string that is appended to the end of the\n * output *whenever the input string is truncated*. Default: '...'.\n * @param options.separator - A string or regular expression that defines a\n * cutoff point for the truncation. If multiple cutoff points are found, the one\n * closest to `n` will be used, and if no cutoff point is found then the\n * function will fallback to the trivial cutoff point. Regular expressions are\n * also supported. Default: (which is equivalent to `\"\"` or the regular\n * expression `/./`).\n * @signature\n * truncate(n, { omission, separator })(data);\n * @example\n * pipe(\"Hello, world!\" as const, truncate(8)); //=> \"Hello...\"\n * pipe(\n * \"cat, dog, mouse\" as const,\n * truncate(12, { omission: \"__\", separator: \",\"}),\n * ); //=> \"cat, dog__\"\n * @dataLast\n * @category String\n */\nexport function truncate<\n N extends number,\n const Options extends TruncateOptions,\n>(\n n: N,\n options?: Options,\n): (data: S) => Truncate;\n\nexport function truncate(\n dataOrN: string | number,\n nOrOptions?: number | TruncateOptions,\n options?: TruncateOptions,\n): unknown {\n return typeof dataOrN === \"string\"\n ? truncateImplementation(\n dataOrN,\n // @ts-expect-error [ts2345] -- We want to reduce runtime checks to a\n // minimum, and there's no (easy) way to couple params so that when we\n // check one, the others are inferred accordingly.\n nOrOptions,\n options,\n )\n : (data: string) =>\n truncateImplementation(\n data,\n dataOrN,\n // @ts-expect-error [ts2345] -- We want to reduce runtime checks to a\n // minimum, and there's no (easy) way to couple params so that when we\n // check one, the others are inferred accordingly.\n nOrOptions,\n );\n}\n\nfunction truncateImplementation(\n data: string,\n n: number,\n { omission = DEFAULT_OMISSION, separator }: TruncateOptions = {},\n): string {\n if (data.length <= n) {\n // No truncation needed.\n return data;\n }\n\n if (n <= 0) {\n // Avoid weirdness when n isn't positive.\n return \"\";\n }\n\n if (n < omission.length) {\n // TODO [>3]: This was an oversight, there's no value in returning just parts of the omission string itself, with no actual content. Instead, we should truncate the input without adding the omission at all in cases where the omission would completely eclipse the content.\n // Handle cases where the omission itself is too long.\n return omission.slice(0, n);\n }\n\n // Our trivial cutoff is the point where we can add the omission and reach\n // n exactly, this is what we'll use when no separator is provided.\n let cutoff = n - omission.length;\n\n if (typeof separator === \"string\") {\n const lastSeparator = data.lastIndexOf(separator, cutoff);\n if (lastSeparator !== -1) {\n // If we find the separator within the part of the string that would be\n // returned we move the cutoff further so that we also remove it.\n cutoff = lastSeparator;\n }\n } else if (separator !== undefined) {\n const globalSeparator = separator.flags.includes(\"g\")\n ? separator\n : new RegExp(separator.source, `${separator.flags}g`);\n\n let lastSeparator;\n for (const { index } of data.matchAll(globalSeparator)) {\n if (index > cutoff) {\n // We only care about separators within the part of the string that\n // would be returned anyway, once we are past that point we don't care\n // about any further separators.\n break;\n }\n lastSeparator = index;\n }\n if (lastSeparator !== undefined) {\n cutoff = lastSeparator;\n }\n }\n\n // Build the output.\n return `${data.slice(0, cutoff)}${omission}`;\n}\n", "import { purry } from \"./purry\";\n\n/**\n * Makes the first character of a string lowercase while leaving the rest\n * unchanged.\n *\n * It uses the built-in [`String.prototype.toLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase)\n * for the runtime and the built-in [`Uncapitalize`](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html#Uncapitalizestringtype)\n * utility type for typing and thus shares their _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_.\n *\n * For display purposes, prefer using the CSS pseudo-element [`::first-letter`](https://developer.mozilla.org/en-US/docs/Web/CSS/::first-letter) to target\n * just the first letter of the word, and [`text-transform: lowercase`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-transform#lowercase)\n * to lowercase it. This transformation **is** locale-aware.\n *\n * For other case manipulations see: `toUpperCase`, `toLowerCase`, `capitalize`,\n * `toCamelCase`, `toKebabCase`, `toSnakeCase`, and `toTitleCase`.\n *\n * @param data - A string.\n * @signature\n * uncapitalize(data);\n * @example\n * uncapitalize(\"HELLO WORLD\"); // \"hELLO WORLD\"\n * @dataFirst\n * @category String\n */\nexport function uncapitalize(data: T): Uncapitalize;\n\n/**\n * Makes the first character of a string lowercase while leaving the rest\n * unchanged.\n *\n * It uses the built-in [`String.prototype.toLowerCase`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase)\n * for the runtime and the built-in [`Uncapitalize`](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html#Uncapitalizestringtype)\n * utility type for typing and thus shares their _[locale inaccuracies](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase#description)_.\n *\n * For display purposes, prefer using the CSS pseudo-element [`::first-letter`](https://developer.mozilla.org/en-US/docs/Web/CSS/::first-letter) to target\n * just the first letter of the word, and [`text-transform: lowercase`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-transform#lowercase)\n * to lowercase it. This transformation **is** locale-aware.\n *\n * For other case manipulations see: `toUpperCase`, `toLowerCase`, `capitalize`,\n * `toCamelCase`, `toKebabCase`, `toSnakeCase`, and `toTitleCase`.\n *\n * @signature\n * uncapitalize()(data);\n * @example\n * pipe(\"HELLO WORLD\", uncapitalize()); // \"hELLO WORLD\"\n * @dataLast\n * @category String\n */\nexport function uncapitalize(): (data: T) => Uncapitalize;\n\nexport function uncapitalize(...args: readonly unknown[]): unknown {\n return purry(uncapitalizeImplementation, args);\n}\n\nconst uncapitalizeImplementation = (\n data: T,\n): Uncapitalize =>\n `${data[0]?.toLowerCase() ?? \"\"}${data.slice(1)}` as Uncapitalize;\n", "import { purryFromLazy } from \"./internal/purryFromLazy\";\nimport type { Deduped } from \"./internal/types/Deduped\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { SKIP_ITEM } from \"./internal/utilityEvaluators\";\n\n/**\n * Returns a new array containing only one copy of each element in the original\n * list. Elements are compared by reference using Set.\n *\n * @param data - The array to filter.\n * @signature\n * unique(array)\n * @example\n * unique([1, 2, 2, 5, 1, 6, 7]) // => [1, 2, 5, 6, 7]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function unique(data: T): Deduped;\n\n/**\n * Returns a new array containing only one copy of each element in the original\n * list. Elements are compared by reference using Set.\n *\n * @signature\n * unique()(array)\n * @example\n * pipe(\n * [1, 2, 2, 5, 1, 6, 7], // only 4 iterations\n * unique(),\n * take(3)\n * ) // => [1, 2, 5]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function unique(): (data: T) => Deduped;\n\nexport function unique(...args: readonly unknown[]): unknown {\n return purryFromLazy(lazyImplementation, args);\n}\n\nfunction lazyImplementation(): LazyEvaluator {\n const set = new Set();\n return (value) => {\n if (set.has(value)) {\n return SKIP_ITEM;\n }\n set.add(value);\n return { done: false, hasNext: true, next: value };\n };\n}\n", "import { purryFromLazy } from \"./internal/purryFromLazy\";\nimport type { BrandedReturn } from \"./internal/types/BrandedReturn\";\nimport type { Deduped } from \"./internal/types/Deduped\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { SKIP_ITEM } from \"./internal/utilityEvaluators\";\n\n/**\n * Returns a new array containing only one copy of each element in the original\n * list transformed by a function. Elements are compared by reference using Set.\n *\n * @param data - The array to filter.\n * @param keyFunction - Extracts a value that would be used to compare elements.\n * @signature\n * uniqueBy(data, keyFunction)\n * @example\n * uniqueBy(\n * [{ n: 1 }, { n: 2 }, { n: 2 }, { n: 5 }, { n: 1 }, { n: 6 }, { n: 7 }],\n * (obj) => obj.n,\n * ) // => [{n: 1}, {n: 2}, {n: 5}, {n: 6}, {n: 7}]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function uniqueBy(\n data: T,\n keyFunction: (item: T[number], index: number, data: T) => unknown,\n): Deduped;\n\n/**\n * Returns a new array containing only one copy of each element in the original\n * list transformed by a function. Elements are compared by reference using Set.\n *\n * @param keyFunction - Extracts a value that would be used to compare elements.\n * @signature\n * uniqueBy(keyFunction)(data)\n * @example\n * pipe(\n * [{n: 1}, {n: 2}, {n: 2}, {n: 5}, {n: 1}, {n: 6}, {n: 7}], // only 4 iterations\n * uniqueBy(obj => obj.n),\n * take(3)\n * ) // => [{n: 1}, {n: 2}, {n: 5}]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function uniqueBy(\n keyFunction: (item: T[number], index: number, data: T) => unknown,\n): (data: T) => Deduped;\n\nexport function uniqueBy(...args: readonly unknown[]): unknown {\n return purryFromLazy(lazyImplementation, args);\n}\n\nfunction lazyImplementation(\n keyFunction: (item: T, index: number, data: readonly T[]) => unknown,\n): LazyEvaluator {\n // @see https://github.com/typescript-eslint/typescript-eslint/issues/9885\n const brandedKeyFunction = keyFunction as BrandedReturn;\n\n const set = new Set>();\n return (value, index, data) => {\n const key = brandedKeyFunction(value, index, data);\n if (set.has(key)) {\n return SKIP_ITEM;\n }\n\n set.add(key);\n return { done: false, hasNext: true, next: value };\n };\n}\n", "import { purryFromLazy } from \"./internal/purryFromLazy\";\nimport type { Deduped } from \"./internal/types/Deduped\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { SKIP_ITEM } from \"./internal/utilityEvaluators\";\n\ntype IsEquals = (a: T, b: T) => boolean;\n\n/**\n * Returns a new array containing only one copy of each element in the original\n * list. Elements are compared by custom comparator isEquals.\n *\n * @param data - The array to filter.\n * @param isEquals - The comparator.\n * @signature\n * uniqueWith(array, isEquals)\n * @example\n * uniqueWith(\n * [{a: 1}, {a: 2}, {a: 2}, {a: 5}, {a: 1}, {a: 6}, {a: 7}],\n * equals,\n * ) // => [{a: 1}, {a: 2}, {a: 5}, {a: 6}, {a: 7}]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function uniqueWith(\n data: T,\n isEquals: IsEquals,\n): Deduped;\n\n/**\n * Returns a new array containing only one copy of each element in the original\n * list. Elements are compared by custom comparator isEquals.\n *\n * @param isEquals - The comparator.\n * @signature uniqueWith(isEquals)(array)\n * @example\n * uniqueWith(equals)(\n * [{a: 1}, {a: 2}, {a: 2}, {a: 5}, {a: 1}, {a: 6}, {a: 7}],\n * ) // => [{a: 1}, {a: 2}, {a: 5}, {a: 6}, {a: 7}]\n * pipe(\n * [{a: 1}, {a: 2}, {a: 2}, {a: 5}, {a: 1}, {a: 6}, {a: 7}], // only 4 iterations\n * uniqueWith(equals),\n * take(3)\n * ) // => [{a: 1}, {a: 2}, {a: 5}]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function uniqueWith(\n isEquals: IsEquals,\n): (data: T) => Deduped;\n\nexport function uniqueWith(...args: readonly unknown[]): unknown {\n return purryFromLazy(lazyImplementation, args);\n}\n\nconst lazyImplementation =\n (isEquals: IsEquals): LazyEvaluator =>\n (value, index, data) => {\n const firstEqualIndex = data.findIndex(\n (otherValue, otherIndex) =>\n index === otherIndex || isEquals(value, otherValue),\n );\n\n // skip items that aren't at the first equal index.\n return firstEqualIndex === index\n ? { done: false, hasNext: true, next: value }\n : SKIP_ITEM;\n };\n", "import type { EnumerableStringKeyedValueOf } from \"./internal/types/EnumerableStringKeyedValueOf\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport { purry } from \"./purry\";\n\ntype Values = T extends IterableContainer\n ? T[number][]\n : EnumerableStringKeyedValueOf[];\n\n/**\n * Returns a new array containing the values of the array or object.\n *\n * @param data - Either an array or an object.\n * @signature\n * values(source)\n * @example\n * values(['x', 'y', 'z']) // => ['x', 'y', 'z']\n * values({ a: 'x', b: 'y', c: 'z' }) // => ['x', 'y', 'z']\n * @dataFirst\n * @category Object\n */\nexport function values(data: T): Values;\n\n/**\n * Returns a new array containing the values of the array or object.\n *\n * @signature\n * values()(source)\n * @example\n * pipe(['x', 'y', 'z'], values()) // => ['x', 'y', 'z']\n * pipe({ a: 'x', b: 'y', c: 'z' }, values()) // => ['x', 'y', 'z']\n * pipe(\n * { a: 'x', b: 'y', c: 'z' },\n * values(),\n * first(),\n * ) // => 'x'\n * @dataLast\n * @category Object\n */\nexport function values(): (data: T) => Values;\n\nexport function values(...args: readonly unknown[]): unknown {\n return purry(Object.values, args);\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * function inference is stricter and doesn't work well when the arguments\n * aren't typed as `any` in the generic type declaration.\n */\n\nimport type { GuardType } from \"./internal/types/GuardType\";\n\n/**\n * Conditionally run a function based on a predicate, returning its result (similar to\n * the [`?:` (ternary) operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_operator).)\n * If the optional `onFalse` function is not provided, the data will be passed\n * through in those cases.\n *\n * Supports type predicates to refine the types for both branches and the return\n * value.\n *\n * Additional arguments are passed to all functions. In data-first calls, they\n * are taken as variadic arguments; but in data-last calls, they are when the\n * curried function itself is called.\n *\n * For more complex cases check out `conditional`.\n *\n * @param predicate - Decides if the `onTrue` mapper should run or not. If it's\n * a type predicate it also narrows types for the mappers and the return value.\n * @param onTrue - Function to run when the predicate returns `true`.\n * @signature\n * when(predicate, onTrue)(data, ...extraArgs)\n * when(predicate, { onTrue, onFalse })(data, ...extraArgs)\n * @example\n * pipe(data, when(isNullish, constant(42)));\n * pipe(data, when((x) => x > 3, { onTrue: add(1), onFalse: multiply(2) }));\n * map(data, when(isNullish, (x, index) => x + index));\n * @dataLast\n * @category Function\n */\nexport function when<\n T,\n ExtraArgs extends any[],\n Predicate extends (data: T, ...extraArgs: ExtraArgs) => boolean,\n OnTrue extends (\n data: GuardType,\n ...extraArgs: ExtraArgs\n ) => unknown,\n>(\n predicate: Predicate,\n onTrue: OnTrue,\n): (\n data: T,\n ...extraArgs: ExtraArgs\n) => Exclude> | ReturnType;\nexport function when<\n T,\n ExtraArgs extends any[],\n Predicate extends (data: T, ...extraArgs: ExtraArgs) => boolean,\n OnTrue extends (\n data: GuardType,\n ...extraArgs: ExtraArgs\n ) => unknown,\n OnFalse extends (\n data: Exclude>,\n ...extraArgs: ExtraArgs\n ) => unknown,\n>(\n predicate: Predicate,\n branches: {\n readonly onTrue: OnTrue;\n readonly onFalse: OnFalse;\n },\n): (\n data: T,\n ...extraArgs: ExtraArgs\n) => ReturnType | ReturnType;\n\n/**\n * Conditionally run a function based on a predicate, returning its result (similar to\n * the [`?:` (ternary) operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_operator).)\n * If the optional `onFalse` function is not provided, the data will be passed\n * through in those cases.\n *\n * Supports type predicates to refine the types for both branches and the return\n * value.\n *\n * Additional arguments are passed to all functions. In data-first calls, they\n * are taken as variadic arguments; but in data-last calls, they are when the\n * curried function itself is called.\n *\n * For more complex cases check out `conditional`.\n *\n * @param data - The data to be passed to all functions, as the first param.\n * @param predicate - Decides if the `onTrue` mapper should run or not. If it's\n * a type predicate it also narrows types for the mappers and the return value.\n * @param onTrue - The function that would run when the predicate returns\n * `true`.\n * @param extraArgs - Additional arguments. These would be passed as is to the\n * `predicate`, `onTrue`, and `onFalse` functions.\n * @signature\n * when(data, predicate, onTrue, ...extraArgs)\n * when(data, predicate, { onTrue, onFalse }, ...extraArgs)\n * @example\n * when(data, isNullish, constant(42));\n * when(data, (x) => x > 3, { onTrue: add(1), onFalse: multiply(2) });\n * when(data, isString, (x, radix) => parseInt(x, radix), 10);\n * @dataFirst\n * @category Function\n */\nexport function when<\n T,\n ExtraArgs extends any[],\n Predicate extends (data: T, ...extraArgs: ExtraArgs) => boolean,\n OnTrue extends (\n data: GuardType,\n ...extraArgs: ExtraArgs\n ) => unknown,\n>(\n data: T,\n predicate: Predicate,\n onTrue: OnTrue,\n ...extraArgs: ExtraArgs\n): Exclude> | ReturnType;\nexport function when<\n T,\n ExtraArgs extends any[],\n Predicate extends (data: T, ...extraArgs: ExtraArgs) => boolean,\n OnTrue extends (\n data: GuardType,\n ...extraArgs: ExtraArgs\n ) => unknown,\n OnFalse extends (\n data: Exclude>,\n ...extraArgs: ExtraArgs\n ) => unknown,\n>(\n data: T,\n predicate: Predicate,\n branches: {\n readonly onTrue: OnTrue;\n readonly onFalse: OnFalse;\n },\n ...extraArgs: ExtraArgs\n): ReturnType | ReturnType;\n\nexport function when(...args: readonly unknown[]): unknown {\n return args.length === 2\n ? (data: unknown, ...extraArgs: readonly unknown[]) =>\n // @ts-expect-error [ts2556] -- This is OK, we trust our typing of the overloaded functions\n whenImplementation(data, ...args, ...extraArgs)\n : // @ts-expect-error [ts2556] -- This is OK, we trust our typing of the overloaded functions\n whenImplementation(...args);\n}\n\nconst whenImplementation = (\n data: T,\n predicate: (data: T, ...extraArgs: ExtraArgs) => boolean,\n onTrueOrBranches:\n | ((data: T, ...extraArgs: ExtraArgs) => WhenTrue)\n | {\n readonly onTrue: (data: T, ...extraArgs: ExtraArgs) => WhenTrue;\n readonly onFalse: (data: T, ...extraArgs: ExtraArgs) => WhenFalse;\n },\n ...extraArgs: ExtraArgs\n): T | WhenFalse | WhenTrue =>\n predicate(data, ...extraArgs)\n ? typeof onTrueOrBranches === \"function\"\n ? onTrueOrBranches(data, ...extraArgs)\n : onTrueOrBranches.onTrue(data, ...extraArgs)\n : typeof onTrueOrBranches === \"function\"\n ? data\n : onTrueOrBranches.onFalse(data, ...extraArgs);\n", "import type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\nimport { purry } from \"./purry\";\n\ntype Zipped =\n // If the array is empty the output is empty, no surprises\n Left extends readonly []\n ? []\n : Right extends readonly []\n ? []\n : // Are the two inputs both tuples with a non-rest first item?\n Left extends readonly [infer LeftHead, ...infer LeftRest]\n ? Right extends readonly [infer RightHead, ...infer RightRest]\n ? // ...Then take that first item from both and recurse\n [[LeftHead, RightHead], ...Zipped]\n : // Is only one of the inputs a tuple (with a non-rest first item)?\n // Then take that item, and match it with whatever the type of the other *array's* items are.\n [[LeftHead, Right[number]], ...Zipped]\n : Right extends readonly [infer RightHead, ...infer RightRest]\n ? [[Left[number], RightHead], ...Zipped]\n : // Both inputs are not tuples (with a non-rest first item, they might be tuples with non-rest last item(s))\n // So the output is just the \"trivial\" zip result.\n [Left[number], Right[number]][];\n\n/**\n * Creates a new list from two supplied lists by pairing up equally-positioned\n * items. The length of the returned list will match the shortest of the two\n * inputs.\n *\n * @param first - The first input list.\n * @param second - The second input list.\n * @signature\n * zip(first, second)\n * @example\n * zip([1, 2], ['a', 'b']) // => [[1, 'a'], [2, 'b']]\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function zip(\n first: F,\n second: S,\n): Zipped;\n\n/**\n * Creates a new list from two supplied lists by pairing up equally-positioned\n * items. The length of the returned list will match the shortest of the two\n * inputs.\n *\n * @param second - The second input list.\n * @signature\n * zip(second)(first)\n * @example\n * zip(['a', 'b'])([1, 2]) // => [[1, 'a'], [2, 'b']]\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function zip(\n second: S,\n): (first: F) => Zipped;\n\nexport function zip(...args: readonly unknown[]): unknown {\n return purry(zipImplementation, args, lazyImplementation);\n}\n\nconst zipImplementation = <\n F extends IterableContainer,\n S extends IterableContainer,\n>(\n first: F,\n second: S,\n): Zipped =>\n (first.length < second.length\n ? first.map((item, index) => [item, second[index]])\n : second.map((item, index) => [first[index], item])) as Zipped;\n\nconst lazyImplementation =\n (\n second: S,\n ): LazyEvaluator =>\n (value, index) => ({\n hasNext: true,\n next: [value, second[index]],\n done: index >= second.length - 1,\n });\n", "import { lazyDataLastImpl } from \"./internal/lazyDataLastImpl\";\nimport type { IterableContainer } from \"./internal/types/IterableContainer\";\nimport type { LazyEvaluator } from \"./internal/types/LazyEvaluator\";\n\ntype ZippingFunction<\n T1 extends IterableContainer = IterableContainer,\n T2 extends IterableContainer = IterableContainer,\n Value = unknown,\n> = (\n first: T1[number],\n second: T2[number],\n index: number,\n data: readonly [first: T1, second: T2],\n) => Value;\n\n/**\n * Creates a new list from two supplied lists by calling the supplied function\n * with the same-positioned element from each list.\n *\n * @param fn - The function applied to each position of the list.\n * @signature\n * zipWith(fn)(first, second)\n * @example\n * zipWith((a: string, b: string) => a + b)(['1', '2', '3'], ['a', 'b', 'c']) // => ['1a', '2b', '3c']\n * @category Array\n */\nexport function zipWith(\n fn: ZippingFunction,\n): (first: readonly TItem1[], second: readonly TItem2[]) => Value[];\n\n/**\n * Creates a new list from two supplied lists by calling the supplied function\n * with the same-positioned element from each list.\n *\n * @param second - The second input list.\n * @param fn - The function applied to each position of the list.\n * @signature\n * zipWith(second, fn)(first)\n * @example\n * pipe(['1', '2', '3'], zipWith(['a', 'b', 'c'], (a, b) => a + b)) // => ['1a', '2b', '3c']\n * @dataLast\n * @lazy\n * @category Array\n */\nexport function zipWith<\n T1 extends IterableContainer,\n T2 extends IterableContainer,\n Value,\n>(second: T2, fn: ZippingFunction): (first: T1) => Value[];\n\n/**\n * Creates a new list from two supplied lists by calling the supplied function\n * with the same-positioned element from each list.\n *\n * @param first - The first input list.\n * @param second - The second input list.\n * @param fn - The function applied to each position of the list.\n * @signature\n * zipWith(first, second, fn)\n * @example\n * zipWith(['1', '2', '3'], ['a', 'b', 'c'], (a, b) => a + b) // => ['1a', '2b', '3c']\n * @dataFirst\n * @lazy\n * @category Array\n */\nexport function zipWith<\n T1 extends IterableContainer,\n T2 extends IterableContainer,\n Value,\n>(first: T1, second: T2, fn: ZippingFunction): Value[];\n\nexport function zipWith(\n arg0: IterableContainer | ZippingFunction,\n arg1?: IterableContainer | ZippingFunction,\n arg2?: ZippingFunction,\n): unknown {\n if (typeof arg0 === \"function\") {\n // Both datum's last\n return (data1: IterableContainer, data2: IterableContainer) =>\n zipWithImplementation(data1, data2, arg0);\n }\n\n if (typeof arg1 === \"function\") {\n // dataLast\n return lazyDataLastImpl(\n zipWithImplementation,\n [arg0, arg1],\n lazyImplementation,\n );\n }\n\n // dataFirst. Notice that we assert that the arguments are defined to reduce\n // the number of runtime checks that would otherwise be needed to make\n // TypeScript happy here. Because this is an internal implementation and we\n // are protected by the function typing itself this is fine!\n return zipWithImplementation(arg0, arg1!, arg2!);\n}\n\nfunction zipWithImplementation<\n T1 extends IterableContainer,\n T2 extends IterableContainer,\n Value,\n>(first: T1, second: T2, fn: ZippingFunction): Value[] {\n const datum = [first, second] as const;\n return first.length < second.length\n ? first.map((item, index) => fn(item, second[index], index, datum))\n : second.map((item, index) => fn(first[index], item, index, datum));\n}\n\nconst lazyImplementation =\n (\n second: T2,\n fn: ZippingFunction,\n ): LazyEvaluator =>\n (value, index, data) => ({\n next: fn(value, second[index], index, [data, second]),\n hasNext: true,\n done: index >= second.length - 1,\n });\n", "import * as z from \"./v4/classic/external.js\";\nexport * from \"./v4/classic/external.js\";\nexport { z };\nexport default z;\n", "export * as core from \"../core/index.js\";\nexport * from \"./schemas.js\";\nexport * from \"./checks.js\";\nexport * from \"./errors.js\";\nexport * from \"./parse.js\";\nexport * from \"./compat.js\";\n// zod-specified\nimport { config } from \"../core/index.js\";\nimport en from \"../locales/en.js\";\nconfig(en());\nexport { globalRegistry, registry, config, $output, $input, $brand, clone, regexes, treeifyError, prettifyError, formatError, flattenError, TimePrecision, util, NEVER, } from \"../core/index.js\";\nexport { toJSONSchema } from \"../core/json-schema-processors.js\";\nexport { fromJSONSchema } from \"./from-json-schema.js\";\nexport * as locales from \"../locales/index.js\";\n// iso\n// must be exported from top-level\n// https://github.com/colinhacks/zod/issues/4491\nexport { ZodISODateTime, ZodISODate, ZodISOTime, ZodISODuration } from \"./iso.js\";\nexport * as iso from \"./iso.js\";\nexport * as coerce from \"./coerce.js\";\n", "export * from \"./core.js\";\nexport * from \"./parse.js\";\nexport * from \"./errors.js\";\nexport * from \"./schemas.js\";\nexport * from \"./checks.js\";\nexport * from \"./versions.js\";\nexport * as util from \"./util.js\";\nexport * as regexes from \"./regexes.js\";\nexport * as locales from \"../locales/index.js\";\nexport * from \"./registries.js\";\nexport * from \"./doc.js\";\nexport * from \"./api.js\";\nexport * from \"./to-json-schema.js\";\nexport { toJSONSchema } from \"./json-schema-processors.js\";\nexport { JSONSchemaGenerator } from \"./json-schema-generator.js\";\nexport * as JSONSchema from \"./json-schema.js\";\n", "/** A special constant with type `never` */\nexport const NEVER = Object.freeze({\n status: \"aborted\",\n});\nexport /*@__NO_SIDE_EFFECTS__*/ function $constructor(name, initializer, params) {\n function init(inst, def) {\n if (!inst._zod) {\n Object.defineProperty(inst, \"_zod\", {\n value: {\n def,\n constr: _,\n traits: new Set(),\n },\n enumerable: false,\n });\n }\n if (inst._zod.traits.has(name)) {\n return;\n }\n inst._zod.traits.add(name);\n initializer(inst, def);\n // support prototype modifications\n const proto = _.prototype;\n const keys = Object.keys(proto);\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (!(k in inst)) {\n inst[k] = proto[k].bind(inst);\n }\n }\n }\n // doesn't work if Parent has a constructor with arguments\n const Parent = params?.Parent ?? Object;\n class Definition extends Parent {\n }\n Object.defineProperty(Definition, \"name\", { value: name });\n function _(def) {\n var _a;\n const inst = params?.Parent ? new Definition() : this;\n init(inst, def);\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n for (const fn of inst._zod.deferred) {\n fn();\n }\n return inst;\n }\n Object.defineProperty(_, \"init\", { value: init });\n Object.defineProperty(_, Symbol.hasInstance, {\n value: (inst) => {\n if (params?.Parent && inst instanceof params.Parent)\n return true;\n return inst?._zod?.traits?.has(name);\n },\n });\n Object.defineProperty(_, \"name\", { value: name });\n return _;\n}\n////////////////////////////// UTILITIES ///////////////////////////////////////\nexport const $brand = Symbol(\"zod_brand\");\nexport class $ZodAsyncError extends Error {\n constructor() {\n super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);\n }\n}\nexport class $ZodEncodeError extends Error {\n constructor(name) {\n super(`Encountered unidirectional transform during encode: ${name}`);\n this.name = \"ZodEncodeError\";\n }\n}\nexport const globalConfig = {};\nexport function config(newConfig) {\n if (newConfig)\n Object.assign(globalConfig, newConfig);\n return globalConfig;\n}\n", "// functions\nexport function assertEqual(val) {\n return val;\n}\nexport function assertNotEqual(val) {\n return val;\n}\nexport function assertIs(_arg) { }\nexport function assertNever(_x) {\n throw new Error(\"Unexpected value in exhaustive check\");\n}\nexport function assert(_) { }\nexport function getEnumValues(entries) {\n const numericValues = Object.values(entries).filter((v) => typeof v === \"number\");\n const values = Object.entries(entries)\n .filter(([k, _]) => numericValues.indexOf(+k) === -1)\n .map(([_, v]) => v);\n return values;\n}\nexport function joinValues(array, separator = \"|\") {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\nexport function jsonStringifyReplacer(_, value) {\n if (typeof value === \"bigint\")\n return value.toString();\n return value;\n}\nexport function cached(getter) {\n const set = false;\n return {\n get value() {\n if (!set) {\n const value = getter();\n Object.defineProperty(this, \"value\", { value });\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n };\n}\nexport function nullish(input) {\n return input === null || input === undefined;\n}\nexport function cleanRegex(source) {\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n return source.slice(start, end);\n}\nexport function floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepString = step.toString();\n let stepDecCount = (stepString.split(\".\")[1] || \"\").length;\n if (stepDecCount === 0 && /\\d?e-\\d?/.test(stepString)) {\n const match = stepString.match(/\\d?e-(\\d?)/);\n if (match?.[1]) {\n stepDecCount = Number.parseInt(match[1]);\n }\n }\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nconst EVALUATING = Symbol(\"evaluating\");\nexport function defineLazy(object, key, getter) {\n let value = undefined;\n Object.defineProperty(object, key, {\n get() {\n if (value === EVALUATING) {\n // Circular reference detected, return undefined to break the cycle\n return undefined;\n }\n if (value === undefined) {\n value = EVALUATING;\n value = getter();\n }\n return value;\n },\n set(v) {\n Object.defineProperty(object, key, {\n value: v,\n // configurable: true,\n });\n // object[key] = v;\n },\n configurable: true,\n });\n}\nexport function objectClone(obj) {\n return Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));\n}\nexport function assignProp(target, prop, value) {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n}\nexport function mergeDefs(...defs) {\n const mergedDescriptors = {};\n for (const def of defs) {\n const descriptors = Object.getOwnPropertyDescriptors(def);\n Object.assign(mergedDescriptors, descriptors);\n }\n return Object.defineProperties({}, mergedDescriptors);\n}\nexport function cloneDef(schema) {\n return mergeDefs(schema._zod.def);\n}\nexport function getElementAtPath(obj, path) {\n if (!path)\n return obj;\n return path.reduce((acc, key) => acc?.[key], obj);\n}\nexport function promiseAllObject(promisesObj) {\n const keys = Object.keys(promisesObj);\n const promises = keys.map((key) => promisesObj[key]);\n return Promise.all(promises).then((results) => {\n const resolvedObj = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObj[keys[i]] = results[i];\n }\n return resolvedObj;\n });\n}\nexport function randomString(length = 10) {\n const chars = \"abcdefghijklmnopqrstuvwxyz\";\n let str = \"\";\n for (let i = 0; i < length; i++) {\n str += chars[Math.floor(Math.random() * chars.length)];\n }\n return str;\n}\nexport function esc(str) {\n return JSON.stringify(str);\n}\nexport function slugify(input) {\n return input\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\nexport const captureStackTrace = (\"captureStackTrace\" in Error ? Error.captureStackTrace : (..._args) => { });\nexport function isObject(data) {\n return typeof data === \"object\" && data !== null && !Array.isArray(data);\n}\nexport const allowsEval = cached(() => {\n // @ts-ignore\n if (typeof navigator !== \"undefined\" && navigator?.userAgent?.includes(\"Cloudflare\")) {\n return false;\n }\n try {\n const F = Function;\n new F(\"\");\n return true;\n }\n catch (_) {\n return false;\n }\n});\nexport function isPlainObject(o) {\n if (isObject(o) === false)\n return false;\n // modified constructor\n const ctor = o.constructor;\n if (ctor === undefined)\n return true;\n if (typeof ctor !== \"function\")\n return true;\n // modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false)\n return false;\n // ctor doesn't have static `isPrototypeOf`\n if (Object.prototype.hasOwnProperty.call(prot, \"isPrototypeOf\") === false) {\n return false;\n }\n return true;\n}\nexport function shallowClone(o) {\n if (isPlainObject(o))\n return { ...o };\n if (Array.isArray(o))\n return [...o];\n return o;\n}\nexport function numKeys(data) {\n let keyCount = 0;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n }\n }\n return keyCount;\n}\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return \"undefined\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isNaN(data) ? \"nan\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"function\":\n return \"function\";\n case \"bigint\":\n return \"bigint\";\n case \"symbol\":\n return \"symbol\";\n case \"object\":\n if (Array.isArray(data)) {\n return \"array\";\n }\n if (data === null) {\n return \"null\";\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return \"promise\";\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return \"map\";\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return \"set\";\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return \"date\";\n }\n // @ts-ignore\n if (typeof File !== \"undefined\" && data instanceof File) {\n return \"file\";\n }\n return \"object\";\n default:\n throw new Error(`Unknown data type: ${t}`);\n }\n};\nexport const propertyKeyTypes = new Set([\"string\", \"number\", \"symbol\"]);\nexport const primitiveTypes = new Set([\"string\", \"number\", \"bigint\", \"boolean\", \"symbol\", \"undefined\"]);\nexport function escapeRegex(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n// zod-specific utils\nexport function clone(inst, def, params) {\n const cl = new inst._zod.constr(def ?? inst._zod.def);\n if (!def || params?.parent)\n cl._zod.parent = inst;\n return cl;\n}\nexport function normalizeParams(_params) {\n const params = _params;\n if (!params)\n return {};\n if (typeof params === \"string\")\n return { error: () => params };\n if (params?.message !== undefined) {\n if (params?.error !== undefined)\n throw new Error(\"Cannot specify both `message` and `error` params\");\n params.error = params.message;\n }\n delete params.message;\n if (typeof params.error === \"string\")\n return { ...params, error: () => params.error };\n return params;\n}\nexport function createTransparentProxy(getter) {\n let target;\n return new Proxy({}, {\n get(_, prop, receiver) {\n target ?? (target = getter());\n return Reflect.get(target, prop, receiver);\n },\n set(_, prop, value, receiver) {\n target ?? (target = getter());\n return Reflect.set(target, prop, value, receiver);\n },\n has(_, prop) {\n target ?? (target = getter());\n return Reflect.has(target, prop);\n },\n deleteProperty(_, prop) {\n target ?? (target = getter());\n return Reflect.deleteProperty(target, prop);\n },\n ownKeys(_) {\n target ?? (target = getter());\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(_, prop) {\n target ?? (target = getter());\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n defineProperty(_, prop, descriptor) {\n target ?? (target = getter());\n return Reflect.defineProperty(target, prop, descriptor);\n },\n });\n}\nexport function stringifyPrimitive(value) {\n if (typeof value === \"bigint\")\n return value.toString() + \"n\";\n if (typeof value === \"string\")\n return `\"${value}\"`;\n return `${value}`;\n}\nexport function optionalKeys(shape) {\n return Object.keys(shape).filter((k) => {\n return shape[k]._zod.optin === \"optional\" && shape[k]._zod.optout === \"optional\";\n });\n}\nexport const NUMBER_FORMAT_RANGES = {\n safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n int32: [-2147483648, 2147483647],\n uint32: [0, 4294967295],\n float32: [-3.4028234663852886e38, 3.4028234663852886e38],\n float64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport const BIGINT_FORMAT_RANGES = {\n int64: [/* @__PURE__*/ BigInt(\"-9223372036854775808\"), /* @__PURE__*/ BigInt(\"9223372036854775807\")],\n uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt(\"18446744073709551615\")],\n};\nexport function pick(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".pick() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = {};\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n newShape[key] = currDef.shape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function omit(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".omit() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = { ...schema._zod.def.shape };\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n delete newShape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function extend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to extend: expected a plain object\");\n }\n const checks = schema._zod.def.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n // Only throw if new shape overlaps with existing shape\n // Use getOwnPropertyDescriptor to check key existence without accessing values\n const existingShape = schema._zod.def.shape;\n for (const key in shape) {\n if (Object.getOwnPropertyDescriptor(existingShape, key) !== undefined) {\n throw new Error(\"Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.\");\n }\n }\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function safeExtend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to safeExtend: expected a plain object\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function merge(a, b) {\n const def = mergeDefs(a._zod.def, {\n get shape() {\n const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n get catchall() {\n return b._zod.def.catchall;\n },\n checks: [], // delete existing checks\n });\n return clone(a, def);\n}\nexport function partial(Class, schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".partial() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in oldShape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n else {\n for (const key in oldShape) {\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function required(Class, schema, mask) {\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n else {\n for (const key in oldShape) {\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n });\n return clone(schema, def);\n}\n// invalid_type | too_big | too_small | invalid_format | not_multiple_of | unrecognized_keys | invalid_union | invalid_key | invalid_element | invalid_value | custom\nexport function aborted(x, startIndex = 0) {\n if (x.aborted === true)\n return true;\n for (let i = startIndex; i < x.issues.length; i++) {\n if (x.issues[i]?.continue !== true) {\n return true;\n }\n }\n return false;\n}\nexport function prefixIssues(path, issues) {\n return issues.map((iss) => {\n var _a;\n (_a = iss).path ?? (_a.path = []);\n iss.path.unshift(path);\n return iss;\n });\n}\nexport function unwrapMessage(message) {\n return typeof message === \"string\" ? message : message?.message;\n}\nexport function finalizeIssue(iss, ctx, config) {\n const full = { ...iss, path: iss.path ?? [] };\n // for backwards compatibility\n if (!iss.message) {\n const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ??\n unwrapMessage(ctx?.error?.(iss)) ??\n unwrapMessage(config.customError?.(iss)) ??\n unwrapMessage(config.localeError?.(iss)) ??\n \"Invalid input\";\n full.message = message;\n }\n // delete (full as any).def;\n delete full.inst;\n delete full.continue;\n if (!ctx?.reportInput) {\n delete full.input;\n }\n return full;\n}\nexport function getSizableOrigin(input) {\n if (input instanceof Set)\n return \"set\";\n if (input instanceof Map)\n return \"map\";\n // @ts-ignore\n if (input instanceof File)\n return \"file\";\n return \"unknown\";\n}\nexport function getLengthableOrigin(input) {\n if (Array.isArray(input))\n return \"array\";\n if (typeof input === \"string\")\n return \"string\";\n return \"unknown\";\n}\nexport function parsedType(data) {\n const t = typeof data;\n switch (t) {\n case \"number\": {\n return Number.isNaN(data) ? \"nan\" : \"number\";\n }\n case \"object\": {\n if (data === null) {\n return \"null\";\n }\n if (Array.isArray(data)) {\n return \"array\";\n }\n const obj = data;\n if (obj && Object.getPrototypeOf(obj) !== Object.prototype && \"constructor\" in obj && obj.constructor) {\n return obj.constructor.name;\n }\n }\n }\n return t;\n}\nexport function issue(...args) {\n const [iss, input, inst] = args;\n if (typeof iss === \"string\") {\n return {\n message: iss,\n code: \"custom\",\n input,\n inst,\n };\n }\n return { ...iss };\n}\nexport function cleanEnum(obj) {\n return Object.entries(obj)\n .filter(([k, _]) => {\n // return true if NaN, meaning it's not a number, thus a string key\n return Number.isNaN(Number.parseInt(k, 10));\n })\n .map((el) => el[1]);\n}\n// Codec utility functions\nexport function base64ToUint8Array(base64) {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\nexport function uint8ArrayToBase64(bytes) {\n let binaryString = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binaryString += String.fromCharCode(bytes[i]);\n }\n return btoa(binaryString);\n}\nexport function base64urlToUint8Array(base64url) {\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padding = \"=\".repeat((4 - (base64.length % 4)) % 4);\n return base64ToUint8Array(base64 + padding);\n}\nexport function uint8ArrayToBase64url(bytes) {\n return uint8ArrayToBase64(bytes).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\nexport function hexToUint8Array(hex) {\n const cleanHex = hex.replace(/^0x/, \"\");\n if (cleanHex.length % 2 !== 0) {\n throw new Error(\"Invalid hex string length\");\n }\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < cleanHex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(cleanHex.slice(i, i + 2), 16);\n }\n return bytes;\n}\nexport function uint8ArrayToHex(bytes) {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n// instanceof\nexport class Class {\n constructor(..._args) { }\n}\n", "import { $constructor } from \"./core.js\";\nimport * as util from \"./util.js\";\nconst initializer = (inst, def) => {\n inst.name = \"$ZodError\";\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod,\n enumerable: false,\n });\n Object.defineProperty(inst, \"issues\", {\n value: def,\n enumerable: false,\n });\n inst.message = JSON.stringify(def, util.jsonStringifyReplacer, 2);\n Object.defineProperty(inst, \"toString\", {\n value: () => inst.message,\n enumerable: false,\n });\n};\nexport const $ZodError = $constructor(\"$ZodError\", initializer);\nexport const $ZodRealError = $constructor(\"$ZodError\", initializer, { Parent: Error });\nexport function flattenError(error, mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of error.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n}\nexport function formatError(error, mapper = (issue) => issue.message) {\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n issue.errors.map((issues) => processError({ issues }));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues });\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues });\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(error);\n return fieldErrors;\n}\nexport function treeifyError(error, mapper = (issue) => issue.message) {\n const result = { errors: [] };\n const processError = (error, path = []) => {\n var _a, _b;\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n // regular union error\n issue.errors.map((issues) => processError({ issues }, issue.path));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else {\n const fullpath = [...path, ...issue.path];\n if (fullpath.length === 0) {\n result.errors.push(mapper(issue));\n continue;\n }\n let curr = result;\n let i = 0;\n while (i < fullpath.length) {\n const el = fullpath[i];\n const terminal = i === fullpath.length - 1;\n if (typeof el === \"string\") {\n curr.properties ?? (curr.properties = {});\n (_a = curr.properties)[el] ?? (_a[el] = { errors: [] });\n curr = curr.properties[el];\n }\n else {\n curr.items ?? (curr.items = []);\n (_b = curr.items)[el] ?? (_b[el] = { errors: [] });\n curr = curr.items[el];\n }\n if (terminal) {\n curr.errors.push(mapper(issue));\n }\n i++;\n }\n }\n }\n };\n processError(error);\n return result;\n}\n/** Format a ZodError as a human-readable string in the following form.\n *\n * From\n *\n * ```ts\n * ZodError {\n * issues: [\n * {\n * expected: 'string',\n * code: 'invalid_type',\n * path: [ 'username' ],\n * message: 'Invalid input: expected string'\n * },\n * {\n * expected: 'number',\n * code: 'invalid_type',\n * path: [ 'favoriteNumbers', 1 ],\n * message: 'Invalid input: expected number'\n * }\n * ];\n * }\n * ```\n *\n * to\n *\n * ```\n * username\n * \u2716 Expected number, received string at \"username\n * favoriteNumbers[0]\n * \u2716 Invalid input: expected number\n * ```\n */\nexport function toDotPath(_path) {\n const segs = [];\n const path = _path.map((seg) => (typeof seg === \"object\" ? seg.key : seg));\n for (const seg of path) {\n if (typeof seg === \"number\")\n segs.push(`[${seg}]`);\n else if (typeof seg === \"symbol\")\n segs.push(`[${JSON.stringify(String(seg))}]`);\n else if (/[^\\w$]/.test(seg))\n segs.push(`[${JSON.stringify(seg)}]`);\n else {\n if (segs.length)\n segs.push(\".\");\n segs.push(seg);\n }\n }\n return segs.join(\"\");\n}\nexport function prettifyError(error) {\n const lines = [];\n // sort by path length\n const issues = [...error.issues].sort((a, b) => (a.path ?? []).length - (b.path ?? []).length);\n // Process each issue\n for (const issue of issues) {\n lines.push(`\u2716 ${issue.message}`);\n if (issue.path?.length)\n lines.push(` \u2192 at ${toDotPath(issue.path)}`);\n }\n // Convert Map to formatted string\n return lines.join(\"\\n\");\n}\n", "import * as core from \"./core.js\";\nimport * as errors from \"./errors.js\";\nimport * as util from \"./util.js\";\nexport const _parse = (_Err) => (schema, value, _ctx, _params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n if (result.issues.length) {\n const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, _params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parse = /* @__PURE__*/ _parse(errors.$ZodRealError);\nexport const _parseAsync = (_Err) => async (schema, value, _ctx, params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n if (result.issues.length) {\n const e = new (params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parseAsync = /* @__PURE__*/ _parseAsync(errors.$ZodRealError);\nexport const _safeParse = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n return result.issues.length\n ? {\n success: false,\n error: new (_Err ?? errors.$ZodError)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParse = /* @__PURE__*/ _safeParse(errors.$ZodRealError);\nexport const _safeParseAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n return result.issues.length\n ? {\n success: false,\n error: new _Err(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParseAsync = /* @__PURE__*/ _safeParseAsync(errors.$ZodRealError);\nexport const _encode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _parse(_Err)(schema, value, ctx);\n};\nexport const encode = /* @__PURE__*/ _encode(errors.$ZodRealError);\nexport const _decode = (_Err) => (schema, value, _ctx) => {\n return _parse(_Err)(schema, value, _ctx);\n};\nexport const decode = /* @__PURE__*/ _decode(errors.$ZodRealError);\nexport const _encodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _parseAsync(_Err)(schema, value, ctx);\n};\nexport const encodeAsync = /* @__PURE__*/ _encodeAsync(errors.$ZodRealError);\nexport const _decodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _parseAsync(_Err)(schema, value, _ctx);\n};\nexport const decodeAsync = /* @__PURE__*/ _decodeAsync(errors.$ZodRealError);\nexport const _safeEncode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _safeParse(_Err)(schema, value, ctx);\n};\nexport const safeEncode = /* @__PURE__*/ _safeEncode(errors.$ZodRealError);\nexport const _safeDecode = (_Err) => (schema, value, _ctx) => {\n return _safeParse(_Err)(schema, value, _ctx);\n};\nexport const safeDecode = /* @__PURE__*/ _safeDecode(errors.$ZodRealError);\nexport const _safeEncodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _safeParseAsync(_Err)(schema, value, ctx);\n};\nexport const safeEncodeAsync = /* @__PURE__*/ _safeEncodeAsync(errors.$ZodRealError);\nexport const _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _safeParseAsync(_Err)(schema, value, _ctx);\n};\nexport const safeDecodeAsync = /* @__PURE__*/ _safeDecodeAsync(errors.$ZodRealError);\n", "import * as util from \"./util.js\";\nexport const cuid = /^[cC][^\\s-]{8,}$/;\nexport const cuid2 = /^[0-9a-z]+$/;\nexport const ulid = /^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/;\nexport const xid = /^[0-9a-vA-V]{20}$/;\nexport const ksuid = /^[A-Za-z0-9]{27}$/;\nexport const nanoid = /^[a-zA-Z0-9_-]{21}$/;\n/** ISO 8601-1 duration regex. Does not support the 8601-2 extensions like negative durations or fractional/negative components. */\nexport const duration = /^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$/;\n/** Implements ISO 8601-2 extensions like explicit +- prefixes, mixing weeks with other units, and fractional/negative components. */\nexport const extendedDuration = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n/** A regex for any UUID-like identifier: 8-4-4-4-12 hex pattern */\nexport const guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;\n/** Returns a regex for validating an RFC 9562/4122 UUID.\n *\n * @param version Optionally specify a version 1-8. If no version is specified, all versions are supported. */\nexport const uuid = (version) => {\n if (!version)\n return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/;\n return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`);\n};\nexport const uuid4 = /*@__PURE__*/ uuid(4);\nexport const uuid6 = /*@__PURE__*/ uuid(6);\nexport const uuid7 = /*@__PURE__*/ uuid(7);\n/** Practical email validation */\nexport const email = /^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/;\n/** Equivalent to the HTML5 input[type=email] validation implemented by browsers. Source: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email */\nexport const html5Email = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n/** The classic emailregex.com regex for RFC 5322-compliant emails */\nexport const rfc5322Email = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n/** A loose regex that allows Unicode characters, enforces length limits, and that's about it. */\nexport const unicodeEmail = /^[^\\s@\"]{1,64}@[^\\s@]{1,255}$/u;\nexport const idnEmail = unicodeEmail;\nexport const browserEmail = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emoji = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nexport function emoji() {\n return new RegExp(_emoji, \"u\");\n}\nexport const ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nexport const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;\nexport const mac = (delimiter) => {\n const escapedDelim = util.escapeRegex(delimiter ?? \":\");\n return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`);\n};\nexport const cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$/;\nexport const cidrv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nexport const base64 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;\nexport const base64url = /^[A-Za-z0-9_-]*$/;\n// based on https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address\n// export const hostname: RegExp = /^([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+$/;\nexport const hostname = /^(?=.{1,253}\\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\\.?$/;\nexport const domain = /^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$/;\n// https://blog.stevenlevithan.com/archives/validate-phone-number#r4-3 (regex sans spaces)\n// E.164: leading digit must be 1-9; total digits (excluding '+') between 7-15\nexport const e164 = /^\\+[1-9]\\d{6,14}$/;\n// const dateSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateSource = `(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))`;\nexport const date = /*@__PURE__*/ new RegExp(`^${dateSource}$`);\nfunction timeSource(args) {\n const hhmm = `(?:[01]\\\\d|2[0-3]):[0-5]\\\\d`;\n const regex = typeof args.precision === \"number\"\n ? args.precision === -1\n ? `${hhmm}`\n : args.precision === 0\n ? `${hhmm}:[0-5]\\\\d`\n : `${hhmm}:[0-5]\\\\d\\\\.\\\\d{${args.precision}}`\n : `${hhmm}(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?`;\n return regex;\n}\nexport function time(args) {\n return new RegExp(`^${timeSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetime(args) {\n const time = timeSource({ precision: args.precision });\n const opts = [\"Z\"];\n if (args.local)\n opts.push(\"\");\n // if (args.offset) opts.push(`([+-]\\\\d{2}:\\\\d{2})`);\n if (args.offset)\n opts.push(`([+-](?:[01]\\\\d|2[0-3]):[0-5]\\\\d)`);\n const timeRegex = `${time}(?:${opts.join(\"|\")})`;\n return new RegExp(`^${dateSource}T(?:${timeRegex})$`);\n}\nexport const string = (params) => {\n const regex = params ? `[\\\\s\\\\S]{${params?.minimum ?? 0},${params?.maximum ?? \"\"}}` : `[\\\\s\\\\S]*`;\n return new RegExp(`^${regex}$`);\n};\nexport const bigint = /^-?\\d+n?$/;\nexport const integer = /^-?\\d+$/;\nexport const number = /^-?\\d+(?:\\.\\d+)?$/;\nexport const boolean = /^(?:true|false)$/i;\nconst _null = /^null$/i;\nexport { _null as null };\nconst _undefined = /^undefined$/i;\nexport { _undefined as undefined };\n// regex for string with no uppercase letters\nexport const lowercase = /^[^A-Z]*$/;\n// regex for string with no lowercase letters\nexport const uppercase = /^[^a-z]*$/;\n// regex for hexadecimal strings (any length)\nexport const hex = /^[0-9a-fA-F]*$/;\n// Hash regexes for different algorithms and encodings\n// Helper function to create base64 regex with exact length and padding\nfunction fixedBase64(bodyLength, padding) {\n return new RegExp(`^[A-Za-z0-9+/]{${bodyLength}}${padding}$`);\n}\n// Helper function to create base64url regex with exact length (no padding)\nfunction fixedBase64url(length) {\n return new RegExp(`^[A-Za-z0-9_-]{${length}}$`);\n}\n// MD5 (16 bytes): base64 = 24 chars total (22 + \"==\")\nexport const md5_hex = /^[0-9a-fA-F]{32}$/;\nexport const md5_base64 = /*@__PURE__*/ fixedBase64(22, \"==\");\nexport const md5_base64url = /*@__PURE__*/ fixedBase64url(22);\n// SHA1 (20 bytes): base64 = 28 chars total (27 + \"=\")\nexport const sha1_hex = /^[0-9a-fA-F]{40}$/;\nexport const sha1_base64 = /*@__PURE__*/ fixedBase64(27, \"=\");\nexport const sha1_base64url = /*@__PURE__*/ fixedBase64url(27);\n// SHA256 (32 bytes): base64 = 44 chars total (43 + \"=\")\nexport const sha256_hex = /^[0-9a-fA-F]{64}$/;\nexport const sha256_base64 = /*@__PURE__*/ fixedBase64(43, \"=\");\nexport const sha256_base64url = /*@__PURE__*/ fixedBase64url(43);\n// SHA384 (48 bytes): base64 = 64 chars total (no padding)\nexport const sha384_hex = /^[0-9a-fA-F]{96}$/;\nexport const sha384_base64 = /*@__PURE__*/ fixedBase64(64, \"\");\nexport const sha384_base64url = /*@__PURE__*/ fixedBase64url(64);\n// SHA512 (64 bytes): base64 = 88 chars total (86 + \"==\")\nexport const sha512_hex = /^[0-9a-fA-F]{128}$/;\nexport const sha512_base64 = /*@__PURE__*/ fixedBase64(86, \"==\");\nexport const sha512_base64url = /*@__PURE__*/ fixedBase64url(86);\n", "// import { $ZodType } from \"./schemas.js\";\nimport * as core from \"./core.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nexport const $ZodCheck = /*@__PURE__*/ core.$constructor(\"$ZodCheck\", (inst, def) => {\n var _a;\n inst._zod ?? (inst._zod = {});\n inst._zod.def = def;\n (_a = inst._zod).onattach ?? (_a.onattach = []);\n});\nconst numericOriginMap = {\n number: \"number\",\n bigint: \"bigint\",\n object: \"date\",\n};\nexport const $ZodCheckLessThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckLessThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY;\n if (def.value < curr) {\n if (def.inclusive)\n bag.maximum = def.value;\n else\n bag.exclusiveMaximum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value <= def.value : payload.value < def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckGreaterThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckGreaterThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY;\n if (def.value > curr) {\n if (def.inclusive)\n bag.minimum = def.value;\n else\n bag.exclusiveMinimum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value >= def.value : payload.value > def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMultipleOf = \n/*@__PURE__*/ core.$constructor(\"$ZodCheckMultipleOf\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n var _a;\n (_a = inst._zod.bag).multipleOf ?? (_a.multipleOf = def.value);\n });\n inst._zod.check = (payload) => {\n if (typeof payload.value !== typeof def.value)\n throw new Error(\"Cannot mix number and bigint in multiple_of check.\");\n const isMultiple = typeof payload.value === \"bigint\"\n ? payload.value % def.value === BigInt(0)\n : util.floatSafeRemainder(payload.value, def.value) === 0;\n if (isMultiple)\n return;\n payload.issues.push({\n origin: typeof payload.value,\n code: \"not_multiple_of\",\n divisor: def.value,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckNumberFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n def.format = def.format || \"float64\";\n const isInt = def.format?.includes(\"int\");\n const origin = isInt ? \"int\" : \"number\";\n const [minimum, maximum] = util.NUMBER_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n if (isInt)\n bag.pattern = regexes.integer;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (isInt) {\n if (!Number.isInteger(input)) {\n // invalid_format issue\n // payload.issues.push({\n // expected: def.format,\n // format: def.format,\n // code: \"invalid_format\",\n // input,\n // inst,\n // });\n // invalid_type issue\n payload.issues.push({\n expected: origin,\n format: def.format,\n code: \"invalid_type\",\n continue: false,\n input,\n inst,\n });\n return;\n // not_multiple_of issue\n // payload.issues.push({\n // code: \"not_multiple_of\",\n // origin: \"number\",\n // input,\n // inst,\n // divisor: 1,\n // });\n }\n if (!Number.isSafeInteger(input)) {\n if (input > 0) {\n // too_big\n payload.issues.push({\n input,\n code: \"too_big\",\n maximum: Number.MAX_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n else {\n // too_small\n payload.issues.push({\n input,\n code: \"too_small\",\n minimum: Number.MIN_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n return;\n }\n }\n if (input < minimum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_small\",\n minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckBigIntFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n const [minimum, maximum] = util.BIGINT_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (input < minimum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_small\",\n minimum: minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckMaxSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size <= def.maximum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size >= def.minimum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckSizeEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckSizeEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.size;\n bag.maximum = def.size;\n bag.size = def.size;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size === def.size)\n return;\n const tooBig = size > def.size;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n ...(tooBig ? { code: \"too_big\", maximum: def.size } : { code: \"too_small\", minimum: def.size }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMaxLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length <= def.maximum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length >= def.minimum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLengthEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckLengthEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.length;\n bag.maximum = def.length;\n bag.length = def.length;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length === def.length)\n return;\n const origin = util.getLengthableOrigin(input);\n const tooBig = length > def.length;\n payload.issues.push({\n origin,\n ...(tooBig ? { code: \"too_big\", maximum: def.length } : { code: \"too_small\", minimum: def.length }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckStringFormat\", (inst, def) => {\n var _a, _b;\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n if (def.pattern) {\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(def.pattern);\n }\n });\n if (def.pattern)\n (_a = inst._zod).check ?? (_a.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n ...(def.pattern ? { pattern: def.pattern.toString() } : {}),\n inst,\n continue: !def.abort,\n });\n });\n else\n (_b = inst._zod).check ?? (_b.check = () => { });\n});\nexport const $ZodCheckRegex = /*@__PURE__*/ core.$constructor(\"$ZodCheckRegex\", (inst, def) => {\n $ZodCheckStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"regex\",\n input: payload.value,\n pattern: def.pattern.toString(),\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLowerCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckLowerCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.lowercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckUpperCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckUpperCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.uppercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckIncludes = /*@__PURE__*/ core.$constructor(\"$ZodCheckIncludes\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const escapedRegex = util.escapeRegex(def.includes);\n const pattern = new RegExp(typeof def.position === \"number\" ? `^.{${def.position}}${escapedRegex}` : escapedRegex);\n def.pattern = pattern;\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.includes(def.includes, def.position))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"includes\",\n includes: def.includes,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStartsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckStartsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`^${util.escapeRegex(def.prefix)}.*`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.startsWith(def.prefix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"starts_with\",\n prefix: def.prefix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckEndsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckEndsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`.*${util.escapeRegex(def.suffix)}$`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.endsWith(def.suffix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"ends_with\",\n suffix: def.suffix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n///////////////////////////////////\n///// $ZodCheckProperty /////\n///////////////////////////////////\nfunction handleCheckPropertyResult(result, payload, property) {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(property, result.issues));\n }\n}\nexport const $ZodCheckProperty = /*@__PURE__*/ core.$constructor(\"$ZodCheckProperty\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n const result = def.schema._zod.run({\n value: payload.value[def.property],\n issues: [],\n }, {});\n if (result instanceof Promise) {\n return result.then((result) => handleCheckPropertyResult(result, payload, def.property));\n }\n handleCheckPropertyResult(result, payload, def.property);\n return;\n };\n});\nexport const $ZodCheckMimeType = /*@__PURE__*/ core.$constructor(\"$ZodCheckMimeType\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const mimeSet = new Set(def.mime);\n inst._zod.onattach.push((inst) => {\n inst._zod.bag.mime = def.mime;\n });\n inst._zod.check = (payload) => {\n if (mimeSet.has(payload.value.type))\n return;\n payload.issues.push({\n code: \"invalid_value\",\n values: def.mime,\n input: payload.value.type,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckOverwrite = /*@__PURE__*/ core.$constructor(\"$ZodCheckOverwrite\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n payload.value = def.tx(payload.value);\n };\n});\n", "export class Doc {\n constructor(args = []) {\n this.content = [];\n this.indent = 0;\n if (this)\n this.args = args;\n }\n indented(fn) {\n this.indent += 1;\n fn(this);\n this.indent -= 1;\n }\n write(arg) {\n if (typeof arg === \"function\") {\n arg(this, { execution: \"sync\" });\n arg(this, { execution: \"async\" });\n return;\n }\n const content = arg;\n const lines = content.split(\"\\n\").filter((x) => x);\n const minIndent = Math.min(...lines.map((x) => x.length - x.trimStart().length));\n const dedented = lines.map((x) => x.slice(minIndent)).map((x) => \" \".repeat(this.indent * 2) + x);\n for (const line of dedented) {\n this.content.push(line);\n }\n }\n compile() {\n const F = Function;\n const args = this?.args;\n const content = this?.content ?? [``];\n const lines = [...content.map((x) => ` ${x}`)];\n // console.log(lines.join(\"\\n\"));\n return new F(...args, lines.join(\"\\n\"));\n }\n}\n", "export const version = {\n major: 4,\n minor: 3,\n patch: 6,\n};\n", "import * as checks from \"./checks.js\";\nimport * as core from \"./core.js\";\nimport { Doc } from \"./doc.js\";\nimport { parse, parseAsync, safeParse, safeParseAsync } from \"./parse.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nimport { version } from \"./versions.js\";\nexport const $ZodType = /*@__PURE__*/ core.$constructor(\"$ZodType\", (inst, def) => {\n var _a;\n inst ?? (inst = {});\n inst._zod.def = def; // set _def property\n inst._zod.bag = inst._zod.bag || {}; // initialize _bag object\n inst._zod.version = version;\n const checks = [...(inst._zod.def.checks ?? [])];\n // if inst is itself a checks.$ZodCheck, run it as a check\n if (inst._zod.traits.has(\"$ZodCheck\")) {\n checks.unshift(inst);\n }\n for (const ch of checks) {\n for (const fn of ch._zod.onattach) {\n fn(inst);\n }\n }\n if (checks.length === 0) {\n // deferred initializer\n // inst._zod.parse is not yet defined\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n inst._zod.deferred?.push(() => {\n inst._zod.run = inst._zod.parse;\n });\n }\n else {\n const runChecks = (payload, checks, ctx) => {\n let isAborted = util.aborted(payload);\n let asyncResult;\n for (const ch of checks) {\n if (ch._zod.def.when) {\n const shouldRun = ch._zod.def.when(payload);\n if (!shouldRun)\n continue;\n }\n else if (isAborted) {\n continue;\n }\n const currLen = payload.issues.length;\n const _ = ch._zod.check(payload);\n if (_ instanceof Promise && ctx?.async === false) {\n throw new core.$ZodAsyncError();\n }\n if (asyncResult || _ instanceof Promise) {\n asyncResult = (asyncResult ?? Promise.resolve()).then(async () => {\n await _;\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n return;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n });\n }\n else {\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n continue;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n }\n }\n if (asyncResult) {\n return asyncResult.then(() => {\n return payload;\n });\n }\n return payload;\n };\n const handleCanaryResult = (canary, payload, ctx) => {\n // abort if the canary is aborted\n if (util.aborted(canary)) {\n canary.aborted = true;\n return canary;\n }\n // run checks first, then\n const checkResult = runChecks(payload, checks, ctx);\n if (checkResult instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return checkResult.then((checkResult) => inst._zod.parse(checkResult, ctx));\n }\n return inst._zod.parse(checkResult, ctx);\n };\n inst._zod.run = (payload, ctx) => {\n if (ctx.skipChecks) {\n return inst._zod.parse(payload, ctx);\n }\n if (ctx.direction === \"backward\") {\n // run canary\n // initial pass (no checks)\n const canary = inst._zod.parse({ value: payload.value, issues: [] }, { ...ctx, skipChecks: true });\n if (canary instanceof Promise) {\n return canary.then((canary) => {\n return handleCanaryResult(canary, payload, ctx);\n });\n }\n return handleCanaryResult(canary, payload, ctx);\n }\n // forward\n const result = inst._zod.parse(payload, ctx);\n if (result instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return result.then((result) => runChecks(result, checks, ctx));\n }\n return runChecks(result, checks, ctx);\n };\n }\n // Lazy initialize ~standard to avoid creating objects for every schema\n util.defineLazy(inst, \"~standard\", () => ({\n validate: (value) => {\n try {\n const r = safeParse(inst, value);\n return r.success ? { value: r.data } : { issues: r.error?.issues };\n }\n catch (_) {\n return safeParseAsync(inst, value).then((r) => (r.success ? { value: r.data } : { issues: r.error?.issues }));\n }\n },\n vendor: \"zod\",\n version: 1,\n }));\n});\nexport { clone } from \"./util.js\";\nexport const $ZodString = /*@__PURE__*/ core.$constructor(\"$ZodString\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = [...(inst?._zod.bag?.patterns ?? [])].pop() ?? regexes.string(inst._zod.bag);\n inst._zod.parse = (payload, _) => {\n if (def.coerce)\n try {\n payload.value = String(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"string\")\n return payload;\n payload.issues.push({\n expected: \"string\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodStringFormat\", (inst, def) => {\n // check initialization must come first\n checks.$ZodCheckStringFormat.init(inst, def);\n $ZodString.init(inst, def);\n});\nexport const $ZodGUID = /*@__PURE__*/ core.$constructor(\"$ZodGUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.guid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodUUID = /*@__PURE__*/ core.$constructor(\"$ZodUUID\", (inst, def) => {\n if (def.version) {\n const versionMap = {\n v1: 1,\n v2: 2,\n v3: 3,\n v4: 4,\n v5: 5,\n v6: 6,\n v7: 7,\n v8: 8,\n };\n const v = versionMap[def.version];\n if (v === undefined)\n throw new Error(`Invalid UUID version: \"${def.version}\"`);\n def.pattern ?? (def.pattern = regexes.uuid(v));\n }\n else\n def.pattern ?? (def.pattern = regexes.uuid());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodEmail = /*@__PURE__*/ core.$constructor(\"$ZodEmail\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.email);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodURL = /*@__PURE__*/ core.$constructor(\"$ZodURL\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n try {\n // Trim whitespace from input\n const trimmed = payload.value.trim();\n // @ts-ignore\n const url = new URL(trimmed);\n if (def.hostname) {\n def.hostname.lastIndex = 0;\n if (!def.hostname.test(url.hostname)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid hostname\",\n pattern: def.hostname.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n if (def.protocol) {\n def.protocol.lastIndex = 0;\n if (!def.protocol.test(url.protocol.endsWith(\":\") ? url.protocol.slice(0, -1) : url.protocol)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid protocol\",\n pattern: def.protocol.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n // Set the output value based on normalize flag\n if (def.normalize) {\n // Use normalized URL\n payload.value = url.href;\n }\n else {\n // Preserve the original input (trimmed)\n payload.value = trimmed;\n }\n return;\n }\n catch (_) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodEmoji = /*@__PURE__*/ core.$constructor(\"$ZodEmoji\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.emoji());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodNanoID = /*@__PURE__*/ core.$constructor(\"$ZodNanoID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.nanoid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID = /*@__PURE__*/ core.$constructor(\"$ZodCUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID2 = /*@__PURE__*/ core.$constructor(\"$ZodCUID2\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid2);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodULID = /*@__PURE__*/ core.$constructor(\"$ZodULID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ulid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodXID = /*@__PURE__*/ core.$constructor(\"$ZodXID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.xid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodKSUID = /*@__PURE__*/ core.$constructor(\"$ZodKSUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ksuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODateTime = /*@__PURE__*/ core.$constructor(\"$ZodISODateTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.datetime(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODate = /*@__PURE__*/ core.$constructor(\"$ZodISODate\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.date);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISOTime = /*@__PURE__*/ core.$constructor(\"$ZodISOTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.time(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODuration = /*@__PURE__*/ core.$constructor(\"$ZodISODuration\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.duration);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodIPv4 = /*@__PURE__*/ core.$constructor(\"$ZodIPv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv4);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv4`;\n});\nexport const $ZodIPv6 = /*@__PURE__*/ core.$constructor(\"$ZodIPv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv6);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv6`;\n inst._zod.check = (payload) => {\n try {\n // @ts-ignore\n new URL(`http://[${payload.value}]`);\n // return;\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"ipv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodMAC = /*@__PURE__*/ core.$constructor(\"$ZodMAC\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.mac(def.delimiter));\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `mac`;\n});\nexport const $ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv4);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv6); // not used for validation\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n const parts = payload.value.split(\"/\");\n try {\n if (parts.length !== 2)\n throw new Error();\n const [address, prefix] = parts;\n if (!prefix)\n throw new Error();\n const prefixNum = Number(prefix);\n if (`${prefixNum}` !== prefix)\n throw new Error();\n if (prefixNum < 0 || prefixNum > 128)\n throw new Error();\n // @ts-ignore\n new URL(`http://[${address}]`);\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"cidrv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64(data) {\n if (data === \"\")\n return true;\n if (data.length % 4 !== 0)\n return false;\n try {\n // @ts-ignore\n atob(data);\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodBase64 = /*@__PURE__*/ core.$constructor(\"$ZodBase64\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64\";\n inst._zod.check = (payload) => {\n if (isValidBase64(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64URL(data) {\n if (!regexes.base64url.test(data))\n return false;\n const base64 = data.replace(/[-_]/g, (c) => (c === \"-\" ? \"+\" : \"/\"));\n const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\");\n return isValidBase64(padded);\n}\nexport const $ZodBase64URL = /*@__PURE__*/ core.$constructor(\"$ZodBase64URL\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64url);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64url\";\n inst._zod.check = (payload) => {\n if (isValidBase64URL(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodE164 = /*@__PURE__*/ core.$constructor(\"$ZodE164\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.e164);\n $ZodStringFormat.init(inst, def);\n});\n////////////////////////////// ZodJWT //////////////////////////////\nexport function isValidJWT(token, algorithm = null) {\n try {\n const tokensParts = token.split(\".\");\n if (tokensParts.length !== 3)\n return false;\n const [header] = tokensParts;\n if (!header)\n return false;\n // @ts-ignore\n const parsedHeader = JSON.parse(atob(header));\n if (\"typ\" in parsedHeader && parsedHeader?.typ !== \"JWT\")\n return false;\n if (!parsedHeader.alg)\n return false;\n if (algorithm && (!(\"alg\" in parsedHeader) || parsedHeader.alg !== algorithm))\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodJWT = /*@__PURE__*/ core.$constructor(\"$ZodJWT\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (isValidJWT(payload.value, def.alg))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"jwt\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCustomStringFormat\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (def.fn(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodNumber = /*@__PURE__*/ core.$constructor(\"$ZodNumber\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = inst._zod.bag.pattern ?? regexes.number;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Number(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"number\" && !Number.isNaN(input) && Number.isFinite(input)) {\n return payload;\n }\n const received = typeof input === \"number\"\n ? Number.isNaN(input)\n ? \"NaN\"\n : !Number.isFinite(input)\n ? \"Infinity\"\n : undefined\n : undefined;\n payload.issues.push({\n expected: \"number\",\n code: \"invalid_type\",\n input,\n inst,\n ...(received ? { received } : {}),\n });\n return payload;\n };\n});\nexport const $ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodNumberFormat\", (inst, def) => {\n checks.$ZodCheckNumberFormat.init(inst, def);\n $ZodNumber.init(inst, def); // no format checks\n});\nexport const $ZodBoolean = /*@__PURE__*/ core.$constructor(\"$ZodBoolean\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.boolean;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Boolean(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"boolean\")\n return payload;\n payload.issues.push({\n expected: \"boolean\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigInt = /*@__PURE__*/ core.$constructor(\"$ZodBigInt\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.bigint;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = BigInt(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"bigint\")\n return payload;\n payload.issues.push({\n expected: \"bigint\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodBigIntFormat\", (inst, def) => {\n checks.$ZodCheckBigIntFormat.init(inst, def);\n $ZodBigInt.init(inst, def); // no format checks\n});\nexport const $ZodSymbol = /*@__PURE__*/ core.$constructor(\"$ZodSymbol\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"symbol\")\n return payload;\n payload.issues.push({\n expected: \"symbol\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodUndefined = /*@__PURE__*/ core.$constructor(\"$ZodUndefined\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.undefined;\n inst._zod.values = new Set([undefined]);\n inst._zod.optin = \"optional\";\n inst._zod.optout = \"optional\";\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"undefined\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodNull = /*@__PURE__*/ core.$constructor(\"$ZodNull\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.null;\n inst._zod.values = new Set([null]);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (input === null)\n return payload;\n payload.issues.push({\n expected: \"null\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodAny = /*@__PURE__*/ core.$constructor(\"$ZodAny\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodUnknown = /*@__PURE__*/ core.$constructor(\"$ZodUnknown\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodNever = /*@__PURE__*/ core.$constructor(\"$ZodNever\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n payload.issues.push({\n expected: \"never\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodVoid = /*@__PURE__*/ core.$constructor(\"$ZodVoid\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"void\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodDate = /*@__PURE__*/ core.$constructor(\"$ZodDate\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce) {\n try {\n payload.value = new Date(payload.value);\n }\n catch (_err) { }\n }\n const input = payload.value;\n const isDate = input instanceof Date;\n const isValidDate = isDate && !Number.isNaN(input.getTime());\n if (isValidDate)\n return payload;\n payload.issues.push({\n expected: \"date\",\n code: \"invalid_type\",\n input,\n ...(isDate ? { received: \"Invalid Date\" } : {}),\n inst,\n });\n return payload;\n };\n});\nfunction handleArrayResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nexport const $ZodArray = /*@__PURE__*/ core.$constructor(\"$ZodArray\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n expected: \"array\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = Array(input.length);\n const proms = [];\n for (let i = 0; i < input.length; i++) {\n const item = input[i];\n const result = def.element._zod.run({\n value: item,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleArrayResult(result, payload, i)));\n }\n else {\n handleArrayResult(result, payload, i);\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload; //handleArrayResultsAsync(parseResults, final);\n };\n});\nfunction handlePropertyResult(result, final, key, input, isOptionalOut) {\n if (result.issues.length) {\n // For optional-out schemas, ignore errors on absent keys\n if (isOptionalOut && !(key in input)) {\n return;\n }\n final.issues.push(...util.prefixIssues(key, result.issues));\n }\n if (result.value === undefined) {\n if (key in input) {\n final.value[key] = undefined;\n }\n }\n else {\n final.value[key] = result.value;\n }\n}\nfunction normalizeDef(def) {\n const keys = Object.keys(def.shape);\n for (const k of keys) {\n if (!def.shape?.[k]?._zod?.traits?.has(\"$ZodType\")) {\n throw new Error(`Invalid element at key \"${k}\": expected a Zod schema`);\n }\n }\n const okeys = util.optionalKeys(def.shape);\n return {\n ...def,\n keys,\n keySet: new Set(keys),\n numKeys: keys.length,\n optionalKeys: new Set(okeys),\n };\n}\nfunction handleCatchall(proms, input, payload, ctx, def, inst) {\n const unrecognized = [];\n // iterate over input keys\n const keySet = def.keySet;\n const _catchall = def.catchall._zod;\n const t = _catchall.def.type;\n const isOptionalOut = _catchall.optout === \"optional\";\n for (const key in input) {\n if (keySet.has(key))\n continue;\n if (t === \"never\") {\n unrecognized.push(key);\n continue;\n }\n const r = _catchall.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalOut);\n }\n }\n if (unrecognized.length) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n keys: unrecognized,\n input,\n inst,\n });\n }\n if (!proms.length)\n return payload;\n return Promise.all(proms).then(() => {\n return payload;\n });\n}\nexport const $ZodObject = /*@__PURE__*/ core.$constructor(\"$ZodObject\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodType.init(inst, def);\n // const sh = def.shape;\n const desc = Object.getOwnPropertyDescriptor(def, \"shape\");\n if (!desc?.get) {\n const sh = def.shape;\n Object.defineProperty(def, \"shape\", {\n get: () => {\n const newSh = { ...sh };\n Object.defineProperty(def, \"shape\", {\n value: newSh,\n });\n return newSh;\n },\n });\n }\n const _normalized = util.cached(() => normalizeDef(def));\n util.defineLazy(inst._zod, \"propValues\", () => {\n const shape = def.shape;\n const propValues = {};\n for (const key in shape) {\n const field = shape[key]._zod;\n if (field.values) {\n propValues[key] ?? (propValues[key] = new Set());\n for (const v of field.values)\n propValues[key].add(v);\n }\n }\n return propValues;\n });\n const isObject = util.isObject;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = {};\n const proms = [];\n const shape = value.shape;\n for (const key of value.keys) {\n const el = shape[key];\n const isOptionalOut = el._zod.optout === \"optional\";\n const r = el._zod.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalOut);\n }\n }\n if (!catchall) {\n return proms.length ? Promise.all(proms).then(() => payload) : payload;\n }\n return handleCatchall(proms, input, payload, ctx, _normalized.value, inst);\n };\n});\nexport const $ZodObjectJIT = /*@__PURE__*/ core.$constructor(\"$ZodObjectJIT\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodObject.init(inst, def);\n const superParse = inst._zod.parse;\n const _normalized = util.cached(() => normalizeDef(def));\n const generateFastpass = (shape) => {\n const doc = new Doc([\"shape\", \"payload\", \"ctx\"]);\n const normalized = _normalized.value;\n const parseStr = (key) => {\n const k = util.esc(key);\n return `shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`;\n };\n doc.write(`const input = payload.value;`);\n const ids = Object.create(null);\n let counter = 0;\n for (const key of normalized.keys) {\n ids[key] = `key_${counter++}`;\n }\n // A: preserve key order {\n doc.write(`const newResult = {};`);\n for (const key of normalized.keys) {\n const id = ids[key];\n const k = util.esc(key);\n const schema = shape[key];\n const isOptionalOut = schema?._zod?.optout === \"optional\";\n doc.write(`const ${id} = ${parseStr(key)};`);\n if (isOptionalOut) {\n // For optional-out schemas, ignore errors on absent keys\n doc.write(`\n if (${id}.issues.length) {\n if (${k} in input) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n else {\n doc.write(`\n if (${id}.issues.length) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n }\n doc.write(`payload.value = newResult;`);\n doc.write(`return payload;`);\n const fn = doc.compile();\n return (payload, ctx) => fn(shape, payload, ctx);\n };\n let fastpass;\n const isObject = util.isObject;\n const jit = !core.globalConfig.jitless;\n const allowsEval = util.allowsEval;\n const fastEnabled = jit && allowsEval.value; // && !def.catchall;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n if (jit && fastEnabled && ctx?.async === false && ctx.jitless !== true) {\n // always synchronous\n if (!fastpass)\n fastpass = generateFastpass(def.shape);\n payload = fastpass(payload, ctx);\n if (!catchall)\n return payload;\n return handleCatchall([], input, payload, ctx, value, inst);\n }\n return superParse(payload, ctx);\n };\n});\nfunction handleUnionResults(results, final, inst, ctx) {\n for (const result of results) {\n if (result.issues.length === 0) {\n final.value = result.value;\n return final;\n }\n }\n const nonaborted = results.filter((r) => !util.aborted(r));\n if (nonaborted.length === 1) {\n final.value = nonaborted[0].value;\n return nonaborted[0];\n }\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n return final;\n}\nexport const $ZodUnion = /*@__PURE__*/ core.$constructor(\"$ZodUnion\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.options.some((o) => o._zod.optin === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"optout\", () => def.options.some((o) => o._zod.optout === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"values\", () => {\n if (def.options.every((o) => o._zod.values)) {\n return new Set(def.options.flatMap((option) => Array.from(option._zod.values)));\n }\n return undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n if (def.options.every((o) => o._zod.pattern)) {\n const patterns = def.options.map((o) => o._zod.pattern);\n return new RegExp(`^(${patterns.map((p) => util.cleanRegex(p.source)).join(\"|\")})$`);\n }\n return undefined;\n });\n const single = def.options.length === 1;\n const first = def.options[0]._zod.run;\n inst._zod.parse = (payload, ctx) => {\n if (single) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n if (result.issues.length === 0)\n return result;\n results.push(result);\n }\n }\n if (!async)\n return handleUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleUnionResults(results, payload, inst, ctx);\n });\n };\n});\nfunction handleExclusiveUnionResults(results, final, inst, ctx) {\n const successes = results.filter((r) => r.issues.length === 0);\n if (successes.length === 1) {\n final.value = successes[0].value;\n return final;\n }\n if (successes.length === 0) {\n // No matches - same as regular union\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n }\n else {\n // Multiple matches - exclusive union failure\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: [],\n inclusive: false,\n });\n }\n return final;\n}\nexport const $ZodXor = /*@__PURE__*/ core.$constructor(\"$ZodXor\", (inst, def) => {\n $ZodUnion.init(inst, def);\n def.inclusive = false;\n const single = def.options.length === 1;\n const first = def.options[0]._zod.run;\n inst._zod.parse = (payload, ctx) => {\n if (single) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n results.push(result);\n }\n }\n if (!async)\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n });\n };\n});\nexport const $ZodDiscriminatedUnion = \n/*@__PURE__*/\ncore.$constructor(\"$ZodDiscriminatedUnion\", (inst, def) => {\n def.inclusive = false;\n $ZodUnion.init(inst, def);\n const _super = inst._zod.parse;\n util.defineLazy(inst._zod, \"propValues\", () => {\n const propValues = {};\n for (const option of def.options) {\n const pv = option._zod.propValues;\n if (!pv || Object.keys(pv).length === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(option)}\"`);\n for (const [k, v] of Object.entries(pv)) {\n if (!propValues[k])\n propValues[k] = new Set();\n for (const val of v) {\n propValues[k].add(val);\n }\n }\n }\n return propValues;\n });\n const disc = util.cached(() => {\n const opts = def.options;\n const map = new Map();\n for (const o of opts) {\n const values = o._zod.propValues?.[def.discriminator];\n if (!values || values.size === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(o)}\"`);\n for (const v of values) {\n if (map.has(v)) {\n throw new Error(`Duplicate discriminator value \"${String(v)}\"`);\n }\n map.set(v, o);\n }\n }\n return map;\n });\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isObject(input)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"object\",\n input,\n inst,\n });\n return payload;\n }\n const opt = disc.value.get(input?.[def.discriminator]);\n if (opt) {\n return opt._zod.run(payload, ctx);\n }\n if (def.unionFallback) {\n return _super(payload, ctx);\n }\n // no matching discriminator\n payload.issues.push({\n code: \"invalid_union\",\n errors: [],\n note: \"No matching discriminator\",\n discriminator: def.discriminator,\n input,\n path: [def.discriminator],\n inst,\n });\n return payload;\n };\n});\nexport const $ZodIntersection = /*@__PURE__*/ core.$constructor(\"$ZodIntersection\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n const left = def.left._zod.run({ value: input, issues: [] }, ctx);\n const right = def.right._zod.run({ value: input, issues: [] }, ctx);\n const async = left instanceof Promise || right instanceof Promise;\n if (async) {\n return Promise.all([left, right]).then(([left, right]) => {\n return handleIntersectionResults(payload, left, right);\n });\n }\n return handleIntersectionResults(payload, left, right);\n };\n});\nfunction mergeValues(a, b) {\n // const aType = parse.t(a);\n // const bType = parse.t(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n if (a instanceof Date && b instanceof Date && +a === +b) {\n return { valid: true, data: a };\n }\n if (util.isPlainObject(a) && util.isPlainObject(b)) {\n const bKeys = Object.keys(b);\n const sharedKeys = Object.keys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [key, ...sharedValue.mergeErrorPath],\n };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return { valid: false, mergeErrorPath: [] };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [index, ...sharedValue.mergeErrorPath],\n };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n return { valid: false, mergeErrorPath: [] };\n}\nfunction handleIntersectionResults(result, left, right) {\n // Track which side(s) report each key as unrecognized\n const unrecKeys = new Map();\n let unrecIssue;\n for (const iss of left.issues) {\n if (iss.code === \"unrecognized_keys\") {\n unrecIssue ?? (unrecIssue = iss);\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).l = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n for (const iss of right.issues) {\n if (iss.code === \"unrecognized_keys\") {\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).r = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n // Report only keys unrecognized by BOTH sides\n const bothKeys = [...unrecKeys].filter(([, f]) => f.l && f.r).map(([k]) => k);\n if (bothKeys.length && unrecIssue) {\n result.issues.push({ ...unrecIssue, keys: bothKeys });\n }\n if (util.aborted(result))\n return result;\n const merged = mergeValues(left.value, right.value);\n if (!merged.valid) {\n throw new Error(`Unmergable intersection. Error path: ` + `${JSON.stringify(merged.mergeErrorPath)}`);\n }\n result.value = merged.data;\n return result;\n}\nexport const $ZodTuple = /*@__PURE__*/ core.$constructor(\"$ZodTuple\", (inst, def) => {\n $ZodType.init(inst, def);\n const items = def.items;\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n input,\n inst,\n expected: \"tuple\",\n code: \"invalid_type\",\n });\n return payload;\n }\n payload.value = [];\n const proms = [];\n const reversedIndex = [...items].reverse().findIndex((item) => item._zod.optin !== \"optional\");\n const optStart = reversedIndex === -1 ? 0 : items.length - reversedIndex;\n if (!def.rest) {\n const tooBig = input.length > items.length;\n const tooSmall = input.length < optStart - 1;\n if (tooBig || tooSmall) {\n payload.issues.push({\n ...(tooBig\n ? { code: \"too_big\", maximum: items.length, inclusive: true }\n : { code: \"too_small\", minimum: items.length }),\n input,\n inst,\n origin: \"array\",\n });\n return payload;\n }\n }\n let i = -1;\n for (const item of items) {\n i++;\n if (i >= input.length)\n if (i >= optStart)\n continue;\n const result = item._zod.run({\n value: input[i],\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleTupleResult(result, payload, i)));\n }\n else {\n handleTupleResult(result, payload, i);\n }\n }\n if (def.rest) {\n const rest = input.slice(items.length);\n for (const el of rest) {\n i++;\n const result = def.rest._zod.run({\n value: el,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleTupleResult(result, payload, i)));\n }\n else {\n handleTupleResult(result, payload, i);\n }\n }\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleTupleResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nexport const $ZodRecord = /*@__PURE__*/ core.$constructor(\"$ZodRecord\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isPlainObject(input)) {\n payload.issues.push({\n expected: \"record\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n const values = def.keyType._zod.values;\n if (values) {\n payload.value = {};\n const recordKeys = new Set();\n for (const key of values) {\n if (typeof key === \"string\" || typeof key === \"number\" || typeof key === \"symbol\") {\n recordKeys.add(typeof key === \"number\" ? key.toString() : key);\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[key] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[key] = result.value;\n }\n }\n }\n let unrecognized;\n for (const key in input) {\n if (!recordKeys.has(key)) {\n unrecognized = unrecognized ?? [];\n unrecognized.push(key);\n }\n }\n if (unrecognized && unrecognized.length > 0) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n input,\n inst,\n keys: unrecognized,\n });\n }\n }\n else {\n payload.value = {};\n for (const key of Reflect.ownKeys(input)) {\n if (key === \"__proto__\")\n continue;\n let keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n if (keyResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n // Numeric string fallback: if key is a numeric string and failed, retry with Number(key)\n // This handles z.number(), z.literal([1, 2, 3]), and unions containing numeric literals\n const checkNumericKey = typeof key === \"string\" && regexes.number.test(key) && keyResult.issues.length;\n if (checkNumericKey) {\n const retryResult = def.keyType._zod.run({ value: Number(key), issues: [] }, ctx);\n if (retryResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n if (retryResult.issues.length === 0) {\n keyResult = retryResult;\n }\n }\n if (keyResult.issues.length) {\n if (def.mode === \"loose\") {\n // Pass through unchanged\n payload.value[key] = input[key];\n }\n else {\n // Default \"strict\" behavior: error on invalid key\n payload.issues.push({\n code: \"invalid_key\",\n origin: \"record\",\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n input: key,\n path: [key],\n inst,\n });\n }\n continue;\n }\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload;\n };\n});\nexport const $ZodMap = /*@__PURE__*/ core.$constructor(\"$ZodMap\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Map)) {\n payload.issues.push({\n expected: \"map\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n payload.value = new Map();\n for (const [key, value] of input) {\n const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n const valueResult = def.valueType._zod.run({ value: value, issues: [] }, ctx);\n if (keyResult instanceof Promise || valueResult instanceof Promise) {\n proms.push(Promise.all([keyResult, valueResult]).then(([keyResult, valueResult]) => {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }));\n }\n else {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) {\n if (keyResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, keyResult.issues));\n }\n else {\n final.issues.push({\n code: \"invalid_key\",\n origin: \"map\",\n input,\n inst,\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n if (valueResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, valueResult.issues));\n }\n else {\n final.issues.push({\n origin: \"map\",\n code: \"invalid_element\",\n input,\n inst,\n key: key,\n issues: valueResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n final.value.set(keyResult.value, valueResult.value);\n}\nexport const $ZodSet = /*@__PURE__*/ core.$constructor(\"$ZodSet\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Set)) {\n payload.issues.push({\n input,\n inst,\n expected: \"set\",\n code: \"invalid_type\",\n });\n return payload;\n }\n const proms = [];\n payload.value = new Set();\n for (const item of input) {\n const result = def.valueType._zod.run({ value: item, issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleSetResult(result, payload)));\n }\n else\n handleSetResult(result, payload);\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleSetResult(result, final) {\n if (result.issues.length) {\n final.issues.push(...result.issues);\n }\n final.value.add(result.value);\n}\nexport const $ZodEnum = /*@__PURE__*/ core.$constructor(\"$ZodEnum\", (inst, def) => {\n $ZodType.init(inst, def);\n const values = util.getEnumValues(def.entries);\n const valuesSet = new Set(values);\n inst._zod.values = valuesSet;\n inst._zod.pattern = new RegExp(`^(${values\n .filter((k) => util.propertyKeyTypes.has(typeof k))\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o.toString()))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (valuesSet.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodLiteral = /*@__PURE__*/ core.$constructor(\"$ZodLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n if (def.values.length === 0) {\n throw new Error(\"Cannot create literal schema with no valid values\");\n }\n const values = new Set(def.values);\n inst._zod.values = values;\n inst._zod.pattern = new RegExp(`^(${def.values\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o ? util.escapeRegex(o.toString()) : String(o)))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (values.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values: def.values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodFile = /*@__PURE__*/ core.$constructor(\"$ZodFile\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n // @ts-ignore\n if (input instanceof File)\n return payload;\n payload.issues.push({\n expected: \"file\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodTransform = /*@__PURE__*/ core.$constructor(\"$ZodTransform\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n const _out = def.transform(payload.value, payload);\n if (ctx.async) {\n const output = _out instanceof Promise ? _out : Promise.resolve(_out);\n return output.then((output) => {\n payload.value = output;\n return payload;\n });\n }\n if (_out instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n payload.value = _out;\n return payload;\n };\n});\nfunction handleOptionalResult(result, input) {\n if (result.issues.length && input === undefined) {\n return { issues: [], value: undefined };\n }\n return result;\n}\nexport const $ZodOptional = /*@__PURE__*/ core.$constructor(\"$ZodOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n inst._zod.optout = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, undefined]) : undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)})?$`) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n if (def.innerType._zod.optin === \"optional\") {\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise)\n return result.then((r) => handleOptionalResult(r, payload.value));\n return handleOptionalResult(result, payload.value);\n }\n if (payload.value === undefined) {\n return payload;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodExactOptional = /*@__PURE__*/ core.$constructor(\"$ZodExactOptional\", (inst, def) => {\n // Call parent init - inherits optin/optout = \"optional\"\n $ZodOptional.init(inst, def);\n // Override values/pattern to NOT add undefined\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"pattern\", () => def.innerType._zod.pattern);\n // Override parse to just delegate (no undefined handling)\n inst._zod.parse = (payload, ctx) => {\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNullable = /*@__PURE__*/ core.$constructor(\"$ZodNullable\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)}|null)$`) : undefined;\n });\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, null]) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n // Forward direction (decode): allow null to pass through\n if (payload.value === null)\n return payload;\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodDefault = /*@__PURE__*/ core.$constructor(\"$ZodDefault\", (inst, def) => {\n $ZodType.init(inst, def);\n // inst._zod.qin = \"true\";\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply defaults for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n /**\n * $ZodDefault returns the default value immediately in forward direction.\n * It doesn't pass the default value into the validator (\"prefault\"). There's no reason to pass the default value through validation. The validity of the default is enforced by TypeScript statically. Otherwise, it's the responsibility of the user to ensure the default is valid. In the case of pipes with divergent in/out types, you can specify the default on the `in` schema of your ZodPipe to set a \"prefault\" for the pipe. */\n return payload;\n }\n // Forward direction: continue with default handling\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleDefaultResult(result, def));\n }\n return handleDefaultResult(result, def);\n };\n});\nfunction handleDefaultResult(payload, def) {\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return payload;\n}\nexport const $ZodPrefault = /*@__PURE__*/ core.$constructor(\"$ZodPrefault\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply prefault for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNonOptional = /*@__PURE__*/ core.$constructor(\"$ZodNonOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => {\n const v = def.innerType._zod.values;\n return v ? new Set([...v].filter((x) => x !== undefined)) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleNonOptionalResult(result, inst));\n }\n return handleNonOptionalResult(result, inst);\n };\n});\nfunction handleNonOptionalResult(payload, inst) {\n if (!payload.issues.length && payload.value === undefined) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"nonoptional\",\n input: payload.value,\n inst,\n });\n }\n return payload;\n}\nexport const $ZodSuccess = /*@__PURE__*/ core.$constructor(\"$ZodSuccess\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(\"ZodSuccess\");\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.issues.length === 0;\n return payload;\n });\n }\n payload.value = result.issues.length === 0;\n return payload;\n };\n});\nexport const $ZodCatch = /*@__PURE__*/ core.$constructor(\"$ZodCatch\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply catch logic\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n }\n return payload;\n });\n }\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n }\n return payload;\n };\n});\nexport const $ZodNaN = /*@__PURE__*/ core.$constructor(\"$ZodNaN\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"number\" || !Number.isNaN(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"nan\",\n code: \"invalid_type\",\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodPipe = /*@__PURE__*/ core.$constructor(\"$ZodPipe\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handlePipeResult(right, def.in, ctx));\n }\n return handlePipeResult(right, def.in, ctx);\n }\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handlePipeResult(left, def.out, ctx));\n }\n return handlePipeResult(left, def.out, ctx);\n };\n});\nfunction handlePipeResult(left, next, ctx) {\n if (left.issues.length) {\n // prevent further checks\n left.aborted = true;\n return left;\n }\n return next._zod.run({ value: left.value, issues: left.issues }, ctx);\n}\nexport const $ZodCodec = /*@__PURE__*/ core.$constructor(\"$ZodCodec\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handleCodecAResult(left, def, ctx));\n }\n return handleCodecAResult(left, def, ctx);\n }\n else {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handleCodecAResult(right, def, ctx));\n }\n return handleCodecAResult(right, def, ctx);\n }\n };\n});\nfunction handleCodecAResult(result, def, ctx) {\n if (result.issues.length) {\n // prevent further checks\n result.aborted = true;\n return result;\n }\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const transformed = def.transform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.out, ctx));\n }\n return handleCodecTxResult(result, transformed, def.out, ctx);\n }\n else {\n const transformed = def.reverseTransform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.in, ctx));\n }\n return handleCodecTxResult(result, transformed, def.in, ctx);\n }\n}\nfunction handleCodecTxResult(left, value, nextSchema, ctx) {\n // Check if transform added any issues\n if (left.issues.length) {\n left.aborted = true;\n return left;\n }\n return nextSchema._zod.run({ value, issues: left.issues }, ctx);\n}\nexport const $ZodReadonly = /*@__PURE__*/ core.$constructor(\"$ZodReadonly\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"propValues\", () => def.innerType._zod.propValues);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType?._zod?.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType?._zod?.optout);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then(handleReadonlyResult);\n }\n return handleReadonlyResult(result);\n };\n});\nfunction handleReadonlyResult(payload) {\n payload.value = Object.freeze(payload.value);\n return payload;\n}\nexport const $ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"$ZodTemplateLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n const regexParts = [];\n for (const part of def.parts) {\n if (typeof part === \"object\" && part !== null) {\n // is Zod schema\n if (!part._zod.pattern) {\n // if (!source)\n throw new Error(`Invalid template literal part, no pattern found: ${[...part._zod.traits].shift()}`);\n }\n const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern;\n if (!source)\n throw new Error(`Invalid template literal part: ${part._zod.traits}`);\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n regexParts.push(source.slice(start, end));\n }\n else if (part === null || util.primitiveTypes.has(typeof part)) {\n regexParts.push(util.escapeRegex(`${part}`));\n }\n else {\n throw new Error(`Invalid template literal part: ${part}`);\n }\n }\n inst._zod.pattern = new RegExp(`^${regexParts.join(\"\")}$`);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"string\") {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"string\",\n code: \"invalid_type\",\n });\n return payload;\n }\n inst._zod.pattern.lastIndex = 0;\n if (!inst._zod.pattern.test(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n code: \"invalid_format\",\n format: def.format ?? \"template_literal\",\n pattern: inst._zod.pattern.source,\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodFunction = /*@__PURE__*/ core.$constructor(\"$ZodFunction\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._def = def;\n inst._zod.def = def;\n inst.implement = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implement() must be called with a function\");\n }\n return function (...args) {\n const parsedArgs = inst._def.input ? parse(inst._def.input, args) : args;\n const result = Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return parse(inst._def.output, result);\n }\n return result;\n };\n };\n inst.implementAsync = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implementAsync() must be called with a function\");\n }\n return async function (...args) {\n const parsedArgs = inst._def.input ? await parseAsync(inst._def.input, args) : args;\n const result = await Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return await parseAsync(inst._def.output, result);\n }\n return result;\n };\n };\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"function\") {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"function\",\n input: payload.value,\n inst,\n });\n return payload;\n }\n // Check if output is a promise type to determine if we should use async implementation\n const hasPromiseOutput = inst._def.output && inst._def.output._zod.def.type === \"promise\";\n if (hasPromiseOutput) {\n payload.value = inst.implementAsync(payload.value);\n }\n else {\n payload.value = inst.implement(payload.value);\n }\n return payload;\n };\n inst.input = (...args) => {\n const F = inst.constructor;\n if (Array.isArray(args[0])) {\n return new F({\n type: \"function\",\n input: new $ZodTuple({\n type: \"tuple\",\n items: args[0],\n rest: args[1],\n }),\n output: inst._def.output,\n });\n }\n return new F({\n type: \"function\",\n input: args[0],\n output: inst._def.output,\n });\n };\n inst.output = (output) => {\n const F = inst.constructor;\n return new F({\n type: \"function\",\n input: inst._def.input,\n output,\n });\n };\n return inst;\n});\nexport const $ZodPromise = /*@__PURE__*/ core.$constructor(\"$ZodPromise\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n return Promise.resolve(payload.value).then((inner) => def.innerType._zod.run({ value: inner, issues: [] }, ctx));\n };\n});\nexport const $ZodLazy = /*@__PURE__*/ core.$constructor(\"$ZodLazy\", (inst, def) => {\n $ZodType.init(inst, def);\n // let _innerType!: any;\n // util.defineLazy(def, \"getter\", () => {\n // if (!_innerType) {\n // _innerType = def.getter();\n // }\n // return () => _innerType;\n // });\n util.defineLazy(inst._zod, \"innerType\", () => def.getter());\n util.defineLazy(inst._zod, \"pattern\", () => inst._zod.innerType?._zod?.pattern);\n util.defineLazy(inst._zod, \"propValues\", () => inst._zod.innerType?._zod?.propValues);\n util.defineLazy(inst._zod, \"optin\", () => inst._zod.innerType?._zod?.optin ?? undefined);\n util.defineLazy(inst._zod, \"optout\", () => inst._zod.innerType?._zod?.optout ?? undefined);\n inst._zod.parse = (payload, ctx) => {\n const inner = inst._zod.innerType;\n return inner._zod.run(payload, ctx);\n };\n});\nexport const $ZodCustom = /*@__PURE__*/ core.$constructor(\"$ZodCustom\", (inst, def) => {\n checks.$ZodCheck.init(inst, def);\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _) => {\n return payload;\n };\n inst._zod.check = (payload) => {\n const input = payload.value;\n const r = def.fn(input);\n if (r instanceof Promise) {\n return r.then((r) => handleRefineResult(r, payload, input, inst));\n }\n handleRefineResult(r, payload, input, inst);\n return;\n };\n});\nfunction handleRefineResult(result, payload, input, inst) {\n if (!result) {\n const _iss = {\n code: \"custom\",\n input,\n inst, // incorporates params.error into issue reporting\n path: [...(inst._zod.def.path ?? [])], // incorporates params.error into issue reporting\n continue: !inst._zod.def.abort,\n // params: inst._zod.def.params,\n };\n if (inst._zod.def.params)\n _iss.params = inst._zod.def.params;\n payload.issues.push(util.issue(_iss));\n }\n}\n", "export { default as ar } from \"./ar.js\";\nexport { default as az } from \"./az.js\";\nexport { default as be } from \"./be.js\";\nexport { default as bg } from \"./bg.js\";\nexport { default as ca } from \"./ca.js\";\nexport { default as cs } from \"./cs.js\";\nexport { default as da } from \"./da.js\";\nexport { default as de } from \"./de.js\";\nexport { default as en } from \"./en.js\";\nexport { default as eo } from \"./eo.js\";\nexport { default as es } from \"./es.js\";\nexport { default as fa } from \"./fa.js\";\nexport { default as fi } from \"./fi.js\";\nexport { default as fr } from \"./fr.js\";\nexport { default as frCA } from \"./fr-CA.js\";\nexport { default as he } from \"./he.js\";\nexport { default as hu } from \"./hu.js\";\nexport { default as hy } from \"./hy.js\";\nexport { default as id } from \"./id.js\";\nexport { default as is } from \"./is.js\";\nexport { default as it } from \"./it.js\";\nexport { default as ja } from \"./ja.js\";\nexport { default as ka } from \"./ka.js\";\nexport { default as kh } from \"./kh.js\";\nexport { default as km } from \"./km.js\";\nexport { default as ko } from \"./ko.js\";\nexport { default as lt } from \"./lt.js\";\nexport { default as mk } from \"./mk.js\";\nexport { default as ms } from \"./ms.js\";\nexport { default as nl } from \"./nl.js\";\nexport { default as no } from \"./no.js\";\nexport { default as ota } from \"./ota.js\";\nexport { default as ps } from \"./ps.js\";\nexport { default as pl } from \"./pl.js\";\nexport { default as pt } from \"./pt.js\";\nexport { default as ru } from \"./ru.js\";\nexport { default as sl } from \"./sl.js\";\nexport { default as sv } from \"./sv.js\";\nexport { default as ta } from \"./ta.js\";\nexport { default as th } from \"./th.js\";\nexport { default as tr } from \"./tr.js\";\nexport { default as ua } from \"./ua.js\";\nexport { default as uk } from \"./uk.js\";\nexport { default as ur } from \"./ur.js\";\nexport { default as uz } from \"./uz.js\";\nexport { default as vi } from \"./vi.js\";\nexport { default as zhCN } from \"./zh-CN.js\";\nexport { default as zhTW } from \"./zh-TW.js\";\nexport { default as yo } from \"./yo.js\";\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u062D\u0631\u0641\", verb: \"\u0623\u0646 \u064A\u062D\u0648\u064A\" },\n file: { unit: \"\u0628\u0627\u064A\u062A\", verb: \"\u0623\u0646 \u064A\u062D\u0648\u064A\" },\n array: { unit: \"\u0639\u0646\u0635\u0631\", verb: \"\u0623\u0646 \u064A\u062D\u0648\u064A\" },\n set: { unit: \"\u0639\u0646\u0635\u0631\", verb: \"\u0623\u0646 \u064A\u062D\u0648\u064A\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0645\u062F\u062E\u0644\",\n email: \"\u0628\u0631\u064A\u062F \u0625\u0644\u0643\u062A\u0631\u0648\u0646\u064A\",\n url: \"\u0631\u0627\u0628\u0637\",\n emoji: \"\u0625\u064A\u0645\u0648\u062C\u064A\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"\u062A\u0627\u0631\u064A\u062E \u0648\u0648\u0642\u062A \u0628\u0645\u0639\u064A\u0627\u0631 ISO\",\n date: \"\u062A\u0627\u0631\u064A\u062E \u0628\u0645\u0639\u064A\u0627\u0631 ISO\",\n time: \"\u0648\u0642\u062A \u0628\u0645\u0639\u064A\u0627\u0631 ISO\",\n duration: \"\u0645\u062F\u0629 \u0628\u0645\u0639\u064A\u0627\u0631 ISO\",\n ipv4: \"\u0639\u0646\u0648\u0627\u0646 IPv4\",\n ipv6: \"\u0639\u0646\u0648\u0627\u0646 IPv6\",\n cidrv4: \"\u0645\u062F\u0649 \u0639\u0646\u0627\u0648\u064A\u0646 \u0628\u0635\u064A\u063A\u0629 IPv4\",\n cidrv6: \"\u0645\u062F\u0649 \u0639\u0646\u0627\u0648\u064A\u0646 \u0628\u0635\u064A\u063A\u0629 IPv6\",\n base64: \"\u0646\u064E\u0635 \u0628\u062A\u0631\u0645\u064A\u0632 base64-encoded\",\n base64url: \"\u0646\u064E\u0635 \u0628\u062A\u0631\u0645\u064A\u0632 base64url-encoded\",\n json_string: \"\u0646\u064E\u0635 \u0639\u0644\u0649 \u0647\u064A\u0626\u0629 JSON\",\n e164: \"\u0631\u0642\u0645 \u0647\u0627\u062A\u0641 \u0628\u0645\u0639\u064A\u0627\u0631 E.164\",\n jwt: \"JWT\",\n template_literal: \"\u0645\u062F\u062E\u0644\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 instanceof ${issue.expected}\u060C \u0648\u0644\u0643\u0646 \u062A\u0645 \u0625\u062F\u062E\u0627\u0644 ${received}`;\n }\n return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 ${expected}\u060C \u0648\u0644\u0643\u0646 \u062A\u0645 \u0625\u062F\u062E\u0627\u0644 ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u0645\u062F\u062E\u0644\u0627\u062A \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\u0629: \u064A\u0641\u062A\u0631\u0636 \u0625\u062F\u062E\u0627\u0644 ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u0627\u062E\u062A\u064A\u0627\u0631 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062A\u0648\u0642\u0639 \u0627\u0646\u062A\u0642\u0627\u0621 \u0623\u062D\u062F \u0647\u0630\u0647 \u0627\u0644\u062E\u064A\u0627\u0631\u0627\u062A: ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return ` \u0623\u0643\u0628\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0623\u0646 \u062A\u0643\u0648\u0646 ${issue.origin ?? \"\u0627\u0644\u0642\u064A\u0645\u0629\"} ${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"\u0639\u0646\u0635\u0631\"}`;\n return `\u0623\u0643\u0628\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0623\u0646 \u062A\u0643\u0648\u0646 ${issue.origin ?? \"\u0627\u0644\u0642\u064A\u0645\u0629\"} ${adj} ${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u0623\u0635\u063A\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0644\u0640 ${issue.origin} \u0623\u0646 \u064A\u0643\u0648\u0646 ${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `\u0623\u0635\u063A\u0631 \u0645\u0646 \u0627\u0644\u0644\u0627\u0632\u0645: \u064A\u0641\u062A\u0631\u0636 \u0644\u0640 ${issue.origin} \u0623\u0646 \u064A\u0643\u0648\u0646 ${adj} ${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0628\u062F\u0623 \u0628\u0640 \"${issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0646\u062A\u0647\u064A \u0628\u0640 \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u062A\u0636\u0645\u0651\u064E\u0646 \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u0646\u064E\u0635 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0637\u0627\u0628\u0642 \u0627\u0644\u0646\u0645\u0637 ${_issue.pattern}`;\n return `${FormatDictionary[_issue.format] ?? issue.format} \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644`;\n }\n case \"not_multiple_of\":\n return `\u0631\u0642\u0645 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644: \u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0645\u0646 \u0645\u0636\u0627\u0639\u0641\u0627\u062A ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `\u0645\u0639\u0631\u0641${issue.keys.length > 1 ? \"\u0627\u062A\" : \"\"} \u063A\u0631\u064A\u0628${issue.keys.length > 1 ? \"\u0629\" : \"\"}: ${util.joinValues(issue.keys, \"\u060C \")}`;\n case \"invalid_key\":\n return `\u0645\u0639\u0631\u0641 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644 \u0641\u064A ${issue.origin}`;\n case \"invalid_union\":\n return \"\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\";\n case \"invalid_element\":\n return `\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644 \u0641\u064A ${issue.origin}`;\n default:\n return \"\u0645\u062F\u062E\u0644 \u063A\u064A\u0631 \u0645\u0642\u0628\u0648\u0644\";\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"simvol\", verb: \"olmal\u0131d\u0131r\" },\n file: { unit: \"bayt\", verb: \"olmal\u0131d\u0131r\" },\n array: { unit: \"element\", verb: \"olmal\u0131d\u0131r\" },\n set: { unit: \"element\", verb: \"olmal\u0131d\u0131r\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"input\",\n email: \"email address\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO datetime\",\n date: \"ISO date\",\n time: \"ISO time\",\n duration: \"ISO duration\",\n ipv4: \"IPv4 address\",\n ipv6: \"IPv6 address\",\n cidrv4: \"IPv4 range\",\n cidrv6: \"IPv6 range\",\n base64: \"base64-encoded string\",\n base64url: \"base64url-encoded string\",\n json_string: \"JSON string\",\n e164: \"E.164 number\",\n jwt: \"JWT\",\n template_literal: \"input\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Yanl\u0131\u015F d\u0259y\u0259r: g\u00F6zl\u0259nil\u0259n instanceof ${issue.expected}, daxil olan ${received}`;\n }\n return `Yanl\u0131\u015F d\u0259y\u0259r: g\u00F6zl\u0259nil\u0259n ${expected}, daxil olan ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Yanl\u0131\u015F d\u0259y\u0259r: g\u00F6zl\u0259nil\u0259n ${util.stringifyPrimitive(issue.values[0])}`;\n return `Yanl\u0131\u015F se\u00E7im: a\u015Fa\u011F\u0131dak\u0131lardan biri olmal\u0131d\u0131r: ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u00C7ox b\u00F6y\u00FCk: g\u00F6zl\u0259nil\u0259n ${issue.origin ?? \"d\u0259y\u0259r\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"element\"}`;\n return `\u00C7ox b\u00F6y\u00FCk: g\u00F6zl\u0259nil\u0259n ${issue.origin ?? \"d\u0259y\u0259r\"} ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u00C7ox ki\u00E7ik: g\u00F6zl\u0259nil\u0259n ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n return `\u00C7ox ki\u00E7ik: g\u00F6zl\u0259nil\u0259n ${issue.origin} ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Yanl\u0131\u015F m\u0259tn: \"${_issue.prefix}\" il\u0259 ba\u015Flamal\u0131d\u0131r`;\n if (_issue.format === \"ends_with\")\n return `Yanl\u0131\u015F m\u0259tn: \"${_issue.suffix}\" il\u0259 bitm\u0259lidir`;\n if (_issue.format === \"includes\")\n return `Yanl\u0131\u015F m\u0259tn: \"${_issue.includes}\" daxil olmal\u0131d\u0131r`;\n if (_issue.format === \"regex\")\n return `Yanl\u0131\u015F m\u0259tn: ${_issue.pattern} \u015Fablonuna uy\u011Fun olmal\u0131d\u0131r`;\n return `Yanl\u0131\u015F ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Yanl\u0131\u015F \u0259d\u0259d: ${issue.divisor} il\u0259 b\u00F6l\u00FCn\u0259 bil\u0259n olmal\u0131d\u0131r`;\n case \"unrecognized_keys\":\n return `Tan\u0131nmayan a\u00E7ar${issue.keys.length > 1 ? \"lar\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `${issue.origin} daxilind\u0259 yanl\u0131\u015F a\u00E7ar`;\n case \"invalid_union\":\n return \"Yanl\u0131\u015F d\u0259y\u0259r\";\n case \"invalid_element\":\n return `${issue.origin} daxilind\u0259 yanl\u0131\u015F d\u0259y\u0259r`;\n default:\n return `Yanl\u0131\u015F d\u0259y\u0259r`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nfunction getBelarusianPlural(count, one, few, many) {\n const absCount = Math.abs(count);\n const lastDigit = absCount % 10;\n const lastTwoDigits = absCount % 100;\n if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {\n return many;\n }\n if (lastDigit === 1) {\n return one;\n }\n if (lastDigit >= 2 && lastDigit <= 4) {\n return few;\n }\n return many;\n}\nconst error = () => {\n const Sizable = {\n string: {\n unit: {\n one: \"\u0441\u0456\u043C\u0432\u0430\u043B\",\n few: \"\u0441\u0456\u043C\u0432\u0430\u043B\u044B\",\n many: \"\u0441\u0456\u043C\u0432\u0430\u043B\u0430\u045E\",\n },\n verb: \"\u043C\u0435\u0446\u044C\",\n },\n array: {\n unit: {\n one: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\",\n few: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B\",\n many: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u045E\",\n },\n verb: \"\u043C\u0435\u0446\u044C\",\n },\n set: {\n unit: {\n one: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\",\n few: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u044B\",\n many: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\u045E\",\n },\n verb: \"\u043C\u0435\u0446\u044C\",\n },\n file: {\n unit: {\n one: \"\u0431\u0430\u0439\u0442\",\n few: \"\u0431\u0430\u0439\u0442\u044B\",\n many: \"\u0431\u0430\u0439\u0442\u0430\u045E\",\n },\n verb: \"\u043C\u0435\u0446\u044C\",\n },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0443\u0432\u043E\u0434\",\n email: \"email \u0430\u0434\u0440\u0430\u0441\",\n url: \"URL\",\n emoji: \"\u044D\u043C\u043E\u0434\u0437\u0456\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO \u0434\u0430\u0442\u0430 \u0456 \u0447\u0430\u0441\",\n date: \"ISO \u0434\u0430\u0442\u0430\",\n time: \"ISO \u0447\u0430\u0441\",\n duration: \"ISO \u043F\u0440\u0430\u0446\u044F\u0433\u043B\u0430\u0441\u0446\u044C\",\n ipv4: \"IPv4 \u0430\u0434\u0440\u0430\u0441\",\n ipv6: \"IPv6 \u0430\u0434\u0440\u0430\u0441\",\n cidrv4: \"IPv4 \u0434\u044B\u044F\u043F\u0430\u0437\u043E\u043D\",\n cidrv6: \"IPv6 \u0434\u044B\u044F\u043F\u0430\u0437\u043E\u043D\",\n base64: \"\u0440\u0430\u0434\u043E\u043A \u0443 \u0444\u0430\u0440\u043C\u0430\u0446\u0435 base64\",\n base64url: \"\u0440\u0430\u0434\u043E\u043A \u0443 \u0444\u0430\u0440\u043C\u0430\u0446\u0435 base64url\",\n json_string: \"JSON \u0440\u0430\u0434\u043E\u043A\",\n e164: \"\u043D\u0443\u043C\u0430\u0440 E.164\",\n jwt: \"JWT\",\n template_literal: \"\u0443\u0432\u043E\u0434\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u043B\u0456\u043A\",\n array: \"\u043C\u0430\u0441\u0456\u045E\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u045E\u0441\u044F instanceof ${issue.expected}, \u0430\u0442\u0440\u044B\u043C\u0430\u043D\u0430 ${received}`;\n }\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u045E\u0441\u044F ${expected}, \u0430\u0442\u0440\u044B\u043C\u0430\u043D\u0430 ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0432\u0430\u0440\u044B\u044F\u043D\u0442: \u0447\u0430\u043A\u0430\u045E\u0441\u044F \u0430\u0434\u0437\u0456\u043D \u0437 ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n const maxValue = Number(issue.maximum);\n const unit = getBelarusianPlural(maxValue, sizing.unit.one, sizing.unit.few, sizing.unit.many);\n return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u0432\u044F\u043B\u0456\u043A\u0456: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435\"} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 ${sizing.verb} ${adj}${issue.maximum.toString()} ${unit}`;\n }\n return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u0432\u044F\u043B\u0456\u043A\u0456: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435\"} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 \u0431\u044B\u0446\u044C ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n const minValue = Number(issue.minimum);\n const unit = getBelarusianPlural(minValue, sizing.unit.one, sizing.unit.few, sizing.unit.many);\n return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u043C\u0430\u043B\u044B: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue.origin} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 ${sizing.verb} ${adj}${issue.minimum.toString()} ${unit}`;\n }\n return `\u0417\u0430\u043D\u0430\u0434\u0442\u0430 \u043C\u0430\u043B\u044B: \u0447\u0430\u043A\u0430\u043B\u0430\u0441\u044F, \u0448\u0442\u043E ${issue.origin} \u043F\u0430\u0432\u0456\u043D\u043D\u0430 \u0431\u044B\u0446\u044C ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u043F\u0430\u0447\u044B\u043D\u0430\u0446\u0446\u0430 \u0437 \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0437\u0430\u043A\u0430\u043D\u0447\u0432\u0430\u0446\u0446\u0430 \u043D\u0430 \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0437\u043C\u044F\u0448\u0447\u0430\u0446\u044C \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u0440\u0430\u0434\u043E\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0430\u0434\u043F\u0430\u0432\u044F\u0434\u0430\u0446\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`;\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u043B\u0456\u043A: \u043F\u0430\u0432\u0456\u043D\u0435\u043D \u0431\u044B\u0446\u044C \u043A\u0440\u0430\u0442\u043D\u044B\u043C ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `\u041D\u0435\u0440\u0430\u0441\u043F\u0430\u0437\u043D\u0430\u043D\u044B ${issue.keys.length > 1 ? \"\u043A\u043B\u044E\u0447\u044B\" : \"\u043A\u043B\u044E\u0447\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u043A\u043B\u044E\u0447 \u0443 ${issue.origin}`;\n case \"invalid_union\":\n return \"\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434\";\n case \"invalid_element\":\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u0430\u0435 \u0437\u043D\u0430\u0447\u044D\u043D\u043D\u0435 \u045E ${issue.origin}`;\n default:\n return `\u041D\u044F\u043F\u0440\u0430\u0432\u0456\u043B\u044C\u043D\u044B \u045E\u0432\u043E\u0434`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u0441\u0438\u043C\u0432\u043E\u043B\u0430\", verb: \"\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\" },\n file: { unit: \"\u0431\u0430\u0439\u0442\u0430\", verb: \"\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\" },\n array: { unit: \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430\", verb: \"\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\" },\n set: { unit: \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430\", verb: \"\u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0432\u0445\u043E\u0434\",\n email: \"\u0438\u043C\u0435\u0439\u043B \u0430\u0434\u0440\u0435\u0441\",\n url: \"URL\",\n emoji: \"\u0435\u043C\u043E\u0434\u0436\u0438\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO \u0432\u0440\u0435\u043C\u0435\",\n date: \"ISO \u0434\u0430\u0442\u0430\",\n time: \"ISO \u0432\u0440\u0435\u043C\u0435\",\n duration: \"ISO \u043F\u0440\u043E\u0434\u044A\u043B\u0436\u0438\u0442\u0435\u043B\u043D\u043E\u0441\u0442\",\n ipv4: \"IPv4 \u0430\u0434\u0440\u0435\u0441\",\n ipv6: \"IPv6 \u0430\u0434\u0440\u0435\u0441\",\n cidrv4: \"IPv4 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\",\n cidrv6: \"IPv6 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\",\n base64: \"base64-\u043A\u043E\u0434\u0438\u0440\u0430\u043D \u043D\u0438\u0437\",\n base64url: \"base64url-\u043A\u043E\u0434\u0438\u0440\u0430\u043D \u043D\u0438\u0437\",\n json_string: \"JSON \u043D\u0438\u0437\",\n e164: \"E.164 \u043D\u043E\u043C\u0435\u0440\",\n jwt: \"JWT\",\n template_literal: \"\u0432\u0445\u043E\u0434\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0447\u0438\u0441\u043B\u043E\",\n array: \"\u043C\u0430\u0441\u0438\u0432\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434: \u043E\u0447\u0430\u043A\u0432\u0430\u043D instanceof ${issue.expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D ${received}`;\n }\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434: \u043E\u0447\u0430\u043A\u0432\u0430\u043D ${expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434: \u043E\u0447\u0430\u043A\u0432\u0430\u043D ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430 \u043E\u043F\u0446\u0438\u044F: \u043E\u0447\u0430\u043A\u0432\u0430\u043D\u043E \u0435\u0434\u043D\u043E \u043E\u0442 ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u0422\u0432\u044A\u0440\u0434\u0435 \u0433\u043E\u043B\u044F\u043C\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue.origin ?? \"\u0441\u0442\u043E\u0439\u043D\u043E\u0441\u0442\"} \u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430 ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430\"}`;\n return `\u0422\u0432\u044A\u0440\u0434\u0435 \u0433\u043E\u043B\u044F\u043C\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue.origin ?? \"\u0441\u0442\u043E\u0439\u043D\u043E\u0441\u0442\"} \u0434\u0430 \u0431\u044A\u0434\u0435 ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u0422\u0432\u044A\u0440\u0434\u0435 \u043C\u0430\u043B\u043A\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue.origin} \u0434\u0430 \u0441\u044A\u0434\u044A\u0440\u0436\u0430 ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `\u0422\u0432\u044A\u0440\u0434\u0435 \u043C\u0430\u043B\u043A\u043E: \u043E\u0447\u0430\u043A\u0432\u0430 \u0441\u0435 ${issue.origin} \u0434\u0430 \u0431\u044A\u0434\u0435 ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0437\u0430\u043F\u043E\u0447\u0432\u0430 \u0441 \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0437\u0430\u0432\u044A\u0440\u0448\u0432\u0430 \u0441 \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0432\u043A\u043B\u044E\u0447\u0432\u0430 \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043D\u0438\u0437: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0441\u044A\u0432\u043F\u0430\u0434\u0430 \u0441 ${_issue.pattern}`;\n let invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D\";\n if (_issue.format === \"emoji\")\n invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E\";\n if (_issue.format === \"datetime\")\n invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E\";\n if (_issue.format === \"date\")\n invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430\";\n if (_issue.format === \"time\")\n invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E\";\n if (_issue.format === \"duration\")\n invalid_adj = \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430\";\n return `${invalid_adj} ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u043E \u0447\u0438\u0441\u043B\u043E: \u0442\u0440\u044F\u0431\u0432\u0430 \u0434\u0430 \u0431\u044A\u0434\u0435 \u043A\u0440\u0430\u0442\u043D\u043E \u043D\u0430 ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `\u041D\u0435\u0440\u0430\u0437\u043F\u043E\u0437\u043D\u0430\u0442${issue.keys.length > 1 ? \"\u0438\" : \"\"} \u043A\u043B\u044E\u0447${issue.keys.length > 1 ? \"\u043E\u0432\u0435\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u043A\u043B\u044E\u0447 \u0432 ${issue.origin}`;\n case \"invalid_union\":\n return \"\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434\";\n case \"invalid_element\":\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u0430 \u0441\u0442\u043E\u0439\u043D\u043E\u0441\u0442 \u0432 ${issue.origin}`;\n default:\n return `\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u0435\u043D \u0432\u0445\u043E\u0434`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"car\u00E0cters\", verb: \"contenir\" },\n file: { unit: \"bytes\", verb: \"contenir\" },\n array: { unit: \"elements\", verb: \"contenir\" },\n set: { unit: \"elements\", verb: \"contenir\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"entrada\",\n email: \"adre\u00E7a electr\u00F2nica\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"data i hora ISO\",\n date: \"data ISO\",\n time: \"hora ISO\",\n duration: \"durada ISO\",\n ipv4: \"adre\u00E7a IPv4\",\n ipv6: \"adre\u00E7a IPv6\",\n cidrv4: \"rang IPv4\",\n cidrv6: \"rang IPv6\",\n base64: \"cadena codificada en base64\",\n base64url: \"cadena codificada en base64url\",\n json_string: \"cadena JSON\",\n e164: \"n\u00FAmero E.164\",\n jwt: \"JWT\",\n template_literal: \"entrada\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Tipus inv\u00E0lid: s'esperava instanceof ${issue.expected}, s'ha rebut ${received}`;\n }\n return `Tipus inv\u00E0lid: s'esperava ${expected}, s'ha rebut ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Valor inv\u00E0lid: s'esperava ${util.stringifyPrimitive(issue.values[0])}`;\n return `Opci\u00F3 inv\u00E0lida: s'esperava una de ${util.joinValues(issue.values, \" o \")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"com a m\u00E0xim\" : \"menys de\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Massa gran: s'esperava que ${issue.origin ?? \"el valor\"} contingu\u00E9s ${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"elements\"}`;\n return `Massa gran: s'esperava que ${issue.origin ?? \"el valor\"} fos ${adj} ${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \"com a m\u00EDnim\" : \"m\u00E9s de\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Massa petit: s'esperava que ${issue.origin} contingu\u00E9s ${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Massa petit: s'esperava que ${issue.origin} fos ${adj} ${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `Format inv\u00E0lid: ha de comen\u00E7ar amb \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `Format inv\u00E0lid: ha d'acabar amb \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Format inv\u00E0lid: ha d'incloure \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Format inv\u00E0lid: ha de coincidir amb el patr\u00F3 ${_issue.pattern}`;\n return `Format inv\u00E0lid per a ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `N\u00FAmero inv\u00E0lid: ha de ser m\u00FAltiple de ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Clau${issue.keys.length > 1 ? \"s\" : \"\"} no reconeguda${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Clau inv\u00E0lida a ${issue.origin}`;\n case \"invalid_union\":\n return \"Entrada inv\u00E0lida\"; // Could also be \"Tipus d'uni\u00F3 inv\u00E0lid\" but \"Entrada inv\u00E0lida\" is more general\n case \"invalid_element\":\n return `Element inv\u00E0lid a ${issue.origin}`;\n default:\n return `Entrada inv\u00E0lida`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"znak\u016F\", verb: \"m\u00EDt\" },\n file: { unit: \"bajt\u016F\", verb: \"m\u00EDt\" },\n array: { unit: \"prvk\u016F\", verb: \"m\u00EDt\" },\n set: { unit: \"prvk\u016F\", verb: \"m\u00EDt\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"regul\u00E1rn\u00ED v\u00FDraz\",\n email: \"e-mailov\u00E1 adresa\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"datum a \u010Das ve form\u00E1tu ISO\",\n date: \"datum ve form\u00E1tu ISO\",\n time: \"\u010Das ve form\u00E1tu ISO\",\n duration: \"doba trv\u00E1n\u00ED ISO\",\n ipv4: \"IPv4 adresa\",\n ipv6: \"IPv6 adresa\",\n cidrv4: \"rozsah IPv4\",\n cidrv6: \"rozsah IPv6\",\n base64: \"\u0159et\u011Bzec zak\u00F3dovan\u00FD ve form\u00E1tu base64\",\n base64url: \"\u0159et\u011Bzec zak\u00F3dovan\u00FD ve form\u00E1tu base64url\",\n json_string: \"\u0159et\u011Bzec ve form\u00E1tu JSON\",\n e164: \"\u010D\u00EDslo E.164\",\n jwt: \"JWT\",\n template_literal: \"vstup\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u010D\u00EDslo\",\n string: \"\u0159et\u011Bzec\",\n function: \"funkce\",\n array: \"pole\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Neplatn\u00FD vstup: o\u010Dek\u00E1v\u00E1no instanceof ${issue.expected}, obdr\u017Eeno ${received}`;\n }\n return `Neplatn\u00FD vstup: o\u010Dek\u00E1v\u00E1no ${expected}, obdr\u017Eeno ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Neplatn\u00FD vstup: o\u010Dek\u00E1v\u00E1no ${util.stringifyPrimitive(issue.values[0])}`;\n return `Neplatn\u00E1 mo\u017Enost: o\u010Dek\u00E1v\u00E1na jedna z hodnot ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Hodnota je p\u0159\u00EDli\u0161 velk\u00E1: ${issue.origin ?? \"hodnota\"} mus\u00ED m\u00EDt ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"prvk\u016F\"}`;\n }\n return `Hodnota je p\u0159\u00EDli\u0161 velk\u00E1: ${issue.origin ?? \"hodnota\"} mus\u00ED b\u00FDt ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Hodnota je p\u0159\u00EDli\u0161 mal\u00E1: ${issue.origin ?? \"hodnota\"} mus\u00ED m\u00EDt ${adj}${issue.minimum.toString()} ${sizing.unit ?? \"prvk\u016F\"}`;\n }\n return `Hodnota je p\u0159\u00EDli\u0161 mal\u00E1: ${issue.origin ?? \"hodnota\"} mus\u00ED b\u00FDt ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Neplatn\u00FD \u0159et\u011Bzec: mus\u00ED za\u010D\u00EDnat na \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Neplatn\u00FD \u0159et\u011Bzec: mus\u00ED kon\u010Dit na \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Neplatn\u00FD \u0159et\u011Bzec: mus\u00ED obsahovat \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Neplatn\u00FD \u0159et\u011Bzec: mus\u00ED odpov\u00EDdat vzoru ${_issue.pattern}`;\n return `Neplatn\u00FD form\u00E1t ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Neplatn\u00E9 \u010D\u00EDslo: mus\u00ED b\u00FDt n\u00E1sobkem ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Nezn\u00E1m\u00E9 kl\u00ED\u010De: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Neplatn\u00FD kl\u00ED\u010D v ${issue.origin}`;\n case \"invalid_union\":\n return \"Neplatn\u00FD vstup\";\n case \"invalid_element\":\n return `Neplatn\u00E1 hodnota v ${issue.origin}`;\n default:\n return `Neplatn\u00FD vstup`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"tegn\", verb: \"havde\" },\n file: { unit: \"bytes\", verb: \"havde\" },\n array: { unit: \"elementer\", verb: \"indeholdt\" },\n set: { unit: \"elementer\", verb: \"indeholdt\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"input\",\n email: \"e-mailadresse\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO dato- og klokkesl\u00E6t\",\n date: \"ISO-dato\",\n time: \"ISO-klokkesl\u00E6t\",\n duration: \"ISO-varighed\",\n ipv4: \"IPv4-omr\u00E5de\",\n ipv6: \"IPv6-omr\u00E5de\",\n cidrv4: \"IPv4-spektrum\",\n cidrv6: \"IPv6-spektrum\",\n base64: \"base64-kodet streng\",\n base64url: \"base64url-kodet streng\",\n json_string: \"JSON-streng\",\n e164: \"E.164-nummer\",\n jwt: \"JWT\",\n template_literal: \"input\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n string: \"streng\",\n number: \"tal\",\n boolean: \"boolean\",\n array: \"liste\",\n object: \"objekt\",\n set: \"s\u00E6t\",\n file: \"fil\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Ugyldigt input: forventede instanceof ${issue.expected}, fik ${received}`;\n }\n return `Ugyldigt input: forventede ${expected}, fik ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Ugyldig v\u00E6rdi: forventede ${util.stringifyPrimitive(issue.values[0])}`;\n return `Ugyldigt valg: forventede en af f\u00F8lgende ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n const origin = TypeDictionary[issue.origin] ?? issue.origin;\n if (sizing)\n return `For stor: forventede ${origin ?? \"value\"} ${sizing.verb} ${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"elementer\"}`;\n return `For stor: forventede ${origin ?? \"value\"} havde ${adj} ${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n const origin = TypeDictionary[issue.origin] ?? issue.origin;\n if (sizing) {\n return `For lille: forventede ${origin} ${sizing.verb} ${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `For lille: forventede ${origin} havde ${adj} ${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Ugyldig streng: skal starte med \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Ugyldig streng: skal ende med \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Ugyldig streng: skal indeholde \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Ugyldig streng: skal matche m\u00F8nsteret ${_issue.pattern}`;\n return `Ugyldig ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Ugyldigt tal: skal v\u00E6re deleligt med ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `${issue.keys.length > 1 ? \"Ukendte n\u00F8gler\" : \"Ukendt n\u00F8gle\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Ugyldig n\u00F8gle i ${issue.origin}`;\n case \"invalid_union\":\n return \"Ugyldigt input: matcher ingen af de tilladte typer\";\n case \"invalid_element\":\n return `Ugyldig v\u00E6rdi i ${issue.origin}`;\n default:\n return `Ugyldigt input`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"Zeichen\", verb: \"zu haben\" },\n file: { unit: \"Bytes\", verb: \"zu haben\" },\n array: { unit: \"Elemente\", verb: \"zu haben\" },\n set: { unit: \"Elemente\", verb: \"zu haben\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"Eingabe\",\n email: \"E-Mail-Adresse\",\n url: \"URL\",\n emoji: \"Emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO-Datum und -Uhrzeit\",\n date: \"ISO-Datum\",\n time: \"ISO-Uhrzeit\",\n duration: \"ISO-Dauer\",\n ipv4: \"IPv4-Adresse\",\n ipv6: \"IPv6-Adresse\",\n cidrv4: \"IPv4-Bereich\",\n cidrv6: \"IPv6-Bereich\",\n base64: \"Base64-codierter String\",\n base64url: \"Base64-URL-codierter String\",\n json_string: \"JSON-String\",\n e164: \"E.164-Nummer\",\n jwt: \"JWT\",\n template_literal: \"Eingabe\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"Zahl\",\n array: \"Array\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Ung\u00FCltige Eingabe: erwartet instanceof ${issue.expected}, erhalten ${received}`;\n }\n return `Ung\u00FCltige Eingabe: erwartet ${expected}, erhalten ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Ung\u00FCltige Eingabe: erwartet ${util.stringifyPrimitive(issue.values[0])}`;\n return `Ung\u00FCltige Option: erwartet eine von ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Zu gro\u00DF: erwartet, dass ${issue.origin ?? \"Wert\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"Elemente\"} hat`;\n return `Zu gro\u00DF: erwartet, dass ${issue.origin ?? \"Wert\"} ${adj}${issue.maximum.toString()} ist`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Zu klein: erwartet, dass ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit} hat`;\n }\n return `Zu klein: erwartet, dass ${issue.origin} ${adj}${issue.minimum.toString()} ist`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Ung\u00FCltiger String: muss mit \"${_issue.prefix}\" beginnen`;\n if (_issue.format === \"ends_with\")\n return `Ung\u00FCltiger String: muss mit \"${_issue.suffix}\" enden`;\n if (_issue.format === \"includes\")\n return `Ung\u00FCltiger String: muss \"${_issue.includes}\" enthalten`;\n if (_issue.format === \"regex\")\n return `Ung\u00FCltiger String: muss dem Muster ${_issue.pattern} entsprechen`;\n return `Ung\u00FCltig: ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Ung\u00FCltige Zahl: muss ein Vielfaches von ${issue.divisor} sein`;\n case \"unrecognized_keys\":\n return `${issue.keys.length > 1 ? \"Unbekannte Schl\u00FCssel\" : \"Unbekannter Schl\u00FCssel\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Ung\u00FCltiger Schl\u00FCssel in ${issue.origin}`;\n case \"invalid_union\":\n return \"Ung\u00FCltige Eingabe\";\n case \"invalid_element\":\n return `Ung\u00FCltiger Wert in ${issue.origin}`;\n default:\n return `Ung\u00FCltige Eingabe`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"characters\", verb: \"to have\" },\n file: { unit: \"bytes\", verb: \"to have\" },\n array: { unit: \"items\", verb: \"to have\" },\n set: { unit: \"items\", verb: \"to have\" },\n map: { unit: \"entries\", verb: \"to have\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"input\",\n email: \"email address\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO datetime\",\n date: \"ISO date\",\n time: \"ISO time\",\n duration: \"ISO duration\",\n ipv4: \"IPv4 address\",\n ipv6: \"IPv6 address\",\n mac: \"MAC address\",\n cidrv4: \"IPv4 range\",\n cidrv6: \"IPv6 range\",\n base64: \"base64-encoded string\",\n base64url: \"base64url-encoded string\",\n json_string: \"JSON string\",\n e164: \"E.164 number\",\n jwt: \"JWT\",\n template_literal: \"input\",\n };\n // type names: missing keys = do not translate (use raw value via ?? fallback)\n const TypeDictionary = {\n // Compatibility: \"nan\" -> \"NaN\" for display\n nan: \"NaN\",\n // All other type names omitted - they fall back to raw values via ?? operator\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n return `Invalid input: expected ${expected}, received ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Invalid input: expected ${util.stringifyPrimitive(issue.values[0])}`;\n return `Invalid option: expected one of ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Too big: expected ${issue.origin ?? \"value\"} to have ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elements\"}`;\n return `Too big: expected ${issue.origin ?? \"value\"} to be ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Too small: expected ${issue.origin} to have ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Too small: expected ${issue.origin} to be ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `Invalid string: must start with \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `Invalid string: must end with \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Invalid string: must include \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Invalid string: must match pattern ${_issue.pattern}`;\n return `Invalid ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Invalid number: must be a multiple of ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Unrecognized key${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Invalid key in ${issue.origin}`;\n case \"invalid_union\":\n return \"Invalid input\";\n case \"invalid_element\":\n return `Invalid value in ${issue.origin}`;\n default:\n return `Invalid input`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"karaktrojn\", verb: \"havi\" },\n file: { unit: \"bajtojn\", verb: \"havi\" },\n array: { unit: \"elementojn\", verb: \"havi\" },\n set: { unit: \"elementojn\", verb: \"havi\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"enigo\",\n email: \"retadreso\",\n url: \"URL\",\n emoji: \"emo\u011Dio\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO-datotempo\",\n date: \"ISO-dato\",\n time: \"ISO-tempo\",\n duration: \"ISO-da\u016Dro\",\n ipv4: \"IPv4-adreso\",\n ipv6: \"IPv6-adreso\",\n cidrv4: \"IPv4-rango\",\n cidrv6: \"IPv6-rango\",\n base64: \"64-ume kodita karaktraro\",\n base64url: \"URL-64-ume kodita karaktraro\",\n json_string: \"JSON-karaktraro\",\n e164: \"E.164-nombro\",\n jwt: \"JWT\",\n template_literal: \"enigo\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"nombro\",\n array: \"tabelo\",\n null: \"senvalora\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Nevalida enigo: atendi\u011Dis instanceof ${issue.expected}, ricevi\u011Dis ${received}`;\n }\n return `Nevalida enigo: atendi\u011Dis ${expected}, ricevi\u011Dis ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Nevalida enigo: atendi\u011Dis ${util.stringifyPrimitive(issue.values[0])}`;\n return `Nevalida opcio: atendi\u011Dis unu el ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Tro granda: atendi\u011Dis ke ${issue.origin ?? \"valoro\"} havu ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementojn\"}`;\n return `Tro granda: atendi\u011Dis ke ${issue.origin ?? \"valoro\"} havu ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Tro malgranda: atendi\u011Dis ke ${issue.origin} havu ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Tro malgranda: atendi\u011Dis ke ${issue.origin} estu ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Nevalida karaktraro: devas komenci\u011Di per \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Nevalida karaktraro: devas fini\u011Di per \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Nevalida karaktraro: devas inkluzivi \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Nevalida karaktraro: devas kongrui kun la modelo ${_issue.pattern}`;\n return `Nevalida ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Nevalida nombro: devas esti oblo de ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Nekonata${issue.keys.length > 1 ? \"j\" : \"\"} \u015Dlosilo${issue.keys.length > 1 ? \"j\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Nevalida \u015Dlosilo en ${issue.origin}`;\n case \"invalid_union\":\n return \"Nevalida enigo\";\n case \"invalid_element\":\n return `Nevalida valoro en ${issue.origin}`;\n default:\n return `Nevalida enigo`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"caracteres\", verb: \"tener\" },\n file: { unit: \"bytes\", verb: \"tener\" },\n array: { unit: \"elementos\", verb: \"tener\" },\n set: { unit: \"elementos\", verb: \"tener\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"entrada\",\n email: \"direcci\u00F3n de correo electr\u00F3nico\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"fecha y hora ISO\",\n date: \"fecha ISO\",\n time: \"hora ISO\",\n duration: \"duraci\u00F3n ISO\",\n ipv4: \"direcci\u00F3n IPv4\",\n ipv6: \"direcci\u00F3n IPv6\",\n cidrv4: \"rango IPv4\",\n cidrv6: \"rango IPv6\",\n base64: \"cadena codificada en base64\",\n base64url: \"URL codificada en base64\",\n json_string: \"cadena JSON\",\n e164: \"n\u00FAmero E.164\",\n jwt: \"JWT\",\n template_literal: \"entrada\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n string: \"texto\",\n number: \"n\u00FAmero\",\n boolean: \"booleano\",\n array: \"arreglo\",\n object: \"objeto\",\n set: \"conjunto\",\n file: \"archivo\",\n date: \"fecha\",\n bigint: \"n\u00FAmero grande\",\n symbol: \"s\u00EDmbolo\",\n undefined: \"indefinido\",\n null: \"nulo\",\n function: \"funci\u00F3n\",\n map: \"mapa\",\n record: \"registro\",\n tuple: \"tupla\",\n enum: \"enumeraci\u00F3n\",\n union: \"uni\u00F3n\",\n literal: \"literal\",\n promise: \"promesa\",\n void: \"vac\u00EDo\",\n never: \"nunca\",\n unknown: \"desconocido\",\n any: \"cualquiera\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Entrada inv\u00E1lida: se esperaba instanceof ${issue.expected}, recibido ${received}`;\n }\n return `Entrada inv\u00E1lida: se esperaba ${expected}, recibido ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Entrada inv\u00E1lida: se esperaba ${util.stringifyPrimitive(issue.values[0])}`;\n return `Opci\u00F3n inv\u00E1lida: se esperaba una de ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n const origin = TypeDictionary[issue.origin] ?? issue.origin;\n if (sizing)\n return `Demasiado grande: se esperaba que ${origin ?? \"valor\"} tuviera ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementos\"}`;\n return `Demasiado grande: se esperaba que ${origin ?? \"valor\"} fuera ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n const origin = TypeDictionary[issue.origin] ?? issue.origin;\n if (sizing) {\n return `Demasiado peque\u00F1o: se esperaba que ${origin} tuviera ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Demasiado peque\u00F1o: se esperaba que ${origin} fuera ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Cadena inv\u00E1lida: debe comenzar con \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Cadena inv\u00E1lida: debe terminar en \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Cadena inv\u00E1lida: debe incluir \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Cadena inv\u00E1lida: debe coincidir con el patr\u00F3n ${_issue.pattern}`;\n return `Inv\u00E1lido ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `N\u00FAmero inv\u00E1lido: debe ser m\u00FAltiplo de ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Llave${issue.keys.length > 1 ? \"s\" : \"\"} desconocida${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Llave inv\u00E1lida en ${TypeDictionary[issue.origin] ?? issue.origin}`;\n case \"invalid_union\":\n return \"Entrada inv\u00E1lida\";\n case \"invalid_element\":\n return `Valor inv\u00E1lido en ${TypeDictionary[issue.origin] ?? issue.origin}`;\n default:\n return `Entrada inv\u00E1lida`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u06A9\u0627\u0631\u0627\u06A9\u062A\u0631\", verb: \"\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F\" },\n file: { unit: \"\u0628\u0627\u06CC\u062A\", verb: \"\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F\" },\n array: { unit: \"\u0622\u06CC\u062A\u0645\", verb: \"\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F\" },\n set: { unit: \"\u0622\u06CC\u062A\u0645\", verb: \"\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0648\u0631\u0648\u062F\u06CC\",\n email: \"\u0622\u062F\u0631\u0633 \u0627\u06CC\u0645\u06CC\u0644\",\n url: \"URL\",\n emoji: \"\u0627\u06CC\u0645\u0648\u062C\u06CC\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"\u062A\u0627\u0631\u06CC\u062E \u0648 \u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648\",\n date: \"\u062A\u0627\u0631\u06CC\u062E \u0627\u06CC\u0632\u0648\",\n time: \"\u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648\",\n duration: \"\u0645\u062F\u062A \u0632\u0645\u0627\u0646 \u0627\u06CC\u0632\u0648\",\n ipv4: \"IPv4 \u0622\u062F\u0631\u0633\",\n ipv6: \"IPv6 \u0622\u062F\u0631\u0633\",\n cidrv4: \"IPv4 \u062F\u0627\u0645\u0646\u0647\",\n cidrv6: \"IPv6 \u062F\u0627\u0645\u0646\u0647\",\n base64: \"base64-encoded \u0631\u0634\u062A\u0647\",\n base64url: \"base64url-encoded \u0631\u0634\u062A\u0647\",\n json_string: \"JSON \u0631\u0634\u062A\u0647\",\n e164: \"E.164 \u0639\u062F\u062F\",\n jwt: \"JWT\",\n template_literal: \"\u0648\u0631\u0648\u062F\u06CC\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0639\u062F\u062F\",\n array: \"\u0622\u0631\u0627\u06CC\u0647\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A instanceof ${issue.expected} \u0645\u06CC\u200C\u0628\u0648\u062F\u060C ${received} \u062F\u0631\u06CC\u0627\u0641\u062A \u0634\u062F`;\n }\n return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A ${expected} \u0645\u06CC\u200C\u0628\u0648\u062F\u060C ${received} \u062F\u0631\u06CC\u0627\u0641\u062A \u0634\u062F`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1) {\n return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A ${util.stringifyPrimitive(issue.values[0])} \u0645\u06CC\u200C\u0628\u0648\u062F`;\n }\n return `\u06AF\u0632\u06CC\u0646\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0645\u06CC\u200C\u0628\u0627\u06CC\u0633\u062A \u06CC\u06A9\u06CC \u0627\u0632 ${util.joinValues(issue.values, \"|\")} \u0645\u06CC\u200C\u0628\u0648\u062F`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u062E\u06CC\u0644\u06CC \u0628\u0632\u0631\u06AF: ${issue.origin ?? \"\u0645\u0642\u062F\u0627\u0631\"} \u0628\u0627\u06CC\u062F ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0639\u0646\u0635\u0631\"} \u0628\u0627\u0634\u062F`;\n }\n return `\u062E\u06CC\u0644\u06CC \u0628\u0632\u0631\u06AF: ${issue.origin ?? \"\u0645\u0642\u062F\u0627\u0631\"} \u0628\u0627\u06CC\u062F ${adj}${issue.maximum.toString()} \u0628\u0627\u0634\u062F`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u062E\u06CC\u0644\u06CC \u06A9\u0648\u0686\u06A9: ${issue.origin} \u0628\u0627\u06CC\u062F ${adj}${issue.minimum.toString()} ${sizing.unit} \u0628\u0627\u0634\u062F`;\n }\n return `\u062E\u06CC\u0644\u06CC \u06A9\u0648\u0686\u06A9: ${issue.origin} \u0628\u0627\u06CC\u062F ${adj}${issue.minimum.toString()} \u0628\u0627\u0634\u062F`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 \"${_issue.prefix}\" \u0634\u0631\u0648\u0639 \u0634\u0648\u062F`;\n }\n if (_issue.format === \"ends_with\") {\n return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 \"${_issue.suffix}\" \u062A\u0645\u0627\u0645 \u0634\u0648\u062F`;\n }\n if (_issue.format === \"includes\") {\n return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0634\u0627\u0645\u0644 \"${_issue.includes}\" \u0628\u0627\u0634\u062F`;\n }\n if (_issue.format === \"regex\") {\n return `\u0631\u0634\u062A\u0647 \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0628\u0627 \u0627\u0644\u06AF\u0648\u06CC ${_issue.pattern} \u0645\u0637\u0627\u0628\u0642\u062A \u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F`;\n }\n return `${FormatDictionary[_issue.format] ?? issue.format} \u0646\u0627\u0645\u0639\u062A\u0628\u0631`;\n }\n case \"not_multiple_of\":\n return `\u0639\u062F\u062F \u0646\u0627\u0645\u0639\u062A\u0628\u0631: \u0628\u0627\u06CC\u062F \u0645\u0636\u0631\u0628 ${issue.divisor} \u0628\u0627\u0634\u062F`;\n case \"unrecognized_keys\":\n return `\u06A9\u0644\u06CC\u062F${issue.keys.length > 1 ? \"\u0647\u0627\u06CC\" : \"\"} \u0646\u0627\u0634\u0646\u0627\u0633: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u06A9\u0644\u06CC\u062F \u0646\u0627\u0634\u0646\u0627\u0633 \u062F\u0631 ${issue.origin}`;\n case \"invalid_union\":\n return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631`;\n case \"invalid_element\":\n return `\u0645\u0642\u062F\u0627\u0631 \u0646\u0627\u0645\u0639\u062A\u0628\u0631 \u062F\u0631 ${issue.origin}`;\n default:\n return `\u0648\u0631\u0648\u062F\u06CC \u0646\u0627\u0645\u0639\u062A\u0628\u0631`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"merkki\u00E4\", subject: \"merkkijonon\" },\n file: { unit: \"tavua\", subject: \"tiedoston\" },\n array: { unit: \"alkiota\", subject: \"listan\" },\n set: { unit: \"alkiota\", subject: \"joukon\" },\n number: { unit: \"\", subject: \"luvun\" },\n bigint: { unit: \"\", subject: \"suuren kokonaisluvun\" },\n int: { unit: \"\", subject: \"kokonaisluvun\" },\n date: { unit: \"\", subject: \"p\u00E4iv\u00E4m\u00E4\u00E4r\u00E4n\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"s\u00E4\u00E4nn\u00F6llinen lauseke\",\n email: \"s\u00E4hk\u00F6postiosoite\",\n url: \"URL-osoite\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO-aikaleima\",\n date: \"ISO-p\u00E4iv\u00E4m\u00E4\u00E4r\u00E4\",\n time: \"ISO-aika\",\n duration: \"ISO-kesto\",\n ipv4: \"IPv4-osoite\",\n ipv6: \"IPv6-osoite\",\n cidrv4: \"IPv4-alue\",\n cidrv6: \"IPv6-alue\",\n base64: \"base64-koodattu merkkijono\",\n base64url: \"base64url-koodattu merkkijono\",\n json_string: \"JSON-merkkijono\",\n e164: \"E.164-luku\",\n jwt: \"JWT\",\n template_literal: \"templaattimerkkijono\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Virheellinen tyyppi: odotettiin instanceof ${issue.expected}, oli ${received}`;\n }\n return `Virheellinen tyyppi: odotettiin ${expected}, oli ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Virheellinen sy\u00F6te: t\u00E4ytyy olla ${util.stringifyPrimitive(issue.values[0])}`;\n return `Virheellinen valinta: t\u00E4ytyy olla yksi seuraavista: ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Liian suuri: ${sizing.subject} t\u00E4ytyy olla ${adj}${issue.maximum.toString()} ${sizing.unit}`.trim();\n }\n return `Liian suuri: arvon t\u00E4ytyy olla ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Liian pieni: ${sizing.subject} t\u00E4ytyy olla ${adj}${issue.minimum.toString()} ${sizing.unit}`.trim();\n }\n return `Liian pieni: arvon t\u00E4ytyy olla ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Virheellinen sy\u00F6te: t\u00E4ytyy alkaa \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Virheellinen sy\u00F6te: t\u00E4ytyy loppua \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Virheellinen sy\u00F6te: t\u00E4ytyy sis\u00E4lt\u00E4\u00E4 \"${_issue.includes}\"`;\n if (_issue.format === \"regex\") {\n return `Virheellinen sy\u00F6te: t\u00E4ytyy vastata s\u00E4\u00E4nn\u00F6llist\u00E4 lauseketta ${_issue.pattern}`;\n }\n return `Virheellinen ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Virheellinen luku: t\u00E4ytyy olla luvun ${issue.divisor} monikerta`;\n case \"unrecognized_keys\":\n return `${issue.keys.length > 1 ? \"Tuntemattomat avaimet\" : \"Tuntematon avain\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return \"Virheellinen avain tietueessa\";\n case \"invalid_union\":\n return \"Virheellinen unioni\";\n case \"invalid_element\":\n return \"Virheellinen arvo joukossa\";\n default:\n return `Virheellinen sy\u00F6te`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"caract\u00E8res\", verb: \"avoir\" },\n file: { unit: \"octets\", verb: \"avoir\" },\n array: { unit: \"\u00E9l\u00E9ments\", verb: \"avoir\" },\n set: { unit: \"\u00E9l\u00E9ments\", verb: \"avoir\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"entr\u00E9e\",\n email: \"adresse e-mail\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"date et heure ISO\",\n date: \"date ISO\",\n time: \"heure ISO\",\n duration: \"dur\u00E9e ISO\",\n ipv4: \"adresse IPv4\",\n ipv6: \"adresse IPv6\",\n cidrv4: \"plage IPv4\",\n cidrv6: \"plage IPv6\",\n base64: \"cha\u00EEne encod\u00E9e en base64\",\n base64url: \"cha\u00EEne encod\u00E9e en base64url\",\n json_string: \"cha\u00EEne JSON\",\n e164: \"num\u00E9ro E.164\",\n jwt: \"JWT\",\n template_literal: \"entr\u00E9e\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"nombre\",\n array: \"tableau\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Entr\u00E9e invalide : instanceof ${issue.expected} attendu, ${received} re\u00E7u`;\n }\n return `Entr\u00E9e invalide : ${expected} attendu, ${received} re\u00E7u`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Entr\u00E9e invalide : ${util.stringifyPrimitive(issue.values[0])} attendu`;\n return `Option invalide : une valeur parmi ${util.joinValues(issue.values, \"|\")} attendue`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Trop grand : ${issue.origin ?? \"valeur\"} doit ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u00E9l\u00E9ment(s)\"}`;\n return `Trop grand : ${issue.origin ?? \"valeur\"} doit \u00EAtre ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Trop petit : ${issue.origin} doit ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Trop petit : ${issue.origin} doit \u00EAtre ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Cha\u00EEne invalide : doit commencer par \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Cha\u00EEne invalide : doit se terminer par \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Cha\u00EEne invalide : doit inclure \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Cha\u00EEne invalide : doit correspondre au mod\u00E8le ${_issue.pattern}`;\n return `${FormatDictionary[_issue.format] ?? issue.format} invalide`;\n }\n case \"not_multiple_of\":\n return `Nombre invalide : doit \u00EAtre un multiple de ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Cl\u00E9${issue.keys.length > 1 ? \"s\" : \"\"} non reconnue${issue.keys.length > 1 ? \"s\" : \"\"} : ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Cl\u00E9 invalide dans ${issue.origin}`;\n case \"invalid_union\":\n return \"Entr\u00E9e invalide\";\n case \"invalid_element\":\n return `Valeur invalide dans ${issue.origin}`;\n default:\n return `Entr\u00E9e invalide`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"caract\u00E8res\", verb: \"avoir\" },\n file: { unit: \"octets\", verb: \"avoir\" },\n array: { unit: \"\u00E9l\u00E9ments\", verb: \"avoir\" },\n set: { unit: \"\u00E9l\u00E9ments\", verb: \"avoir\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"entr\u00E9e\",\n email: \"adresse courriel\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"date-heure ISO\",\n date: \"date ISO\",\n time: \"heure ISO\",\n duration: \"dur\u00E9e ISO\",\n ipv4: \"adresse IPv4\",\n ipv6: \"adresse IPv6\",\n cidrv4: \"plage IPv4\",\n cidrv6: \"plage IPv6\",\n base64: \"cha\u00EEne encod\u00E9e en base64\",\n base64url: \"cha\u00EEne encod\u00E9e en base64url\",\n json_string: \"cha\u00EEne JSON\",\n e164: \"num\u00E9ro E.164\",\n jwt: \"JWT\",\n template_literal: \"entr\u00E9e\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Entr\u00E9e invalide : attendu instanceof ${issue.expected}, re\u00E7u ${received}`;\n }\n return `Entr\u00E9e invalide : attendu ${expected}, re\u00E7u ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Entr\u00E9e invalide : attendu ${util.stringifyPrimitive(issue.values[0])}`;\n return `Option invalide : attendu l'une des valeurs suivantes ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"\u2264\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Trop grand : attendu que ${issue.origin ?? \"la valeur\"} ait ${adj}${issue.maximum.toString()} ${sizing.unit}`;\n return `Trop grand : attendu que ${issue.origin ?? \"la valeur\"} soit ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \"\u2265\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Trop petit : attendu que ${issue.origin} ait ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Trop petit : attendu que ${issue.origin} soit ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `Cha\u00EEne invalide : doit commencer par \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `Cha\u00EEne invalide : doit se terminer par \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Cha\u00EEne invalide : doit inclure \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Cha\u00EEne invalide : doit correspondre au motif ${_issue.pattern}`;\n return `${FormatDictionary[_issue.format] ?? issue.format} invalide`;\n }\n case \"not_multiple_of\":\n return `Nombre invalide : doit \u00EAtre un multiple de ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Cl\u00E9${issue.keys.length > 1 ? \"s\" : \"\"} non reconnue${issue.keys.length > 1 ? \"s\" : \"\"} : ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Cl\u00E9 invalide dans ${issue.origin}`;\n case \"invalid_union\":\n return \"Entr\u00E9e invalide\";\n case \"invalid_element\":\n return `Valeur invalide dans ${issue.origin}`;\n default:\n return `Entr\u00E9e invalide`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n // Hebrew labels + grammatical gender\n const TypeNames = {\n string: { label: \"\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA\", gender: \"f\" },\n number: { label: \"\u05DE\u05E1\u05E4\u05E8\", gender: \"m\" },\n boolean: { label: \"\u05E2\u05E8\u05DA \u05D1\u05D5\u05DC\u05D9\u05D0\u05E0\u05D9\", gender: \"m\" },\n bigint: { label: \"BigInt\", gender: \"m\" },\n date: { label: \"\u05EA\u05D0\u05E8\u05D9\u05DA\", gender: \"m\" },\n array: { label: \"\u05DE\u05E2\u05E8\u05DA\", gender: \"m\" },\n object: { label: \"\u05D0\u05D5\u05D1\u05D9\u05D9\u05E7\u05D8\", gender: \"m\" },\n null: { label: \"\u05E2\u05E8\u05DA \u05E8\u05D9\u05E7 (null)\", gender: \"m\" },\n undefined: { label: \"\u05E2\u05E8\u05DA \u05DC\u05D0 \u05DE\u05D5\u05D2\u05D3\u05E8 (undefined)\", gender: \"m\" },\n symbol: { label: \"\u05E1\u05D9\u05DE\u05D1\u05D5\u05DC (Symbol)\", gender: \"m\" },\n function: { label: \"\u05E4\u05D5\u05E0\u05E7\u05E6\u05D9\u05D4\", gender: \"f\" },\n map: { label: \"\u05DE\u05E4\u05D4 (Map)\", gender: \"f\" },\n set: { label: \"\u05E7\u05D1\u05D5\u05E6\u05D4 (Set)\", gender: \"f\" },\n file: { label: \"\u05E7\u05D5\u05D1\u05E5\", gender: \"m\" },\n promise: { label: \"Promise\", gender: \"m\" },\n NaN: { label: \"NaN\", gender: \"m\" },\n unknown: { label: \"\u05E2\u05E8\u05DA \u05DC\u05D0 \u05D9\u05D3\u05D5\u05E2\", gender: \"m\" },\n value: { label: \"\u05E2\u05E8\u05DA\", gender: \"m\" },\n };\n // Sizing units for size-related messages + localized origin labels\n const Sizable = {\n string: { unit: \"\u05EA\u05D5\u05D5\u05D9\u05DD\", shortLabel: \"\u05E7\u05E6\u05E8\", longLabel: \"\u05D0\u05E8\u05D5\u05DA\" },\n file: { unit: \"\u05D1\u05D9\u05D9\u05D8\u05D9\u05DD\", shortLabel: \"\u05E7\u05D8\u05DF\", longLabel: \"\u05D2\u05D3\u05D5\u05DC\" },\n array: { unit: \"\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD\", shortLabel: \"\u05E7\u05D8\u05DF\", longLabel: \"\u05D2\u05D3\u05D5\u05DC\" },\n set: { unit: \"\u05E4\u05E8\u05D9\u05D8\u05D9\u05DD\", shortLabel: \"\u05E7\u05D8\u05DF\", longLabel: \"\u05D2\u05D3\u05D5\u05DC\" },\n number: { unit: \"\", shortLabel: \"\u05E7\u05D8\u05DF\", longLabel: \"\u05D2\u05D3\u05D5\u05DC\" }, // no unit\n };\n // Helpers \u2014 labels, articles, and verbs\n const typeEntry = (t) => (t ? TypeNames[t] : undefined);\n const typeLabel = (t) => {\n const e = typeEntry(t);\n if (e)\n return e.label;\n // fallback: show raw string if unknown\n return t ?? TypeNames.unknown.label;\n };\n const withDefinite = (t) => `\u05D4${typeLabel(t)}`;\n const verbFor = (t) => {\n const e = typeEntry(t);\n const gender = e?.gender ?? \"m\";\n return gender === \"f\" ? \"\u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05D9\u05D5\u05EA\" : \"\u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA\";\n };\n const getSizing = (origin) => {\n if (!origin)\n return null;\n return Sizable[origin] ?? null;\n };\n const FormatDictionary = {\n regex: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n email: { label: \"\u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D9\u05DE\u05D9\u05D9\u05DC\", gender: \"f\" },\n url: { label: \"\u05DB\u05EA\u05D5\u05D1\u05EA \u05E8\u05E9\u05EA\", gender: \"f\" },\n emoji: { label: \"\u05D0\u05D9\u05DE\u05D5\u05D2'\u05D9\", gender: \"m\" },\n uuid: { label: \"UUID\", gender: \"m\" },\n nanoid: { label: \"nanoid\", gender: \"m\" },\n guid: { label: \"GUID\", gender: \"m\" },\n cuid: { label: \"cuid\", gender: \"m\" },\n cuid2: { label: \"cuid2\", gender: \"m\" },\n ulid: { label: \"ULID\", gender: \"m\" },\n xid: { label: \"XID\", gender: \"m\" },\n ksuid: { label: \"KSUID\", gender: \"m\" },\n datetime: { label: \"\u05EA\u05D0\u05E8\u05D9\u05DA \u05D5\u05D6\u05DE\u05DF ISO\", gender: \"m\" },\n date: { label: \"\u05EA\u05D0\u05E8\u05D9\u05DA ISO\", gender: \"m\" },\n time: { label: \"\u05D6\u05DE\u05DF ISO\", gender: \"m\" },\n duration: { label: \"\u05DE\u05E9\u05DA \u05D6\u05DE\u05DF ISO\", gender: \"m\" },\n ipv4: { label: \"\u05DB\u05EA\u05D5\u05D1\u05EA IPv4\", gender: \"f\" },\n ipv6: { label: \"\u05DB\u05EA\u05D5\u05D1\u05EA IPv6\", gender: \"f\" },\n cidrv4: { label: \"\u05D8\u05D5\u05D5\u05D7 IPv4\", gender: \"m\" },\n cidrv6: { label: \"\u05D8\u05D5\u05D5\u05D7 IPv6\", gender: \"m\" },\n base64: { label: \"\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D1\u05D1\u05E1\u05D9\u05E1 64\", gender: \"f\" },\n base64url: { label: \"\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D1\u05D1\u05E1\u05D9\u05E1 64 \u05DC\u05DB\u05EA\u05D5\u05D1\u05D5\u05EA \u05E8\u05E9\u05EA\", gender: \"f\" },\n json_string: { label: \"\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA JSON\", gender: \"f\" },\n e164: { label: \"\u05DE\u05E1\u05E4\u05E8 E.164\", gender: \"m\" },\n jwt: { label: \"JWT\", gender: \"m\" },\n ends_with: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n includes: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n lowercase: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n starts_with: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n uppercase: { label: \"\u05E7\u05DC\u05D8\", gender: \"m\" },\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n // Expected type: show without definite article for clearer Hebrew\n const expectedKey = issue.expected;\n const expected = TypeDictionary[expectedKey ?? \"\"] ?? typeLabel(expectedKey);\n // Received: show localized label if known, otherwise constructor/raw\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? TypeNames[receivedType]?.label ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA instanceof ${issue.expected}, \u05D4\u05EA\u05E7\u05D1\u05DC ${received}`;\n }\n return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${expected}, \u05D4\u05EA\u05E7\u05D1\u05DC ${received}`;\n }\n case \"invalid_value\": {\n if (issue.values.length === 1) {\n return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05E2\u05E8\u05DA \u05D7\u05D9\u05D9\u05D1 \u05DC\u05D4\u05D9\u05D5\u05EA ${util.stringifyPrimitive(issue.values[0])}`;\n }\n // Join values with proper Hebrew formatting\n const stringified = issue.values.map((v) => util.stringifyPrimitive(v));\n if (issue.values.length === 2) {\n return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05DF ${stringified[0]} \u05D0\u05D5 ${stringified[1]}`;\n }\n // For 3+ values: \"a\", \"b\" \u05D0\u05D5 \"c\"\n const lastValue = stringified[stringified.length - 1];\n const restValues = stringified.slice(0, -1).join(\", \");\n return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D4\u05D0\u05E4\u05E9\u05E8\u05D5\u05D9\u05D5\u05EA \u05D4\u05DE\u05EA\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05DF ${restValues} \u05D0\u05D5 ${lastValue}`;\n }\n case \"too_big\": {\n const sizing = getSizing(issue.origin);\n const subject = withDefinite(issue.origin ?? \"value\");\n if (issue.origin === \"string\") {\n // Special handling for strings - more natural Hebrew\n return `${sizing?.longLabel ?? \"\u05D0\u05E8\u05D5\u05DA\"} \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05DB\u05D9\u05DC ${issue.maximum.toString()} ${sizing?.unit ?? \"\"} ${issue.inclusive ? \"\u05D0\u05D5 \u05E4\u05D7\u05D5\u05EA\" : \"\u05DC\u05DB\u05DC \u05D4\u05D9\u05D5\u05EA\u05E8\"}`.trim();\n }\n if (issue.origin === \"number\") {\n // Natural Hebrew for numbers\n const comparison = issue.inclusive ? `\u05E7\u05D8\u05DF \u05D0\u05D5 \u05E9\u05D5\u05D5\u05D4 \u05DC-${issue.maximum}` : `\u05E7\u05D8\u05DF \u05DE-${issue.maximum}`;\n return `\u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${comparison}`;\n }\n if (issue.origin === \"array\" || issue.origin === \"set\") {\n // Natural Hebrew for arrays and sets\n const verb = issue.origin === \"set\" ? \"\u05E6\u05E8\u05D9\u05DB\u05D4\" : \"\u05E6\u05E8\u05D9\u05DA\";\n const comparison = issue.inclusive\n ? `${issue.maximum} ${sizing?.unit ?? \"\"} \u05D0\u05D5 \u05E4\u05D7\u05D5\u05EA`\n : `\u05E4\u05D7\u05D5\u05EA \u05DE-${issue.maximum} ${sizing?.unit ?? \"\"}`;\n return `\u05D2\u05D3\u05D5\u05DC \u05DE\u05D3\u05D9: ${subject} ${verb} \u05DC\u05D4\u05DB\u05D9\u05DC ${comparison}`.trim();\n }\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const be = verbFor(issue.origin ?? \"value\");\n if (sizing?.unit) {\n return `${sizing.longLabel} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue.maximum.toString()} ${sizing.unit}`;\n }\n return `${sizing?.longLabel ?? \"\u05D2\u05D3\u05D5\u05DC\"} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const sizing = getSizing(issue.origin);\n const subject = withDefinite(issue.origin ?? \"value\");\n if (issue.origin === \"string\") {\n // Special handling for strings - more natural Hebrew\n return `${sizing?.shortLabel ?? \"\u05E7\u05E6\u05E8\"} \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DB\u05D4 \u05DC\u05D4\u05DB\u05D9\u05DC ${issue.minimum.toString()} ${sizing?.unit ?? \"\"} ${issue.inclusive ? \"\u05D0\u05D5 \u05D9\u05D5\u05EA\u05E8\" : \"\u05DC\u05E4\u05D7\u05D5\u05EA\"}`.trim();\n }\n if (issue.origin === \"number\") {\n // Natural Hebrew for numbers\n const comparison = issue.inclusive ? `\u05D2\u05D3\u05D5\u05DC \u05D0\u05D5 \u05E9\u05D5\u05D5\u05D4 \u05DC-${issue.minimum}` : `\u05D2\u05D3\u05D5\u05DC \u05DE-${issue.minimum}`;\n return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${subject} \u05E6\u05E8\u05D9\u05DA \u05DC\u05D4\u05D9\u05D5\u05EA ${comparison}`;\n }\n if (issue.origin === \"array\" || issue.origin === \"set\") {\n // Natural Hebrew for arrays and sets\n const verb = issue.origin === \"set\" ? \"\u05E6\u05E8\u05D9\u05DB\u05D4\" : \"\u05E6\u05E8\u05D9\u05DA\";\n // Special case for singular (minimum === 1)\n if (issue.minimum === 1 && issue.inclusive) {\n const singularPhrase = issue.origin === \"set\" ? \"\u05DC\u05E4\u05D7\u05D5\u05EA \u05E4\u05E8\u05D9\u05D8 \u05D0\u05D7\u05D3\" : \"\u05DC\u05E4\u05D7\u05D5\u05EA \u05E4\u05E8\u05D9\u05D8 \u05D0\u05D7\u05D3\";\n return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${subject} ${verb} \u05DC\u05D4\u05DB\u05D9\u05DC ${singularPhrase}`;\n }\n const comparison = issue.inclusive\n ? `${issue.minimum} ${sizing?.unit ?? \"\"} \u05D0\u05D5 \u05D9\u05D5\u05EA\u05E8`\n : `\u05D9\u05D5\u05EA\u05E8 \u05DE-${issue.minimum} ${sizing?.unit ?? \"\"}`;\n return `\u05E7\u05D8\u05DF \u05DE\u05D3\u05D9: ${subject} ${verb} \u05DC\u05D4\u05DB\u05D9\u05DC ${comparison}`.trim();\n }\n const adj = issue.inclusive ? \">=\" : \">\";\n const be = verbFor(issue.origin ?? \"value\");\n if (sizing?.unit) {\n return `${sizing.shortLabel} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `${sizing?.shortLabel ?? \"\u05E7\u05D8\u05DF\"} \u05DE\u05D3\u05D9: ${subject} ${be} ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n // These apply to strings \u2014 use feminine grammar + \u05D4\u05F3 \u05D4\u05D9\u05D3\u05D9\u05E2\u05D4\n if (_issue.format === \"starts_with\")\n return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D1 \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05E1\u05EA\u05D9\u05D9\u05DD \u05D1 \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05DB\u05DC\u05D5\u05DC \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u05D4\u05DE\u05D7\u05E8\u05D5\u05D6\u05EA \u05D7\u05D9\u05D9\u05D1\u05EA \u05DC\u05D4\u05EA\u05D0\u05D9\u05DD \u05DC\u05EA\u05D1\u05E0\u05D9\u05EA ${_issue.pattern}`;\n // Handle gender agreement for formats\n const nounEntry = FormatDictionary[_issue.format];\n const noun = nounEntry?.label ?? _issue.format;\n const gender = nounEntry?.gender ?? \"m\";\n const adjective = gender === \"f\" ? \"\u05EA\u05E7\u05D9\u05E0\u05D4\" : \"\u05EA\u05E7\u05D9\u05DF\";\n return `${noun} \u05DC\u05D0 ${adjective}`;\n }\n case \"not_multiple_of\":\n return `\u05DE\u05E1\u05E4\u05E8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF: \u05D7\u05D9\u05D9\u05D1 \u05DC\u05D4\u05D9\u05D5\u05EA \u05DE\u05DB\u05E4\u05DC\u05D4 \u05E9\u05DC ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `\u05DE\u05E4\u05EA\u05D7${issue.keys.length > 1 ? \"\u05D5\u05EA\" : \"\"} \u05DC\u05D0 \u05DE\u05D6\u05D5\u05D4${issue.keys.length > 1 ? \"\u05D9\u05DD\" : \"\u05D4\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\": {\n return `\u05E9\u05D3\u05D4 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1\u05D0\u05D5\u05D1\u05D9\u05D9\u05E7\u05D8`;\n }\n case \"invalid_union\":\n return \"\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF\";\n case \"invalid_element\": {\n const place = withDefinite(issue.origin ?? \"array\");\n return `\u05E2\u05E8\u05DA \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF \u05D1${place}`;\n }\n default:\n return `\u05E7\u05DC\u05D8 \u05DC\u05D0 \u05EA\u05E7\u05D9\u05DF`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"karakter\", verb: \"legyen\" },\n file: { unit: \"byte\", verb: \"legyen\" },\n array: { unit: \"elem\", verb: \"legyen\" },\n set: { unit: \"elem\", verb: \"legyen\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"bemenet\",\n email: \"email c\u00EDm\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO id\u0151b\u00E9lyeg\",\n date: \"ISO d\u00E1tum\",\n time: \"ISO id\u0151\",\n duration: \"ISO id\u0151intervallum\",\n ipv4: \"IPv4 c\u00EDm\",\n ipv6: \"IPv6 c\u00EDm\",\n cidrv4: \"IPv4 tartom\u00E1ny\",\n cidrv6: \"IPv6 tartom\u00E1ny\",\n base64: \"base64-k\u00F3dolt string\",\n base64url: \"base64url-k\u00F3dolt string\",\n json_string: \"JSON string\",\n e164: \"E.164 sz\u00E1m\",\n jwt: \"JWT\",\n template_literal: \"bemenet\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"sz\u00E1m\",\n array: \"t\u00F6mb\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u00C9rv\u00E9nytelen bemenet: a v\u00E1rt \u00E9rt\u00E9k instanceof ${issue.expected}, a kapott \u00E9rt\u00E9k ${received}`;\n }\n return `\u00C9rv\u00E9nytelen bemenet: a v\u00E1rt \u00E9rt\u00E9k ${expected}, a kapott \u00E9rt\u00E9k ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u00C9rv\u00E9nytelen bemenet: a v\u00E1rt \u00E9rt\u00E9k ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u00C9rv\u00E9nytelen opci\u00F3: valamelyik \u00E9rt\u00E9k v\u00E1rt ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `T\u00FAl nagy: ${issue.origin ?? \"\u00E9rt\u00E9k\"} m\u00E9rete t\u00FAl nagy ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elem\"}`;\n return `T\u00FAl nagy: a bemeneti \u00E9rt\u00E9k ${issue.origin ?? \"\u00E9rt\u00E9k\"} t\u00FAl nagy: ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `T\u00FAl kicsi: a bemeneti \u00E9rt\u00E9k ${issue.origin} m\u00E9rete t\u00FAl kicsi ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `T\u00FAl kicsi: a bemeneti \u00E9rt\u00E9k ${issue.origin} t\u00FAl kicsi ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u00C9rv\u00E9nytelen string: \"${_issue.prefix}\" \u00E9rt\u00E9kkel kell kezd\u0151dnie`;\n if (_issue.format === \"ends_with\")\n return `\u00C9rv\u00E9nytelen string: \"${_issue.suffix}\" \u00E9rt\u00E9kkel kell v\u00E9gz\u0151dnie`;\n if (_issue.format === \"includes\")\n return `\u00C9rv\u00E9nytelen string: \"${_issue.includes}\" \u00E9rt\u00E9ket kell tartalmaznia`;\n if (_issue.format === \"regex\")\n return `\u00C9rv\u00E9nytelen string: ${_issue.pattern} mint\u00E1nak kell megfelelnie`;\n return `\u00C9rv\u00E9nytelen ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u00C9rv\u00E9nytelen sz\u00E1m: ${issue.divisor} t\u00F6bbsz\u00F6r\u00F6s\u00E9nek kell lennie`;\n case \"unrecognized_keys\":\n return `Ismeretlen kulcs${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u00C9rv\u00E9nytelen kulcs ${issue.origin}`;\n case \"invalid_union\":\n return \"\u00C9rv\u00E9nytelen bemenet\";\n case \"invalid_element\":\n return `\u00C9rv\u00E9nytelen \u00E9rt\u00E9k: ${issue.origin}`;\n default:\n return `\u00C9rv\u00E9nytelen bemenet`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nfunction getArmenianPlural(count, one, many) {\n return Math.abs(count) === 1 ? one : many;\n}\nfunction withDefiniteArticle(word) {\n if (!word)\n return \"\";\n const vowels = [\"\u0561\", \"\u0565\", \"\u0568\", \"\u056B\", \"\u0578\", \"\u0578\u0582\", \"\u0585\"];\n const lastChar = word[word.length - 1];\n return word + (vowels.includes(lastChar) ? \"\u0576\" : \"\u0568\");\n}\nconst error = () => {\n const Sizable = {\n string: {\n unit: {\n one: \"\u0576\u0577\u0561\u0576\",\n many: \"\u0576\u0577\u0561\u0576\u0576\u0565\u0580\",\n },\n verb: \"\u0578\u0582\u0576\u0565\u0576\u0561\u056C\",\n },\n file: {\n unit: {\n one: \"\u0562\u0561\u0575\u0569\",\n many: \"\u0562\u0561\u0575\u0569\u0565\u0580\",\n },\n verb: \"\u0578\u0582\u0576\u0565\u0576\u0561\u056C\",\n },\n array: {\n unit: {\n one: \"\u057F\u0561\u0580\u0580\",\n many: \"\u057F\u0561\u0580\u0580\u0565\u0580\",\n },\n verb: \"\u0578\u0582\u0576\u0565\u0576\u0561\u056C\",\n },\n set: {\n unit: {\n one: \"\u057F\u0561\u0580\u0580\",\n many: \"\u057F\u0561\u0580\u0580\u0565\u0580\",\n },\n verb: \"\u0578\u0582\u0576\u0565\u0576\u0561\u056C\",\n },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0574\u0578\u0582\u057F\u0584\",\n email: \"\u0567\u056C. \u0570\u0561\u057D\u0581\u0565\",\n url: \"URL\",\n emoji: \"\u0567\u0574\u0578\u057B\u056B\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO \u0561\u0574\u057D\u0561\u0569\u056B\u057E \u0587 \u056A\u0561\u0574\",\n date: \"ISO \u0561\u0574\u057D\u0561\u0569\u056B\u057E\",\n time: \"ISO \u056A\u0561\u0574\",\n duration: \"ISO \u057F\u0587\u0578\u0572\u0578\u0582\u0569\u0575\u0578\u0582\u0576\",\n ipv4: \"IPv4 \u0570\u0561\u057D\u0581\u0565\",\n ipv6: \"IPv6 \u0570\u0561\u057D\u0581\u0565\",\n cidrv4: \"IPv4 \u0574\u056B\u057B\u0561\u056F\u0561\u0575\u0584\",\n cidrv6: \"IPv6 \u0574\u056B\u057B\u0561\u056F\u0561\u0575\u0584\",\n base64: \"base64 \u0571\u0587\u0561\u0579\u0561\u0583\u0578\u057E \u057F\u0578\u0572\",\n base64url: \"base64url \u0571\u0587\u0561\u0579\u0561\u0583\u0578\u057E \u057F\u0578\u0572\",\n json_string: \"JSON \u057F\u0578\u0572\",\n e164: \"E.164 \u0570\u0561\u0574\u0561\u0580\",\n jwt: \"JWT\",\n template_literal: \"\u0574\u0578\u0582\u057F\u0584\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0569\u056B\u057E\",\n array: \"\u0566\u0561\u0576\u0563\u057E\u0561\u056E\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 instanceof ${issue.expected}, \u057D\u057F\u0561\u0581\u057E\u0565\u056C \u0567 ${received}`;\n }\n return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 ${expected}, \u057D\u057F\u0561\u0581\u057E\u0565\u056C \u0567 ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 ${util.stringifyPrimitive(issue.values[1])}`;\n return `\u054D\u056D\u0561\u056C \u057F\u0561\u0580\u0562\u0565\u0580\u0561\u056F\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567\u0580 \u0570\u0565\u057F\u0587\u0575\u0561\u056C\u0576\u0565\u0580\u056B\u0581 \u0574\u0565\u056F\u0568\u055D ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n const maxValue = Number(issue.maximum);\n const unit = getArmenianPlural(maxValue, sizing.unit.one, sizing.unit.many);\n return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0574\u0565\u056E \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue.origin ?? \"\u0561\u0580\u056A\u0565\u0584\")} \u056F\u0578\u0582\u0576\u0565\u0576\u0561 ${adj}${issue.maximum.toString()} ${unit}`;\n }\n return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0574\u0565\u056E \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue.origin ?? \"\u0561\u0580\u056A\u0565\u0584\")} \u056C\u056B\u0576\u056B ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n const minValue = Number(issue.minimum);\n const unit = getArmenianPlural(minValue, sizing.unit.one, sizing.unit.many);\n return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0583\u0578\u0584\u0580 \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue.origin)} \u056F\u0578\u0582\u0576\u0565\u0576\u0561 ${adj}${issue.minimum.toString()} ${unit}`;\n }\n return `\u0549\u0561\u0583\u0561\u0566\u0561\u0576\u0581 \u0583\u0578\u0584\u0580 \u0561\u0580\u056A\u0565\u0584\u2024 \u057D\u057A\u0561\u057D\u057E\u0578\u0582\u0574 \u0567, \u0578\u0580 ${withDefiniteArticle(issue.origin)} \u056C\u056B\u0576\u056B ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u057D\u056F\u057D\u057E\u056B \"${_issue.prefix}\"-\u0578\u057E`;\n if (_issue.format === \"ends_with\")\n return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u0561\u057E\u0561\u0580\u057F\u057E\u056B \"${_issue.suffix}\"-\u0578\u057E`;\n if (_issue.format === \"includes\")\n return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u057A\u0561\u0580\u0578\u0582\u0576\u0561\u056F\u056B \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u054D\u056D\u0561\u056C \u057F\u0578\u0572\u2024 \u057A\u0565\u057F\u0584 \u0567 \u0570\u0561\u0574\u0561\u057A\u0561\u057F\u0561\u057D\u056D\u0561\u0576\u056B ${_issue.pattern} \u0571\u0587\u0561\u0579\u0561\u0583\u056B\u0576`;\n return `\u054D\u056D\u0561\u056C ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u054D\u056D\u0561\u056C \u0569\u056B\u057E\u2024 \u057A\u0565\u057F\u0584 \u0567 \u0562\u0561\u0566\u0574\u0561\u057A\u0561\u057F\u056B\u056F \u056C\u056B\u0576\u056B ${issue.divisor}-\u056B`;\n case \"unrecognized_keys\":\n return `\u0549\u0573\u0561\u0576\u0561\u0579\u057E\u0561\u056E \u0562\u0561\u0576\u0561\u056C\u056B${issue.keys.length > 1 ? \"\u0576\u0565\u0580\" : \"\"}. ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u054D\u056D\u0561\u056C \u0562\u0561\u0576\u0561\u056C\u056B ${withDefiniteArticle(issue.origin)}-\u0578\u0582\u0574`;\n case \"invalid_union\":\n return \"\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574\";\n case \"invalid_element\":\n return `\u054D\u056D\u0561\u056C \u0561\u0580\u056A\u0565\u0584 ${withDefiniteArticle(issue.origin)}-\u0578\u0582\u0574`;\n default:\n return `\u054D\u056D\u0561\u056C \u0574\u0578\u0582\u057F\u0584\u0561\u0563\u0580\u0578\u0582\u0574`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"karakter\", verb: \"memiliki\" },\n file: { unit: \"byte\", verb: \"memiliki\" },\n array: { unit: \"item\", verb: \"memiliki\" },\n set: { unit: \"item\", verb: \"memiliki\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"input\",\n email: \"alamat email\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"tanggal dan waktu format ISO\",\n date: \"tanggal format ISO\",\n time: \"jam format ISO\",\n duration: \"durasi format ISO\",\n ipv4: \"alamat IPv4\",\n ipv6: \"alamat IPv6\",\n cidrv4: \"rentang alamat IPv4\",\n cidrv6: \"rentang alamat IPv6\",\n base64: \"string dengan enkode base64\",\n base64url: \"string dengan enkode base64url\",\n json_string: \"string JSON\",\n e164: \"angka E.164\",\n jwt: \"JWT\",\n template_literal: \"input\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Input tidak valid: diharapkan instanceof ${issue.expected}, diterima ${received}`;\n }\n return `Input tidak valid: diharapkan ${expected}, diterima ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Input tidak valid: diharapkan ${util.stringifyPrimitive(issue.values[0])}`;\n return `Pilihan tidak valid: diharapkan salah satu dari ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Terlalu besar: diharapkan ${issue.origin ?? \"value\"} memiliki ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elemen\"}`;\n return `Terlalu besar: diharapkan ${issue.origin ?? \"value\"} menjadi ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Terlalu kecil: diharapkan ${issue.origin} memiliki ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Terlalu kecil: diharapkan ${issue.origin} menjadi ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `String tidak valid: harus dimulai dengan \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `String tidak valid: harus berakhir dengan \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `String tidak valid: harus menyertakan \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `String tidak valid: harus sesuai pola ${_issue.pattern}`;\n return `${FormatDictionary[_issue.format] ?? issue.format} tidak valid`;\n }\n case \"not_multiple_of\":\n return `Angka tidak valid: harus kelipatan dari ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Kunci tidak dikenali ${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Kunci tidak valid di ${issue.origin}`;\n case \"invalid_union\":\n return \"Input tidak valid\";\n case \"invalid_element\":\n return `Nilai tidak valid di ${issue.origin}`;\n default:\n return `Input tidak valid`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"stafi\", verb: \"a\u00F0 hafa\" },\n file: { unit: \"b\u00E6ti\", verb: \"a\u00F0 hafa\" },\n array: { unit: \"hluti\", verb: \"a\u00F0 hafa\" },\n set: { unit: \"hluti\", verb: \"a\u00F0 hafa\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"gildi\",\n email: \"netfang\",\n url: \"vefsl\u00F3\u00F0\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO dagsetning og t\u00EDmi\",\n date: \"ISO dagsetning\",\n time: \"ISO t\u00EDmi\",\n duration: \"ISO t\u00EDmalengd\",\n ipv4: \"IPv4 address\",\n ipv6: \"IPv6 address\",\n cidrv4: \"IPv4 range\",\n cidrv6: \"IPv6 range\",\n base64: \"base64-encoded strengur\",\n base64url: \"base64url-encoded strengur\",\n json_string: \"JSON strengur\",\n e164: \"E.164 t\u00F6lugildi\",\n jwt: \"JWT\",\n template_literal: \"gildi\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"n\u00FAmer\",\n array: \"fylki\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Rangt gildi: \u00DE\u00FA sl\u00F3st inn ${received} \u00FEar sem \u00E1 a\u00F0 vera instanceof ${issue.expected}`;\n }\n return `Rangt gildi: \u00DE\u00FA sl\u00F3st inn ${received} \u00FEar sem \u00E1 a\u00F0 vera ${expected}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Rangt gildi: gert r\u00E1\u00F0 fyrir ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u00D3gilt val: m\u00E1 vera eitt af eftirfarandi ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Of st\u00F3rt: gert er r\u00E1\u00F0 fyrir a\u00F0 ${issue.origin ?? \"gildi\"} hafi ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"hluti\"}`;\n return `Of st\u00F3rt: gert er r\u00E1\u00F0 fyrir a\u00F0 ${issue.origin ?? \"gildi\"} s\u00E9 ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Of l\u00EDti\u00F0: gert er r\u00E1\u00F0 fyrir a\u00F0 ${issue.origin} hafi ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Of l\u00EDti\u00F0: gert er r\u00E1\u00F0 fyrir a\u00F0 ${issue.origin} s\u00E9 ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u00D3gildur strengur: ver\u00F0ur a\u00F0 byrja \u00E1 \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `\u00D3gildur strengur: ver\u00F0ur a\u00F0 enda \u00E1 \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u00D3gildur strengur: ver\u00F0ur a\u00F0 innihalda \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u00D3gildur strengur: ver\u00F0ur a\u00F0 fylgja mynstri ${_issue.pattern}`;\n return `Rangt ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `R\u00F6ng tala: ver\u00F0ur a\u00F0 vera margfeldi af ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `\u00D3\u00FEekkt ${issue.keys.length > 1 ? \"ir lyklar\" : \"ur lykill\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Rangur lykill \u00ED ${issue.origin}`;\n case \"invalid_union\":\n return \"Rangt gildi\";\n case \"invalid_element\":\n return `Rangt gildi \u00ED ${issue.origin}`;\n default:\n return `Rangt gildi`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"caratteri\", verb: \"avere\" },\n file: { unit: \"byte\", verb: \"avere\" },\n array: { unit: \"elementi\", verb: \"avere\" },\n set: { unit: \"elementi\", verb: \"avere\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"input\",\n email: \"indirizzo email\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"data e ora ISO\",\n date: \"data ISO\",\n time: \"ora ISO\",\n duration: \"durata ISO\",\n ipv4: \"indirizzo IPv4\",\n ipv6: \"indirizzo IPv6\",\n cidrv4: \"intervallo IPv4\",\n cidrv6: \"intervallo IPv6\",\n base64: \"stringa codificata in base64\",\n base64url: \"URL codificata in base64\",\n json_string: \"stringa JSON\",\n e164: \"numero E.164\",\n jwt: \"JWT\",\n template_literal: \"input\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"numero\",\n array: \"vettore\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Input non valido: atteso instanceof ${issue.expected}, ricevuto ${received}`;\n }\n return `Input non valido: atteso ${expected}, ricevuto ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Input non valido: atteso ${util.stringifyPrimitive(issue.values[0])}`;\n return `Opzione non valida: atteso uno tra ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Troppo grande: ${issue.origin ?? \"valore\"} deve avere ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementi\"}`;\n return `Troppo grande: ${issue.origin ?? \"valore\"} deve essere ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Troppo piccolo: ${issue.origin} deve avere ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Troppo piccolo: ${issue.origin} deve essere ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Stringa non valida: deve iniziare con \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Stringa non valida: deve terminare con \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Stringa non valida: deve includere \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Stringa non valida: deve corrispondere al pattern ${_issue.pattern}`;\n return `Invalid ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Numero non valido: deve essere un multiplo di ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Chiav${issue.keys.length > 1 ? \"i\" : \"e\"} non riconosciut${issue.keys.length > 1 ? \"e\" : \"a\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Chiave non valida in ${issue.origin}`;\n case \"invalid_union\":\n return \"Input non valido\";\n case \"invalid_element\":\n return `Valore non valido in ${issue.origin}`;\n default:\n return `Input non valido`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u6587\u5B57\", verb: \"\u3067\u3042\u308B\" },\n file: { unit: \"\u30D0\u30A4\u30C8\", verb: \"\u3067\u3042\u308B\" },\n array: { unit: \"\u8981\u7D20\", verb: \"\u3067\u3042\u308B\" },\n set: { unit: \"\u8981\u7D20\", verb: \"\u3067\u3042\u308B\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u5165\u529B\u5024\",\n email: \"\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\",\n url: \"URL\",\n emoji: \"\u7D75\u6587\u5B57\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO\u65E5\u6642\",\n date: \"ISO\u65E5\u4ED8\",\n time: \"ISO\u6642\u523B\",\n duration: \"ISO\u671F\u9593\",\n ipv4: \"IPv4\u30A2\u30C9\u30EC\u30B9\",\n ipv6: \"IPv6\u30A2\u30C9\u30EC\u30B9\",\n cidrv4: \"IPv4\u7BC4\u56F2\",\n cidrv6: \"IPv6\u7BC4\u56F2\",\n base64: \"base64\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217\",\n base64url: \"base64url\u30A8\u30F3\u30B3\u30FC\u30C9\u6587\u5B57\u5217\",\n json_string: \"JSON\u6587\u5B57\u5217\",\n e164: \"E.164\u756A\u53F7\",\n jwt: \"JWT\",\n template_literal: \"\u5165\u529B\u5024\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u6570\u5024\",\n array: \"\u914D\u5217\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u7121\u52B9\u306A\u5165\u529B: instanceof ${issue.expected}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F\u304C\u3001${received}\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F`;\n }\n return `\u7121\u52B9\u306A\u5165\u529B: ${expected}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F\u304C\u3001${received}\u304C\u5165\u529B\u3055\u308C\u307E\u3057\u305F`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u7121\u52B9\u306A\u5165\u529B: ${util.stringifyPrimitive(issue.values[0])}\u304C\u671F\u5F85\u3055\u308C\u307E\u3057\u305F`;\n return `\u7121\u52B9\u306A\u9078\u629E: ${util.joinValues(issue.values, \"\u3001\")}\u306E\u3044\u305A\u308C\u304B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"\u4EE5\u4E0B\u3067\u3042\u308B\" : \"\u3088\u308A\u5C0F\u3055\u3044\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u5927\u304D\u3059\u304E\u308B\u5024: ${issue.origin ?? \"\u5024\"}\u306F${issue.maximum.toString()}${sizing.unit ?? \"\u8981\u7D20\"}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n return `\u5927\u304D\u3059\u304E\u308B\u5024: ${issue.origin ?? \"\u5024\"}\u306F${issue.maximum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \"\u4EE5\u4E0A\u3067\u3042\u308B\" : \"\u3088\u308A\u5927\u304D\u3044\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${issue.origin}\u306F${issue.minimum.toString()}${sizing.unit}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n return `\u5C0F\u3055\u3059\u304E\u308B\u5024: ${issue.origin}\u306F${issue.minimum.toString()}${adj}\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \"${_issue.prefix}\"\u3067\u59CB\u307E\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n if (_issue.format === \"ends_with\")\n return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \"${_issue.suffix}\"\u3067\u7D42\u308F\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n if (_issue.format === \"includes\")\n return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \"${_issue.includes}\"\u3092\u542B\u3080\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n if (_issue.format === \"regex\")\n return `\u7121\u52B9\u306A\u6587\u5B57\u5217: \u30D1\u30BF\u30FC\u30F3${_issue.pattern}\u306B\u4E00\u81F4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n return `\u7121\u52B9\u306A${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u7121\u52B9\u306A\u6570\u5024: ${issue.divisor}\u306E\u500D\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059`;\n case \"unrecognized_keys\":\n return `\u8A8D\u8B58\u3055\u308C\u3066\u3044\u306A\u3044\u30AD\u30FC${issue.keys.length > 1 ? \"\u7FA4\" : \"\"}: ${util.joinValues(issue.keys, \"\u3001\")}`;\n case \"invalid_key\":\n return `${issue.origin}\u5185\u306E\u7121\u52B9\u306A\u30AD\u30FC`;\n case \"invalid_union\":\n return \"\u7121\u52B9\u306A\u5165\u529B\";\n case \"invalid_element\":\n return `${issue.origin}\u5185\u306E\u7121\u52B9\u306A\u5024`;\n default:\n return `\u7121\u52B9\u306A\u5165\u529B`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u10E1\u10D8\u10DB\u10D1\u10DD\u10DA\u10DD\", verb: \"\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1\" },\n file: { unit: \"\u10D1\u10D0\u10D8\u10E2\u10D8\", verb: \"\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1\" },\n array: { unit: \"\u10D4\u10DA\u10D4\u10DB\u10D4\u10DC\u10E2\u10D8\", verb: \"\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1\" },\n set: { unit: \"\u10D4\u10DA\u10D4\u10DB\u10D4\u10DC\u10E2\u10D8\", verb: \"\u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0\",\n email: \"\u10D4\u10DA-\u10E4\u10DD\u10E1\u10E2\u10D8\u10E1 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8\",\n url: \"URL\",\n emoji: \"\u10D4\u10DB\u10DD\u10EF\u10D8\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"\u10D7\u10D0\u10E0\u10D8\u10E6\u10D8-\u10D3\u10E0\u10DD\",\n date: \"\u10D7\u10D0\u10E0\u10D8\u10E6\u10D8\",\n time: \"\u10D3\u10E0\u10DD\",\n duration: \"\u10EE\u10D0\u10DC\u10D2\u10E0\u10EB\u10DA\u10D8\u10D5\u10DD\u10D1\u10D0\",\n ipv4: \"IPv4 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8\",\n ipv6: \"IPv6 \u10DB\u10D8\u10E1\u10D0\u10DB\u10D0\u10E0\u10D7\u10D8\",\n cidrv4: \"IPv4 \u10D3\u10D8\u10D0\u10DE\u10D0\u10D6\u10DD\u10DC\u10D8\",\n cidrv6: \"IPv6 \u10D3\u10D8\u10D0\u10DE\u10D0\u10D6\u10DD\u10DC\u10D8\",\n base64: \"base64-\u10D9\u10DD\u10D3\u10D8\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8\",\n base64url: \"base64url-\u10D9\u10DD\u10D3\u10D8\u10E0\u10D4\u10D1\u10E3\u10DA\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8\",\n json_string: \"JSON \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8\",\n e164: \"E.164 \u10DC\u10DD\u10DB\u10D4\u10E0\u10D8\",\n jwt: \"JWT\",\n template_literal: \"\u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u10E0\u10D8\u10EA\u10EE\u10D5\u10D8\",\n string: \"\u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8\",\n boolean: \"\u10D1\u10E3\u10DA\u10D4\u10D0\u10DC\u10D8\",\n function: \"\u10E4\u10E3\u10DC\u10E5\u10EA\u10D8\u10D0\",\n array: \"\u10DB\u10D0\u10E1\u10D8\u10D5\u10D8\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 instanceof ${issue.expected}, \u10DB\u10D8\u10E6\u10D4\u10D1\u10E3\u10DA\u10D8 ${received}`;\n }\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${expected}, \u10DB\u10D8\u10E6\u10D4\u10D1\u10E3\u10DA\u10D8 ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D5\u10D0\u10E0\u10D8\u10D0\u10DC\u10E2\u10D8: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8\u10D0 \u10D4\u10E0\u10D7-\u10D4\u10E0\u10D7\u10D8 ${util.joinValues(issue.values, \"|\")}-\u10D3\u10D0\u10DC`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10D3\u10D8\u10D3\u10D8: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue.origin ?? \"\u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0\"} ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit}`;\n return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10D3\u10D8\u10D3\u10D8: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue.origin ?? \"\u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0\"} \u10D8\u10E7\u10DD\u10E1 ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10DE\u10D0\u10E2\u10D0\u10E0\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue.origin} ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `\u10D6\u10D4\u10D3\u10DB\u10D4\u10E2\u10D0\u10D3 \u10DE\u10D0\u10E2\u10D0\u10E0\u10D0: \u10DB\u10DD\u10E1\u10D0\u10DA\u10DD\u10D3\u10DC\u10D4\u10DA\u10D8 ${issue.origin} \u10D8\u10E7\u10DD\u10E1 ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10D8\u10EC\u10E7\u10D4\u10D1\u10DD\u10D3\u10D4\u10E1 \"${_issue.prefix}\"-\u10D8\u10D7`;\n }\n if (_issue.format === \"ends_with\")\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10DB\u10D7\u10D0\u10D5\u10E0\u10D3\u10D4\u10D1\u10DD\u10D3\u10D4\u10E1 \"${_issue.suffix}\"-\u10D8\u10D7`;\n if (_issue.format === \"includes\")\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D8\u10EA\u10D0\u10D5\u10D3\u10D4\u10E1 \"${_issue.includes}\"-\u10E1`;\n if (_issue.format === \"regex\")\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E1\u10E2\u10E0\u10D8\u10DC\u10D2\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10E8\u10D4\u10D4\u10E1\u10D0\u10D1\u10D0\u10DB\u10D4\u10D1\u10DD\u10D3\u10D4\u10E1 \u10E8\u10D0\u10D1\u10DA\u10DD\u10DC\u10E1 ${_issue.pattern}`;\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E0\u10D8\u10EA\u10EE\u10D5\u10D8: \u10E3\u10DC\u10D3\u10D0 \u10D8\u10E7\u10DD\u10E1 ${issue.divisor}-\u10D8\u10E1 \u10EF\u10D4\u10E0\u10D0\u10D3\u10D8`;\n case \"unrecognized_keys\":\n return `\u10E3\u10EA\u10DC\u10DD\u10D1\u10D8 \u10D2\u10D0\u10E1\u10D0\u10E6\u10D4\u10D1${issue.keys.length > 1 ? \"\u10D4\u10D1\u10D8\" : \"\u10D8\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10D2\u10D0\u10E1\u10D0\u10E6\u10D4\u10D1\u10D8 ${issue.origin}-\u10E8\u10D8`;\n case \"invalid_union\":\n return \"\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0\";\n case \"invalid_element\":\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10DB\u10DC\u10D8\u10E8\u10D5\u10DC\u10D4\u10DA\u10DD\u10D1\u10D0 ${issue.origin}-\u10E8\u10D8`;\n default:\n return `\u10D0\u10E0\u10D0\u10E1\u10EC\u10DD\u10E0\u10D8 \u10E8\u10D4\u10E7\u10D5\u10D0\u10DC\u10D0`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u178F\u17BD\u17A2\u1780\u17D2\u179F\u179A\", verb: \"\u1782\u17BD\u179A\u1798\u17B6\u1793\" },\n file: { unit: \"\u1794\u17C3\", verb: \"\u1782\u17BD\u179A\u1798\u17B6\u1793\" },\n array: { unit: \"\u1792\u17B6\u178F\u17BB\", verb: \"\u1782\u17BD\u179A\u1798\u17B6\u1793\" },\n set: { unit: \"\u1792\u17B6\u178F\u17BB\", verb: \"\u1782\u17BD\u179A\u1798\u17B6\u1793\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\",\n email: \"\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793\u17A2\u17CA\u17B8\u1798\u17C2\u179B\",\n url: \"URL\",\n emoji: \"\u179F\u1789\u17D2\u1789\u17B6\u17A2\u17B6\u179A\u1798\u17D2\u1798\u178E\u17CD\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"\u1780\u17B6\u179B\u1794\u179A\u17B7\u1785\u17D2\u1786\u17C1\u1791 \u1793\u17B7\u1784\u1798\u17C9\u17C4\u1784 ISO\",\n date: \"\u1780\u17B6\u179B\u1794\u179A\u17B7\u1785\u17D2\u1786\u17C1\u1791 ISO\",\n time: \"\u1798\u17C9\u17C4\u1784 ISO\",\n duration: \"\u179A\u1799\u17C8\u1796\u17C1\u179B ISO\",\n ipv4: \"\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv4\",\n ipv6: \"\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv6\",\n cidrv4: \"\u178A\u17C2\u1793\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv4\",\n cidrv6: \"\u178A\u17C2\u1793\u17A2\u17B6\u179F\u1799\u178A\u17D2\u178B\u17B6\u1793 IPv6\",\n base64: \"\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u17A2\u17CA\u17B7\u1780\u17BC\u178A base64\",\n base64url: \"\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u17A2\u17CA\u17B7\u1780\u17BC\u178A base64url\",\n json_string: \"\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A JSON\",\n e164: \"\u179B\u17C1\u1781 E.164\",\n jwt: \"JWT\",\n template_literal: \"\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u179B\u17C1\u1781\",\n array: \"\u17A2\u17B6\u179A\u17C1 (Array)\",\n null: \"\u1782\u17D2\u1798\u17B6\u1793\u178F\u1798\u17D2\u179B\u17C3 (null)\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A instanceof ${issue.expected} \u1794\u17C9\u17BB\u1793\u17D2\u178F\u17C2\u1791\u1791\u17BD\u179B\u1794\u17B6\u1793 ${received}`;\n }\n return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${expected} \u1794\u17C9\u17BB\u1793\u17D2\u178F\u17C2\u1791\u1791\u17BD\u179B\u1794\u17B6\u1793 ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1794\u1789\u17D2\u1785\u17BC\u179B\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u1787\u1798\u17D2\u179A\u17BE\u179F\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1787\u17B6\u1798\u17BD\u1799\u1780\u17D2\u1793\u17BB\u1784\u1785\u17C6\u178E\u17C4\u1798 ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u1792\u17C6\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue.origin ?? \"\u178F\u1798\u17D2\u179B\u17C3\"} ${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"\u1792\u17B6\u178F\u17BB\"}`;\n return `\u1792\u17C6\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue.origin ?? \"\u178F\u1798\u17D2\u179B\u17C3\"} ${adj} ${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u178F\u17BC\u1785\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue.origin} ${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `\u178F\u17BC\u1785\u1796\u17C1\u1780\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1780\u17B6\u179A ${issue.origin} ${adj} ${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1785\u17B6\u1794\u17CB\u1795\u17D2\u178F\u17BE\u1798\u178A\u17C4\u1799 \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1794\u1789\u17D2\u1785\u1794\u17CB\u178A\u17C4\u1799 \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u1798\u17B6\u1793 \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u1781\u17D2\u179F\u17C2\u17A2\u1780\u17D2\u179F\u179A\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u178F\u17C2\u1795\u17D2\u1782\u17BC\u1795\u17D2\u1782\u1784\u1793\u17B9\u1784\u1791\u1798\u17D2\u179A\u1784\u17CB\u178A\u17C2\u179B\u1794\u17B6\u1793\u1780\u17C6\u178E\u178F\u17CB ${_issue.pattern}`;\n return `\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u179B\u17C1\u1781\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u17D6 \u178F\u17D2\u179A\u17BC\u179C\u178F\u17C2\u1787\u17B6\u1796\u17A0\u17BB\u1782\u17BB\u178E\u1793\u17C3 ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `\u179A\u1780\u1783\u17BE\u1789\u179F\u17C4\u1798\u17B7\u1793\u179F\u17D2\u1782\u17B6\u179B\u17CB\u17D6 ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u179F\u17C4\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u1793\u17C5\u1780\u17D2\u1793\u17BB\u1784 ${issue.origin}`;\n case \"invalid_union\":\n return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C`;\n case \"invalid_element\":\n return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C\u1793\u17C5\u1780\u17D2\u1793\u17BB\u1784 ${issue.origin}`;\n default:\n return `\u1791\u17B7\u1793\u17D2\u1793\u1793\u17D0\u1799\u1798\u17B7\u1793\u178F\u17D2\u179A\u17B9\u1798\u178F\u17D2\u179A\u17BC\u179C`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import km from \"./km.js\";\n/** @deprecated Use `km` instead. */\nexport default function () {\n return km();\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\uBB38\uC790\", verb: \"to have\" },\n file: { unit: \"\uBC14\uC774\uD2B8\", verb: \"to have\" },\n array: { unit: \"\uAC1C\", verb: \"to have\" },\n set: { unit: \"\uAC1C\", verb: \"to have\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\uC785\uB825\",\n email: \"\uC774\uBA54\uC77C \uC8FC\uC18C\",\n url: \"URL\",\n emoji: \"\uC774\uBAA8\uC9C0\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO \uB0A0\uC9DC\uC2DC\uAC04\",\n date: \"ISO \uB0A0\uC9DC\",\n time: \"ISO \uC2DC\uAC04\",\n duration: \"ISO \uAE30\uAC04\",\n ipv4: \"IPv4 \uC8FC\uC18C\",\n ipv6: \"IPv6 \uC8FC\uC18C\",\n cidrv4: \"IPv4 \uBC94\uC704\",\n cidrv6: \"IPv6 \uBC94\uC704\",\n base64: \"base64 \uC778\uCF54\uB529 \uBB38\uC790\uC5F4\",\n base64url: \"base64url \uC778\uCF54\uB529 \uBB38\uC790\uC5F4\",\n json_string: \"JSON \uBB38\uC790\uC5F4\",\n e164: \"E.164 \uBC88\uD638\",\n jwt: \"JWT\",\n template_literal: \"\uC785\uB825\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\uC798\uBABB\uB41C \uC785\uB825: \uC608\uC0C1 \uD0C0\uC785\uC740 instanceof ${issue.expected}, \uBC1B\uC740 \uD0C0\uC785\uC740 ${received}\uC785\uB2C8\uB2E4`;\n }\n return `\uC798\uBABB\uB41C \uC785\uB825: \uC608\uC0C1 \uD0C0\uC785\uC740 ${expected}, \uBC1B\uC740 \uD0C0\uC785\uC740 ${received}\uC785\uB2C8\uB2E4`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\uC798\uBABB\uB41C \uC785\uB825: \uAC12\uC740 ${util.stringifyPrimitive(issue.values[0])} \uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4`;\n return `\uC798\uBABB\uB41C \uC635\uC158: ${util.joinValues(issue.values, \"\uB610\uB294 \")} \uC911 \uD558\uB098\uC5EC\uC57C \uD569\uB2C8\uB2E4`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"\uC774\uD558\" : \"\uBBF8\uB9CC\";\n const suffix = adj === \"\uBBF8\uB9CC\" ? \"\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4\" : \"\uC5EC\uC57C \uD569\uB2C8\uB2E4\";\n const sizing = getSizing(issue.origin);\n const unit = sizing?.unit ?? \"\uC694\uC18C\";\n if (sizing)\n return `${issue.origin ?? \"\uAC12\"}\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4: ${issue.maximum.toString()}${unit} ${adj}${suffix}`;\n return `${issue.origin ?? \"\uAC12\"}\uC774 \uB108\uBB34 \uD07D\uB2C8\uB2E4: ${issue.maximum.toString()} ${adj}${suffix}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \"\uC774\uC0C1\" : \"\uCD08\uACFC\";\n const suffix = adj === \"\uC774\uC0C1\" ? \"\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4\" : \"\uC5EC\uC57C \uD569\uB2C8\uB2E4\";\n const sizing = getSizing(issue.origin);\n const unit = sizing?.unit ?? \"\uC694\uC18C\";\n if (sizing) {\n return `${issue.origin ?? \"\uAC12\"}\uC774 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4: ${issue.minimum.toString()}${unit} ${adj}${suffix}`;\n }\n return `${issue.origin ?? \"\uAC12\"}\uC774 \uB108\uBB34 \uC791\uC2B5\uB2C8\uB2E4: ${issue.minimum.toString()} ${adj}${suffix}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \"${_issue.prefix}\"(\uC73C)\uB85C \uC2DC\uC791\uD574\uC57C \uD569\uB2C8\uB2E4`;\n }\n if (_issue.format === \"ends_with\")\n return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \"${_issue.suffix}\"(\uC73C)\uB85C \uB05D\uB098\uC57C \uD569\uB2C8\uB2E4`;\n if (_issue.format === \"includes\")\n return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \"${_issue.includes}\"\uC744(\uB97C) \uD3EC\uD568\uD574\uC57C \uD569\uB2C8\uB2E4`;\n if (_issue.format === \"regex\")\n return `\uC798\uBABB\uB41C \uBB38\uC790\uC5F4: \uC815\uADDC\uC2DD ${_issue.pattern} \uD328\uD134\uACFC \uC77C\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4`;\n return `\uC798\uBABB\uB41C ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\uC798\uBABB\uB41C \uC22B\uC790: ${issue.divisor}\uC758 \uBC30\uC218\uC5EC\uC57C \uD569\uB2C8\uB2E4`;\n case \"unrecognized_keys\":\n return `\uC778\uC2DD\uD560 \uC218 \uC5C6\uB294 \uD0A4: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\uC798\uBABB\uB41C \uD0A4: ${issue.origin}`;\n case \"invalid_union\":\n return `\uC798\uBABB\uB41C \uC785\uB825`;\n case \"invalid_element\":\n return `\uC798\uBABB\uB41C \uAC12: ${issue.origin}`;\n default:\n return `\uC798\uBABB\uB41C \uC785\uB825`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst capitalizeFirstCharacter = (text) => {\n return text.charAt(0).toUpperCase() + text.slice(1);\n};\nfunction getUnitTypeFromNumber(number) {\n const abs = Math.abs(number);\n const last = abs % 10;\n const last2 = abs % 100;\n if ((last2 >= 11 && last2 <= 19) || last === 0)\n return \"many\";\n if (last === 1)\n return \"one\";\n return \"few\";\n}\nconst error = () => {\n const Sizable = {\n string: {\n unit: {\n one: \"simbolis\",\n few: \"simboliai\",\n many: \"simboli\u0173\",\n },\n verb: {\n smaller: {\n inclusive: \"turi b\u016Bti ne ilgesn\u0117 kaip\",\n notInclusive: \"turi b\u016Bti trumpesn\u0117 kaip\",\n },\n bigger: {\n inclusive: \"turi b\u016Bti ne trumpesn\u0117 kaip\",\n notInclusive: \"turi b\u016Bti ilgesn\u0117 kaip\",\n },\n },\n },\n file: {\n unit: {\n one: \"baitas\",\n few: \"baitai\",\n many: \"bait\u0173\",\n },\n verb: {\n smaller: {\n inclusive: \"turi b\u016Bti ne didesnis kaip\",\n notInclusive: \"turi b\u016Bti ma\u017Eesnis kaip\",\n },\n bigger: {\n inclusive: \"turi b\u016Bti ne ma\u017Eesnis kaip\",\n notInclusive: \"turi b\u016Bti didesnis kaip\",\n },\n },\n },\n array: {\n unit: {\n one: \"element\u0105\",\n few: \"elementus\",\n many: \"element\u0173\",\n },\n verb: {\n smaller: {\n inclusive: \"turi tur\u0117ti ne daugiau kaip\",\n notInclusive: \"turi tur\u0117ti ma\u017Eiau kaip\",\n },\n bigger: {\n inclusive: \"turi tur\u0117ti ne ma\u017Eiau kaip\",\n notInclusive: \"turi tur\u0117ti daugiau kaip\",\n },\n },\n },\n set: {\n unit: {\n one: \"element\u0105\",\n few: \"elementus\",\n many: \"element\u0173\",\n },\n verb: {\n smaller: {\n inclusive: \"turi tur\u0117ti ne daugiau kaip\",\n notInclusive: \"turi tur\u0117ti ma\u017Eiau kaip\",\n },\n bigger: {\n inclusive: \"turi tur\u0117ti ne ma\u017Eiau kaip\",\n notInclusive: \"turi tur\u0117ti daugiau kaip\",\n },\n },\n },\n };\n function getSizing(origin, unitType, inclusive, targetShouldBe) {\n const result = Sizable[origin] ?? null;\n if (result === null)\n return result;\n return {\n unit: result.unit[unitType],\n verb: result.verb[targetShouldBe][inclusive ? \"inclusive\" : \"notInclusive\"],\n };\n }\n const FormatDictionary = {\n regex: \"\u012Fvestis\",\n email: \"el. pa\u0161to adresas\",\n url: \"URL\",\n emoji: \"jaustukas\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO data ir laikas\",\n date: \"ISO data\",\n time: \"ISO laikas\",\n duration: \"ISO trukm\u0117\",\n ipv4: \"IPv4 adresas\",\n ipv6: \"IPv6 adresas\",\n cidrv4: \"IPv4 tinklo prefiksas (CIDR)\",\n cidrv6: \"IPv6 tinklo prefiksas (CIDR)\",\n base64: \"base64 u\u017Ekoduota eilut\u0117\",\n base64url: \"base64url u\u017Ekoduota eilut\u0117\",\n json_string: \"JSON eilut\u0117\",\n e164: \"E.164 numeris\",\n jwt: \"JWT\",\n template_literal: \"\u012Fvestis\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"skai\u010Dius\",\n bigint: \"sveikasis skai\u010Dius\",\n string: \"eilut\u0117\",\n boolean: \"login\u0117 reik\u0161m\u0117\",\n undefined: \"neapibr\u0117\u017Eta reik\u0161m\u0117\",\n function: \"funkcija\",\n symbol: \"simbolis\",\n array: \"masyvas\",\n object: \"objektas\",\n null: \"nulin\u0117 reik\u0161m\u0117\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Gautas tipas ${received}, o tik\u0117tasi - instanceof ${issue.expected}`;\n }\n return `Gautas tipas ${received}, o tik\u0117tasi - ${expected}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Privalo b\u016Bti ${util.stringifyPrimitive(issue.values[0])}`;\n return `Privalo b\u016Bti vienas i\u0161 ${util.joinValues(issue.values, \"|\")} pasirinkim\u0173`;\n case \"too_big\": {\n const origin = TypeDictionary[issue.origin] ?? issue.origin;\n const sizing = getSizing(issue.origin, getUnitTypeFromNumber(Number(issue.maximum)), issue.inclusive ?? false, \"smaller\");\n if (sizing?.verb)\n return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} ${sizing.verb} ${issue.maximum.toString()} ${sizing.unit ?? \"element\u0173\"}`;\n const adj = issue.inclusive ? \"ne didesnis kaip\" : \"ma\u017Eesnis kaip\";\n return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} turi b\u016Bti ${adj} ${issue.maximum.toString()} ${sizing?.unit}`;\n }\n case \"too_small\": {\n const origin = TypeDictionary[issue.origin] ?? issue.origin;\n const sizing = getSizing(issue.origin, getUnitTypeFromNumber(Number(issue.minimum)), issue.inclusive ?? false, \"bigger\");\n if (sizing?.verb)\n return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} ${sizing.verb} ${issue.minimum.toString()} ${sizing.unit ?? \"element\u0173\"}`;\n const adj = issue.inclusive ? \"ne ma\u017Eesnis kaip\" : \"didesnis kaip\";\n return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} turi b\u016Bti ${adj} ${issue.minimum.toString()} ${sizing?.unit}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `Eilut\u0117 privalo prasid\u0117ti \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `Eilut\u0117 privalo pasibaigti \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Eilut\u0117 privalo \u012Ftraukti \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Eilut\u0117 privalo atitikti ${_issue.pattern}`;\n return `Neteisingas ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Skai\u010Dius privalo b\u016Bti ${issue.divisor} kartotinis.`;\n case \"unrecognized_keys\":\n return `Neatpa\u017Eint${issue.keys.length > 1 ? \"i\" : \"as\"} rakt${issue.keys.length > 1 ? \"ai\" : \"as\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return \"Rastas klaidingas raktas\";\n case \"invalid_union\":\n return \"Klaidinga \u012Fvestis\";\n case \"invalid_element\": {\n const origin = TypeDictionary[issue.origin] ?? issue.origin;\n return `${capitalizeFirstCharacter(origin ?? issue.origin ?? \"reik\u0161m\u0117\")} turi klaiding\u0105 \u012Fvest\u012F`;\n }\n default:\n return \"Klaidinga \u012Fvestis\";\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u0437\u043D\u0430\u0446\u0438\", verb: \"\u0434\u0430 \u0438\u043C\u0430\u0430\u0442\" },\n file: { unit: \"\u0431\u0430\u0458\u0442\u0438\", verb: \"\u0434\u0430 \u0438\u043C\u0430\u0430\u0442\" },\n array: { unit: \"\u0441\u0442\u0430\u0432\u043A\u0438\", verb: \"\u0434\u0430 \u0438\u043C\u0430\u0430\u0442\" },\n set: { unit: \"\u0441\u0442\u0430\u0432\u043A\u0438\", verb: \"\u0434\u0430 \u0438\u043C\u0430\u0430\u0442\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0432\u043D\u0435\u0441\",\n email: \"\u0430\u0434\u0440\u0435\u0441\u0430 \u043D\u0430 \u0435-\u043F\u043E\u0448\u0442\u0430\",\n url: \"URL\",\n emoji: \"\u0435\u043C\u043E\u045F\u0438\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO \u0434\u0430\u0442\u0443\u043C \u0438 \u0432\u0440\u0435\u043C\u0435\",\n date: \"ISO \u0434\u0430\u0442\u0443\u043C\",\n time: \"ISO \u0432\u0440\u0435\u043C\u0435\",\n duration: \"ISO \u0432\u0440\u0435\u043C\u0435\u0442\u0440\u0430\u0435\u045A\u0435\",\n ipv4: \"IPv4 \u0430\u0434\u0440\u0435\u0441\u0430\",\n ipv6: \"IPv6 \u0430\u0434\u0440\u0435\u0441\u0430\",\n cidrv4: \"IPv4 \u043E\u043F\u0441\u0435\u0433\",\n cidrv6: \"IPv6 \u043E\u043F\u0441\u0435\u0433\",\n base64: \"base64-\u0435\u043D\u043A\u043E\u0434\u0438\u0440\u0430\u043D\u0430 \u043D\u0438\u0437\u0430\",\n base64url: \"base64url-\u0435\u043D\u043A\u043E\u0434\u0438\u0440\u0430\u043D\u0430 \u043D\u0438\u0437\u0430\",\n json_string: \"JSON \u043D\u0438\u0437\u0430\",\n e164: \"E.164 \u0431\u0440\u043E\u0458\",\n jwt: \"JWT\",\n template_literal: \"\u0432\u043D\u0435\u0441\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0431\u0440\u043E\u0458\",\n array: \"\u043D\u0438\u0437\u0430\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 instanceof ${issue.expected}, \u043F\u0440\u0438\u043C\u0435\u043D\u043E ${received}`;\n }\n return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${expected}, \u043F\u0440\u0438\u043C\u0435\u043D\u043E ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Invalid input: expected ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u0413\u0440\u0435\u0448\u0430\u043D\u0430 \u043E\u043F\u0446\u0438\u0458\u0430: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 \u0435\u0434\u043D\u0430 ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u0433\u043E\u043B\u0435\u043C: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue.origin ?? \"\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0430\"} \u0434\u0430 \u0438\u043C\u0430 ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0438\"}`;\n return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u0433\u043E\u043B\u0435\u043C: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue.origin ?? \"\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0430\"} \u0434\u0430 \u0431\u0438\u0434\u0435 ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u043C\u0430\u043B: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue.origin} \u0434\u0430 \u0438\u043C\u0430 ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `\u041F\u0440\u0435\u043C\u043D\u043E\u0433\u0443 \u043C\u0430\u043B: \u0441\u0435 \u043E\u0447\u0435\u043A\u0443\u0432\u0430 ${issue.origin} \u0434\u0430 \u0431\u0438\u0434\u0435 ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0437\u0430\u043F\u043E\u0447\u043D\u0443\u0432\u0430 \u0441\u043E \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0437\u0430\u0432\u0440\u0448\u0443\u0432\u0430 \u0441\u043E \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0432\u043A\u043B\u0443\u0447\u0443\u0432\u0430 \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u041D\u0435\u0432\u0430\u0436\u0435\u0447\u043A\u0430 \u043D\u0438\u0437\u0430: \u043C\u043E\u0440\u0430 \u0434\u0430 \u043E\u0434\u0433\u043E\u0430\u0440\u0430 \u043D\u0430 \u043F\u0430\u0442\u0435\u0440\u043D\u043E\u0442 ${_issue.pattern}`;\n return `Invalid ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u0413\u0440\u0435\u0448\u0435\u043D \u0431\u0440\u043E\u0458: \u043C\u043E\u0440\u0430 \u0434\u0430 \u0431\u0438\u0434\u0435 \u0434\u0435\u043B\u0438\u0432 \u0441\u043E ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `${issue.keys.length > 1 ? \"\u041D\u0435\u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0435\u043D\u0438 \u043A\u043B\u0443\u0447\u0435\u0432\u0438\" : \"\u041D\u0435\u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0435\u043D \u043A\u043B\u0443\u0447\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u0413\u0440\u0435\u0448\u0435\u043D \u043A\u043B\u0443\u0447 \u0432\u043E ${issue.origin}`;\n case \"invalid_union\":\n return \"\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441\";\n case \"invalid_element\":\n return `\u0413\u0440\u0435\u0448\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0432\u043E ${issue.origin}`;\n default:\n return `\u0413\u0440\u0435\u0448\u0435\u043D \u0432\u043D\u0435\u0441`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"aksara\", verb: \"mempunyai\" },\n file: { unit: \"bait\", verb: \"mempunyai\" },\n array: { unit: \"elemen\", verb: \"mempunyai\" },\n set: { unit: \"elemen\", verb: \"mempunyai\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"input\",\n email: \"alamat e-mel\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"tarikh masa ISO\",\n date: \"tarikh ISO\",\n time: \"masa ISO\",\n duration: \"tempoh ISO\",\n ipv4: \"alamat IPv4\",\n ipv6: \"alamat IPv6\",\n cidrv4: \"julat IPv4\",\n cidrv6: \"julat IPv6\",\n base64: \"string dikodkan base64\",\n base64url: \"string dikodkan base64url\",\n json_string: \"string JSON\",\n e164: \"nombor E.164\",\n jwt: \"JWT\",\n template_literal: \"input\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"nombor\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Input tidak sah: dijangka instanceof ${issue.expected}, diterima ${received}`;\n }\n return `Input tidak sah: dijangka ${expected}, diterima ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Input tidak sah: dijangka ${util.stringifyPrimitive(issue.values[0])}`;\n return `Pilihan tidak sah: dijangka salah satu daripada ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Terlalu besar: dijangka ${issue.origin ?? \"nilai\"} ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elemen\"}`;\n return `Terlalu besar: dijangka ${issue.origin ?? \"nilai\"} adalah ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Terlalu kecil: dijangka ${issue.origin} ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Terlalu kecil: dijangka ${issue.origin} adalah ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `String tidak sah: mesti bermula dengan \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `String tidak sah: mesti berakhir dengan \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `String tidak sah: mesti mengandungi \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `String tidak sah: mesti sepadan dengan corak ${_issue.pattern}`;\n return `${FormatDictionary[_issue.format] ?? issue.format} tidak sah`;\n }\n case \"not_multiple_of\":\n return `Nombor tidak sah: perlu gandaan ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Kunci tidak dikenali: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Kunci tidak sah dalam ${issue.origin}`;\n case \"invalid_union\":\n return \"Input tidak sah\";\n case \"invalid_element\":\n return `Nilai tidak sah dalam ${issue.origin}`;\n default:\n return `Input tidak sah`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"tekens\", verb: \"heeft\" },\n file: { unit: \"bytes\", verb: \"heeft\" },\n array: { unit: \"elementen\", verb: \"heeft\" },\n set: { unit: \"elementen\", verb: \"heeft\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"invoer\",\n email: \"emailadres\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO datum en tijd\",\n date: \"ISO datum\",\n time: \"ISO tijd\",\n duration: \"ISO duur\",\n ipv4: \"IPv4-adres\",\n ipv6: \"IPv6-adres\",\n cidrv4: \"IPv4-bereik\",\n cidrv6: \"IPv6-bereik\",\n base64: \"base64-gecodeerde tekst\",\n base64url: \"base64 URL-gecodeerde tekst\",\n json_string: \"JSON string\",\n e164: \"E.164-nummer\",\n jwt: \"JWT\",\n template_literal: \"invoer\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"getal\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Ongeldige invoer: verwacht instanceof ${issue.expected}, ontving ${received}`;\n }\n return `Ongeldige invoer: verwacht ${expected}, ontving ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Ongeldige invoer: verwacht ${util.stringifyPrimitive(issue.values[0])}`;\n return `Ongeldige optie: verwacht \u00E9\u00E9n van ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n const longName = issue.origin === \"date\" ? \"laat\" : issue.origin === \"string\" ? \"lang\" : \"groot\";\n if (sizing)\n return `Te ${longName}: verwacht dat ${issue.origin ?? \"waarde\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementen\"} ${sizing.verb}`;\n return `Te ${longName}: verwacht dat ${issue.origin ?? \"waarde\"} ${adj}${issue.maximum.toString()} is`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n const shortName = issue.origin === \"date\" ? \"vroeg\" : issue.origin === \"string\" ? \"kort\" : \"klein\";\n if (sizing) {\n return `Te ${shortName}: verwacht dat ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit} ${sizing.verb}`;\n }\n return `Te ${shortName}: verwacht dat ${issue.origin} ${adj}${issue.minimum.toString()} is`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `Ongeldige tekst: moet met \"${_issue.prefix}\" beginnen`;\n }\n if (_issue.format === \"ends_with\")\n return `Ongeldige tekst: moet op \"${_issue.suffix}\" eindigen`;\n if (_issue.format === \"includes\")\n return `Ongeldige tekst: moet \"${_issue.includes}\" bevatten`;\n if (_issue.format === \"regex\")\n return `Ongeldige tekst: moet overeenkomen met patroon ${_issue.pattern}`;\n return `Ongeldig: ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Ongeldig getal: moet een veelvoud van ${issue.divisor} zijn`;\n case \"unrecognized_keys\":\n return `Onbekende key${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Ongeldige key in ${issue.origin}`;\n case \"invalid_union\":\n return \"Ongeldige invoer\";\n case \"invalid_element\":\n return `Ongeldige waarde in ${issue.origin}`;\n default:\n return `Ongeldige invoer`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"tegn\", verb: \"\u00E5 ha\" },\n file: { unit: \"bytes\", verb: \"\u00E5 ha\" },\n array: { unit: \"elementer\", verb: \"\u00E5 inneholde\" },\n set: { unit: \"elementer\", verb: \"\u00E5 inneholde\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"input\",\n email: \"e-postadresse\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO dato- og klokkeslett\",\n date: \"ISO-dato\",\n time: \"ISO-klokkeslett\",\n duration: \"ISO-varighet\",\n ipv4: \"IPv4-omr\u00E5de\",\n ipv6: \"IPv6-omr\u00E5de\",\n cidrv4: \"IPv4-spekter\",\n cidrv6: \"IPv6-spekter\",\n base64: \"base64-enkodet streng\",\n base64url: \"base64url-enkodet streng\",\n json_string: \"JSON-streng\",\n e164: \"E.164-nummer\",\n jwt: \"JWT\",\n template_literal: \"input\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"tall\",\n array: \"liste\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Ugyldig input: forventet instanceof ${issue.expected}, fikk ${received}`;\n }\n return `Ugyldig input: forventet ${expected}, fikk ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Ugyldig verdi: forventet ${util.stringifyPrimitive(issue.values[0])}`;\n return `Ugyldig valg: forventet en av ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `For stor(t): forventet ${issue.origin ?? \"value\"} til \u00E5 ha ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementer\"}`;\n return `For stor(t): forventet ${issue.origin ?? \"value\"} til \u00E5 ha ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `For lite(n): forventet ${issue.origin} til \u00E5 ha ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `For lite(n): forventet ${issue.origin} til \u00E5 ha ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Ugyldig streng: m\u00E5 starte med \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Ugyldig streng: m\u00E5 ende med \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Ugyldig streng: m\u00E5 inneholde \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Ugyldig streng: m\u00E5 matche m\u00F8nsteret ${_issue.pattern}`;\n return `Ugyldig ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Ugyldig tall: m\u00E5 v\u00E6re et multiplum av ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `${issue.keys.length > 1 ? \"Ukjente n\u00F8kler\" : \"Ukjent n\u00F8kkel\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Ugyldig n\u00F8kkel i ${issue.origin}`;\n case \"invalid_union\":\n return \"Ugyldig input\";\n case \"invalid_element\":\n return `Ugyldig verdi i ${issue.origin}`;\n default:\n return `Ugyldig input`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"harf\", verb: \"olmal\u0131d\u0131r\" },\n file: { unit: \"bayt\", verb: \"olmal\u0131d\u0131r\" },\n array: { unit: \"unsur\", verb: \"olmal\u0131d\u0131r\" },\n set: { unit: \"unsur\", verb: \"olmal\u0131d\u0131r\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"giren\",\n email: \"epostag\u00E2h\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO heng\u00E2m\u0131\",\n date: \"ISO tarihi\",\n time: \"ISO zaman\u0131\",\n duration: \"ISO m\u00FCddeti\",\n ipv4: \"IPv4 ni\u015F\u00E2n\u0131\",\n ipv6: \"IPv6 ni\u015F\u00E2n\u0131\",\n cidrv4: \"IPv4 menzili\",\n cidrv6: \"IPv6 menzili\",\n base64: \"base64-\u015Fifreli metin\",\n base64url: \"base64url-\u015Fifreli metin\",\n json_string: \"JSON metin\",\n e164: \"E.164 say\u0131s\u0131\",\n jwt: \"JWT\",\n template_literal: \"giren\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"numara\",\n array: \"saf\",\n null: \"gayb\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `F\u00E2sit giren: umulan instanceof ${issue.expected}, al\u0131nan ${received}`;\n }\n return `F\u00E2sit giren: umulan ${expected}, al\u0131nan ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `F\u00E2sit giren: umulan ${util.stringifyPrimitive(issue.values[0])}`;\n return `F\u00E2sit tercih: m\u00FBteberler ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Fazla b\u00FCy\u00FCk: ${issue.origin ?? \"value\"}, ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elements\"} sahip olmal\u0131yd\u0131.`;\n return `Fazla b\u00FCy\u00FCk: ${issue.origin ?? \"value\"}, ${adj}${issue.maximum.toString()} olmal\u0131yd\u0131.`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Fazla k\u00FC\u00E7\u00FCk: ${issue.origin}, ${adj}${issue.minimum.toString()} ${sizing.unit} sahip olmal\u0131yd\u0131.`;\n }\n return `Fazla k\u00FC\u00E7\u00FCk: ${issue.origin}, ${adj}${issue.minimum.toString()} olmal\u0131yd\u0131.`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `F\u00E2sit metin: \"${_issue.prefix}\" ile ba\u015Flamal\u0131.`;\n if (_issue.format === \"ends_with\")\n return `F\u00E2sit metin: \"${_issue.suffix}\" ile bitmeli.`;\n if (_issue.format === \"includes\")\n return `F\u00E2sit metin: \"${_issue.includes}\" ihtiv\u00E2 etmeli.`;\n if (_issue.format === \"regex\")\n return `F\u00E2sit metin: ${_issue.pattern} nak\u015F\u0131na uymal\u0131.`;\n return `F\u00E2sit ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `F\u00E2sit say\u0131: ${issue.divisor} kat\u0131 olmal\u0131yd\u0131.`;\n case \"unrecognized_keys\":\n return `Tan\u0131nmayan anahtar ${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `${issue.origin} i\u00E7in tan\u0131nmayan anahtar var.`;\n case \"invalid_union\":\n return \"Giren tan\u0131namad\u0131.\";\n case \"invalid_element\":\n return `${issue.origin} i\u00E7in tan\u0131nmayan k\u0131ymet var.`;\n default:\n return `K\u0131ymet tan\u0131namad\u0131.`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u062A\u0648\u06A9\u064A\", verb: \"\u0648\u0644\u0631\u064A\" },\n file: { unit: \"\u0628\u0627\u06CC\u067C\u0633\", verb: \"\u0648\u0644\u0631\u064A\" },\n array: { unit: \"\u062A\u0648\u06A9\u064A\", verb: \"\u0648\u0644\u0631\u064A\" },\n set: { unit: \"\u062A\u0648\u06A9\u064A\", verb: \"\u0648\u0644\u0631\u064A\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0648\u0631\u0648\u062F\u064A\",\n email: \"\u0628\u0631\u06CC\u069A\u0646\u0627\u0644\u06CC\u06A9\",\n url: \"\u06CC\u0648 \u0622\u0631 \u0627\u0644\",\n emoji: \"\u0627\u06CC\u0645\u0648\u062C\u064A\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"\u0646\u06CC\u067C\u0647 \u0627\u0648 \u0648\u062E\u062A\",\n date: \"\u0646\u06D0\u067C\u0647\",\n time: \"\u0648\u062E\u062A\",\n duration: \"\u0645\u0648\u062F\u0647\",\n ipv4: \"\u062F IPv4 \u067E\u062A\u0647\",\n ipv6: \"\u062F IPv6 \u067E\u062A\u0647\",\n cidrv4: \"\u062F IPv4 \u0633\u0627\u062D\u0647\",\n cidrv6: \"\u062F IPv6 \u0633\u0627\u062D\u0647\",\n base64: \"base64-encoded \u0645\u062A\u0646\",\n base64url: \"base64url-encoded \u0645\u062A\u0646\",\n json_string: \"JSON \u0645\u062A\u0646\",\n e164: \"\u062F E.164 \u0634\u0645\u06D0\u0631\u0647\",\n jwt: \"JWT\",\n template_literal: \"\u0648\u0631\u0648\u062F\u064A\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0639\u062F\u062F\",\n array: \"\u0627\u0631\u06D0\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F instanceof ${issue.expected} \u0648\u0627\u06CC, \u0645\u06AB\u0631 ${received} \u062A\u0631\u0644\u0627\u0633\u0647 \u0634\u0648`;\n }\n return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F ${expected} \u0648\u0627\u06CC, \u0645\u06AB\u0631 ${received} \u062A\u0631\u0644\u0627\u0633\u0647 \u0634\u0648`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1) {\n return `\u0646\u0627\u0633\u0645 \u0648\u0631\u0648\u062F\u064A: \u0628\u0627\u06CC\u062F ${util.stringifyPrimitive(issue.values[0])} \u0648\u0627\u06CC`;\n }\n return `\u0646\u0627\u0633\u0645 \u0627\u0646\u062A\u062E\u0627\u0628: \u0628\u0627\u06CC\u062F \u06CC\u0648 \u0644\u0647 ${util.joinValues(issue.values, \"|\")} \u0685\u062E\u0647 \u0648\u0627\u06CC`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u0689\u06CC\u0631 \u0644\u0648\u06CC: ${issue.origin ?? \"\u0627\u0631\u0632\u069A\u062A\"} \u0628\u0627\u06CC\u062F ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0639\u0646\u0635\u0631\u0648\u0646\u0647\"} \u0648\u0644\u0631\u064A`;\n }\n return `\u0689\u06CC\u0631 \u0644\u0648\u06CC: ${issue.origin ?? \"\u0627\u0631\u0632\u069A\u062A\"} \u0628\u0627\u06CC\u062F ${adj}${issue.maximum.toString()} \u0648\u064A`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u0689\u06CC\u0631 \u06A9\u0648\u0686\u0646\u06CC: ${issue.origin} \u0628\u0627\u06CC\u062F ${adj}${issue.minimum.toString()} ${sizing.unit} \u0648\u0644\u0631\u064A`;\n }\n return `\u0689\u06CC\u0631 \u06A9\u0648\u0686\u0646\u06CC: ${issue.origin} \u0628\u0627\u06CC\u062F ${adj}${issue.minimum.toString()} \u0648\u064A`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F \"${_issue.prefix}\" \u0633\u0631\u0647 \u067E\u06CC\u0644 \u0634\u064A`;\n }\n if (_issue.format === \"ends_with\") {\n return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F \"${_issue.suffix}\" \u0633\u0631\u0647 \u067E\u0627\u06CC \u062A\u0647 \u0648\u0631\u0633\u064A\u0696\u064A`;\n }\n if (_issue.format === \"includes\") {\n return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \"${_issue.includes}\" \u0648\u0644\u0631\u064A`;\n }\n if (_issue.format === \"regex\") {\n return `\u0646\u0627\u0633\u0645 \u0645\u062A\u0646: \u0628\u0627\u06CC\u062F \u062F ${_issue.pattern} \u0633\u0631\u0647 \u0645\u0637\u0627\u0628\u0642\u062A \u0648\u0644\u0631\u064A`;\n }\n return `${FormatDictionary[_issue.format] ?? issue.format} \u0646\u0627\u0633\u0645 \u062F\u06CC`;\n }\n case \"not_multiple_of\":\n return `\u0646\u0627\u0633\u0645 \u0639\u062F\u062F: \u0628\u0627\u06CC\u062F \u062F ${issue.divisor} \u0645\u0636\u0631\u0628 \u0648\u064A`;\n case \"unrecognized_keys\":\n return `\u0646\u0627\u0633\u0645 ${issue.keys.length > 1 ? \"\u06A9\u0644\u06CC\u0689\u0648\u0646\u0647\" : \"\u06A9\u0644\u06CC\u0689\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u0646\u0627\u0633\u0645 \u06A9\u0644\u06CC\u0689 \u067E\u0647 ${issue.origin} \u06A9\u06D0`;\n case \"invalid_union\":\n return `\u0646\u0627\u0633\u0645\u0647 \u0648\u0631\u0648\u062F\u064A`;\n case \"invalid_element\":\n return `\u0646\u0627\u0633\u0645 \u0639\u0646\u0635\u0631 \u067E\u0647 ${issue.origin} \u06A9\u06D0`;\n default:\n return `\u0646\u0627\u0633\u0645\u0647 \u0648\u0631\u0648\u062F\u064A`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"znak\u00F3w\", verb: \"mie\u0107\" },\n file: { unit: \"bajt\u00F3w\", verb: \"mie\u0107\" },\n array: { unit: \"element\u00F3w\", verb: \"mie\u0107\" },\n set: { unit: \"element\u00F3w\", verb: \"mie\u0107\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"wyra\u017Cenie\",\n email: \"adres email\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"data i godzina w formacie ISO\",\n date: \"data w formacie ISO\",\n time: \"godzina w formacie ISO\",\n duration: \"czas trwania ISO\",\n ipv4: \"adres IPv4\",\n ipv6: \"adres IPv6\",\n cidrv4: \"zakres IPv4\",\n cidrv6: \"zakres IPv6\",\n base64: \"ci\u0105g znak\u00F3w zakodowany w formacie base64\",\n base64url: \"ci\u0105g znak\u00F3w zakodowany w formacie base64url\",\n json_string: \"ci\u0105g znak\u00F3w w formacie JSON\",\n e164: \"liczba E.164\",\n jwt: \"JWT\",\n template_literal: \"wej\u015Bcie\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"liczba\",\n array: \"tablica\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano instanceof ${issue.expected}, otrzymano ${received}`;\n }\n return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano ${expected}, otrzymano ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Nieprawid\u0142owe dane wej\u015Bciowe: oczekiwano ${util.stringifyPrimitive(issue.values[0])}`;\n return `Nieprawid\u0142owa opcja: oczekiwano jednej z warto\u015Bci ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Za du\u017Ca warto\u015B\u0107: oczekiwano, \u017Ce ${issue.origin ?? \"warto\u015B\u0107\"} b\u0119dzie mie\u0107 ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"element\u00F3w\"}`;\n }\n return `Zbyt du\u017C(y/a/e): oczekiwano, \u017Ce ${issue.origin ?? \"warto\u015B\u0107\"} b\u0119dzie wynosi\u0107 ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Za ma\u0142a warto\u015B\u0107: oczekiwano, \u017Ce ${issue.origin ?? \"warto\u015B\u0107\"} b\u0119dzie mie\u0107 ${adj}${issue.minimum.toString()} ${sizing.unit ?? \"element\u00F3w\"}`;\n }\n return `Zbyt ma\u0142(y/a/e): oczekiwano, \u017Ce ${issue.origin ?? \"warto\u015B\u0107\"} b\u0119dzie wynosi\u0107 ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Nieprawid\u0142owy ci\u0105g znak\u00F3w: musi zaczyna\u0107 si\u0119 od \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Nieprawid\u0142owy ci\u0105g znak\u00F3w: musi ko\u0144czy\u0107 si\u0119 na \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Nieprawid\u0142owy ci\u0105g znak\u00F3w: musi zawiera\u0107 \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Nieprawid\u0142owy ci\u0105g znak\u00F3w: musi odpowiada\u0107 wzorcowi ${_issue.pattern}`;\n return `Nieprawid\u0142ow(y/a/e) ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Nieprawid\u0142owa liczba: musi by\u0107 wielokrotno\u015Bci\u0105 ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Nierozpoznane klucze${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Nieprawid\u0142owy klucz w ${issue.origin}`;\n case \"invalid_union\":\n return \"Nieprawid\u0142owe dane wej\u015Bciowe\";\n case \"invalid_element\":\n return `Nieprawid\u0142owa warto\u015B\u0107 w ${issue.origin}`;\n default:\n return `Nieprawid\u0142owe dane wej\u015Bciowe`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"caracteres\", verb: \"ter\" },\n file: { unit: \"bytes\", verb: \"ter\" },\n array: { unit: \"itens\", verb: \"ter\" },\n set: { unit: \"itens\", verb: \"ter\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"padr\u00E3o\",\n email: \"endere\u00E7o de e-mail\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"data e hora ISO\",\n date: \"data ISO\",\n time: \"hora ISO\",\n duration: \"dura\u00E7\u00E3o ISO\",\n ipv4: \"endere\u00E7o IPv4\",\n ipv6: \"endere\u00E7o IPv6\",\n cidrv4: \"faixa de IPv4\",\n cidrv6: \"faixa de IPv6\",\n base64: \"texto codificado em base64\",\n base64url: \"URL codificada em base64\",\n json_string: \"texto JSON\",\n e164: \"n\u00FAmero E.164\",\n jwt: \"JWT\",\n template_literal: \"entrada\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"n\u00FAmero\",\n null: \"nulo\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Tipo inv\u00E1lido: esperado instanceof ${issue.expected}, recebido ${received}`;\n }\n return `Tipo inv\u00E1lido: esperado ${expected}, recebido ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Entrada inv\u00E1lida: esperado ${util.stringifyPrimitive(issue.values[0])}`;\n return `Op\u00E7\u00E3o inv\u00E1lida: esperada uma das ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Muito grande: esperado que ${issue.origin ?? \"valor\"} tivesse ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementos\"}`;\n return `Muito grande: esperado que ${issue.origin ?? \"valor\"} fosse ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Muito pequeno: esperado que ${issue.origin} tivesse ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Muito pequeno: esperado que ${issue.origin} fosse ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Texto inv\u00E1lido: deve come\u00E7ar com \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Texto inv\u00E1lido: deve terminar com \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Texto inv\u00E1lido: deve incluir \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Texto inv\u00E1lido: deve corresponder ao padr\u00E3o ${_issue.pattern}`;\n return `${FormatDictionary[_issue.format] ?? issue.format} inv\u00E1lido`;\n }\n case \"not_multiple_of\":\n return `N\u00FAmero inv\u00E1lido: deve ser m\u00FAltiplo de ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Chave${issue.keys.length > 1 ? \"s\" : \"\"} desconhecida${issue.keys.length > 1 ? \"s\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Chave inv\u00E1lida em ${issue.origin}`;\n case \"invalid_union\":\n return \"Entrada inv\u00E1lida\";\n case \"invalid_element\":\n return `Valor inv\u00E1lido em ${issue.origin}`;\n default:\n return `Campo inv\u00E1lido`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nfunction getRussianPlural(count, one, few, many) {\n const absCount = Math.abs(count);\n const lastDigit = absCount % 10;\n const lastTwoDigits = absCount % 100;\n if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {\n return many;\n }\n if (lastDigit === 1) {\n return one;\n }\n if (lastDigit >= 2 && lastDigit <= 4) {\n return few;\n }\n return many;\n}\nconst error = () => {\n const Sizable = {\n string: {\n unit: {\n one: \"\u0441\u0438\u043C\u0432\u043E\u043B\",\n few: \"\u0441\u0438\u043C\u0432\u043E\u043B\u0430\",\n many: \"\u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432\",\n },\n verb: \"\u0438\u043C\u0435\u0442\u044C\",\n },\n file: {\n unit: {\n one: \"\u0431\u0430\u0439\u0442\",\n few: \"\u0431\u0430\u0439\u0442\u0430\",\n many: \"\u0431\u0430\u0439\u0442\",\n },\n verb: \"\u0438\u043C\u0435\u0442\u044C\",\n },\n array: {\n unit: {\n one: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\",\n few: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\",\n many: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432\",\n },\n verb: \"\u0438\u043C\u0435\u0442\u044C\",\n },\n set: {\n unit: {\n one: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\",\n few: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u0430\",\n many: \"\u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432\",\n },\n verb: \"\u0438\u043C\u0435\u0442\u044C\",\n },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0432\u0432\u043E\u0434\",\n email: \"email \u0430\u0434\u0440\u0435\u0441\",\n url: \"URL\",\n emoji: \"\u044D\u043C\u043E\u0434\u0437\u0438\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO \u0434\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043C\u044F\",\n date: \"ISO \u0434\u0430\u0442\u0430\",\n time: \"ISO \u0432\u0440\u0435\u043C\u044F\",\n duration: \"ISO \u0434\u043B\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C\",\n ipv4: \"IPv4 \u0430\u0434\u0440\u0435\u0441\",\n ipv6: \"IPv6 \u0430\u0434\u0440\u0435\u0441\",\n cidrv4: \"IPv4 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\",\n cidrv6: \"IPv6 \u0434\u0438\u0430\u043F\u0430\u0437\u043E\u043D\",\n base64: \"\u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 base64\",\n base64url: \"\u0441\u0442\u0440\u043E\u043A\u0430 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 base64url\",\n json_string: \"JSON \u0441\u0442\u0440\u043E\u043A\u0430\",\n e164: \"\u043D\u043E\u043C\u0435\u0440 E.164\",\n jwt: \"JWT\",\n template_literal: \"\u0432\u0432\u043E\u0434\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0447\u0438\u0441\u043B\u043E\",\n array: \"\u043C\u0430\u0441\u0441\u0438\u0432\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C instanceof ${issue.expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043E ${received}`;\n }\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C ${expected}, \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043E ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0432\u043E\u0434: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0434\u043D\u043E \u0438\u0437 ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n const maxValue = Number(issue.maximum);\n const unit = getRussianPlural(maxValue, sizing.unit.one, sizing.unit.few, sizing.unit.many);\n return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\"} \u0431\u0443\u0434\u0435\u0442 \u0438\u043C\u0435\u0442\u044C ${adj}${issue.maximum.toString()} ${unit}`;\n }\n return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\"} \u0431\u0443\u0434\u0435\u0442 ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n const minValue = Number(issue.minimum);\n const unit = getRussianPlural(minValue, sizing.unit.one, sizing.unit.few, sizing.unit.many);\n return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue.origin} \u0431\u0443\u0434\u0435\u0442 \u0438\u043C\u0435\u0442\u044C ${adj}${issue.minimum.toString()} ${unit}`;\n }\n return `\u0421\u043B\u0438\u0448\u043A\u043E\u043C \u043C\u0430\u043B\u0435\u043D\u044C\u043A\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435: \u043E\u0436\u0438\u0434\u0430\u043B\u043E\u0441\u044C, \u0447\u0442\u043E ${issue.origin} \u0431\u0443\u0434\u0435\u0442 ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C\u0441\u044F \u0441 \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0437\u0430\u043A\u0430\u043D\u0447\u0438\u0432\u0430\u0442\u044C\u0441\u044F \u043D\u0430 \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430: \u0434\u043E\u043B\u0436\u043D\u0430 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043E\u0432\u0430\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`;\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0447\u0438\u0441\u043B\u043E: \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043A\u0440\u0430\u0442\u043D\u044B\u043C ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `\u041D\u0435\u0440\u0430\u0441\u043F\u043E\u0437\u043D\u0430\u043D\u043D${issue.keys.length > 1 ? \"\u044B\u0435\" : \"\u044B\u0439\"} \u043A\u043B\u044E\u0447${issue.keys.length > 1 ? \"\u0438\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u043A\u043B\u044E\u0447 \u0432 ${issue.origin}`;\n case \"invalid_union\":\n return \"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\";\n case \"invalid_element\":\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0432 ${issue.origin}`;\n default:\n return `\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0435 \u0432\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"znakov\", verb: \"imeti\" },\n file: { unit: \"bajtov\", verb: \"imeti\" },\n array: { unit: \"elementov\", verb: \"imeti\" },\n set: { unit: \"elementov\", verb: \"imeti\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"vnos\",\n email: \"e-po\u0161tni naslov\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO datum in \u010Das\",\n date: \"ISO datum\",\n time: \"ISO \u010Das\",\n duration: \"ISO trajanje\",\n ipv4: \"IPv4 naslov\",\n ipv6: \"IPv6 naslov\",\n cidrv4: \"obseg IPv4\",\n cidrv6: \"obseg IPv6\",\n base64: \"base64 kodiran niz\",\n base64url: \"base64url kodiran niz\",\n json_string: \"JSON niz\",\n e164: \"E.164 \u0161tevilka\",\n jwt: \"JWT\",\n template_literal: \"vnos\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0161tevilo\",\n array: \"tabela\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Neveljaven vnos: pri\u010Dakovano instanceof ${issue.expected}, prejeto ${received}`;\n }\n return `Neveljaven vnos: pri\u010Dakovano ${expected}, prejeto ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Neveljaven vnos: pri\u010Dakovano ${util.stringifyPrimitive(issue.values[0])}`;\n return `Neveljavna mo\u017Enost: pri\u010Dakovano eno izmed ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Preveliko: pri\u010Dakovano, da bo ${issue.origin ?? \"vrednost\"} imelo ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"elementov\"}`;\n return `Preveliko: pri\u010Dakovano, da bo ${issue.origin ?? \"vrednost\"} ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Premajhno: pri\u010Dakovano, da bo ${issue.origin} imelo ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Premajhno: pri\u010Dakovano, da bo ${issue.origin} ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `Neveljaven niz: mora se za\u010Deti z \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `Neveljaven niz: mora se kon\u010Dati z \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Neveljaven niz: mora vsebovati \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Neveljaven niz: mora ustrezati vzorcu ${_issue.pattern}`;\n return `Neveljaven ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Neveljavno \u0161tevilo: mora biti ve\u010Dkratnik ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Neprepoznan${issue.keys.length > 1 ? \"i klju\u010Di\" : \" klju\u010D\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Neveljaven klju\u010D v ${issue.origin}`;\n case \"invalid_union\":\n return \"Neveljaven vnos\";\n case \"invalid_element\":\n return `Neveljavna vrednost v ${issue.origin}`;\n default:\n return \"Neveljaven vnos\";\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"tecken\", verb: \"att ha\" },\n file: { unit: \"bytes\", verb: \"att ha\" },\n array: { unit: \"objekt\", verb: \"att inneh\u00E5lla\" },\n set: { unit: \"objekt\", verb: \"att inneh\u00E5lla\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"regulj\u00E4rt uttryck\",\n email: \"e-postadress\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO-datum och tid\",\n date: \"ISO-datum\",\n time: \"ISO-tid\",\n duration: \"ISO-varaktighet\",\n ipv4: \"IPv4-intervall\",\n ipv6: \"IPv6-intervall\",\n cidrv4: \"IPv4-spektrum\",\n cidrv6: \"IPv6-spektrum\",\n base64: \"base64-kodad str\u00E4ng\",\n base64url: \"base64url-kodad str\u00E4ng\",\n json_string: \"JSON-str\u00E4ng\",\n e164: \"E.164-nummer\",\n jwt: \"JWT\",\n template_literal: \"mall-literal\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"antal\",\n array: \"lista\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Ogiltig inmatning: f\u00F6rv\u00E4ntat instanceof ${issue.expected}, fick ${received}`;\n }\n return `Ogiltig inmatning: f\u00F6rv\u00E4ntat ${expected}, fick ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Ogiltig inmatning: f\u00F6rv\u00E4ntat ${util.stringifyPrimitive(issue.values[0])}`;\n return `Ogiltigt val: f\u00F6rv\u00E4ntade en av ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `F\u00F6r stor(t): f\u00F6rv\u00E4ntade ${issue.origin ?? \"v\u00E4rdet\"} att ha ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"element\"}`;\n }\n return `F\u00F6r stor(t): f\u00F6rv\u00E4ntat ${issue.origin ?? \"v\u00E4rdet\"} att ha ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `F\u00F6r lite(t): f\u00F6rv\u00E4ntade ${issue.origin ?? \"v\u00E4rdet\"} att ha ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `F\u00F6r lite(t): f\u00F6rv\u00E4ntade ${issue.origin ?? \"v\u00E4rdet\"} att ha ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `Ogiltig str\u00E4ng: m\u00E5ste b\u00F6rja med \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `Ogiltig str\u00E4ng: m\u00E5ste sluta med \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Ogiltig str\u00E4ng: m\u00E5ste inneh\u00E5lla \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Ogiltig str\u00E4ng: m\u00E5ste matcha m\u00F6nstret \"${_issue.pattern}\"`;\n return `Ogiltig(t) ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Ogiltigt tal: m\u00E5ste vara en multipel av ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `${issue.keys.length > 1 ? \"Ok\u00E4nda nycklar\" : \"Ok\u00E4nd nyckel\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Ogiltig nyckel i ${issue.origin ?? \"v\u00E4rdet\"}`;\n case \"invalid_union\":\n return \"Ogiltig input\";\n case \"invalid_element\":\n return `Ogiltigt v\u00E4rde i ${issue.origin ?? \"v\u00E4rdet\"}`;\n default:\n return `Ogiltig input`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u0B8E\u0BB4\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BCD\u0B95\u0BB3\u0BCD\", verb: \"\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD\" },\n file: { unit: \"\u0BAA\u0BC8\u0B9F\u0BCD\u0B9F\u0BC1\u0B95\u0BB3\u0BCD\", verb: \"\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD\" },\n array: { unit: \"\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD\", verb: \"\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD\" },\n set: { unit: \"\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD\", verb: \"\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1\",\n email: \"\u0BAE\u0BBF\u0BA9\u0BCD\u0BA9\u0B9E\u0BCD\u0B9A\u0BB2\u0BCD \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO \u0BA4\u0BC7\u0BA4\u0BBF \u0BA8\u0BC7\u0BB0\u0BAE\u0BCD\",\n date: \"ISO \u0BA4\u0BC7\u0BA4\u0BBF\",\n time: \"ISO \u0BA8\u0BC7\u0BB0\u0BAE\u0BCD\",\n duration: \"ISO \u0B95\u0BBE\u0BB2 \u0B85\u0BB3\u0BB5\u0BC1\",\n ipv4: \"IPv4 \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF\",\n ipv6: \"IPv6 \u0BAE\u0BC1\u0B95\u0BB5\u0BB0\u0BBF\",\n cidrv4: \"IPv4 \u0BB5\u0BB0\u0BAE\u0BCD\u0BAA\u0BC1\",\n cidrv6: \"IPv6 \u0BB5\u0BB0\u0BAE\u0BCD\u0BAA\u0BC1\",\n base64: \"base64-encoded \u0B9A\u0BB0\u0BAE\u0BCD\",\n base64url: \"base64url-encoded \u0B9A\u0BB0\u0BAE\u0BCD\",\n json_string: \"JSON \u0B9A\u0BB0\u0BAE\u0BCD\",\n e164: \"E.164 \u0B8E\u0BA3\u0BCD\",\n jwt: \"JWT\",\n template_literal: \"input\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0B8E\u0BA3\u0BCD\",\n array: \"\u0B85\u0BA3\u0BBF\",\n null: \"\u0BB5\u0BC6\u0BB1\u0BC1\u0BAE\u0BC8\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 instanceof ${issue.expected}, \u0BAA\u0BC6\u0BB1\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${received}`;\n }\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${expected}, \u0BAA\u0BC6\u0BB1\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BB5\u0BBF\u0BB0\u0BC1\u0BAA\u0BCD\u0BAA\u0BAE\u0BCD: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${util.joinValues(issue.values, \"|\")} \u0B87\u0BB2\u0BCD \u0B92\u0BA9\u0BCD\u0BB1\u0BC1`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u0BAE\u0BBF\u0B95 \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue.origin ?? \"\u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0B89\u0BB1\u0BC1\u0BAA\u0BCD\u0BAA\u0BC1\u0B95\u0BB3\u0BCD\"} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n }\n return `\u0BAE\u0BBF\u0B95 \u0BAA\u0BC6\u0BB0\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue.origin ?? \"\u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1\"} ${adj}${issue.maximum.toString()} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u0BAE\u0BBF\u0B95\u0B9A\u0BCD \u0B9A\u0BBF\u0BB1\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`; //\n }\n return `\u0BAE\u0BBF\u0B95\u0B9A\u0BCD \u0B9A\u0BBF\u0BB1\u0BBF\u0BAF\u0BA4\u0BC1: \u0B8E\u0BA4\u0BBF\u0BB0\u0BCD\u0BAA\u0BBE\u0BB0\u0BCD\u0B95\u0BCD\u0B95\u0BAA\u0BCD\u0BAA\u0B9F\u0BCD\u0B9F\u0BA4\u0BC1 ${issue.origin} ${adj}${issue.minimum.toString()} \u0B86\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: \"${_issue.prefix}\" \u0B87\u0BB2\u0BCD \u0BA4\u0BCA\u0B9F\u0B99\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n if (_issue.format === \"ends_with\")\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: \"${_issue.suffix}\" \u0B87\u0BB2\u0BCD \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0B9F\u0BC8\u0BAF \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n if (_issue.format === \"includes\")\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: \"${_issue.includes}\" \u0B90 \u0B89\u0BB3\u0BCD\u0BB3\u0B9F\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n if (_issue.format === \"regex\")\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B9A\u0BB0\u0BAE\u0BCD: ${_issue.pattern} \u0BAE\u0BC1\u0BB1\u0BC8\u0BAA\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B9F\u0BA9\u0BCD \u0BAA\u0BCA\u0BB0\u0BC1\u0BA8\u0BCD\u0BA4 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B8E\u0BA3\u0BCD: ${issue.divisor} \u0B87\u0BA9\u0BCD \u0BAA\u0BB2\u0BAE\u0BBE\u0B95 \u0B87\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD`;\n case \"unrecognized_keys\":\n return `\u0B85\u0B9F\u0BC8\u0BAF\u0BBE\u0BB3\u0BAE\u0BCD \u0BA4\u0BC6\u0BB0\u0BBF\u0BAF\u0BBE\u0BA4 \u0BB5\u0BBF\u0B9A\u0BC8${issue.keys.length > 1 ? \"\u0B95\u0BB3\u0BCD\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `${issue.origin} \u0B87\u0BB2\u0BCD \u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BB5\u0BBF\u0B9A\u0BC8`;\n case \"invalid_union\":\n return \"\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1\";\n case \"invalid_element\":\n return `${issue.origin} \u0B87\u0BB2\u0BCD \u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0BAE\u0BA4\u0BBF\u0BAA\u0BCD\u0BAA\u0BC1`;\n default:\n return `\u0BA4\u0BB5\u0BB1\u0BBE\u0BA9 \u0B89\u0BB3\u0BCD\u0BB3\u0BC0\u0B9F\u0BC1`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23\", verb: \"\u0E04\u0E27\u0E23\u0E21\u0E35\" },\n file: { unit: \"\u0E44\u0E1A\u0E15\u0E4C\", verb: \"\u0E04\u0E27\u0E23\u0E21\u0E35\" },\n array: { unit: \"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\", verb: \"\u0E04\u0E27\u0E23\u0E21\u0E35\" },\n set: { unit: \"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\", verb: \"\u0E04\u0E27\u0E23\u0E21\u0E35\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19\",\n email: \"\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48\u0E2D\u0E35\u0E40\u0E21\u0E25\",\n url: \"URL\",\n emoji: \"\u0E2D\u0E34\u0E42\u0E21\u0E08\u0E34\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO\",\n date: \"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E41\u0E1A\u0E1A ISO\",\n time: \"\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO\",\n duration: \"\u0E0A\u0E48\u0E27\u0E07\u0E40\u0E27\u0E25\u0E32\u0E41\u0E1A\u0E1A ISO\",\n ipv4: \"\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48 IPv4\",\n ipv6: \"\u0E17\u0E35\u0E48\u0E2D\u0E22\u0E39\u0E48 IPv6\",\n cidrv4: \"\u0E0A\u0E48\u0E27\u0E07 IP \u0E41\u0E1A\u0E1A IPv4\",\n cidrv6: \"\u0E0A\u0E48\u0E27\u0E07 IP \u0E41\u0E1A\u0E1A IPv6\",\n base64: \"\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A Base64\",\n base64url: \"\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A Base64 \u0E2A\u0E33\u0E2B\u0E23\u0E31\u0E1A URL\",\n json_string: \"\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E41\u0E1A\u0E1A JSON\",\n e164: \"\u0E40\u0E1A\u0E2D\u0E23\u0E4C\u0E42\u0E17\u0E23\u0E28\u0E31\u0E1E\u0E17\u0E4C\u0E23\u0E30\u0E2B\u0E27\u0E48\u0E32\u0E07\u0E1B\u0E23\u0E30\u0E40\u0E17\u0E28 (E.164)\",\n jwt: \"\u0E42\u0E17\u0E40\u0E04\u0E19 JWT\",\n template_literal: \"\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E17\u0E35\u0E48\u0E1B\u0E49\u0E2D\u0E19\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02\",\n array: \"\u0E2D\u0E32\u0E23\u0E4C\u0E40\u0E23\u0E22\u0E4C (Array)\",\n null: \"\u0E44\u0E21\u0E48\u0E21\u0E35\u0E04\u0E48\u0E32 (null)\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 instanceof ${issue.expected} \u0E41\u0E15\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A ${received}`;\n }\n return `\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 ${expected} \u0E41\u0E15\u0E48\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u0E04\u0E48\u0E32\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19 ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u0E15\u0E31\u0E27\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E04\u0E27\u0E23\u0E40\u0E1B\u0E47\u0E19\u0E2B\u0E19\u0E36\u0E48\u0E07\u0E43\u0E19 ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"\u0E44\u0E21\u0E48\u0E40\u0E01\u0E34\u0E19\" : \"\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u0E40\u0E01\u0E34\u0E19\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue.origin ?? \"\u0E04\u0E48\u0E32\"} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue.maximum.toString()} ${sizing.unit ?? \"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\"}`;\n return `\u0E40\u0E01\u0E34\u0E19\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue.origin ?? \"\u0E04\u0E48\u0E32\"} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \"\u0E2D\u0E22\u0E48\u0E32\u0E07\u0E19\u0E49\u0E2D\u0E22\" : \"\u0E21\u0E32\u0E01\u0E01\u0E27\u0E48\u0E32\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue.origin} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `\u0E19\u0E49\u0E2D\u0E22\u0E01\u0E27\u0E48\u0E32\u0E01\u0E33\u0E2B\u0E19\u0E14: ${issue.origin} \u0E04\u0E27\u0E23\u0E21\u0E35${adj} ${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E02\u0E36\u0E49\u0E19\u0E15\u0E49\u0E19\u0E14\u0E49\u0E27\u0E22 \"${_issue.prefix}\"`;\n }\n if (_issue.format === \"ends_with\")\n return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E25\u0E07\u0E17\u0E49\u0E32\u0E22\u0E14\u0E49\u0E27\u0E22 \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E15\u0E49\u0E2D\u0E07\u0E21\u0E35 \"${_issue.includes}\" \u0E2D\u0E22\u0E39\u0E48\u0E43\u0E19\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21`;\n if (_issue.format === \"regex\")\n return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E15\u0E49\u0E2D\u0E07\u0E15\u0E23\u0E07\u0E01\u0E31\u0E1A\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14 ${_issue.pattern}`;\n return `\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u0E15\u0E31\u0E27\u0E40\u0E25\u0E02\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E15\u0E49\u0E2D\u0E07\u0E40\u0E1B\u0E47\u0E19\u0E08\u0E33\u0E19\u0E27\u0E19\u0E17\u0E35\u0E48\u0E2B\u0E32\u0E23\u0E14\u0E49\u0E27\u0E22 ${issue.divisor} \u0E44\u0E14\u0E49\u0E25\u0E07\u0E15\u0E31\u0E27`;\n case \"unrecognized_keys\":\n return `\u0E1E\u0E1A\u0E04\u0E35\u0E22\u0E4C\u0E17\u0E35\u0E48\u0E44\u0E21\u0E48\u0E23\u0E39\u0E49\u0E08\u0E31\u0E01: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u0E04\u0E35\u0E22\u0E4C\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E19 ${issue.origin}`;\n case \"invalid_union\":\n return \"\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07: \u0E44\u0E21\u0E48\u0E15\u0E23\u0E07\u0E01\u0E31\u0E1A\u0E23\u0E39\u0E1B\u0E41\u0E1A\u0E1A\u0E22\u0E39\u0E40\u0E19\u0E35\u0E22\u0E19\u0E17\u0E35\u0E48\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E44\u0E27\u0E49\";\n case \"invalid_element\":\n return `\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E19 ${issue.origin}`;\n default:\n return `\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"karakter\", verb: \"olmal\u0131\" },\n file: { unit: \"bayt\", verb: \"olmal\u0131\" },\n array: { unit: \"\u00F6\u011Fe\", verb: \"olmal\u0131\" },\n set: { unit: \"\u00F6\u011Fe\", verb: \"olmal\u0131\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"girdi\",\n email: \"e-posta adresi\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO tarih ve saat\",\n date: \"ISO tarih\",\n time: \"ISO saat\",\n duration: \"ISO s\u00FCre\",\n ipv4: \"IPv4 adresi\",\n ipv6: \"IPv6 adresi\",\n cidrv4: \"IPv4 aral\u0131\u011F\u0131\",\n cidrv6: \"IPv6 aral\u0131\u011F\u0131\",\n base64: \"base64 ile \u015Fifrelenmi\u015F metin\",\n base64url: \"base64url ile \u015Fifrelenmi\u015F metin\",\n json_string: \"JSON dizesi\",\n e164: \"E.164 say\u0131s\u0131\",\n jwt: \"JWT\",\n template_literal: \"\u015Eablon dizesi\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Ge\u00E7ersiz de\u011Fer: beklenen instanceof ${issue.expected}, al\u0131nan ${received}`;\n }\n return `Ge\u00E7ersiz de\u011Fer: beklenen ${expected}, al\u0131nan ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Ge\u00E7ersiz de\u011Fer: beklenen ${util.stringifyPrimitive(issue.values[0])}`;\n return `Ge\u00E7ersiz se\u00E7enek: a\u015Fa\u011F\u0131dakilerden biri olmal\u0131: ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u00C7ok b\u00FCy\u00FCk: beklenen ${issue.origin ?? \"de\u011Fer\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u00F6\u011Fe\"}`;\n return `\u00C7ok b\u00FCy\u00FCk: beklenen ${issue.origin ?? \"de\u011Fer\"} ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u00C7ok k\u00FC\u00E7\u00FCk: beklenen ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n return `\u00C7ok k\u00FC\u00E7\u00FCk: beklenen ${issue.origin} ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Ge\u00E7ersiz metin: \"${_issue.prefix}\" ile ba\u015Flamal\u0131`;\n if (_issue.format === \"ends_with\")\n return `Ge\u00E7ersiz metin: \"${_issue.suffix}\" ile bitmeli`;\n if (_issue.format === \"includes\")\n return `Ge\u00E7ersiz metin: \"${_issue.includes}\" i\u00E7ermeli`;\n if (_issue.format === \"regex\")\n return `Ge\u00E7ersiz metin: ${_issue.pattern} desenine uymal\u0131`;\n return `Ge\u00E7ersiz ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Ge\u00E7ersiz say\u0131: ${issue.divisor} ile tam b\u00F6l\u00FCnebilmeli`;\n case \"unrecognized_keys\":\n return `Tan\u0131nmayan anahtar${issue.keys.length > 1 ? \"lar\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `${issue.origin} i\u00E7inde ge\u00E7ersiz anahtar`;\n case \"invalid_union\":\n return \"Ge\u00E7ersiz de\u011Fer\";\n case \"invalid_element\":\n return `${issue.origin} i\u00E7inde ge\u00E7ersiz de\u011Fer`;\n default:\n return `Ge\u00E7ersiz de\u011Fer`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432\", verb: \"\u043C\u0430\u0442\u0438\u043C\u0435\" },\n file: { unit: \"\u0431\u0430\u0439\u0442\u0456\u0432\", verb: \"\u043C\u0430\u0442\u0438\u043C\u0435\" },\n array: { unit: \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432\", verb: \"\u043C\u0430\u0442\u0438\u043C\u0435\" },\n set: { unit: \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432\", verb: \"\u043C\u0430\u0442\u0438\u043C\u0435\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456\",\n email: \"\u0430\u0434\u0440\u0435\u0441\u0430 \u0435\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0457 \u043F\u043E\u0448\u0442\u0438\",\n url: \"URL\",\n emoji: \"\u0435\u043C\u043E\u0434\u0437\u0456\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"\u0434\u0430\u0442\u0430 \u0442\u0430 \u0447\u0430\u0441 ISO\",\n date: \"\u0434\u0430\u0442\u0430 ISO\",\n time: \"\u0447\u0430\u0441 ISO\",\n duration: \"\u0442\u0440\u0438\u0432\u0430\u043B\u0456\u0441\u0442\u044C ISO\",\n ipv4: \"\u0430\u0434\u0440\u0435\u0441\u0430 IPv4\",\n ipv6: \"\u0430\u0434\u0440\u0435\u0441\u0430 IPv6\",\n cidrv4: \"\u0434\u0456\u0430\u043F\u0430\u0437\u043E\u043D IPv4\",\n cidrv6: \"\u0434\u0456\u0430\u043F\u0430\u0437\u043E\u043D IPv6\",\n base64: \"\u0440\u044F\u0434\u043E\u043A \u0443 \u043A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u0456 base64\",\n base64url: \"\u0440\u044F\u0434\u043E\u043A \u0443 \u043A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u0456 base64url\",\n json_string: \"\u0440\u044F\u0434\u043E\u043A JSON\",\n e164: \"\u043D\u043E\u043C\u0435\u0440 E.164\",\n jwt: \"JWT\",\n template_literal: \"\u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0447\u0438\u0441\u043B\u043E\",\n array: \"\u043C\u0430\u0441\u0438\u0432\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F instanceof ${issue.expected}, \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043E ${received}`;\n }\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F ${expected}, \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043E ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0430 \u043E\u043F\u0446\u0456\u044F: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F \u043E\u0434\u043D\u0435 \u0437 ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F\"} ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432\"}`;\n return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u0432\u0435\u043B\u0438\u043A\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue.origin ?? \"\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F\"} \u0431\u0443\u0434\u0435 ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue.origin} ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `\u0417\u0430\u043D\u0430\u0434\u0442\u043E \u043C\u0430\u043B\u0435: \u043E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E ${issue.origin} \u0431\u0443\u0434\u0435 ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u043F\u043E\u0447\u0438\u043D\u0430\u0442\u0438\u0441\u044F \u0437 \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u0437\u0430\u043A\u0456\u043D\u0447\u0443\u0432\u0430\u0442\u0438\u0441\u044F \u043D\u0430 \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u043C\u0456\u0441\u0442\u0438\u0442\u0438 \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0440\u044F\u0434\u043E\u043A: \u043F\u043E\u0432\u0438\u043D\u0435\u043D \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u0442\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 ${_issue.pattern}`;\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435 \u0447\u0438\u0441\u043B\u043E: \u043F\u043E\u0432\u0438\u043D\u043D\u043E \u0431\u0443\u0442\u0438 \u043A\u0440\u0430\u0442\u043D\u0438\u043C ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `\u041D\u0435\u0440\u043E\u0437\u043F\u0456\u0437\u043D\u0430\u043D\u0438\u0439 \u043A\u043B\u044E\u0447${issue.keys.length > 1 ? \"\u0456\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u043A\u043B\u044E\u0447 \u0443 ${issue.origin}`;\n case \"invalid_union\":\n return \"\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456\";\n case \"invalid_element\":\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0443 ${issue.origin}`;\n default:\n return `\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0456 \u0432\u0445\u0456\u0434\u043D\u0456 \u0434\u0430\u043D\u0456`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import uk from \"./uk.js\";\n/** @deprecated Use `uk` instead. */\nexport default function () {\n return uk();\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u062D\u0631\u0648\u0641\", verb: \"\u06C1\u0648\u0646\u0627\" },\n file: { unit: \"\u0628\u0627\u0626\u0679\u0633\", verb: \"\u06C1\u0648\u0646\u0627\" },\n array: { unit: \"\u0622\u0626\u0679\u0645\u0632\", verb: \"\u06C1\u0648\u0646\u0627\" },\n set: { unit: \"\u0622\u0626\u0679\u0645\u0632\", verb: \"\u06C1\u0648\u0646\u0627\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0627\u0646 \u067E\u0679\",\n email: \"\u0627\u06CC \u0645\u06CC\u0644 \u0627\u06CC\u0688\u0631\u06CC\u0633\",\n url: \"\u06CC\u0648 \u0622\u0631 \u0627\u06CC\u0644\",\n emoji: \"\u0627\u06CC\u0645\u0648\u062C\u06CC\",\n uuid: \"\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n uuidv4: \"\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC \u0648\u06CC 4\",\n uuidv6: \"\u06CC\u0648 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC \u0648\u06CC 6\",\n nanoid: \"\u0646\u06CC\u0646\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n guid: \"\u062C\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n cuid: \"\u0633\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n cuid2: \"\u0633\u06CC \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC 2\",\n ulid: \"\u06CC\u0648 \u0627\u06CC\u0644 \u0622\u0626\u06CC \u0688\u06CC\",\n xid: \"\u0627\u06CC\u06A9\u0633 \u0622\u0626\u06CC \u0688\u06CC\",\n ksuid: \"\u06A9\u06D2 \u0627\u06CC\u0633 \u06CC\u0648 \u0622\u0626\u06CC \u0688\u06CC\",\n datetime: \"\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0688\u06CC\u0679 \u0679\u0627\u0626\u0645\",\n date: \"\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u062A\u0627\u0631\u06CC\u062E\",\n time: \"\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0648\u0642\u062A\",\n duration: \"\u0622\u0626\u06CC \u0627\u06CC\u0633 \u0627\u0648 \u0645\u062F\u062A\",\n ipv4: \"\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 4 \u0627\u06CC\u0688\u0631\u06CC\u0633\",\n ipv6: \"\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 6 \u0627\u06CC\u0688\u0631\u06CC\u0633\",\n cidrv4: \"\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 4 \u0631\u06CC\u0646\u062C\",\n cidrv6: \"\u0622\u0626\u06CC \u067E\u06CC \u0648\u06CC 6 \u0631\u06CC\u0646\u062C\",\n base64: \"\u0628\u06CC\u0633 64 \u0627\u0646 \u06A9\u0648\u0688\u0688 \u0633\u0679\u0631\u0646\u06AF\",\n base64url: \"\u0628\u06CC\u0633 64 \u06CC\u0648 \u0622\u0631 \u0627\u06CC\u0644 \u0627\u0646 \u06A9\u0648\u0688\u0688 \u0633\u0679\u0631\u0646\u06AF\",\n json_string: \"\u062C\u06D2 \u0627\u06CC\u0633 \u0627\u0648 \u0627\u06CC\u0646 \u0633\u0679\u0631\u0646\u06AF\",\n e164: \"\u0627\u06CC 164 \u0646\u0645\u0628\u0631\",\n jwt: \"\u062C\u06D2 \u0688\u0628\u0644\u06CC\u0648 \u0679\u06CC\",\n template_literal: \"\u0627\u0646 \u067E\u0679\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u0646\u0645\u0628\u0631\",\n array: \"\u0622\u0631\u06D2\",\n null: \"\u0646\u0644\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: instanceof ${issue.expected} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627\u060C ${received} \u0645\u0648\u0635\u0648\u0644 \u06C1\u0648\u0627`;\n }\n return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: ${expected} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627\u060C ${received} \u0645\u0648\u0635\u0648\u0644 \u06C1\u0648\u0627`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679: ${util.stringifyPrimitive(issue.values[0])} \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`;\n return `\u063A\u0644\u0637 \u0622\u067E\u0634\u0646: ${util.joinValues(issue.values, \"|\")} \u0645\u06CC\u06BA \u0633\u06D2 \u0627\u06CC\u06A9 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u0628\u06C1\u062A \u0628\u0691\u0627: ${issue.origin ?? \"\u0648\u06CC\u0644\u06CC\u0648\"} \u06A9\u06D2 ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u0639\u0646\u0627\u0635\u0631\"} \u06C1\u0648\u0646\u06D2 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u06D2`;\n return `\u0628\u06C1\u062A \u0628\u0691\u0627: ${issue.origin ?? \"\u0648\u06CC\u0644\u06CC\u0648\"} \u06A9\u0627 ${adj}${issue.maximum.toString()} \u06C1\u0648\u0646\u0627 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u0628\u06C1\u062A \u0686\u06BE\u0648\u0679\u0627: ${issue.origin} \u06A9\u06D2 ${adj}${issue.minimum.toString()} ${sizing.unit} \u06C1\u0648\u0646\u06D2 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u06D2`;\n }\n return `\u0628\u06C1\u062A \u0686\u06BE\u0648\u0679\u0627: ${issue.origin} \u06A9\u0627 ${adj}${issue.minimum.toString()} \u06C1\u0648\u0646\u0627 \u0645\u062A\u0648\u0642\u0639 \u062A\u06BE\u0627`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \"${_issue.prefix}\" \u0633\u06D2 \u0634\u0631\u0648\u0639 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n }\n if (_issue.format === \"ends_with\")\n return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \"${_issue.suffix}\" \u067E\u0631 \u062E\u062A\u0645 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n if (_issue.format === \"includes\")\n return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \"${_issue.includes}\" \u0634\u0627\u0645\u0644 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n if (_issue.format === \"regex\")\n return `\u063A\u0644\u0637 \u0633\u0679\u0631\u0646\u06AF: \u067E\u06CC\u0679\u0631\u0646 ${_issue.pattern} \u0633\u06D2 \u0645\u06CC\u0686 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n return `\u063A\u0644\u0637 ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u063A\u0644\u0637 \u0646\u0645\u0628\u0631: ${issue.divisor} \u06A9\u0627 \u0645\u0636\u0627\u0639\u0641 \u06C1\u0648\u0646\u0627 \u0686\u0627\u06C1\u06CC\u06D2`;\n case \"unrecognized_keys\":\n return `\u063A\u06CC\u0631 \u062A\u0633\u0644\u06CC\u0645 \u0634\u062F\u06C1 \u06A9\u06CC${issue.keys.length > 1 ? \"\u0632\" : \"\"}: ${util.joinValues(issue.keys, \"\u060C \")}`;\n case \"invalid_key\":\n return `${issue.origin} \u0645\u06CC\u06BA \u063A\u0644\u0637 \u06A9\u06CC`;\n case \"invalid_union\":\n return \"\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679\";\n case \"invalid_element\":\n return `${issue.origin} \u0645\u06CC\u06BA \u063A\u0644\u0637 \u0648\u06CC\u0644\u06CC\u0648`;\n default:\n return `\u063A\u0644\u0637 \u0627\u0646 \u067E\u0679`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"belgi\", verb: \"bo\u2018lishi kerak\" },\n file: { unit: \"bayt\", verb: \"bo\u2018lishi kerak\" },\n array: { unit: \"element\", verb: \"bo\u2018lishi kerak\" },\n set: { unit: \"element\", verb: \"bo\u2018lishi kerak\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"kirish\",\n email: \"elektron pochta manzili\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO sana va vaqti\",\n date: \"ISO sana\",\n time: \"ISO vaqt\",\n duration: \"ISO davomiylik\",\n ipv4: \"IPv4 manzil\",\n ipv6: \"IPv6 manzil\",\n mac: \"MAC manzil\",\n cidrv4: \"IPv4 diapazon\",\n cidrv6: \"IPv6 diapazon\",\n base64: \"base64 kodlangan satr\",\n base64url: \"base64url kodlangan satr\",\n json_string: \"JSON satr\",\n e164: \"E.164 raqam\",\n jwt: \"JWT\",\n template_literal: \"kirish\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"raqam\",\n array: \"massiv\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `Noto\u2018g\u2018ri kirish: kutilgan instanceof ${issue.expected}, qabul qilingan ${received}`;\n }\n return `Noto\u2018g\u2018ri kirish: kutilgan ${expected}, qabul qilingan ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `Noto\u2018g\u2018ri kirish: kutilgan ${util.stringifyPrimitive(issue.values[0])}`;\n return `Noto\u2018g\u2018ri variant: quyidagilardan biri kutilgan ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Juda katta: kutilgan ${issue.origin ?? \"qiymat\"} ${adj}${issue.maximum.toString()} ${sizing.unit} ${sizing.verb}`;\n return `Juda katta: kutilgan ${issue.origin ?? \"qiymat\"} ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Juda kichik: kutilgan ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit} ${sizing.verb}`;\n }\n return `Juda kichik: kutilgan ${issue.origin} ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Noto\u2018g\u2018ri satr: \"${_issue.prefix}\" bilan boshlanishi kerak`;\n if (_issue.format === \"ends_with\")\n return `Noto\u2018g\u2018ri satr: \"${_issue.suffix}\" bilan tugashi kerak`;\n if (_issue.format === \"includes\")\n return `Noto\u2018g\u2018ri satr: \"${_issue.includes}\" ni o\u2018z ichiga olishi kerak`;\n if (_issue.format === \"regex\")\n return `Noto\u2018g\u2018ri satr: ${_issue.pattern} shabloniga mos kelishi kerak`;\n return `Noto\u2018g\u2018ri ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `Noto\u2018g\u2018ri raqam: ${issue.divisor} ning karralisi bo\u2018lishi kerak`;\n case \"unrecognized_keys\":\n return `Noma\u2019lum kalit${issue.keys.length > 1 ? \"lar\" : \"\"}: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `${issue.origin} dagi kalit noto\u2018g\u2018ri`;\n case \"invalid_union\":\n return \"Noto\u2018g\u2018ri kirish\";\n case \"invalid_element\":\n return `${issue.origin} da noto\u2018g\u2018ri qiymat`;\n default:\n return `Noto\u2018g\u2018ri kirish`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"k\u00FD t\u1EF1\", verb: \"c\u00F3\" },\n file: { unit: \"byte\", verb: \"c\u00F3\" },\n array: { unit: \"ph\u1EA7n t\u1EED\", verb: \"c\u00F3\" },\n set: { unit: \"ph\u1EA7n t\u1EED\", verb: \"c\u00F3\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u0111\u1EA7u v\u00E0o\",\n email: \"\u0111\u1ECBa ch\u1EC9 email\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ng\u00E0y gi\u1EDD ISO\",\n date: \"ng\u00E0y ISO\",\n time: \"gi\u1EDD ISO\",\n duration: \"kho\u1EA3ng th\u1EDDi gian ISO\",\n ipv4: \"\u0111\u1ECBa ch\u1EC9 IPv4\",\n ipv6: \"\u0111\u1ECBa ch\u1EC9 IPv6\",\n cidrv4: \"d\u1EA3i IPv4\",\n cidrv6: \"d\u1EA3i IPv6\",\n base64: \"chu\u1ED7i m\u00E3 h\u00F3a base64\",\n base64url: \"chu\u1ED7i m\u00E3 h\u00F3a base64url\",\n json_string: \"chu\u1ED7i JSON\",\n e164: \"s\u1ED1 E.164\",\n jwt: \"JWT\",\n template_literal: \"\u0111\u1EA7u v\u00E0o\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"s\u1ED1\",\n array: \"m\u1EA3ng\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i instanceof ${issue.expected}, nh\u1EADn \u0111\u01B0\u1EE3c ${received}`;\n }\n return `\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i ${expected}, nh\u1EADn \u0111\u01B0\u1EE3c ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i ${util.stringifyPrimitive(issue.values[0])}`;\n return `T\u00F9y ch\u1ECDn kh\u00F4ng h\u1EE3p l\u1EC7: mong \u0111\u1EE3i m\u1ED9t trong c\u00E1c gi\u00E1 tr\u1ECB ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `Qu\u00E1 l\u1EDBn: mong \u0111\u1EE3i ${issue.origin ?? \"gi\u00E1 tr\u1ECB\"} ${sizing.verb} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"ph\u1EA7n t\u1EED\"}`;\n return `Qu\u00E1 l\u1EDBn: mong \u0111\u1EE3i ${issue.origin ?? \"gi\u00E1 tr\u1ECB\"} ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `Qu\u00E1 nh\u1ECF: mong \u0111\u1EE3i ${issue.origin} ${sizing.verb} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `Qu\u00E1 nh\u1ECF: mong \u0111\u1EE3i ${issue.origin} ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `Chu\u1ED7i kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i b\u1EAFt \u0111\u1EA7u b\u1EB1ng \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `Chu\u1ED7i kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i k\u1EBFt th\u00FAc b\u1EB1ng \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `Chu\u1ED7i kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i bao g\u1ED3m \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `Chu\u1ED7i kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i kh\u1EDBp v\u1EDBi m\u1EABu ${_issue.pattern}`;\n return `${FormatDictionary[_issue.format] ?? issue.format} kh\u00F4ng h\u1EE3p l\u1EC7`;\n }\n case \"not_multiple_of\":\n return `S\u1ED1 kh\u00F4ng h\u1EE3p l\u1EC7: ph\u1EA3i l\u00E0 b\u1ED9i s\u1ED1 c\u1EE7a ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `Kh\u00F3a kh\u00F4ng \u0111\u01B0\u1EE3c nh\u1EADn d\u1EA1ng: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `Kh\u00F3a kh\u00F4ng h\u1EE3p l\u1EC7 trong ${issue.origin}`;\n case \"invalid_union\":\n return \"\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7\";\n case \"invalid_element\":\n return `Gi\u00E1 tr\u1ECB kh\u00F4ng h\u1EE3p l\u1EC7 trong ${issue.origin}`;\n default:\n return `\u0110\u1EA7u v\u00E0o kh\u00F4ng h\u1EE3p l\u1EC7`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u5B57\u7B26\", verb: \"\u5305\u542B\" },\n file: { unit: \"\u5B57\u8282\", verb: \"\u5305\u542B\" },\n array: { unit: \"\u9879\", verb: \"\u5305\u542B\" },\n set: { unit: \"\u9879\", verb: \"\u5305\u542B\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u8F93\u5165\",\n email: \"\u7535\u5B50\u90AE\u4EF6\",\n url: \"URL\",\n emoji: \"\u8868\u60C5\u7B26\u53F7\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO\u65E5\u671F\u65F6\u95F4\",\n date: \"ISO\u65E5\u671F\",\n time: \"ISO\u65F6\u95F4\",\n duration: \"ISO\u65F6\u957F\",\n ipv4: \"IPv4\u5730\u5740\",\n ipv6: \"IPv6\u5730\u5740\",\n cidrv4: \"IPv4\u7F51\u6BB5\",\n cidrv6: \"IPv6\u7F51\u6BB5\",\n base64: \"base64\u7F16\u7801\u5B57\u7B26\u4E32\",\n base64url: \"base64url\u7F16\u7801\u5B57\u7B26\u4E32\",\n json_string: \"JSON\u5B57\u7B26\u4E32\",\n e164: \"E.164\u53F7\u7801\",\n jwt: \"JWT\",\n template_literal: \"\u8F93\u5165\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"\u6570\u5B57\",\n array: \"\u6570\u7EC4\",\n null: \"\u7A7A\u503C(null)\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B instanceof ${issue.expected}\uFF0C\u5B9E\u9645\u63A5\u6536 ${received}`;\n }\n return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B ${expected}\uFF0C\u5B9E\u9645\u63A5\u6536 ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u65E0\u6548\u8F93\u5165\uFF1A\u671F\u671B ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u65E0\u6548\u9009\u9879\uFF1A\u671F\u671B\u4EE5\u4E0B\u4E4B\u4E00 ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u6570\u503C\u8FC7\u5927\uFF1A\u671F\u671B ${issue.origin ?? \"\u503C\"} ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u4E2A\u5143\u7D20\"}`;\n return `\u6570\u503C\u8FC7\u5927\uFF1A\u671F\u671B ${issue.origin ?? \"\u503C\"} ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u6570\u503C\u8FC7\u5C0F\uFF1A\u671F\u671B ${issue.origin} ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `\u6570\u503C\u8FC7\u5C0F\uFF1A\u671F\u671B ${issue.origin} ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u4EE5 \"${_issue.prefix}\" \u5F00\u5934`;\n if (_issue.format === \"ends_with\")\n return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u4EE5 \"${_issue.suffix}\" \u7ED3\u5C3E`;\n if (_issue.format === \"includes\")\n return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u5305\u542B \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u65E0\u6548\u5B57\u7B26\u4E32\uFF1A\u5FC5\u987B\u6EE1\u8DB3\u6B63\u5219\u8868\u8FBE\u5F0F ${_issue.pattern}`;\n return `\u65E0\u6548${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u65E0\u6548\u6570\u5B57\uFF1A\u5FC5\u987B\u662F ${issue.divisor} \u7684\u500D\u6570`;\n case \"unrecognized_keys\":\n return `\u51FA\u73B0\u672A\u77E5\u7684\u952E(key): ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `${issue.origin} \u4E2D\u7684\u952E(key)\u65E0\u6548`;\n case \"invalid_union\":\n return \"\u65E0\u6548\u8F93\u5165\";\n case \"invalid_element\":\n return `${issue.origin} \u4E2D\u5305\u542B\u65E0\u6548\u503C(value)`;\n default:\n return `\u65E0\u6548\u8F93\u5165`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u5B57\u5143\", verb: \"\u64C1\u6709\" },\n file: { unit: \"\u4F4D\u5143\u7D44\", verb: \"\u64C1\u6709\" },\n array: { unit: \"\u9805\u76EE\", verb: \"\u64C1\u6709\" },\n set: { unit: \"\u9805\u76EE\", verb: \"\u64C1\u6709\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u8F38\u5165\",\n email: \"\u90F5\u4EF6\u5730\u5740\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"ISO \u65E5\u671F\u6642\u9593\",\n date: \"ISO \u65E5\u671F\",\n time: \"ISO \u6642\u9593\",\n duration: \"ISO \u671F\u9593\",\n ipv4: \"IPv4 \u4F4D\u5740\",\n ipv6: \"IPv6 \u4F4D\u5740\",\n cidrv4: \"IPv4 \u7BC4\u570D\",\n cidrv6: \"IPv6 \u7BC4\u570D\",\n base64: \"base64 \u7DE8\u78BC\u5B57\u4E32\",\n base64url: \"base64url \u7DE8\u78BC\u5B57\u4E32\",\n json_string: \"JSON \u5B57\u4E32\",\n e164: \"E.164 \u6578\u503C\",\n jwt: \"JWT\",\n template_literal: \"\u8F38\u5165\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA instanceof ${issue.expected}\uFF0C\u4F46\u6536\u5230 ${received}`;\n }\n return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA ${expected}\uFF0C\u4F46\u6536\u5230 ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u7121\u6548\u7684\u8F38\u5165\u503C\uFF1A\u9810\u671F\u70BA ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u7121\u6548\u7684\u9078\u9805\uFF1A\u9810\u671F\u70BA\u4EE5\u4E0B\u5176\u4E2D\u4E4B\u4E00 ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `\u6578\u503C\u904E\u5927\uFF1A\u9810\u671F ${issue.origin ?? \"\u503C\"} \u61C9\u70BA ${adj}${issue.maximum.toString()} ${sizing.unit ?? \"\u500B\u5143\u7D20\"}`;\n return `\u6578\u503C\u904E\u5927\uFF1A\u9810\u671F ${issue.origin ?? \"\u503C\"} \u61C9\u70BA ${adj}${issue.maximum.toString()}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing) {\n return `\u6578\u503C\u904E\u5C0F\uFF1A\u9810\u671F ${issue.origin} \u61C9\u70BA ${adj}${issue.minimum.toString()} ${sizing.unit}`;\n }\n return `\u6578\u503C\u904E\u5C0F\uFF1A\u9810\u671F ${issue.origin} \u61C9\u70BA ${adj}${issue.minimum.toString()}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\") {\n return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u4EE5 \"${_issue.prefix}\" \u958B\u982D`;\n }\n if (_issue.format === \"ends_with\")\n return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u4EE5 \"${_issue.suffix}\" \u7D50\u5C3E`;\n if (_issue.format === \"includes\")\n return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u5305\u542B \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u7121\u6548\u7684\u5B57\u4E32\uFF1A\u5FC5\u9808\u7B26\u5408\u683C\u5F0F ${_issue.pattern}`;\n return `\u7121\u6548\u7684 ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `\u7121\u6548\u7684\u6578\u5B57\uFF1A\u5FC5\u9808\u70BA ${issue.divisor} \u7684\u500D\u6578`;\n case \"unrecognized_keys\":\n return `\u7121\u6CD5\u8B58\u5225\u7684\u9375\u503C${issue.keys.length > 1 ? \"\u5011\" : \"\"}\uFF1A${util.joinValues(issue.keys, \"\u3001\")}`;\n case \"invalid_key\":\n return `${issue.origin} \u4E2D\u6709\u7121\u6548\u7684\u9375\u503C`;\n case \"invalid_union\":\n return \"\u7121\u6548\u7684\u8F38\u5165\u503C\";\n case \"invalid_element\":\n return `${issue.origin} \u4E2D\u6709\u7121\u6548\u7684\u503C`;\n default:\n return `\u7121\u6548\u7684\u8F38\u5165\u503C`;\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "import * as util from \"../core/util.js\";\nconst error = () => {\n const Sizable = {\n string: { unit: \"\u00E0mi\", verb: \"n\u00ED\" },\n file: { unit: \"bytes\", verb: \"n\u00ED\" },\n array: { unit: \"nkan\", verb: \"n\u00ED\" },\n set: { unit: \"nkan\", verb: \"n\u00ED\" },\n };\n function getSizing(origin) {\n return Sizable[origin] ?? null;\n }\n const FormatDictionary = {\n regex: \"\u1EB9\u0300r\u1ECD \u00ECb\u00E1w\u1ECDl\u00E9\",\n email: \"\u00E0d\u00EDr\u1EB9\u0301s\u00EC \u00ECm\u1EB9\u0301l\u00EC\",\n url: \"URL\",\n emoji: \"emoji\",\n uuid: \"UUID\",\n uuidv4: \"UUIDv4\",\n uuidv6: \"UUIDv6\",\n nanoid: \"nanoid\",\n guid: \"GUID\",\n cuid: \"cuid\",\n cuid2: \"cuid2\",\n ulid: \"ULID\",\n xid: \"XID\",\n ksuid: \"KSUID\",\n datetime: \"\u00E0k\u00F3k\u00F2 ISO\",\n date: \"\u1ECDj\u1ECD\u0301 ISO\",\n time: \"\u00E0k\u00F3k\u00F2 ISO\",\n duration: \"\u00E0k\u00F3k\u00F2 t\u00F3 p\u00E9 ISO\",\n ipv4: \"\u00E0d\u00EDr\u1EB9\u0301s\u00EC IPv4\",\n ipv6: \"\u00E0d\u00EDr\u1EB9\u0301s\u00EC IPv6\",\n cidrv4: \"\u00E0gb\u00E8gb\u00E8 IPv4\",\n cidrv6: \"\u00E0gb\u00E8gb\u00E8 IPv6\",\n base64: \"\u1ECD\u0300r\u1ECD\u0300 t\u00ED a k\u1ECD\u0301 n\u00ED base64\",\n base64url: \"\u1ECD\u0300r\u1ECD\u0300 base64url\",\n json_string: \"\u1ECD\u0300r\u1ECD\u0300 JSON\",\n e164: \"n\u1ECD\u0301mb\u00E0 E.164\",\n jwt: \"JWT\",\n template_literal: \"\u1EB9\u0300r\u1ECD \u00ECb\u00E1w\u1ECDl\u00E9\",\n };\n const TypeDictionary = {\n nan: \"NaN\",\n number: \"n\u1ECD\u0301mb\u00E0\",\n array: \"akop\u1ECD\",\n };\n return (issue) => {\n switch (issue.code) {\n case \"invalid_type\": {\n const expected = TypeDictionary[issue.expected] ?? issue.expected;\n const receivedType = util.parsedType(issue.input);\n const received = TypeDictionary[receivedType] ?? receivedType;\n if (/^[A-Z]/.test(issue.expected)) {\n return `\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e: a n\u00ED l\u00E1ti fi instanceof ${issue.expected}, \u00E0m\u1ECD\u0300 a r\u00ED ${received}`;\n }\n return `\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e: a n\u00ED l\u00E1ti fi ${expected}, \u00E0m\u1ECD\u0300 a r\u00ED ${received}`;\n }\n case \"invalid_value\":\n if (issue.values.length === 1)\n return `\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e: a n\u00ED l\u00E1ti fi ${util.stringifyPrimitive(issue.values[0])}`;\n return `\u00C0\u1E63\u00E0y\u00E0n a\u1E63\u00EC\u1E63e: yan \u1ECD\u0300kan l\u00E1ra ${util.joinValues(issue.values, \"|\")}`;\n case \"too_big\": {\n const adj = issue.inclusive ? \"<=\" : \"<\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `T\u00F3 p\u1ECD\u0300 j\u00F9: a n\u00ED l\u00E1ti j\u1EB9\u0301 p\u00E9 ${issue.origin ?? \"iye\"} ${sizing.verb} ${adj}${issue.maximum} ${sizing.unit}`;\n return `T\u00F3 p\u1ECD\u0300 j\u00F9: a n\u00ED l\u00E1ti j\u1EB9\u0301 ${adj}${issue.maximum}`;\n }\n case \"too_small\": {\n const adj = issue.inclusive ? \">=\" : \">\";\n const sizing = getSizing(issue.origin);\n if (sizing)\n return `K\u00E9r\u00E9 ju: a n\u00ED l\u00E1ti j\u1EB9\u0301 p\u00E9 ${issue.origin} ${sizing.verb} ${adj}${issue.minimum} ${sizing.unit}`;\n return `K\u00E9r\u00E9 ju: a n\u00ED l\u00E1ti j\u1EB9\u0301 ${adj}${issue.minimum}`;\n }\n case \"invalid_format\": {\n const _issue = issue;\n if (_issue.format === \"starts_with\")\n return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 b\u1EB9\u0300r\u1EB9\u0300 p\u1EB9\u0300l\u00FA \"${_issue.prefix}\"`;\n if (_issue.format === \"ends_with\")\n return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 par\u00ED p\u1EB9\u0300l\u00FA \"${_issue.suffix}\"`;\n if (_issue.format === \"includes\")\n return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 n\u00ED \"${_issue.includes}\"`;\n if (_issue.format === \"regex\")\n return `\u1ECC\u0300r\u1ECD\u0300 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 b\u00E1 \u00E0p\u1EB9\u1EB9r\u1EB9 mu ${_issue.pattern}`;\n return `A\u1E63\u00EC\u1E63e: ${FormatDictionary[_issue.format] ?? issue.format}`;\n }\n case \"not_multiple_of\":\n return `N\u1ECD\u0301mb\u00E0 a\u1E63\u00EC\u1E63e: gb\u1ECD\u0301d\u1ECD\u0300 j\u1EB9\u0301 \u00E8y\u00E0 p\u00EDp\u00EDn ti ${issue.divisor}`;\n case \"unrecognized_keys\":\n return `B\u1ECDt\u00ECn\u00EC \u00E0\u00ECm\u1ECD\u0300: ${util.joinValues(issue.keys, \", \")}`;\n case \"invalid_key\":\n return `B\u1ECDt\u00ECn\u00EC a\u1E63\u00EC\u1E63e n\u00EDn\u00FA ${issue.origin}`;\n case \"invalid_union\":\n return \"\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e\";\n case \"invalid_element\":\n return `Iye a\u1E63\u00EC\u1E63e n\u00EDn\u00FA ${issue.origin}`;\n default:\n return \"\u00CCb\u00E1w\u1ECDl\u00E9 a\u1E63\u00EC\u1E63e\";\n }\n };\n};\nexport default function () {\n return {\n localeError: error(),\n };\n}\n", "var _a;\nexport const $output = Symbol(\"ZodOutput\");\nexport const $input = Symbol(\"ZodInput\");\nexport class $ZodRegistry {\n constructor() {\n this._map = new WeakMap();\n this._idmap = new Map();\n }\n add(schema, ..._meta) {\n const meta = _meta[0];\n this._map.set(schema, meta);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.set(meta.id, schema);\n }\n return this;\n }\n clear() {\n this._map = new WeakMap();\n this._idmap = new Map();\n return this;\n }\n remove(schema) {\n const meta = this._map.get(schema);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.delete(meta.id);\n }\n this._map.delete(schema);\n return this;\n }\n get(schema) {\n // return this._map.get(schema) as any;\n // inherit metadata\n const p = schema._zod.parent;\n if (p) {\n const pm = { ...(this.get(p) ?? {}) };\n delete pm.id; // do not inherit id\n const f = { ...pm, ...this._map.get(schema) };\n return Object.keys(f).length ? f : undefined;\n }\n return this._map.get(schema);\n }\n has(schema) {\n return this._map.has(schema);\n }\n}\n// registries\nexport function registry() {\n return new $ZodRegistry();\n}\n(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());\nexport const globalRegistry = globalThis.__zod_globalRegistry;\n", "import * as checks from \"./checks.js\";\nimport * as registries from \"./registries.js\";\nimport * as schemas from \"./schemas.js\";\nimport * as util from \"./util.js\";\n// @__NO_SIDE_EFFECTS__\nexport function _string(Class, params) {\n return new Class({\n type: \"string\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedString(Class, params) {\n return new Class({\n type: \"string\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _email(Class, params) {\n return new Class({\n type: \"string\",\n format: \"email\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _guid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"guid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v4\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v6\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv7(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v7\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _emoji(Class, params) {\n return new Class({\n type: \"string\",\n format: \"emoji\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nanoid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"nanoid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid2(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid2\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ulid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ulid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _xid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"xid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ksuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ksuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mac(Class, params) {\n return new Class({\n type: \"string\",\n format: \"mac\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _e164(Class, params) {\n return new Class({\n type: \"string\",\n format: \"e164\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _jwt(Class, params) {\n return new Class({\n type: \"string\",\n format: \"jwt\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\nexport const TimePrecision = {\n Any: null,\n Minute: -1,\n Second: 0,\n Millisecond: 3,\n Microsecond: 6,\n};\n// @__NO_SIDE_EFFECTS__\nexport function _isoDateTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"datetime\",\n check: \"string_format\",\n offset: false,\n local: false,\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDate(Class, params) {\n return new Class({\n type: \"string\",\n format: \"date\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"time\",\n check: \"string_format\",\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDuration(Class, params) {\n return new Class({\n type: \"string\",\n format: \"duration\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _number(Class, params) {\n return new Class({\n type: \"number\",\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedNumber(Class, params) {\n return new Class({\n type: \"number\",\n coerce: true,\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"safeint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float64(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"int32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"uint32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _boolean(Class, params) {\n return new Class({\n type: \"boolean\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBoolean(Class, params) {\n return new Class({\n type: \"boolean\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _bigint(Class, params) {\n return new Class({\n type: \"bigint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBigint(Class, params) {\n return new Class({\n type: \"bigint\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"int64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"uint64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _symbol(Class, params) {\n return new Class({\n type: \"symbol\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _undefined(Class, params) {\n return new Class({\n type: \"undefined\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _null(Class, params) {\n return new Class({\n type: \"null\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _any(Class) {\n return new Class({\n type: \"any\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _unknown(Class) {\n return new Class({\n type: \"unknown\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _never(Class, params) {\n return new Class({\n type: \"never\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _void(Class, params) {\n return new Class({\n type: \"void\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _date(Class, params) {\n return new Class({\n type: \"date\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedDate(Class, params) {\n return new Class({\n type: \"date\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nan(Class, params) {\n return new Class({\n type: \"nan\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lt(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lte(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.lte()` instead. */\n_lte as _max, };\n// @__NO_SIDE_EFFECTS__\nexport function _gt(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _gte(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.gte()` instead. */\n_gte as _min, };\n// @__NO_SIDE_EFFECTS__\nexport function _positive(params) {\n return _gt(0, params);\n}\n// negative\n// @__NO_SIDE_EFFECTS__\nexport function _negative(params) {\n return _lt(0, params);\n}\n// nonpositive\n// @__NO_SIDE_EFFECTS__\nexport function _nonpositive(params) {\n return _lte(0, params);\n}\n// nonnegative\n// @__NO_SIDE_EFFECTS__\nexport function _nonnegative(params) {\n return _gte(0, params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function _multipleOf(value, params) {\n return new checks.$ZodCheckMultipleOf({\n check: \"multiple_of\",\n ...util.normalizeParams(params),\n value,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxSize(maximum, params) {\n return new checks.$ZodCheckMaxSize({\n check: \"max_size\",\n ...util.normalizeParams(params),\n maximum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minSize(minimum, params) {\n return new checks.$ZodCheckMinSize({\n check: \"min_size\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _size(size, params) {\n return new checks.$ZodCheckSizeEquals({\n check: \"size_equals\",\n ...util.normalizeParams(params),\n size,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxLength(maximum, params) {\n const ch = new checks.$ZodCheckMaxLength({\n check: \"max_length\",\n ...util.normalizeParams(params),\n maximum,\n });\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minLength(minimum, params) {\n return new checks.$ZodCheckMinLength({\n check: \"min_length\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _length(length, params) {\n return new checks.$ZodCheckLengthEquals({\n check: \"length_equals\",\n ...util.normalizeParams(params),\n length,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _regex(pattern, params) {\n return new checks.$ZodCheckRegex({\n check: \"string_format\",\n format: \"regex\",\n ...util.normalizeParams(params),\n pattern,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lowercase(params) {\n return new checks.$ZodCheckLowerCase({\n check: \"string_format\",\n format: \"lowercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uppercase(params) {\n return new checks.$ZodCheckUpperCase({\n check: \"string_format\",\n format: \"uppercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _includes(includes, params) {\n return new checks.$ZodCheckIncludes({\n check: \"string_format\",\n format: \"includes\",\n ...util.normalizeParams(params),\n includes,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _startsWith(prefix, params) {\n return new checks.$ZodCheckStartsWith({\n check: \"string_format\",\n format: \"starts_with\",\n ...util.normalizeParams(params),\n prefix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _endsWith(suffix, params) {\n return new checks.$ZodCheckEndsWith({\n check: \"string_format\",\n format: \"ends_with\",\n ...util.normalizeParams(params),\n suffix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _property(property, schema, params) {\n return new checks.$ZodCheckProperty({\n check: \"property\",\n property,\n schema,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mime(types, params) {\n return new checks.$ZodCheckMimeType({\n check: \"mime_type\",\n mime: types,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _overwrite(tx) {\n return new checks.$ZodCheckOverwrite({\n check: \"overwrite\",\n tx,\n });\n}\n// normalize\n// @__NO_SIDE_EFFECTS__\nexport function _normalize(form) {\n return _overwrite((input) => input.normalize(form));\n}\n// trim\n// @__NO_SIDE_EFFECTS__\nexport function _trim() {\n return _overwrite((input) => input.trim());\n}\n// toLowerCase\n// @__NO_SIDE_EFFECTS__\nexport function _toLowerCase() {\n return _overwrite((input) => input.toLowerCase());\n}\n// toUpperCase\n// @__NO_SIDE_EFFECTS__\nexport function _toUpperCase() {\n return _overwrite((input) => input.toUpperCase());\n}\n// slugify\n// @__NO_SIDE_EFFECTS__\nexport function _slugify() {\n return _overwrite((input) => util.slugify(input));\n}\n// @__NO_SIDE_EFFECTS__\nexport function _array(Class, element, params) {\n return new Class({\n type: \"array\",\n element,\n // get element() {\n // return element;\n // },\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _union(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n ...util.normalizeParams(params),\n });\n}\nexport function _xor(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _discriminatedUnion(Class, discriminator, options, params) {\n return new Class({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _intersection(Class, left, right) {\n return new Class({\n type: \"intersection\",\n left,\n right,\n });\n}\n// export function _tuple(\n// Class: util.SchemaClass,\n// items: [],\n// params?: string | $ZodTupleParams\n// ): schemas.$ZodTuple<[], null>;\n// @__NO_SIDE_EFFECTS__\nexport function _tuple(Class, items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof schemas.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new Class({\n type: \"tuple\",\n items,\n rest,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _record(Class, keyType, valueType, params) {\n return new Class({\n type: \"record\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _map(Class, keyType, valueType, params) {\n return new Class({\n type: \"map\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _set(Class, valueType, params) {\n return new Class({\n type: \"set\",\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _enum(Class, values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n // if (Array.isArray(values)) {\n // for (const value of values) {\n // entries[value] = value;\n // }\n // } else {\n // Object.assign(entries, values);\n // }\n // const entries: util.EnumLike = {};\n // for (const val of values) {\n // entries[val] = val;\n // }\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function _nativeEnum(Class, entries, params) {\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _literal(Class, value, params) {\n return new Class({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _file(Class, params) {\n return new Class({\n type: \"file\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _transform(Class, fn) {\n return new Class({\n type: \"transform\",\n transform: fn,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _optional(Class, innerType) {\n return new Class({\n type: \"optional\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nullable(Class, innerType) {\n return new Class({\n type: \"nullable\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _default(Class, innerType, defaultValue) {\n return new Class({\n type: \"default\",\n innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nonoptional(Class, innerType, params) {\n return new Class({\n type: \"nonoptional\",\n innerType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _success(Class, innerType) {\n return new Class({\n type: \"success\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _catch(Class, innerType, catchValue) {\n return new Class({\n type: \"catch\",\n innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _pipe(Class, in_, out) {\n return new Class({\n type: \"pipe\",\n in: in_,\n out,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _readonly(Class, innerType) {\n return new Class({\n type: \"readonly\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _templateLiteral(Class, parts, params) {\n return new Class({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lazy(Class, getter) {\n return new Class({\n type: \"lazy\",\n getter,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _promise(Class, innerType) {\n return new Class({\n type: \"promise\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _custom(Class, fn, _params) {\n const norm = util.normalizeParams(_params);\n norm.abort ?? (norm.abort = true); // default to abort:false\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...norm,\n });\n return schema;\n}\n// same as _custom but defaults to abort:false\n// @__NO_SIDE_EFFECTS__\nexport function _refine(Class, fn, _params) {\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...util.normalizeParams(_params),\n });\n return schema;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _superRefine(fn) {\n const ch = _check((payload) => {\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, ch._zod.def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = ch);\n _issue.continue ?? (_issue.continue = !ch._zod.def.abort); // abort is always undefined, so this is always true...\n payload.issues.push(util.issue(_issue));\n }\n };\n return fn(payload.value, payload);\n });\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _check(fn, params) {\n const ch = new checks.$ZodCheck({\n check: \"custom\",\n ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function describe(description) {\n const ch = new checks.$ZodCheck({ check: \"describe\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, description });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function meta(metadata) {\n const ch = new checks.$ZodCheck({ check: \"meta\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, ...metadata });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringbool(Classes, _params) {\n const params = util.normalizeParams(_params);\n let truthyArray = params.truthy ?? [\"true\", \"1\", \"yes\", \"on\", \"y\", \"enabled\"];\n let falsyArray = params.falsy ?? [\"false\", \"0\", \"no\", \"off\", \"n\", \"disabled\"];\n if (params.case !== \"sensitive\") {\n truthyArray = truthyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n falsyArray = falsyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n }\n const truthySet = new Set(truthyArray);\n const falsySet = new Set(falsyArray);\n const _Codec = Classes.Codec ?? schemas.$ZodCodec;\n const _Boolean = Classes.Boolean ?? schemas.$ZodBoolean;\n const _String = Classes.String ?? schemas.$ZodString;\n const stringSchema = new _String({ type: \"string\", error: params.error });\n const booleanSchema = new _Boolean({ type: \"boolean\", error: params.error });\n const codec = new _Codec({\n type: \"pipe\",\n in: stringSchema,\n out: booleanSchema,\n transform: ((input, payload) => {\n let data = input;\n if (params.case !== \"sensitive\")\n data = data.toLowerCase();\n if (truthySet.has(data)) {\n return true;\n }\n else if (falsySet.has(data)) {\n return false;\n }\n else {\n payload.issues.push({\n code: \"invalid_value\",\n expected: \"stringbool\",\n values: [...truthySet, ...falsySet],\n input: payload.value,\n inst: codec,\n continue: false,\n });\n return {};\n }\n }),\n reverseTransform: ((input, _payload) => {\n if (input === true) {\n return truthyArray[0] || \"true\";\n }\n else {\n return falsyArray[0] || \"false\";\n }\n }),\n error: params.error,\n });\n return codec;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringFormat(Class, format, fnOrRegex, _params = {}) {\n const params = util.normalizeParams(_params);\n const def = {\n ...util.normalizeParams(_params),\n check: \"string_format\",\n type: \"string\",\n format,\n fn: typeof fnOrRegex === \"function\" ? fnOrRegex : (val) => fnOrRegex.test(val),\n ...params,\n };\n if (fnOrRegex instanceof RegExp) {\n def.pattern = fnOrRegex;\n }\n const inst = new Class(def);\n return inst;\n}\n", "import { globalRegistry } from \"./registries.js\";\n// function initializeContext(inputs: JSONSchemaGeneratorParams): ToJSONSchemaContext {\n// return {\n// processor: inputs.processor,\n// metadataRegistry: inputs.metadata ?? globalRegistry,\n// target: inputs.target ?? \"draft-2020-12\",\n// unrepresentable: inputs.unrepresentable ?? \"throw\",\n// };\n// }\nexport function initializeContext(params) {\n // Normalize target: convert old non-hyphenated versions to hyphenated versions\n let target = params?.target ?? \"draft-2020-12\";\n if (target === \"draft-4\")\n target = \"draft-04\";\n if (target === \"draft-7\")\n target = \"draft-07\";\n return {\n processors: params.processors ?? {},\n metadataRegistry: params?.metadata ?? globalRegistry,\n target,\n unrepresentable: params?.unrepresentable ?? \"throw\",\n override: params?.override ?? (() => { }),\n io: params?.io ?? \"output\",\n counter: 0,\n seen: new Map(),\n cycles: params?.cycles ?? \"ref\",\n reused: params?.reused ?? \"inline\",\n external: params?.external ?? undefined,\n };\n}\nexport function process(schema, ctx, _params = { path: [], schemaPath: [] }) {\n var _a;\n const def = schema._zod.def;\n // check for schema in seens\n const seen = ctx.seen.get(schema);\n if (seen) {\n seen.count++;\n // check if cycle\n const isCycle = _params.schemaPath.includes(schema);\n if (isCycle) {\n seen.cycle = _params.path;\n }\n return seen.schema;\n }\n // initialize\n const result = { schema: {}, count: 1, cycle: undefined, path: _params.path };\n ctx.seen.set(schema, result);\n // custom method overrides default behavior\n const overrideSchema = schema._zod.toJSONSchema?.();\n if (overrideSchema) {\n result.schema = overrideSchema;\n }\n else {\n const params = {\n ..._params,\n schemaPath: [..._params.schemaPath, schema],\n path: _params.path,\n };\n if (schema._zod.processJSONSchema) {\n schema._zod.processJSONSchema(ctx, result.schema, params);\n }\n else {\n const _json = result.schema;\n const processor = ctx.processors[def.type];\n if (!processor) {\n throw new Error(`[toJSONSchema]: Non-representable type encountered: ${def.type}`);\n }\n processor(schema, ctx, _json, params);\n }\n const parent = schema._zod.parent;\n if (parent) {\n // Also set ref if processor didn't (for inheritance)\n if (!result.ref)\n result.ref = parent;\n process(parent, ctx, params);\n ctx.seen.get(parent).isParent = true;\n }\n }\n // metadata\n const meta = ctx.metadataRegistry.get(schema);\n if (meta)\n Object.assign(result.schema, meta);\n if (ctx.io === \"input\" && isTransforming(schema)) {\n // examples/defaults only apply to output type of pipe\n delete result.schema.examples;\n delete result.schema.default;\n }\n // set prefault as default\n if (ctx.io === \"input\" && result.schema._prefault)\n (_a = result.schema).default ?? (_a.default = result.schema._prefault);\n delete result.schema._prefault;\n // pulling fresh from ctx.seen in case it was overwritten\n const _result = ctx.seen.get(schema);\n return _result.schema;\n}\nexport function extractDefs(ctx, schema\n// params: EmitParams\n) {\n // iterate over seen map;\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // Track ids to detect duplicates across different schemas\n const idToSchema = new Map();\n for (const entry of ctx.seen.entries()) {\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n const existing = idToSchema.get(id);\n if (existing && existing !== entry[0]) {\n throw new Error(`Duplicate schema id \"${id}\" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);\n }\n idToSchema.set(id, entry[0]);\n }\n }\n // returns a ref to the schema\n // defId will be empty if the ref points to an external schema (or #)\n const makeURI = (entry) => {\n // comparing the seen objects because sometimes\n // multiple schemas map to the same seen object.\n // e.g. lazy\n // external is configured\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n if (ctx.external) {\n const externalId = ctx.external.registry.get(entry[0])?.id; // ?? \"__shared\";// `__schema${ctx.counter++}`;\n // check if schema is in the external registry\n const uriGenerator = ctx.external.uri ?? ((id) => id);\n if (externalId) {\n return { ref: uriGenerator(externalId) };\n }\n // otherwise, add to __shared\n const id = entry[1].defId ?? entry[1].schema.id ?? `schema${ctx.counter++}`;\n entry[1].defId = id; // set defId so it will be reused if needed\n return { defId: id, ref: `${uriGenerator(\"__shared\")}#/${defsSegment}/${id}` };\n }\n if (entry[1] === root) {\n return { ref: \"#\" };\n }\n // self-contained schema\n const uriPrefix = `#`;\n const defUriPrefix = `${uriPrefix}/${defsSegment}/`;\n const defId = entry[1].schema.id ?? `__schema${ctx.counter++}`;\n return { defId, ref: defUriPrefix + defId };\n };\n // stored cached version in `def` property\n // remove all properties, set $ref\n const extractToDef = (entry) => {\n // if the schema is already a reference, do not extract it\n if (entry[1].schema.$ref) {\n return;\n }\n const seen = entry[1];\n const { ref, defId } = makeURI(entry);\n seen.def = { ...seen.schema };\n // defId won't be set if the schema is a reference to an external schema\n // or if the schema is the root schema\n if (defId)\n seen.defId = defId;\n // wipe away all properties except $ref\n const schema = seen.schema;\n for (const key in schema) {\n delete schema[key];\n }\n schema.$ref = ref;\n };\n // throw on cycles\n // break cycles\n if (ctx.cycles === \"throw\") {\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.cycle) {\n throw new Error(\"Cycle detected: \" +\n `#/${seen.cycle?.join(\"/\")}/` +\n '\\n\\nSet the `cycles` parameter to `\"ref\"` to resolve cyclical schemas with defs.');\n }\n }\n }\n // extract schemas into $defs\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n // convert root schema to # $ref\n if (schema === entry[0]) {\n extractToDef(entry); // this has special handling for the root schema\n continue;\n }\n // extract schemas that are in the external registry\n if (ctx.external) {\n const ext = ctx.external.registry.get(entry[0])?.id;\n if (schema !== entry[0] && ext) {\n extractToDef(entry);\n continue;\n }\n }\n // extract schemas with `id` meta\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n extractToDef(entry);\n continue;\n }\n // break cycles\n if (seen.cycle) {\n // any\n extractToDef(entry);\n continue;\n }\n // extract reused schemas\n if (seen.count > 1) {\n if (ctx.reused === \"ref\") {\n extractToDef(entry);\n // biome-ignore lint:\n continue;\n }\n }\n }\n}\nexport function finalize(ctx, schema) {\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // flatten refs - inherit properties from parent schemas\n const flattenRef = (zodSchema) => {\n const seen = ctx.seen.get(zodSchema);\n // already processed\n if (seen.ref === null)\n return;\n const schema = seen.def ?? seen.schema;\n const _cached = { ...schema };\n const ref = seen.ref;\n seen.ref = null; // prevent infinite recursion\n if (ref) {\n flattenRef(ref);\n const refSeen = ctx.seen.get(ref);\n const refSchema = refSeen.schema;\n // merge referenced schema into current\n if (refSchema.$ref && (ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\")) {\n // older drafts can't combine $ref with other properties\n schema.allOf = schema.allOf ?? [];\n schema.allOf.push(refSchema);\n }\n else {\n Object.assign(schema, refSchema);\n }\n // restore child's own properties (child wins)\n Object.assign(schema, _cached);\n const isParentRef = zodSchema._zod.parent === ref;\n // For parent chain, child is a refinement - remove parent-only properties\n if (isParentRef) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (!(key in _cached)) {\n delete schema[key];\n }\n }\n }\n // When ref was extracted to $defs, remove properties that match the definition\n if (refSchema.$ref && refSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in refSeen.def && JSON.stringify(schema[key]) === JSON.stringify(refSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n // If parent was extracted (has $ref), propagate $ref to this schema\n // This handles cases like: readonly().meta({id}).describe()\n // where processor sets ref to innerType but parent should be referenced\n const parent = zodSchema._zod.parent;\n if (parent && parent !== ref) {\n // Ensure parent is processed first so its def has inherited properties\n flattenRef(parent);\n const parentSeen = ctx.seen.get(parent);\n if (parentSeen?.schema.$ref) {\n schema.$ref = parentSeen.schema.$ref;\n // De-duplicate with parent's definition\n if (parentSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in parentSeen.def && JSON.stringify(schema[key]) === JSON.stringify(parentSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n }\n // execute overrides\n ctx.override({\n zodSchema: zodSchema,\n jsonSchema: schema,\n path: seen.path ?? [],\n });\n };\n for (const entry of [...ctx.seen.entries()].reverse()) {\n flattenRef(entry[0]);\n }\n const result = {};\n if (ctx.target === \"draft-2020-12\") {\n result.$schema = \"https://json-schema.org/draft/2020-12/schema\";\n }\n else if (ctx.target === \"draft-07\") {\n result.$schema = \"http://json-schema.org/draft-07/schema#\";\n }\n else if (ctx.target === \"draft-04\") {\n result.$schema = \"http://json-schema.org/draft-04/schema#\";\n }\n else if (ctx.target === \"openapi-3.0\") {\n // OpenAPI 3.0 schema objects should not include a $schema property\n }\n else {\n // Arbitrary string values are allowed but won't have a $schema property set\n }\n if (ctx.external?.uri) {\n const id = ctx.external.registry.get(schema)?.id;\n if (!id)\n throw new Error(\"Schema is missing an `id` property\");\n result.$id = ctx.external.uri(id);\n }\n Object.assign(result, root.def ?? root.schema);\n // build defs object\n const defs = ctx.external?.defs ?? {};\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.def && seen.defId) {\n defs[seen.defId] = seen.def;\n }\n }\n // set definitions in result\n if (ctx.external) {\n }\n else {\n if (Object.keys(defs).length > 0) {\n if (ctx.target === \"draft-2020-12\") {\n result.$defs = defs;\n }\n else {\n result.definitions = defs;\n }\n }\n }\n try {\n // this \"finalizes\" this schema and ensures all cycles are removed\n // each call to finalize() is functionally independent\n // though the seen map is shared\n const finalized = JSON.parse(JSON.stringify(result));\n Object.defineProperty(finalized, \"~standard\", {\n value: {\n ...schema[\"~standard\"],\n jsonSchema: {\n input: createStandardJSONSchemaMethod(schema, \"input\", ctx.processors),\n output: createStandardJSONSchemaMethod(schema, \"output\", ctx.processors),\n },\n },\n enumerable: false,\n writable: false,\n });\n return finalized;\n }\n catch (_err) {\n throw new Error(\"Error converting schema to JSON.\");\n }\n}\nfunction isTransforming(_schema, _ctx) {\n const ctx = _ctx ?? { seen: new Set() };\n if (ctx.seen.has(_schema))\n return false;\n ctx.seen.add(_schema);\n const def = _schema._zod.def;\n if (def.type === \"transform\")\n return true;\n if (def.type === \"array\")\n return isTransforming(def.element, ctx);\n if (def.type === \"set\")\n return isTransforming(def.valueType, ctx);\n if (def.type === \"lazy\")\n return isTransforming(def.getter(), ctx);\n if (def.type === \"promise\" ||\n def.type === \"optional\" ||\n def.type === \"nonoptional\" ||\n def.type === \"nullable\" ||\n def.type === \"readonly\" ||\n def.type === \"default\" ||\n def.type === \"prefault\") {\n return isTransforming(def.innerType, ctx);\n }\n if (def.type === \"intersection\") {\n return isTransforming(def.left, ctx) || isTransforming(def.right, ctx);\n }\n if (def.type === \"record\" || def.type === \"map\") {\n return isTransforming(def.keyType, ctx) || isTransforming(def.valueType, ctx);\n }\n if (def.type === \"pipe\") {\n return isTransforming(def.in, ctx) || isTransforming(def.out, ctx);\n }\n if (def.type === \"object\") {\n for (const key in def.shape) {\n if (isTransforming(def.shape[key], ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"union\") {\n for (const option of def.options) {\n if (isTransforming(option, ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"tuple\") {\n for (const item of def.items) {\n if (isTransforming(item, ctx))\n return true;\n }\n if (def.rest && isTransforming(def.rest, ctx))\n return true;\n return false;\n }\n return false;\n}\n/**\n * Creates a toJSONSchema method for a schema instance.\n * This encapsulates the logic of initializing context, processing, extracting defs, and finalizing.\n */\nexport const createToJSONSchemaMethod = (schema, processors = {}) => (params) => {\n const ctx = initializeContext({ ...params, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\nexport const createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) => {\n const { libraryOptions, target } = params ?? {};\n const ctx = initializeContext({ ...(libraryOptions ?? {}), target, io, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\n", "import { extractDefs, finalize, initializeContext, process, } from \"./to-json-schema.js\";\nimport { getEnumValues } from \"./util.js\";\nconst formatMap = {\n guid: \"uuid\",\n url: \"uri\",\n datetime: \"date-time\",\n json_string: \"json-string\",\n regex: \"\", // do not set\n};\n// ==================== SIMPLE TYPE PROCESSORS ====================\nexport const stringProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n json.type = \"string\";\n const { minimum, maximum, format, patterns, contentEncoding } = schema._zod\n .bag;\n if (typeof minimum === \"number\")\n json.minLength = minimum;\n if (typeof maximum === \"number\")\n json.maxLength = maximum;\n // custom pattern overrides format\n if (format) {\n json.format = formatMap[format] ?? format;\n if (json.format === \"\")\n delete json.format; // empty format is not valid\n // JSON Schema format: \"time\" requires a full time with offset or Z\n // z.iso.time() does not include timezone information, so format: \"time\" should never be used\n if (format === \"time\") {\n delete json.format;\n }\n }\n if (contentEncoding)\n json.contentEncoding = contentEncoding;\n if (patterns && patterns.size > 0) {\n const regexes = [...patterns];\n if (regexes.length === 1)\n json.pattern = regexes[0].source;\n else if (regexes.length > 1) {\n json.allOf = [\n ...regexes.map((regex) => ({\n ...(ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\"\n ? { type: \"string\" }\n : {}),\n pattern: regex.source,\n })),\n ];\n }\n }\n};\nexport const numberProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n const { minimum, maximum, format, multipleOf, exclusiveMaximum, exclusiveMinimum } = schema._zod.bag;\n if (typeof format === \"string\" && format.includes(\"int\"))\n json.type = \"integer\";\n else\n json.type = \"number\";\n if (typeof exclusiveMinimum === \"number\") {\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.minimum = exclusiveMinimum;\n json.exclusiveMinimum = true;\n }\n else {\n json.exclusiveMinimum = exclusiveMinimum;\n }\n }\n if (typeof minimum === \"number\") {\n json.minimum = minimum;\n if (typeof exclusiveMinimum === \"number\" && ctx.target !== \"draft-04\") {\n if (exclusiveMinimum >= minimum)\n delete json.minimum;\n else\n delete json.exclusiveMinimum;\n }\n }\n if (typeof exclusiveMaximum === \"number\") {\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.maximum = exclusiveMaximum;\n json.exclusiveMaximum = true;\n }\n else {\n json.exclusiveMaximum = exclusiveMaximum;\n }\n }\n if (typeof maximum === \"number\") {\n json.maximum = maximum;\n if (typeof exclusiveMaximum === \"number\" && ctx.target !== \"draft-04\") {\n if (exclusiveMaximum <= maximum)\n delete json.maximum;\n else\n delete json.exclusiveMaximum;\n }\n }\n if (typeof multipleOf === \"number\")\n json.multipleOf = multipleOf;\n};\nexport const booleanProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const bigintProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt cannot be represented in JSON Schema\");\n }\n};\nexport const symbolProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Symbols cannot be represented in JSON Schema\");\n }\n};\nexport const nullProcessor = (_schema, ctx, json, _params) => {\n if (ctx.target === \"openapi-3.0\") {\n json.type = \"string\";\n json.nullable = true;\n json.enum = [null];\n }\n else {\n json.type = \"null\";\n }\n};\nexport const undefinedProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Undefined cannot be represented in JSON Schema\");\n }\n};\nexport const voidProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Void cannot be represented in JSON Schema\");\n }\n};\nexport const neverProcessor = (_schema, _ctx, json, _params) => {\n json.not = {};\n};\nexport const anyProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const unknownProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const dateProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Date cannot be represented in JSON Schema\");\n }\n};\nexport const enumProcessor = (schema, _ctx, json, _params) => {\n const def = schema._zod.def;\n const values = getEnumValues(def.entries);\n // Number enums can have both string and number values\n if (values.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (values.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n json.enum = values;\n};\nexport const literalProcessor = (schema, ctx, json, _params) => {\n const def = schema._zod.def;\n const vals = [];\n for (const val of def.values) {\n if (val === undefined) {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Literal `undefined` cannot be represented in JSON Schema\");\n }\n else {\n // do not add to vals\n }\n }\n else if (typeof val === \"bigint\") {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt literals cannot be represented in JSON Schema\");\n }\n else {\n vals.push(Number(val));\n }\n }\n else {\n vals.push(val);\n }\n }\n if (vals.length === 0) {\n // do nothing (an undefined literal was stripped)\n }\n else if (vals.length === 1) {\n const val = vals[0];\n json.type = val === null ? \"null\" : typeof val;\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.enum = [val];\n }\n else {\n json.const = val;\n }\n }\n else {\n if (vals.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (vals.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n if (vals.every((v) => typeof v === \"boolean\"))\n json.type = \"boolean\";\n if (vals.every((v) => v === null))\n json.type = \"null\";\n json.enum = vals;\n }\n};\nexport const nanProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"NaN cannot be represented in JSON Schema\");\n }\n};\nexport const templateLiteralProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const pattern = schema._zod.pattern;\n if (!pattern)\n throw new Error(\"Pattern not found in template literal\");\n _json.type = \"string\";\n _json.pattern = pattern.source;\n};\nexport const fileProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const file = {\n type: \"string\",\n format: \"binary\",\n contentEncoding: \"binary\",\n };\n const { minimum, maximum, mime } = schema._zod.bag;\n if (minimum !== undefined)\n file.minLength = minimum;\n if (maximum !== undefined)\n file.maxLength = maximum;\n if (mime) {\n if (mime.length === 1) {\n file.contentMediaType = mime[0];\n Object.assign(_json, file);\n }\n else {\n Object.assign(_json, file); // shared props at root\n _json.anyOf = mime.map((m) => ({ contentMediaType: m })); // only contentMediaType differs\n }\n }\n else {\n Object.assign(_json, file);\n }\n};\nexport const successProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const customProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Custom types cannot be represented in JSON Schema\");\n }\n};\nexport const functionProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Function types cannot be represented in JSON Schema\");\n }\n};\nexport const transformProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Transforms cannot be represented in JSON Schema\");\n }\n};\nexport const mapProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Map cannot be represented in JSON Schema\");\n }\n};\nexport const setProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Set cannot be represented in JSON Schema\");\n }\n};\n// ==================== COMPOSITE TYPE PROCESSORS ====================\nexport const arrayProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n json.type = \"array\";\n json.items = process(def.element, ctx, { ...params, path: [...params.path, \"items\"] });\n};\nexport const objectProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n json.properties = {};\n const shape = def.shape;\n for (const key in shape) {\n json.properties[key] = process(shape[key], ctx, {\n ...params,\n path: [...params.path, \"properties\", key],\n });\n }\n // required keys\n const allKeys = new Set(Object.keys(shape));\n const requiredKeys = new Set([...allKeys].filter((key) => {\n const v = def.shape[key]._zod;\n if (ctx.io === \"input\") {\n return v.optin === undefined;\n }\n else {\n return v.optout === undefined;\n }\n }));\n if (requiredKeys.size > 0) {\n json.required = Array.from(requiredKeys);\n }\n // catchall\n if (def.catchall?._zod.def.type === \"never\") {\n // strict\n json.additionalProperties = false;\n }\n else if (!def.catchall) {\n // regular\n if (ctx.io === \"output\")\n json.additionalProperties = false;\n }\n else if (def.catchall) {\n json.additionalProperties = process(def.catchall, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n};\nexport const unionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n // Exclusive unions (inclusive === false) use oneOf (exactly one match) instead of anyOf (one or more matches)\n // This includes both z.xor() and discriminated unions\n const isExclusive = def.inclusive === false;\n const options = def.options.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, isExclusive ? \"oneOf\" : \"anyOf\", i],\n }));\n if (isExclusive) {\n json.oneOf = options;\n }\n else {\n json.anyOf = options;\n }\n};\nexport const intersectionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const a = process(def.left, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 0],\n });\n const b = process(def.right, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 1],\n });\n const isSimpleIntersection = (val) => \"allOf\" in val && Object.keys(val).length === 1;\n const allOf = [\n ...(isSimpleIntersection(a) ? a.allOf : [a]),\n ...(isSimpleIntersection(b) ? b.allOf : [b]),\n ];\n json.allOf = allOf;\n};\nexport const tupleProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"array\";\n const prefixPath = ctx.target === \"draft-2020-12\" ? \"prefixItems\" : \"items\";\n const restPath = ctx.target === \"draft-2020-12\" ? \"items\" : ctx.target === \"openapi-3.0\" ? \"items\" : \"additionalItems\";\n const prefixItems = def.items.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, prefixPath, i],\n }));\n const rest = def.rest\n ? process(def.rest, ctx, {\n ...params,\n path: [...params.path, restPath, ...(ctx.target === \"openapi-3.0\" ? [def.items.length] : [])],\n })\n : null;\n if (ctx.target === \"draft-2020-12\") {\n json.prefixItems = prefixItems;\n if (rest) {\n json.items = rest;\n }\n }\n else if (ctx.target === \"openapi-3.0\") {\n json.items = {\n anyOf: prefixItems,\n };\n if (rest) {\n json.items.anyOf.push(rest);\n }\n json.minItems = prefixItems.length;\n if (!rest) {\n json.maxItems = prefixItems.length;\n }\n }\n else {\n json.items = prefixItems;\n if (rest) {\n json.additionalItems = rest;\n }\n }\n // length\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n};\nexport const recordProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n // For looseRecord with regex patterns, use patternProperties\n // This correctly represents \"only validate keys matching the pattern\" semantics\n // and composes well with allOf (intersections)\n const keyType = def.keyType;\n const keyBag = keyType._zod.bag;\n const patterns = keyBag?.patterns;\n if (def.mode === \"loose\" && patterns && patterns.size > 0) {\n // Use patternProperties for looseRecord with regex patterns\n const valueSchema = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"patternProperties\", \"*\"],\n });\n json.patternProperties = {};\n for (const pattern of patterns) {\n json.patternProperties[pattern.source] = valueSchema;\n }\n }\n else {\n // Default behavior: use propertyNames + additionalProperties\n if (ctx.target === \"draft-07\" || ctx.target === \"draft-2020-12\") {\n json.propertyNames = process(def.keyType, ctx, {\n ...params,\n path: [...params.path, \"propertyNames\"],\n });\n }\n json.additionalProperties = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n // Add required for keys with discrete values (enum, literal, etc.)\n const keyValues = keyType._zod.values;\n if (keyValues) {\n const validKeyValues = [...keyValues].filter((v) => typeof v === \"string\" || typeof v === \"number\");\n if (validKeyValues.length > 0) {\n json.required = validKeyValues;\n }\n }\n};\nexport const nullableProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const inner = process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n if (ctx.target === \"openapi-3.0\") {\n seen.ref = def.innerType;\n json.nullable = true;\n }\n else {\n json.anyOf = [inner, { type: \"null\" }];\n }\n};\nexport const nonoptionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const defaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.default = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const prefaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n if (ctx.io === \"input\")\n json._prefault = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const catchProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n let catchValue;\n try {\n catchValue = def.catchValue(undefined);\n }\n catch {\n throw new Error(\"Dynamic catch values are not supported in JSON Schema\");\n }\n json.default = catchValue;\n};\nexport const pipeProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n const innerType = ctx.io === \"input\" ? (def.in._zod.def.type === \"transform\" ? def.out : def.in) : def.out;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\nexport const readonlyProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.readOnly = true;\n};\nexport const promiseProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const optionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const lazyProcessor = (schema, ctx, _json, params) => {\n const innerType = schema._zod.innerType;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\n// ==================== ALL PROCESSORS ====================\nexport const allProcessors = {\n string: stringProcessor,\n number: numberProcessor,\n boolean: booleanProcessor,\n bigint: bigintProcessor,\n symbol: symbolProcessor,\n null: nullProcessor,\n undefined: undefinedProcessor,\n void: voidProcessor,\n never: neverProcessor,\n any: anyProcessor,\n unknown: unknownProcessor,\n date: dateProcessor,\n enum: enumProcessor,\n literal: literalProcessor,\n nan: nanProcessor,\n template_literal: templateLiteralProcessor,\n file: fileProcessor,\n success: successProcessor,\n custom: customProcessor,\n function: functionProcessor,\n transform: transformProcessor,\n map: mapProcessor,\n set: setProcessor,\n array: arrayProcessor,\n object: objectProcessor,\n union: unionProcessor,\n intersection: intersectionProcessor,\n tuple: tupleProcessor,\n record: recordProcessor,\n nullable: nullableProcessor,\n nonoptional: nonoptionalProcessor,\n default: defaultProcessor,\n prefault: prefaultProcessor,\n catch: catchProcessor,\n pipe: pipeProcessor,\n readonly: readonlyProcessor,\n promise: promiseProcessor,\n optional: optionalProcessor,\n lazy: lazyProcessor,\n};\nexport function toJSONSchema(input, params) {\n if (\"_idmap\" in input) {\n // Registry case\n const registry = input;\n const ctx = initializeContext({ ...params, processors: allProcessors });\n const defs = {};\n // First pass: process all schemas to build the seen map\n for (const entry of registry._idmap.entries()) {\n const [_, schema] = entry;\n process(schema, ctx);\n }\n const schemas = {};\n const external = {\n registry,\n uri: params?.uri,\n defs,\n };\n // Update the context with external configuration\n ctx.external = external;\n // Second pass: emit each schema\n for (const entry of registry._idmap.entries()) {\n const [key, schema] = entry;\n extractDefs(ctx, schema);\n schemas[key] = finalize(ctx, schema);\n }\n if (Object.keys(defs).length > 0) {\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n schemas.__shared = {\n [defsSegment]: defs,\n };\n }\n return { schemas };\n }\n // Single schema case\n const ctx = initializeContext({ ...params, processors: allProcessors });\n process(input, ctx);\n extractDefs(ctx, input);\n return finalize(ctx, input);\n}\n", "import { allProcessors } from \"./json-schema-processors.js\";\nimport { extractDefs, finalize, initializeContext, process, } from \"./to-json-schema.js\";\n/**\n * Legacy class-based interface for JSON Schema generation.\n * This class wraps the new functional implementation to provide backward compatibility.\n *\n * @deprecated Use the `toJSONSchema` function instead for new code.\n *\n * @example\n * ```typescript\n * // Legacy usage (still supported)\n * const gen = new JSONSchemaGenerator({ target: \"draft-07\" });\n * gen.process(schema);\n * const result = gen.emit(schema);\n *\n * // Preferred modern usage\n * const result = toJSONSchema(schema, { target: \"draft-07\" });\n * ```\n */\nexport class JSONSchemaGenerator {\n /** @deprecated Access via ctx instead */\n get metadataRegistry() {\n return this.ctx.metadataRegistry;\n }\n /** @deprecated Access via ctx instead */\n get target() {\n return this.ctx.target;\n }\n /** @deprecated Access via ctx instead */\n get unrepresentable() {\n return this.ctx.unrepresentable;\n }\n /** @deprecated Access via ctx instead */\n get override() {\n return this.ctx.override;\n }\n /** @deprecated Access via ctx instead */\n get io() {\n return this.ctx.io;\n }\n /** @deprecated Access via ctx instead */\n get counter() {\n return this.ctx.counter;\n }\n set counter(value) {\n this.ctx.counter = value;\n }\n /** @deprecated Access via ctx instead */\n get seen() {\n return this.ctx.seen;\n }\n constructor(params) {\n // Normalize target for internal context\n let normalizedTarget = params?.target ?? \"draft-2020-12\";\n if (normalizedTarget === \"draft-4\")\n normalizedTarget = \"draft-04\";\n if (normalizedTarget === \"draft-7\")\n normalizedTarget = \"draft-07\";\n this.ctx = initializeContext({\n processors: allProcessors,\n target: normalizedTarget,\n ...(params?.metadata && { metadata: params.metadata }),\n ...(params?.unrepresentable && { unrepresentable: params.unrepresentable }),\n ...(params?.override && { override: params.override }),\n ...(params?.io && { io: params.io }),\n });\n }\n /**\n * Process a schema to prepare it for JSON Schema generation.\n * This must be called before emit().\n */\n process(schema, _params = { path: [], schemaPath: [] }) {\n return process(schema, this.ctx, _params);\n }\n /**\n * Emit the final JSON Schema after processing.\n * Must call process() first.\n */\n emit(schema, _params) {\n // Apply emit params to the context\n if (_params) {\n if (_params.cycles)\n this.ctx.cycles = _params.cycles;\n if (_params.reused)\n this.ctx.reused = _params.reused;\n if (_params.external)\n this.ctx.external = _params.external;\n }\n extractDefs(this.ctx, schema);\n const result = finalize(this.ctx, schema);\n // Strip ~standard property to match old implementation's return type\n const { \"~standard\": _, ...plainResult } = result;\n return plainResult;\n }\n}\n", "export {};\n", "import * as core from \"../core/index.js\";\nimport { util } from \"../core/index.js\";\nimport * as processors from \"../core/json-schema-processors.js\";\nimport { createStandardJSONSchemaMethod, createToJSONSchemaMethod } from \"../core/to-json-schema.js\";\nimport * as checks from \"./checks.js\";\nimport * as iso from \"./iso.js\";\nimport * as parse from \"./parse.js\";\nexport const ZodType = /*@__PURE__*/ core.$constructor(\"ZodType\", (inst, def) => {\n core.$ZodType.init(inst, def);\n Object.assign(inst[\"~standard\"], {\n jsonSchema: {\n input: createStandardJSONSchemaMethod(inst, \"input\"),\n output: createStandardJSONSchemaMethod(inst, \"output\"),\n },\n });\n inst.toJSONSchema = createToJSONSchemaMethod(inst, {});\n inst.def = def;\n inst.type = def.type;\n Object.defineProperty(inst, \"_def\", { value: def });\n // base methods\n inst.check = (...checks) => {\n return inst.clone(util.mergeDefs(def, {\n checks: [\n ...(def.checks ?? []),\n ...checks.map((ch) => typeof ch === \"function\" ? { _zod: { check: ch, def: { check: \"custom\" }, onattach: [] } } : ch),\n ],\n }), {\n parent: true,\n });\n };\n inst.with = inst.check;\n inst.clone = (def, params) => core.clone(inst, def, params);\n inst.brand = () => inst;\n inst.register = ((reg, meta) => {\n reg.add(inst, meta);\n return inst;\n });\n // parsing\n inst.parse = (data, params) => parse.parse(inst, data, params, { callee: inst.parse });\n inst.safeParse = (data, params) => parse.safeParse(inst, data, params);\n inst.parseAsync = async (data, params) => parse.parseAsync(inst, data, params, { callee: inst.parseAsync });\n inst.safeParseAsync = async (data, params) => parse.safeParseAsync(inst, data, params);\n inst.spa = inst.safeParseAsync;\n // encoding/decoding\n inst.encode = (data, params) => parse.encode(inst, data, params);\n inst.decode = (data, params) => parse.decode(inst, data, params);\n inst.encodeAsync = async (data, params) => parse.encodeAsync(inst, data, params);\n inst.decodeAsync = async (data, params) => parse.decodeAsync(inst, data, params);\n inst.safeEncode = (data, params) => parse.safeEncode(inst, data, params);\n inst.safeDecode = (data, params) => parse.safeDecode(inst, data, params);\n inst.safeEncodeAsync = async (data, params) => parse.safeEncodeAsync(inst, data, params);\n inst.safeDecodeAsync = async (data, params) => parse.safeDecodeAsync(inst, data, params);\n // refinements\n inst.refine = (check, params) => inst.check(refine(check, params));\n inst.superRefine = (refinement) => inst.check(superRefine(refinement));\n inst.overwrite = (fn) => inst.check(checks.overwrite(fn));\n // wrappers\n inst.optional = () => optional(inst);\n inst.exactOptional = () => exactOptional(inst);\n inst.nullable = () => nullable(inst);\n inst.nullish = () => optional(nullable(inst));\n inst.nonoptional = (params) => nonoptional(inst, params);\n inst.array = () => array(inst);\n inst.or = (arg) => union([inst, arg]);\n inst.and = (arg) => intersection(inst, arg);\n inst.transform = (tx) => pipe(inst, transform(tx));\n inst.default = (def) => _default(inst, def);\n inst.prefault = (def) => prefault(inst, def);\n // inst.coalesce = (def, params) => coalesce(inst, def, params);\n inst.catch = (params) => _catch(inst, params);\n inst.pipe = (target) => pipe(inst, target);\n inst.readonly = () => readonly(inst);\n // meta\n inst.describe = (description) => {\n const cl = inst.clone();\n core.globalRegistry.add(cl, { description });\n return cl;\n };\n Object.defineProperty(inst, \"description\", {\n get() {\n return core.globalRegistry.get(inst)?.description;\n },\n configurable: true,\n });\n inst.meta = (...args) => {\n if (args.length === 0) {\n return core.globalRegistry.get(inst);\n }\n const cl = inst.clone();\n core.globalRegistry.add(cl, args[0]);\n return cl;\n };\n // helpers\n inst.isOptional = () => inst.safeParse(undefined).success;\n inst.isNullable = () => inst.safeParse(null).success;\n inst.apply = (fn) => fn(inst);\n return inst;\n});\n/** @internal */\nexport const _ZodString = /*@__PURE__*/ core.$constructor(\"_ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.stringProcessor(inst, ctx, json, params);\n const bag = inst._zod.bag;\n inst.format = bag.format ?? null;\n inst.minLength = bag.minimum ?? null;\n inst.maxLength = bag.maximum ?? null;\n // validations\n inst.regex = (...args) => inst.check(checks.regex(...args));\n inst.includes = (...args) => inst.check(checks.includes(...args));\n inst.startsWith = (...args) => inst.check(checks.startsWith(...args));\n inst.endsWith = (...args) => inst.check(checks.endsWith(...args));\n inst.min = (...args) => inst.check(checks.minLength(...args));\n inst.max = (...args) => inst.check(checks.maxLength(...args));\n inst.length = (...args) => inst.check(checks.length(...args));\n inst.nonempty = (...args) => inst.check(checks.minLength(1, ...args));\n inst.lowercase = (params) => inst.check(checks.lowercase(params));\n inst.uppercase = (params) => inst.check(checks.uppercase(params));\n // transforms\n inst.trim = () => inst.check(checks.trim());\n inst.normalize = (...args) => inst.check(checks.normalize(...args));\n inst.toLowerCase = () => inst.check(checks.toLowerCase());\n inst.toUpperCase = () => inst.check(checks.toUpperCase());\n inst.slugify = () => inst.check(checks.slugify());\n});\nexport const ZodString = /*@__PURE__*/ core.$constructor(\"ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n _ZodString.init(inst, def);\n inst.email = (params) => inst.check(core._email(ZodEmail, params));\n inst.url = (params) => inst.check(core._url(ZodURL, params));\n inst.jwt = (params) => inst.check(core._jwt(ZodJWT, params));\n inst.emoji = (params) => inst.check(core._emoji(ZodEmoji, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.uuid = (params) => inst.check(core._uuid(ZodUUID, params));\n inst.uuidv4 = (params) => inst.check(core._uuidv4(ZodUUID, params));\n inst.uuidv6 = (params) => inst.check(core._uuidv6(ZodUUID, params));\n inst.uuidv7 = (params) => inst.check(core._uuidv7(ZodUUID, params));\n inst.nanoid = (params) => inst.check(core._nanoid(ZodNanoID, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.cuid = (params) => inst.check(core._cuid(ZodCUID, params));\n inst.cuid2 = (params) => inst.check(core._cuid2(ZodCUID2, params));\n inst.ulid = (params) => inst.check(core._ulid(ZodULID, params));\n inst.base64 = (params) => inst.check(core._base64(ZodBase64, params));\n inst.base64url = (params) => inst.check(core._base64url(ZodBase64URL, params));\n inst.xid = (params) => inst.check(core._xid(ZodXID, params));\n inst.ksuid = (params) => inst.check(core._ksuid(ZodKSUID, params));\n inst.ipv4 = (params) => inst.check(core._ipv4(ZodIPv4, params));\n inst.ipv6 = (params) => inst.check(core._ipv6(ZodIPv6, params));\n inst.cidrv4 = (params) => inst.check(core._cidrv4(ZodCIDRv4, params));\n inst.cidrv6 = (params) => inst.check(core._cidrv6(ZodCIDRv6, params));\n inst.e164 = (params) => inst.check(core._e164(ZodE164, params));\n // iso\n inst.datetime = (params) => inst.check(iso.datetime(params));\n inst.date = (params) => inst.check(iso.date(params));\n inst.time = (params) => inst.check(iso.time(params));\n inst.duration = (params) => inst.check(iso.duration(params));\n});\nexport function string(params) {\n return core._string(ZodString, params);\n}\nexport const ZodStringFormat = /*@__PURE__*/ core.$constructor(\"ZodStringFormat\", (inst, def) => {\n core.$ZodStringFormat.init(inst, def);\n _ZodString.init(inst, def);\n});\nexport const ZodEmail = /*@__PURE__*/ core.$constructor(\"ZodEmail\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmail.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function email(params) {\n return core._email(ZodEmail, params);\n}\nexport const ZodGUID = /*@__PURE__*/ core.$constructor(\"ZodGUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodGUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function guid(params) {\n return core._guid(ZodGUID, params);\n}\nexport const ZodUUID = /*@__PURE__*/ core.$constructor(\"ZodUUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodUUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function uuid(params) {\n return core._uuid(ZodUUID, params);\n}\nexport function uuidv4(params) {\n return core._uuidv4(ZodUUID, params);\n}\n// ZodUUIDv6\nexport function uuidv6(params) {\n return core._uuidv6(ZodUUID, params);\n}\n// ZodUUIDv7\nexport function uuidv7(params) {\n return core._uuidv7(ZodUUID, params);\n}\nexport const ZodURL = /*@__PURE__*/ core.$constructor(\"ZodURL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodURL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function url(params) {\n return core._url(ZodURL, params);\n}\nexport function httpUrl(params) {\n return core._url(ZodURL, {\n protocol: /^https?$/,\n hostname: core.regexes.domain,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEmoji = /*@__PURE__*/ core.$constructor(\"ZodEmoji\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmoji.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function emoji(params) {\n return core._emoji(ZodEmoji, params);\n}\nexport const ZodNanoID = /*@__PURE__*/ core.$constructor(\"ZodNanoID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodNanoID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function nanoid(params) {\n return core._nanoid(ZodNanoID, params);\n}\nexport const ZodCUID = /*@__PURE__*/ core.$constructor(\"ZodCUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cuid(params) {\n return core._cuid(ZodCUID, params);\n}\nexport const ZodCUID2 = /*@__PURE__*/ core.$constructor(\"ZodCUID2\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID2.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cuid2(params) {\n return core._cuid2(ZodCUID2, params);\n}\nexport const ZodULID = /*@__PURE__*/ core.$constructor(\"ZodULID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodULID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ulid(params) {\n return core._ulid(ZodULID, params);\n}\nexport const ZodXID = /*@__PURE__*/ core.$constructor(\"ZodXID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodXID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function xid(params) {\n return core._xid(ZodXID, params);\n}\nexport const ZodKSUID = /*@__PURE__*/ core.$constructor(\"ZodKSUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodKSUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ksuid(params) {\n return core._ksuid(ZodKSUID, params);\n}\nexport const ZodIPv4 = /*@__PURE__*/ core.$constructor(\"ZodIPv4\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv4(params) {\n return core._ipv4(ZodIPv4, params);\n}\nexport const ZodMAC = /*@__PURE__*/ core.$constructor(\"ZodMAC\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodMAC.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function mac(params) {\n return core._mac(ZodMAC, params);\n}\nexport const ZodIPv6 = /*@__PURE__*/ core.$constructor(\"ZodIPv6\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv6(params) {\n return core._ipv6(ZodIPv6, params);\n}\nexport const ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv4\", (inst, def) => {\n core.$ZodCIDRv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv4(params) {\n return core._cidrv4(ZodCIDRv4, params);\n}\nexport const ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv6\", (inst, def) => {\n core.$ZodCIDRv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv6(params) {\n return core._cidrv6(ZodCIDRv6, params);\n}\nexport const ZodBase64 = /*@__PURE__*/ core.$constructor(\"ZodBase64\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64(params) {\n return core._base64(ZodBase64, params);\n}\nexport const ZodBase64URL = /*@__PURE__*/ core.$constructor(\"ZodBase64URL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64URL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64url(params) {\n return core._base64url(ZodBase64URL, params);\n}\nexport const ZodE164 = /*@__PURE__*/ core.$constructor(\"ZodE164\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodE164.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function e164(params) {\n return core._e164(ZodE164, params);\n}\nexport const ZodJWT = /*@__PURE__*/ core.$constructor(\"ZodJWT\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodJWT.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function jwt(params) {\n return core._jwt(ZodJWT, params);\n}\nexport const ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"ZodCustomStringFormat\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCustomStringFormat.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function stringFormat(format, fnOrRegex, _params = {}) {\n return core._stringFormat(ZodCustomStringFormat, format, fnOrRegex, _params);\n}\nexport function hostname(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hostname\", core.regexes.hostname, _params);\n}\nexport function hex(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hex\", core.regexes.hex, _params);\n}\nexport function hash(alg, params) {\n const enc = params?.enc ?? \"hex\";\n const format = `${alg}_${enc}`;\n const regex = core.regexes[format];\n if (!regex)\n throw new Error(`Unrecognized hash format: ${format}`);\n return core._stringFormat(ZodCustomStringFormat, format, regex, params);\n}\nexport const ZodNumber = /*@__PURE__*/ core.$constructor(\"ZodNumber\", (inst, def) => {\n core.$ZodNumber.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.numberProcessor(inst, ctx, json, params);\n inst.gt = (value, params) => inst.check(checks.gt(value, params));\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.lt = (value, params) => inst.check(checks.lt(value, params));\n inst.lte = (value, params) => inst.check(checks.lte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n inst.int = (params) => inst.check(int(params));\n inst.safe = (params) => inst.check(int(params));\n inst.positive = (params) => inst.check(checks.gt(0, params));\n inst.nonnegative = (params) => inst.check(checks.gte(0, params));\n inst.negative = (params) => inst.check(checks.lt(0, params));\n inst.nonpositive = (params) => inst.check(checks.lte(0, params));\n inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n inst.step = (value, params) => inst.check(checks.multipleOf(value, params));\n // inst.finite = (params) => inst.check(core.finite(params));\n inst.finite = () => inst;\n const bag = inst._zod.bag;\n inst.minValue =\n Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null;\n inst.maxValue =\n Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null;\n inst.isInt = (bag.format ?? \"\").includes(\"int\") || Number.isSafeInteger(bag.multipleOf ?? 0.5);\n inst.isFinite = true;\n inst.format = bag.format ?? null;\n});\nexport function number(params) {\n return core._number(ZodNumber, params);\n}\nexport const ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"ZodNumberFormat\", (inst, def) => {\n core.$ZodNumberFormat.init(inst, def);\n ZodNumber.init(inst, def);\n});\nexport function int(params) {\n return core._int(ZodNumberFormat, params);\n}\nexport function float32(params) {\n return core._float32(ZodNumberFormat, params);\n}\nexport function float64(params) {\n return core._float64(ZodNumberFormat, params);\n}\nexport function int32(params) {\n return core._int32(ZodNumberFormat, params);\n}\nexport function uint32(params) {\n return core._uint32(ZodNumberFormat, params);\n}\nexport const ZodBoolean = /*@__PURE__*/ core.$constructor(\"ZodBoolean\", (inst, def) => {\n core.$ZodBoolean.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.booleanProcessor(inst, ctx, json, params);\n});\nexport function boolean(params) {\n return core._boolean(ZodBoolean, params);\n}\nexport const ZodBigInt = /*@__PURE__*/ core.$constructor(\"ZodBigInt\", (inst, def) => {\n core.$ZodBigInt.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.bigintProcessor(inst, ctx, json, params);\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.gt = (value, params) => inst.check(checks.gt(value, params));\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.lt = (value, params) => inst.check(checks.lt(value, params));\n inst.lte = (value, params) => inst.check(checks.lte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n inst.positive = (params) => inst.check(checks.gt(BigInt(0), params));\n inst.negative = (params) => inst.check(checks.lt(BigInt(0), params));\n inst.nonpositive = (params) => inst.check(checks.lte(BigInt(0), params));\n inst.nonnegative = (params) => inst.check(checks.gte(BigInt(0), params));\n inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n const bag = inst._zod.bag;\n inst.minValue = bag.minimum ?? null;\n inst.maxValue = bag.maximum ?? null;\n inst.format = bag.format ?? null;\n});\nexport function bigint(params) {\n return core._bigint(ZodBigInt, params);\n}\nexport const ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"ZodBigIntFormat\", (inst, def) => {\n core.$ZodBigIntFormat.init(inst, def);\n ZodBigInt.init(inst, def);\n});\n// int64\nexport function int64(params) {\n return core._int64(ZodBigIntFormat, params);\n}\n// uint64\nexport function uint64(params) {\n return core._uint64(ZodBigIntFormat, params);\n}\nexport const ZodSymbol = /*@__PURE__*/ core.$constructor(\"ZodSymbol\", (inst, def) => {\n core.$ZodSymbol.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.symbolProcessor(inst, ctx, json, params);\n});\nexport function symbol(params) {\n return core._symbol(ZodSymbol, params);\n}\nexport const ZodUndefined = /*@__PURE__*/ core.$constructor(\"ZodUndefined\", (inst, def) => {\n core.$ZodUndefined.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.undefinedProcessor(inst, ctx, json, params);\n});\nfunction _undefined(params) {\n return core._undefined(ZodUndefined, params);\n}\nexport { _undefined as undefined };\nexport const ZodNull = /*@__PURE__*/ core.$constructor(\"ZodNull\", (inst, def) => {\n core.$ZodNull.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullProcessor(inst, ctx, json, params);\n});\nfunction _null(params) {\n return core._null(ZodNull, params);\n}\nexport { _null as null };\nexport const ZodAny = /*@__PURE__*/ core.$constructor(\"ZodAny\", (inst, def) => {\n core.$ZodAny.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.anyProcessor(inst, ctx, json, params);\n});\nexport function any() {\n return core._any(ZodAny);\n}\nexport const ZodUnknown = /*@__PURE__*/ core.$constructor(\"ZodUnknown\", (inst, def) => {\n core.$ZodUnknown.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unknownProcessor(inst, ctx, json, params);\n});\nexport function unknown() {\n return core._unknown(ZodUnknown);\n}\nexport const ZodNever = /*@__PURE__*/ core.$constructor(\"ZodNever\", (inst, def) => {\n core.$ZodNever.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.neverProcessor(inst, ctx, json, params);\n});\nexport function never(params) {\n return core._never(ZodNever, params);\n}\nexport const ZodVoid = /*@__PURE__*/ core.$constructor(\"ZodVoid\", (inst, def) => {\n core.$ZodVoid.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.voidProcessor(inst, ctx, json, params);\n});\nfunction _void(params) {\n return core._void(ZodVoid, params);\n}\nexport { _void as void };\nexport const ZodDate = /*@__PURE__*/ core.$constructor(\"ZodDate\", (inst, def) => {\n core.$ZodDate.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.dateProcessor(inst, ctx, json, params);\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n const c = inst._zod.bag;\n inst.minDate = c.minimum ? new Date(c.minimum) : null;\n inst.maxDate = c.maximum ? new Date(c.maximum) : null;\n});\nexport function date(params) {\n return core._date(ZodDate, params);\n}\nexport const ZodArray = /*@__PURE__*/ core.$constructor(\"ZodArray\", (inst, def) => {\n core.$ZodArray.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.arrayProcessor(inst, ctx, json, params);\n inst.element = def.element;\n inst.min = (minLength, params) => inst.check(checks.minLength(minLength, params));\n inst.nonempty = (params) => inst.check(checks.minLength(1, params));\n inst.max = (maxLength, params) => inst.check(checks.maxLength(maxLength, params));\n inst.length = (len, params) => inst.check(checks.length(len, params));\n inst.unwrap = () => inst.element;\n});\nexport function array(element, params) {\n return core._array(ZodArray, element, params);\n}\n// .keyof\nexport function keyof(schema) {\n const shape = schema._zod.def.shape;\n return _enum(Object.keys(shape));\n}\nexport const ZodObject = /*@__PURE__*/ core.$constructor(\"ZodObject\", (inst, def) => {\n core.$ZodObjectJIT.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.objectProcessor(inst, ctx, json, params);\n util.defineLazy(inst, \"shape\", () => {\n return def.shape;\n });\n inst.keyof = () => _enum(Object.keys(inst._zod.def.shape));\n inst.catchall = (catchall) => inst.clone({ ...inst._zod.def, catchall: catchall });\n inst.passthrough = () => inst.clone({ ...inst._zod.def, catchall: unknown() });\n inst.loose = () => inst.clone({ ...inst._zod.def, catchall: unknown() });\n inst.strict = () => inst.clone({ ...inst._zod.def, catchall: never() });\n inst.strip = () => inst.clone({ ...inst._zod.def, catchall: undefined });\n inst.extend = (incoming) => {\n return util.extend(inst, incoming);\n };\n inst.safeExtend = (incoming) => {\n return util.safeExtend(inst, incoming);\n };\n inst.merge = (other) => util.merge(inst, other);\n inst.pick = (mask) => util.pick(inst, mask);\n inst.omit = (mask) => util.omit(inst, mask);\n inst.partial = (...args) => util.partial(ZodOptional, inst, args[0]);\n inst.required = (...args) => util.required(ZodNonOptional, inst, args[0]);\n});\nexport function object(shape, params) {\n const def = {\n type: \"object\",\n shape: shape ?? {},\n ...util.normalizeParams(params),\n };\n return new ZodObject(def);\n}\n// strictObject\nexport function strictObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: never(),\n ...util.normalizeParams(params),\n });\n}\n// looseObject\nexport function looseObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: unknown(),\n ...util.normalizeParams(params),\n });\n}\nexport const ZodUnion = /*@__PURE__*/ core.$constructor(\"ZodUnion\", (inst, def) => {\n core.$ZodUnion.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\nexport function union(options, params) {\n return new ZodUnion({\n type: \"union\",\n options: options,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodXor = /*@__PURE__*/ core.$constructor(\"ZodXor\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodXor.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\n/** Creates an exclusive union (XOR) where exactly one option must match.\n * Unlike regular unions that succeed when any option matches, xor fails if\n * zero or more than one option matches the input. */\nexport function xor(options, params) {\n return new ZodXor({\n type: \"union\",\n options: options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodDiscriminatedUnion = /*@__PURE__*/ core.$constructor(\"ZodDiscriminatedUnion\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodDiscriminatedUnion.init(inst, def);\n});\nexport function discriminatedUnion(discriminator, options, params) {\n // const [options, params] = args;\n return new ZodDiscriminatedUnion({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodIntersection = /*@__PURE__*/ core.$constructor(\"ZodIntersection\", (inst, def) => {\n core.$ZodIntersection.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.intersectionProcessor(inst, ctx, json, params);\n});\nexport function intersection(left, right) {\n return new ZodIntersection({\n type: \"intersection\",\n left: left,\n right: right,\n });\n}\nexport const ZodTuple = /*@__PURE__*/ core.$constructor(\"ZodTuple\", (inst, def) => {\n core.$ZodTuple.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.tupleProcessor(inst, ctx, json, params);\n inst.rest = (rest) => inst.clone({\n ...inst._zod.def,\n rest: rest,\n });\n});\nexport function tuple(items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof core.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new ZodTuple({\n type: \"tuple\",\n items: items,\n rest,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodRecord = /*@__PURE__*/ core.$constructor(\"ZodRecord\", (inst, def) => {\n core.$ZodRecord.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.recordProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n});\nexport function record(keyType, valueType, params) {\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\n// type alksjf = core.output;\nexport function partialRecord(keyType, valueType, params) {\n const k = core.clone(keyType);\n k._zod.values = undefined;\n return new ZodRecord({\n type: \"record\",\n keyType: k,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport function looseRecord(keyType, valueType, params) {\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n mode: \"loose\",\n ...util.normalizeParams(params),\n });\n}\nexport const ZodMap = /*@__PURE__*/ core.$constructor(\"ZodMap\", (inst, def) => {\n core.$ZodMap.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.mapProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function map(keyType, valueType, params) {\n return new ZodMap({\n type: \"map\",\n keyType: keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSet = /*@__PURE__*/ core.$constructor(\"ZodSet\", (inst, def) => {\n core.$ZodSet.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.setProcessor(inst, ctx, json, params);\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function set(valueType, params) {\n return new ZodSet({\n type: \"set\",\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEnum = /*@__PURE__*/ core.$constructor(\"ZodEnum\", (inst, def) => {\n core.$ZodEnum.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.enumProcessor(inst, ctx, json, params);\n inst.enum = def.entries;\n inst.options = Object.values(def.entries);\n const keys = new Set(Object.keys(def.entries));\n inst.extract = (values, params) => {\n const newEntries = {};\n for (const value of values) {\n if (keys.has(value)) {\n newEntries[value] = def.entries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n inst.exclude = (values, params) => {\n const newEntries = { ...def.entries };\n for (const value of values) {\n if (keys.has(value)) {\n delete newEntries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n});\nfunction _enum(values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport { _enum as enum };\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function nativeEnum(entries, params) {\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLiteral = /*@__PURE__*/ core.$constructor(\"ZodLiteral\", (inst, def) => {\n core.$ZodLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.literalProcessor(inst, ctx, json, params);\n inst.values = new Set(def.values);\n Object.defineProperty(inst, \"value\", {\n get() {\n if (def.values.length > 1) {\n throw new Error(\"This schema contains multiple valid literal values. Use `.values` instead.\");\n }\n return def.values[0];\n },\n });\n});\nexport function literal(value, params) {\n return new ZodLiteral({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\nexport const ZodFile = /*@__PURE__*/ core.$constructor(\"ZodFile\", (inst, def) => {\n core.$ZodFile.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.fileProcessor(inst, ctx, json, params);\n inst.min = (size, params) => inst.check(core._minSize(size, params));\n inst.max = (size, params) => inst.check(core._maxSize(size, params));\n inst.mime = (types, params) => inst.check(core._mime(Array.isArray(types) ? types : [types], params));\n});\nexport function file(params) {\n return core._file(ZodFile, params);\n}\nexport const ZodTransform = /*@__PURE__*/ core.$constructor(\"ZodTransform\", (inst, def) => {\n core.$ZodTransform.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.transformProcessor(inst, ctx, json, params);\n inst._zod.parse = (payload, _ctx) => {\n if (_ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = inst);\n // _issue.continue ??= true;\n payload.issues.push(util.issue(_issue));\n }\n };\n const output = def.transform(payload.value, payload);\n if (output instanceof Promise) {\n return output.then((output) => {\n payload.value = output;\n return payload;\n });\n }\n payload.value = output;\n return payload;\n };\n});\nexport function transform(fn) {\n return new ZodTransform({\n type: \"transform\",\n transform: fn,\n });\n}\nexport const ZodOptional = /*@__PURE__*/ core.$constructor(\"ZodOptional\", (inst, def) => {\n core.$ZodOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function optional(innerType) {\n return new ZodOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodExactOptional = /*@__PURE__*/ core.$constructor(\"ZodExactOptional\", (inst, def) => {\n core.$ZodExactOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function exactOptional(innerType) {\n return new ZodExactOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodNullable = /*@__PURE__*/ core.$constructor(\"ZodNullable\", (inst, def) => {\n core.$ZodNullable.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullableProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nullable(innerType) {\n return new ZodNullable({\n type: \"nullable\",\n innerType: innerType,\n });\n}\n// nullish\nexport function nullish(innerType) {\n return optional(nullable(innerType));\n}\nexport const ZodDefault = /*@__PURE__*/ core.$constructor(\"ZodDefault\", (inst, def) => {\n core.$ZodDefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.defaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeDefault = inst.unwrap;\n});\nexport function _default(innerType, defaultValue) {\n return new ZodDefault({\n type: \"default\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodPrefault = /*@__PURE__*/ core.$constructor(\"ZodPrefault\", (inst, def) => {\n core.$ZodPrefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.prefaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function prefault(innerType, defaultValue) {\n return new ZodPrefault({\n type: \"prefault\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodNonOptional = /*@__PURE__*/ core.$constructor(\"ZodNonOptional\", (inst, def) => {\n core.$ZodNonOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nonoptionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nonoptional(innerType, params) {\n return new ZodNonOptional({\n type: \"nonoptional\",\n innerType: innerType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSuccess = /*@__PURE__*/ core.$constructor(\"ZodSuccess\", (inst, def) => {\n core.$ZodSuccess.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.successProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function success(innerType) {\n return new ZodSuccess({\n type: \"success\",\n innerType: innerType,\n });\n}\nexport const ZodCatch = /*@__PURE__*/ core.$constructor(\"ZodCatch\", (inst, def) => {\n core.$ZodCatch.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.catchProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeCatch = inst.unwrap;\n});\nfunction _catch(innerType, catchValue) {\n return new ZodCatch({\n type: \"catch\",\n innerType: innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\nexport { _catch as catch };\nexport const ZodNaN = /*@__PURE__*/ core.$constructor(\"ZodNaN\", (inst, def) => {\n core.$ZodNaN.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nanProcessor(inst, ctx, json, params);\n});\nexport function nan(params) {\n return core._nan(ZodNaN, params);\n}\nexport const ZodPipe = /*@__PURE__*/ core.$constructor(\"ZodPipe\", (inst, def) => {\n core.$ZodPipe.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.pipeProcessor(inst, ctx, json, params);\n inst.in = def.in;\n inst.out = def.out;\n});\nexport function pipe(in_, out) {\n return new ZodPipe({\n type: \"pipe\",\n in: in_,\n out: out,\n // ...util.normalizeParams(params),\n });\n}\nexport const ZodCodec = /*@__PURE__*/ core.$constructor(\"ZodCodec\", (inst, def) => {\n ZodPipe.init(inst, def);\n core.$ZodCodec.init(inst, def);\n});\nexport function codec(in_, out, params) {\n return new ZodCodec({\n type: \"pipe\",\n in: in_,\n out: out,\n transform: params.decode,\n reverseTransform: params.encode,\n });\n}\nexport const ZodReadonly = /*@__PURE__*/ core.$constructor(\"ZodReadonly\", (inst, def) => {\n core.$ZodReadonly.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.readonlyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function readonly(innerType) {\n return new ZodReadonly({\n type: \"readonly\",\n innerType: innerType,\n });\n}\nexport const ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"ZodTemplateLiteral\", (inst, def) => {\n core.$ZodTemplateLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.templateLiteralProcessor(inst, ctx, json, params);\n});\nexport function templateLiteral(parts, params) {\n return new ZodTemplateLiteral({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLazy = /*@__PURE__*/ core.$constructor(\"ZodLazy\", (inst, def) => {\n core.$ZodLazy.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.lazyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.getter();\n});\nexport function lazy(getter) {\n return new ZodLazy({\n type: \"lazy\",\n getter: getter,\n });\n}\nexport const ZodPromise = /*@__PURE__*/ core.$constructor(\"ZodPromise\", (inst, def) => {\n core.$ZodPromise.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.promiseProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function promise(innerType) {\n return new ZodPromise({\n type: \"promise\",\n innerType: innerType,\n });\n}\nexport const ZodFunction = /*@__PURE__*/ core.$constructor(\"ZodFunction\", (inst, def) => {\n core.$ZodFunction.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.functionProcessor(inst, ctx, json, params);\n});\nexport function _function(params) {\n return new ZodFunction({\n type: \"function\",\n input: Array.isArray(params?.input) ? tuple(params?.input) : (params?.input ?? array(unknown())),\n output: params?.output ?? unknown(),\n });\n}\nexport { _function as function };\nexport const ZodCustom = /*@__PURE__*/ core.$constructor(\"ZodCustom\", (inst, def) => {\n core.$ZodCustom.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.customProcessor(inst, ctx, json, params);\n});\n// custom checks\nexport function check(fn) {\n const ch = new core.$ZodCheck({\n check: \"custom\",\n // ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\nexport function custom(fn, _params) {\n return core._custom(ZodCustom, fn ?? (() => true), _params);\n}\nexport function refine(fn, _params = {}) {\n return core._refine(ZodCustom, fn, _params);\n}\n// superRefine\nexport function superRefine(fn) {\n return core._superRefine(fn);\n}\n// Re-export describe and meta from core\nexport const describe = core.describe;\nexport const meta = core.meta;\nfunction _instanceof(cls, params = {}) {\n const inst = new ZodCustom({\n type: \"custom\",\n check: \"custom\",\n fn: (data) => data instanceof cls,\n abort: true,\n ...util.normalizeParams(params),\n });\n inst._zod.bag.Class = cls;\n // Override check to emit invalid_type instead of custom\n inst._zod.check = (payload) => {\n if (!(payload.value instanceof cls)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: cls.name,\n input: payload.value,\n inst,\n path: [...(inst._zod.def.path ?? [])],\n });\n }\n };\n return inst;\n}\nexport { _instanceof as instanceof };\n// stringbool\nexport const stringbool = (...args) => core._stringbool({\n Codec: ZodCodec,\n Boolean: ZodBoolean,\n String: ZodString,\n}, ...args);\nexport function json(params) {\n const jsonSchema = lazy(() => {\n return union([string(params), number(), boolean(), _null(), array(jsonSchema), record(string(), jsonSchema)]);\n });\n return jsonSchema;\n}\n// preprocess\n// /** @deprecated Use `z.pipe()` and `z.transform()` instead. */\nexport function preprocess(fn, schema) {\n return pipe(transform(fn), schema);\n}\n", "export { _lt as lt, _lte as lte, _gt as gt, _gte as gte, _positive as positive, _negative as negative, _nonpositive as nonpositive, _nonnegative as nonnegative, _multipleOf as multipleOf, _maxSize as maxSize, _minSize as minSize, _size as size, _maxLength as maxLength, _minLength as minLength, _length as length, _regex as regex, _lowercase as lowercase, _uppercase as uppercase, _includes as includes, _startsWith as startsWith, _endsWith as endsWith, _property as property, _mime as mime, _overwrite as overwrite, _normalize as normalize, _trim as trim, _toLowerCase as toLowerCase, _toUpperCase as toUpperCase, _slugify as slugify, } from \"../core/index.js\";\n", "import * as core from \"../core/index.js\";\nimport * as schemas from \"./schemas.js\";\nexport const ZodISODateTime = /*@__PURE__*/ core.$constructor(\"ZodISODateTime\", (inst, def) => {\n core.$ZodISODateTime.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function datetime(params) {\n return core._isoDateTime(ZodISODateTime, params);\n}\nexport const ZodISODate = /*@__PURE__*/ core.$constructor(\"ZodISODate\", (inst, def) => {\n core.$ZodISODate.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function date(params) {\n return core._isoDate(ZodISODate, params);\n}\nexport const ZodISOTime = /*@__PURE__*/ core.$constructor(\"ZodISOTime\", (inst, def) => {\n core.$ZodISOTime.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function time(params) {\n return core._isoTime(ZodISOTime, params);\n}\nexport const ZodISODuration = /*@__PURE__*/ core.$constructor(\"ZodISODuration\", (inst, def) => {\n core.$ZodISODuration.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function duration(params) {\n return core._isoDuration(ZodISODuration, params);\n}\n", "import * as core from \"../core/index.js\";\nimport { $ZodError } from \"../core/index.js\";\nimport * as util from \"../core/util.js\";\nconst initializer = (inst, issues) => {\n $ZodError.init(inst, issues);\n inst.name = \"ZodError\";\n Object.defineProperties(inst, {\n format: {\n value: (mapper) => core.formatError(inst, mapper),\n // enumerable: false,\n },\n flatten: {\n value: (mapper) => core.flattenError(inst, mapper),\n // enumerable: false,\n },\n addIssue: {\n value: (issue) => {\n inst.issues.push(issue);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n addIssues: {\n value: (issues) => {\n inst.issues.push(...issues);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n isEmpty: {\n get() {\n return inst.issues.length === 0;\n },\n // enumerable: false,\n },\n });\n // Object.defineProperty(inst, \"isEmpty\", {\n // get() {\n // return inst.issues.length === 0;\n // },\n // });\n};\nexport const ZodError = core.$constructor(\"ZodError\", initializer);\nexport const ZodRealError = core.$constructor(\"ZodError\", initializer, {\n Parent: Error,\n});\n// /** @deprecated Use `z.core.$ZodErrorMapCtx` instead. */\n// export type ErrorMapCtx = core.$ZodErrorMapCtx;\n", "import * as core from \"../core/index.js\";\nimport { ZodRealError } from \"./errors.js\";\nexport const parse = /* @__PURE__ */ core._parse(ZodRealError);\nexport const parseAsync = /* @__PURE__ */ core._parseAsync(ZodRealError);\nexport const safeParse = /* @__PURE__ */ core._safeParse(ZodRealError);\nexport const safeParseAsync = /* @__PURE__ */ core._safeParseAsync(ZodRealError);\n// Codec functions\nexport const encode = /* @__PURE__ */ core._encode(ZodRealError);\nexport const decode = /* @__PURE__ */ core._decode(ZodRealError);\nexport const encodeAsync = /* @__PURE__ */ core._encodeAsync(ZodRealError);\nexport const decodeAsync = /* @__PURE__ */ core._decodeAsync(ZodRealError);\nexport const safeEncode = /* @__PURE__ */ core._safeEncode(ZodRealError);\nexport const safeDecode = /* @__PURE__ */ core._safeDecode(ZodRealError);\nexport const safeEncodeAsync = /* @__PURE__ */ core._safeEncodeAsync(ZodRealError);\nexport const safeDecodeAsync = /* @__PURE__ */ core._safeDecodeAsync(ZodRealError);\n", "// Zod 3 compat layer\nimport * as core from \"../core/index.js\";\n/** @deprecated Use the raw string literal codes instead, e.g. \"invalid_type\". */\nexport const ZodIssueCode = {\n invalid_type: \"invalid_type\",\n too_big: \"too_big\",\n too_small: \"too_small\",\n invalid_format: \"invalid_format\",\n not_multiple_of: \"not_multiple_of\",\n unrecognized_keys: \"unrecognized_keys\",\n invalid_union: \"invalid_union\",\n invalid_key: \"invalid_key\",\n invalid_element: \"invalid_element\",\n invalid_value: \"invalid_value\",\n custom: \"custom\",\n};\nexport { $brand, config } from \"../core/index.js\";\n/** @deprecated Use `z.config(params)` instead. */\nexport function setErrorMap(map) {\n core.config({\n customError: map,\n });\n}\n/** @deprecated Use `z.config()` instead. */\nexport function getErrorMap() {\n return core.config().customError;\n}\n/** @deprecated Do not use. Stub definition, only included for zod-to-json-schema compatibility. */\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n", "import { globalRegistry } from \"../core/registries.js\";\nimport * as _checks from \"./checks.js\";\nimport * as _iso from \"./iso.js\";\nimport * as _schemas from \"./schemas.js\";\n// Local z object to avoid circular dependency with ../index.js\nconst z = {\n ..._schemas,\n ..._checks,\n iso: _iso,\n};\n// Keys that are recognized and handled by the conversion logic\nconst RECOGNIZED_KEYS = new Set([\n // Schema identification\n \"$schema\",\n \"$ref\",\n \"$defs\",\n \"definitions\",\n // Core schema keywords\n \"$id\",\n \"id\",\n \"$comment\",\n \"$anchor\",\n \"$vocabulary\",\n \"$dynamicRef\",\n \"$dynamicAnchor\",\n // Type\n \"type\",\n \"enum\",\n \"const\",\n // Composition\n \"anyOf\",\n \"oneOf\",\n \"allOf\",\n \"not\",\n // Object\n \"properties\",\n \"required\",\n \"additionalProperties\",\n \"patternProperties\",\n \"propertyNames\",\n \"minProperties\",\n \"maxProperties\",\n // Array\n \"items\",\n \"prefixItems\",\n \"additionalItems\",\n \"minItems\",\n \"maxItems\",\n \"uniqueItems\",\n \"contains\",\n \"minContains\",\n \"maxContains\",\n // String\n \"minLength\",\n \"maxLength\",\n \"pattern\",\n \"format\",\n // Number\n \"minimum\",\n \"maximum\",\n \"exclusiveMinimum\",\n \"exclusiveMaximum\",\n \"multipleOf\",\n // Already handled metadata\n \"description\",\n \"default\",\n // Content\n \"contentEncoding\",\n \"contentMediaType\",\n \"contentSchema\",\n // Unsupported (error-throwing)\n \"unevaluatedItems\",\n \"unevaluatedProperties\",\n \"if\",\n \"then\",\n \"else\",\n \"dependentSchemas\",\n \"dependentRequired\",\n // OpenAPI\n \"nullable\",\n \"readOnly\",\n]);\nfunction detectVersion(schema, defaultTarget) {\n const $schema = schema.$schema;\n if ($schema === \"https://json-schema.org/draft/2020-12/schema\") {\n return \"draft-2020-12\";\n }\n if ($schema === \"http://json-schema.org/draft-07/schema#\") {\n return \"draft-7\";\n }\n if ($schema === \"http://json-schema.org/draft-04/schema#\") {\n return \"draft-4\";\n }\n // Use defaultTarget if provided, otherwise default to draft-2020-12\n return defaultTarget ?? \"draft-2020-12\";\n}\nfunction resolveRef(ref, ctx) {\n if (!ref.startsWith(\"#\")) {\n throw new Error(\"External $ref is not supported, only local refs (#/...) are allowed\");\n }\n const path = ref.slice(1).split(\"/\").filter(Boolean);\n // Handle root reference \"#\"\n if (path.length === 0) {\n return ctx.rootSchema;\n }\n const defsKey = ctx.version === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n if (path[0] === defsKey) {\n const key = path[1];\n if (!key || !ctx.defs[key]) {\n throw new Error(`Reference not found: ${ref}`);\n }\n return ctx.defs[key];\n }\n throw new Error(`Reference not found: ${ref}`);\n}\nfunction convertBaseSchema(schema, ctx) {\n // Handle unsupported features\n if (schema.not !== undefined) {\n // Special case: { not: {} } represents never\n if (typeof schema.not === \"object\" && Object.keys(schema.not).length === 0) {\n return z.never();\n }\n throw new Error(\"not is not supported in Zod (except { not: {} } for never)\");\n }\n if (schema.unevaluatedItems !== undefined) {\n throw new Error(\"unevaluatedItems is not supported\");\n }\n if (schema.unevaluatedProperties !== undefined) {\n throw new Error(\"unevaluatedProperties is not supported\");\n }\n if (schema.if !== undefined || schema.then !== undefined || schema.else !== undefined) {\n throw new Error(\"Conditional schemas (if/then/else) are not supported\");\n }\n if (schema.dependentSchemas !== undefined || schema.dependentRequired !== undefined) {\n throw new Error(\"dependentSchemas and dependentRequired are not supported\");\n }\n // Handle $ref\n if (schema.$ref) {\n const refPath = schema.$ref;\n if (ctx.refs.has(refPath)) {\n return ctx.refs.get(refPath);\n }\n if (ctx.processing.has(refPath)) {\n // Circular reference - use lazy\n return z.lazy(() => {\n if (!ctx.refs.has(refPath)) {\n throw new Error(`Circular reference not resolved: ${refPath}`);\n }\n return ctx.refs.get(refPath);\n });\n }\n ctx.processing.add(refPath);\n const resolved = resolveRef(refPath, ctx);\n const zodSchema = convertSchema(resolved, ctx);\n ctx.refs.set(refPath, zodSchema);\n ctx.processing.delete(refPath);\n return zodSchema;\n }\n // Handle enum\n if (schema.enum !== undefined) {\n const enumValues = schema.enum;\n // Special case: OpenAPI 3.0 null representation { type: \"string\", nullable: true, enum: [null] }\n if (ctx.version === \"openapi-3.0\" &&\n schema.nullable === true &&\n enumValues.length === 1 &&\n enumValues[0] === null) {\n return z.null();\n }\n if (enumValues.length === 0) {\n return z.never();\n }\n if (enumValues.length === 1) {\n return z.literal(enumValues[0]);\n }\n // Check if all values are strings\n if (enumValues.every((v) => typeof v === \"string\")) {\n return z.enum(enumValues);\n }\n // Mixed types - use union of literals\n const literalSchemas = enumValues.map((v) => z.literal(v));\n if (literalSchemas.length < 2) {\n return literalSchemas[0];\n }\n return z.union([literalSchemas[0], literalSchemas[1], ...literalSchemas.slice(2)]);\n }\n // Handle const\n if (schema.const !== undefined) {\n return z.literal(schema.const);\n }\n // Handle type\n const type = schema.type;\n if (Array.isArray(type)) {\n // Expand type array into anyOf union\n const typeSchemas = type.map((t) => {\n const typeSchema = { ...schema, type: t };\n return convertBaseSchema(typeSchema, ctx);\n });\n if (typeSchemas.length === 0) {\n return z.never();\n }\n if (typeSchemas.length === 1) {\n return typeSchemas[0];\n }\n return z.union(typeSchemas);\n }\n if (!type) {\n // No type specified - empty schema (any)\n return z.any();\n }\n let zodSchema;\n switch (type) {\n case \"string\": {\n let stringSchema = z.string();\n // Apply format using .check() with Zod format functions\n if (schema.format) {\n const format = schema.format;\n // Map common formats to Zod check functions\n if (format === \"email\") {\n stringSchema = stringSchema.check(z.email());\n }\n else if (format === \"uri\" || format === \"uri-reference\") {\n stringSchema = stringSchema.check(z.url());\n }\n else if (format === \"uuid\" || format === \"guid\") {\n stringSchema = stringSchema.check(z.uuid());\n }\n else if (format === \"date-time\") {\n stringSchema = stringSchema.check(z.iso.datetime());\n }\n else if (format === \"date\") {\n stringSchema = stringSchema.check(z.iso.date());\n }\n else if (format === \"time\") {\n stringSchema = stringSchema.check(z.iso.time());\n }\n else if (format === \"duration\") {\n stringSchema = stringSchema.check(z.iso.duration());\n }\n else if (format === \"ipv4\") {\n stringSchema = stringSchema.check(z.ipv4());\n }\n else if (format === \"ipv6\") {\n stringSchema = stringSchema.check(z.ipv6());\n }\n else if (format === \"mac\") {\n stringSchema = stringSchema.check(z.mac());\n }\n else if (format === \"cidr\") {\n stringSchema = stringSchema.check(z.cidrv4());\n }\n else if (format === \"cidr-v6\") {\n stringSchema = stringSchema.check(z.cidrv6());\n }\n else if (format === \"base64\") {\n stringSchema = stringSchema.check(z.base64());\n }\n else if (format === \"base64url\") {\n stringSchema = stringSchema.check(z.base64url());\n }\n else if (format === \"e164\") {\n stringSchema = stringSchema.check(z.e164());\n }\n else if (format === \"jwt\") {\n stringSchema = stringSchema.check(z.jwt());\n }\n else if (format === \"emoji\") {\n stringSchema = stringSchema.check(z.emoji());\n }\n else if (format === \"nanoid\") {\n stringSchema = stringSchema.check(z.nanoid());\n }\n else if (format === \"cuid\") {\n stringSchema = stringSchema.check(z.cuid());\n }\n else if (format === \"cuid2\") {\n stringSchema = stringSchema.check(z.cuid2());\n }\n else if (format === \"ulid\") {\n stringSchema = stringSchema.check(z.ulid());\n }\n else if (format === \"xid\") {\n stringSchema = stringSchema.check(z.xid());\n }\n else if (format === \"ksuid\") {\n stringSchema = stringSchema.check(z.ksuid());\n }\n // Note: json-string format is not currently supported by Zod\n // Custom formats are ignored - keep as plain string\n }\n // Apply constraints\n if (typeof schema.minLength === \"number\") {\n stringSchema = stringSchema.min(schema.minLength);\n }\n if (typeof schema.maxLength === \"number\") {\n stringSchema = stringSchema.max(schema.maxLength);\n }\n if (schema.pattern) {\n // JSON Schema patterns are not implicitly anchored (match anywhere in string)\n stringSchema = stringSchema.regex(new RegExp(schema.pattern));\n }\n zodSchema = stringSchema;\n break;\n }\n case \"number\":\n case \"integer\": {\n let numberSchema = type === \"integer\" ? z.number().int() : z.number();\n // Apply constraints\n if (typeof schema.minimum === \"number\") {\n numberSchema = numberSchema.min(schema.minimum);\n }\n if (typeof schema.maximum === \"number\") {\n numberSchema = numberSchema.max(schema.maximum);\n }\n if (typeof schema.exclusiveMinimum === \"number\") {\n numberSchema = numberSchema.gt(schema.exclusiveMinimum);\n }\n else if (schema.exclusiveMinimum === true && typeof schema.minimum === \"number\") {\n numberSchema = numberSchema.gt(schema.minimum);\n }\n if (typeof schema.exclusiveMaximum === \"number\") {\n numberSchema = numberSchema.lt(schema.exclusiveMaximum);\n }\n else if (schema.exclusiveMaximum === true && typeof schema.maximum === \"number\") {\n numberSchema = numberSchema.lt(schema.maximum);\n }\n if (typeof schema.multipleOf === \"number\") {\n numberSchema = numberSchema.multipleOf(schema.multipleOf);\n }\n zodSchema = numberSchema;\n break;\n }\n case \"boolean\": {\n zodSchema = z.boolean();\n break;\n }\n case \"null\": {\n zodSchema = z.null();\n break;\n }\n case \"object\": {\n const shape = {};\n const properties = schema.properties || {};\n const requiredSet = new Set(schema.required || []);\n // Convert properties - mark optional ones\n for (const [key, propSchema] of Object.entries(properties)) {\n const propZodSchema = convertSchema(propSchema, ctx);\n // If not in required array, make it optional\n shape[key] = requiredSet.has(key) ? propZodSchema : propZodSchema.optional();\n }\n // Handle propertyNames\n if (schema.propertyNames) {\n const keySchema = convertSchema(schema.propertyNames, ctx);\n const valueSchema = schema.additionalProperties && typeof schema.additionalProperties === \"object\"\n ? convertSchema(schema.additionalProperties, ctx)\n : z.any();\n // Case A: No properties (pure record)\n if (Object.keys(shape).length === 0) {\n zodSchema = z.record(keySchema, valueSchema);\n break;\n }\n // Case B: With properties (intersection of object and looseRecord)\n const objectSchema = z.object(shape).passthrough();\n const recordSchema = z.looseRecord(keySchema, valueSchema);\n zodSchema = z.intersection(objectSchema, recordSchema);\n break;\n }\n // Handle patternProperties\n if (schema.patternProperties) {\n // patternProperties: keys matching pattern must satisfy corresponding schema\n // Use loose records so non-matching keys pass through\n const patternProps = schema.patternProperties;\n const patternKeys = Object.keys(patternProps);\n const looseRecords = [];\n for (const pattern of patternKeys) {\n const patternValue = convertSchema(patternProps[pattern], ctx);\n const keySchema = z.string().regex(new RegExp(pattern));\n looseRecords.push(z.looseRecord(keySchema, patternValue));\n }\n // Build intersection: object schema + all pattern property records\n const schemasToIntersect = [];\n if (Object.keys(shape).length > 0) {\n // Use passthrough so patternProperties can validate additional keys\n schemasToIntersect.push(z.object(shape).passthrough());\n }\n schemasToIntersect.push(...looseRecords);\n if (schemasToIntersect.length === 0) {\n zodSchema = z.object({}).passthrough();\n }\n else if (schemasToIntersect.length === 1) {\n zodSchema = schemasToIntersect[0];\n }\n else {\n // Chain intersections: (A & B) & C & D ...\n let result = z.intersection(schemasToIntersect[0], schemasToIntersect[1]);\n for (let i = 2; i < schemasToIntersect.length; i++) {\n result = z.intersection(result, schemasToIntersect[i]);\n }\n zodSchema = result;\n }\n break;\n }\n // Handle additionalProperties\n // In JSON Schema, additionalProperties defaults to true (allow any extra properties)\n // In Zod, objects strip unknown keys by default, so we need to handle this explicitly\n const objectSchema = z.object(shape);\n if (schema.additionalProperties === false) {\n // Strict mode - no extra properties allowed\n zodSchema = objectSchema.strict();\n }\n else if (typeof schema.additionalProperties === \"object\") {\n // Extra properties must match the specified schema\n zodSchema = objectSchema.catchall(convertSchema(schema.additionalProperties, ctx));\n }\n else {\n // additionalProperties is true or undefined - allow any extra properties (passthrough)\n zodSchema = objectSchema.passthrough();\n }\n break;\n }\n case \"array\": {\n // TODO: uniqueItems is not supported\n // TODO: contains/minContains/maxContains are not supported\n // Check if this is a tuple (prefixItems or items as array)\n const prefixItems = schema.prefixItems;\n const items = schema.items;\n if (prefixItems && Array.isArray(prefixItems)) {\n // Tuple with prefixItems (draft-2020-12)\n const tupleItems = prefixItems.map((item) => convertSchema(item, ctx));\n const rest = items && typeof items === \"object\" && !Array.isArray(items)\n ? convertSchema(items, ctx)\n : undefined;\n if (rest) {\n zodSchema = z.tuple(tupleItems).rest(rest);\n }\n else {\n zodSchema = z.tuple(tupleItems);\n }\n // Apply minItems/maxItems constraints to tuples\n if (typeof schema.minItems === \"number\") {\n zodSchema = zodSchema.check(z.minLength(schema.minItems));\n }\n if (typeof schema.maxItems === \"number\") {\n zodSchema = zodSchema.check(z.maxLength(schema.maxItems));\n }\n }\n else if (Array.isArray(items)) {\n // Tuple with items array (draft-7)\n const tupleItems = items.map((item) => convertSchema(item, ctx));\n const rest = schema.additionalItems && typeof schema.additionalItems === \"object\"\n ? convertSchema(schema.additionalItems, ctx)\n : undefined; // additionalItems: false means no rest, handled by default tuple behavior\n if (rest) {\n zodSchema = z.tuple(tupleItems).rest(rest);\n }\n else {\n zodSchema = z.tuple(tupleItems);\n }\n // Apply minItems/maxItems constraints to tuples\n if (typeof schema.minItems === \"number\") {\n zodSchema = zodSchema.check(z.minLength(schema.minItems));\n }\n if (typeof schema.maxItems === \"number\") {\n zodSchema = zodSchema.check(z.maxLength(schema.maxItems));\n }\n }\n else if (items !== undefined) {\n // Regular array\n const element = convertSchema(items, ctx);\n let arraySchema = z.array(element);\n // Apply constraints\n if (typeof schema.minItems === \"number\") {\n arraySchema = arraySchema.min(schema.minItems);\n }\n if (typeof schema.maxItems === \"number\") {\n arraySchema = arraySchema.max(schema.maxItems);\n }\n zodSchema = arraySchema;\n }\n else {\n // No items specified - array of any\n zodSchema = z.array(z.any());\n }\n break;\n }\n default:\n throw new Error(`Unsupported type: ${type}`);\n }\n // Apply metadata\n if (schema.description) {\n zodSchema = zodSchema.describe(schema.description);\n }\n if (schema.default !== undefined) {\n zodSchema = zodSchema.default(schema.default);\n }\n return zodSchema;\n}\nfunction convertSchema(schema, ctx) {\n if (typeof schema === \"boolean\") {\n return schema ? z.any() : z.never();\n }\n // Convert base schema first (ignoring composition keywords)\n let baseSchema = convertBaseSchema(schema, ctx);\n const hasExplicitType = schema.type || schema.enum !== undefined || schema.const !== undefined;\n // Process composition keywords LAST (they can appear together)\n // Handle anyOf - wrap base schema with union\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n const options = schema.anyOf.map((s) => convertSchema(s, ctx));\n const anyOfUnion = z.union(options);\n baseSchema = hasExplicitType ? z.intersection(baseSchema, anyOfUnion) : anyOfUnion;\n }\n // Handle oneOf - exclusive union (exactly one must match)\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n const options = schema.oneOf.map((s) => convertSchema(s, ctx));\n const oneOfUnion = z.xor(options);\n baseSchema = hasExplicitType ? z.intersection(baseSchema, oneOfUnion) : oneOfUnion;\n }\n // Handle allOf - wrap base schema with intersection\n if (schema.allOf && Array.isArray(schema.allOf)) {\n if (schema.allOf.length === 0) {\n baseSchema = hasExplicitType ? baseSchema : z.any();\n }\n else {\n let result = hasExplicitType ? baseSchema : convertSchema(schema.allOf[0], ctx);\n const startIdx = hasExplicitType ? 0 : 1;\n for (let i = startIdx; i < schema.allOf.length; i++) {\n result = z.intersection(result, convertSchema(schema.allOf[i], ctx));\n }\n baseSchema = result;\n }\n }\n // Handle nullable (OpenAPI 3.0)\n if (schema.nullable === true && ctx.version === \"openapi-3.0\") {\n baseSchema = z.nullable(baseSchema);\n }\n // Handle readOnly\n if (schema.readOnly === true) {\n baseSchema = z.readonly(baseSchema);\n }\n // Collect metadata: core schema keywords and unrecognized keys\n const extraMeta = {};\n // Core schema keywords that should be captured as metadata\n const coreMetadataKeys = [\"$id\", \"id\", \"$comment\", \"$anchor\", \"$vocabulary\", \"$dynamicRef\", \"$dynamicAnchor\"];\n for (const key of coreMetadataKeys) {\n if (key in schema) {\n extraMeta[key] = schema[key];\n }\n }\n // Content keywords - store as metadata\n const contentMetadataKeys = [\"contentEncoding\", \"contentMediaType\", \"contentSchema\"];\n for (const key of contentMetadataKeys) {\n if (key in schema) {\n extraMeta[key] = schema[key];\n }\n }\n // Unrecognized keys (custom metadata)\n for (const key of Object.keys(schema)) {\n if (!RECOGNIZED_KEYS.has(key)) {\n extraMeta[key] = schema[key];\n }\n }\n if (Object.keys(extraMeta).length > 0) {\n ctx.registry.add(baseSchema, extraMeta);\n }\n return baseSchema;\n}\n/**\n * Converts a JSON Schema to a Zod schema. This function should be considered semi-experimental. It's behavior is liable to change. */\nexport function fromJSONSchema(schema, params) {\n // Handle boolean schemas\n if (typeof schema === \"boolean\") {\n return schema ? z.any() : z.never();\n }\n const version = detectVersion(schema, params?.defaultTarget);\n const defs = (schema.$defs || schema.definitions || {});\n const ctx = {\n version,\n defs,\n refs: new Map(),\n processing: new Set(),\n rootSchema: schema,\n registry: params?.registry ?? globalRegistry,\n };\n return convertSchema(schema, ctx);\n}\n", "import * as core from \"../core/index.js\";\nimport * as schemas from \"./schemas.js\";\nexport function string(params) {\n return core._coercedString(schemas.ZodString, params);\n}\nexport function number(params) {\n return core._coercedNumber(schemas.ZodNumber, params);\n}\nexport function boolean(params) {\n return core._coercedBoolean(schemas.ZodBoolean, params);\n}\nexport function bigint(params) {\n return core._coercedBigint(schemas.ZodBigInt, params);\n}\nexport function date(params) {\n return core._coercedDate(schemas.ZodDate, params);\n}\n", "import z from \"zod\";\nfunction zDocumentId(strict = false) {\n const core = z.string().trim().refine(foundry.data.validators.isValidId);\n return strict ? core.readonly() : core.default(foundry.utils.randomID).readonly();\n}\nfunction zSpellcastingEntryId() {\n return z\n .string()\n .trim()\n .refine((value) => {\n const id = value.endsWith(\"-casting\") ? value.slice(0, -8) : value;\n return foundry.data.validators.isValidId(id);\n })\n .readonly();\n}\nexport { zDocumentId, zSpellcastingEntryId };\n", "import z from \"zod\";\nimport { R } from \"..\";\nvar validators = foundry.data.validators;\nfunction zDocumentUUID(options) {\n const { embedded, type } = R.isObjectType(options) ? options : { embedded: undefined, type: options };\n if (type && !R.isIncludedIn(type, CONST.ALL_DOCUMENT_TYPES)) {\n throw new Error(\"The type of a zDocumentUUID must be keys in CONST.ALL_DOCUMENT_TYPES\");\n }\n return z.custom((value) => {\n const resolvedUUID = R.isString(value) ? foundry.utils.parseUuid(value) : null;\n if (!resolvedUUID)\n return false;\n if (type && resolvedUUID.type !== type)\n return false;\n if (embedded === true && !resolvedUUID.embedded.length)\n return false;\n if (embedded === false && resolvedUUID.embedded.length)\n return false;\n if (!resolvedUUID.documentId || !validators.isValidId(resolvedUUID.documentId))\n return false;\n return true;\n });\n}\nexport { zDocumentUUID };\n", "import z from \"zod\";\nfunction zClientDocument(model) {\n return z.custom((value) => {\n return value instanceof getDocumentClass(model);\n });\n}\nexport { zClientDocument };\n", "import { R, z } from \"..\";\nfunction zFilePath(options) {\n const { base64 = false, categories = [], virtual = false, wildcard = false, } = R.isArray(options) ? { categories: options } : options;\n if (!categories.length || categories.some((c) => !(c in CONST.FILE_CATEGORIES))) {\n throw new Error(\"The categories of a zFilePath must be keys in CONST.FILE_CATEGORIES\");\n }\n /**\n * copied from foundry\n */\n return z.custom((value) => {\n if (!R.isString(value))\n return false;\n // Wildcard or virtual paths\n if (virtual && value[0] === \"#\" && value.length > 1)\n return true;\n if (wildcard && value.includes(\"*\"))\n return true;\n // Allowed extension or base64\n return categories.some((c) => {\n const category = CONST.FILE_CATEGORIES[c];\n if (foundry.data.validators.hasFileExtension(value, Object.keys(category)))\n return true;\n return foundry.data.validators.isBase64Data(value, Object.values(category));\n });\n }, {\n error: () => {\n let err = \"does not have a valid file extension\";\n if (base64)\n err += \" or provide valid base64 data\";\n return err;\n },\n });\n}\nexport { zFilePath };\n", "import z from \"zod\";\nconst CONJUNCTION_TYPES = [\"and\", \"or\"];\nconst EQUIPMENT_CATEGORIES = [\"itemTypes\", \"rarity\", \"armorTypes\", \"weaponTypes\"];\nfunction zTraitData() {\n return z.object({\n conjunction: z.enum(CONJUNCTION_TYPES).default(\"and\"),\n selected: z\n .array(z.object({\n label: z.string().trim(),\n not: z.boolean().optional(),\n value: z.string().trim(),\n }))\n .default([]),\n });\n}\nfunction zLevelData(max) {\n return z.object({\n from: z.number().min(0).max(max).multipleOf(1).default(0),\n to: z.number().min(0).max(max).multipleOf(1).default(max),\n });\n}\nfunction zSearchData() {\n return z.object({ text: z.string().trim().default(\"\") });\n}\nfunction zCheckboxData() {\n return z.object({\n options: z.record(z.string(), z.object({ selected: z.boolean() })).default({}),\n selected: z.array(z.string()).default([]),\n });\n}\nfunction zRangeData() {\n return z.object({\n values: z.object({\n inputMin: z.string().nonempty().optional(),\n inputMax: z.string().nonempty().optional(),\n min: z.number().min(0).multipleOf(1).optional(),\n max: z.number().min(0).multipleOf(1).optional(),\n }),\n });\n}\nfunction zEquipmentFilter() {\n return z.object({\n checkboxes: z.partialRecord(z.enum(EQUIPMENT_CATEGORIES), zCheckboxData()).optional(),\n level: zLevelData(30).optional(),\n ranges: z.partialRecord(z.enum([\"price\"]), zRangeData()).optional(),\n search: zSearchData().optional(),\n source: zCheckboxData().optional(),\n traits: zTraitData().optional(),\n });\n}\nexport { zEquipmentFilter };\n", "import z from \"zod\";\nimport { zClientDocument, zDocumentId, zDocumentUUID, } from \".\";\nimport { R } from \"..\";\nfunction zForeignDocument(model, validator = () => true) {\n const ModelClass = getDocumentClass(model);\n return z.codec(zDocumentId().nullable(), zClientDocument(model).nullable(), {\n decode: (id) => {\n const doc = (id ? ModelClass.get(id) : null);\n return doc && validator(doc) ? doc : null;\n },\n encode: (doc) => {\n return doc instanceof ModelClass ? doc.id : null;\n },\n });\n}\nfunction zForeignDocumentUUID(options) {\n const { embedded, type } = R.isObjectType(options) ? options : { embedded: undefined, type: options };\n const ModelClass = getDocumentClass(type);\n return z.codec(zDocumentUUID({ embedded, type }).nullable(), zClientDocument(type).nullable(), {\n decode: async (uuid) => {\n const doc = R.isString(uuid) ? await fromUuid(uuid) : null;\n return doc instanceof ModelClass ? doc : null;\n },\n encode: (doc) => {\n return doc?.uuid ?? null;\n },\n });\n}\nfunction zForeignItem(type, embedded = false) {\n const ItemCls = getDocumentClass(\"Item\");\n const types = R.isArray(type) ? type : [type];\n return z.codec(zDocumentUUID({ embedded, type: \"Item\" }).nullable(), zClientDocument(\"Item\").nullable(), {\n decode: async (uuid) => {\n const item = R.isString(uuid) ? await fromUuid(uuid) : null;\n return item instanceof ItemCls && item.isOfType(...types) ? item : null;\n },\n encode: (doc) => {\n return doc?.uuid ?? null;\n },\n });\n}\nexport { zForeignDocument, zForeignDocumentUUID, zForeignItem };\n", "import z from \"zod\";\nimport { R, valueBetween } from \"..\";\nfunction zRange(min, max) {\n return z.custom((value) => R.isNumber(value) && valueBetween(value, min, max)).default(min);\n}\nexport { zRange };\n", "import z from \"zod\";\nimport { R } from \"..\";\nfunction zSafeArray(schema, unique = false) {\n return z.custom((arr) => {\n const result = [];\n if (!R.isArray(arr)) {\n return result;\n }\n for (const entry of arr) {\n const parsed = schema.safeParse(entry);\n if (parsed.success) {\n result.push(parsed.data);\n }\n }\n return unique ? R.unique(result) : result;\n });\n}\nexport { zSafeArray };\n", "import z from \"zod\";\nimport { R } from \"..\";\nconst _cached = {};\nfunction zAttribute() {\n const attribute = (_cached.attributes ??= R.keys(CONFIG.PF2E.abilities));\n return z.enum(attribute);\n}\nfunction zTradition() {\n const traditions = (_cached.traditions ??= R.keys(CONFIG.PF2E.magicTraditions));\n return z.enum(traditions);\n}\nfunction zSpellRank() {\n return z.custom((value) => {\n return R.isNumber(value) && value >= 1 && value <= 10;\n });\n}\nexport { zAttribute, zSpellRank, zTradition };\n", "import { R } from \"..\";\nclass ZodDocument {\n #data;\n constructor(data) {\n this.#data = data;\n for (const property in this.#data) {\n Object.defineProperty(this, property, {\n get() {\n return this.#data[property];\n },\n set(value) {\n this.#data[property] = value;\n },\n });\n }\n }\n toObject() {\n return foundry.utils.deepClone(this.#data);\n }\n encode(encoder) {\n return encoder.safeEncode(this.#data).data;\n }\n}\nclass ZodDocumentArray extends Array {\n constructor(sources, decoder, Model) {\n const entries = R.pipe(sources, R.map((source) => {\n const data = decoder.safeDecode(source);\n return data ? new Model(data) : undefined;\n }), R.filter(R.isTruthy));\n super(...entries);\n }\n toObject() {\n return this.map((entry) => entry.toObject());\n }\n encode(encoder) {\n return this.map((entry) => entry.encode(encoder)).filter(R.isTruthy);\n }\n}\nexport { ZodDocument, ZodDocumentArray };\n", "import { R } from \".\";\nclass SYSTEM {\n static get id() {\n return game.system.id;\n }\n static get oppositeId() {\n return this.id === \"pf2e\" ? \"sf2e\" : \"pf2e\";\n }\n static get anachronismId() {\n return `${this.oppositeId}-anachronism`;\n }\n static get isPF2e() {\n return this.id === \"pf2e\";\n }\n static get isSF2e() {\n return this.id === \"sf2e\";\n }\n static get isPathfinder() {\n return R.isIncludedIn(this.id, [\"pf2e\", \"sf2e\"]);\n }\n static relativePath(...path) {\n const tail = R.join(path, \"/\");\n return `systems/${this.id}/${tail}`;\n }\n static path(...path) {\n return () => this.relativePath(...path);\n }\n static uuid(pf2e, sf2e) {\n return () => {\n return this.isSF2e ? sf2e : pf2e;\n };\n }\n static itemUuid(pf2e, sf2e) {\n return () => {\n return this.isSF2e ? sf2e : pf2e;\n };\n }\n static uuids(entries) {\n return () => {\n const index = this.isSF2e ? 1 : 0;\n return entries.map((entry) => entry[index]);\n };\n }\n static fromUuid(uuid) {\n const singleUuid = uuid();\n return fromUuid(singleUuid);\n }\n static pack(pf2e, sf2e) {\n return () => {\n return this.getPack(pf2e, sf2e);\n };\n }\n static sluggify(text, options) {\n return game.pf2e.system.sluggify(text, options);\n }\n static getPack(pf2e, sf2e) {\n const name = this.isSF2e ? sf2e : pf2e;\n return game.packs.get(name);\n }\n static getSystemPack(name) {\n return game.packs.get(`${this.id}.${name}`);\n }\n static getAnachronismPack(name) {\n return game.packs.get(`${this.anachronismId}.${name}`);\n }\n}\nexport { SYSTEM };\n", "import { getSetting, localize, R } from \".\";\nclass CustomModule {\n #api = {};\n #current;\n #debug = {};\n #globalName = \"\";\n #group = false;\n #id;\n get id() {\n if (!this.#id) {\n throw new Error(\"Module needs to be registered.\");\n }\n return this.#id;\n }\n get current() {\n return (this.#current ??= game.modules.get(this.id));\n }\n get name() {\n return this.current.title;\n }\n get isDebug() {\n return foundry.utils.getProperty(CONFIG, `debug.${this.id}`) === true;\n }\n register(id, globalName) {\n if (this.#id) {\n throw new Error(\"Module was already registered.\");\n }\n this.#id = id;\n this.#globalName = globalName || id.replace(/^pf2e-/, \"\").replace(/-(\\w)/g, (_, c) => c.toUpperCase());\n Hooks.once(\"init\", () => {\n const self = this;\n const context = {};\n Object.defineProperties(context, {\n active: {\n get() {\n return self.current.active;\n },\n configurable: false,\n enumerable: false,\n },\n api: {\n get() {\n return self.#api;\n },\n configurable: false,\n enumerable: false,\n },\n debug: {\n get() {\n return self.isDebug ? self.#debug : undefined;\n },\n configurable: false,\n enumerable: false,\n },\n getSetting: {\n value: function (setting) {\n return getSetting(setting);\n },\n writable: false,\n configurable: false,\n enumerable: false,\n },\n localize: {\n value: localize.sub(id),\n configurable: false,\n enumerable: false,\n writable: false,\n },\n });\n Object.defineProperty(game, this.#globalName, {\n value: context,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n });\n }\n group(label) {\n this.groupEnd();\n this.#group = label;\n }\n groupEnd() {\n console.groupEnd();\n this.#group = false;\n }\n log(...args) {\n if (R.isString(this.#group)) {\n console.group(`[${this.name}] ${this.#group}`);\n this.#group = true;\n }\n if (this.#group) {\n console.log(...args);\n }\n else {\n console.log(`[${this.name}]`, ...args);\n }\n }\n debug(...args) {\n if (this.isDebug) {\n this.log(...args);\n }\n }\n globalPath(...path) {\n const joined = R.join(path, \".\");\n return joined ? `${this.#globalName}.${joined}` : `${this.#globalName}`;\n }\n path(...path) {\n const joined = R.join(path, \".\");\n return joined ? `${this.id}.${joined}` : `${this.id}`;\n }\n relativePath(...path) {\n const tail = R.join(path, \"/\");\n return `modules/${this.id}/${tail}`;\n }\n imagePath(...path) {\n const ext = path.pop();\n const root = this.relativePath(\"images\", ...path);\n return `${root}.${ext}`;\n }\n templatePath(...path) {\n const root = this.relativePath(\"templates\", ...path);\n return `${root}.hbs`;\n }\n Error(str) {\n return new Error(`\\n[${this.name}] ${str}`);\n }\n error(str, error) {\n let message = `[${this.name}] ${str}`;\n if (error instanceof Error) {\n message += `\\n${error.message}`;\n }\n else if (typeof error === \"string\") {\n message += `\\n${error}`;\n }\n console.error(message);\n }\n apiExpose(key, toExpose) {\n if (foundry.utils.hasProperty(this.#api, key)) {\n throw this.Error(`the api key was already defined: ${key}`);\n }\n const exposed = R.isObjectType(toExpose) ? foundry.utils.deepClone(toExpose) : toExpose;\n Object.freeze(exposed);\n Object.defineProperty(this.#api, key, {\n value: exposed,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n }\n debugExpose(key, toExpose) {\n if (foundry.utils.hasProperty(this.#debug, key)) {\n throw this.Error(`the debug key was already defined: ${key}`);\n }\n const exposed = foundry.utils.deepClone(toExpose);\n Object.freeze(exposed);\n Object.defineProperty(this.#debug, key, {\n value: exposed,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n }\n}\nfunction getActiveModule(key) {\n const module = game.modules.get(key);\n if (!module?.active)\n return;\n return {\n ...module,\n getSetting(...path) {\n return game.settings.get(module.id, R.join(path, \".\"));\n },\n };\n}\nconst MODULE = new CustomModule();\nexport { getActiveModule, MODULE };\n", "import { R, SYSTEM } from \".\";\n/**\n * https://github.com/foundryvtt/pf2e/blob/37b0dcab08141b3e9e4e0f44e51df9f4dfd52a71/src/util/misc.ts#L160C1-L171C3\n */\nconst actionImgMap = R.mapValues({\n 0: \"icons/actions/FreeAction.webp\",\n free: \"icons/actions/FreeAction.webp\",\n 1: \"icons/actions/OneAction.webp\",\n 2: \"icons/actions/TwoActions.webp\",\n 3: \"icons/actions/ThreeActions.webp\",\n \"1 or 2\": \"icons/actions/OneTwoActions.webp\",\n \"1 to 3\": \"icons/actions/OneThreeActions.webp\",\n \"2 or 3\": \"icons/actions/TwoThreeActions.webp\",\n reaction: \"icons/actions/Reaction.webp\",\n passive: \"icons/actions/Passive.webp\",\n}, (tail) => SYSTEM.path(tail));\n/**\n * https://github.com/foundryvtt/pf2e/blob/89892b6fafec1456a0358de8c6d7b102e3fe2da2/src/util/misc.ts#L188C1-L199C3\n */\nconst actionGlyphMap = {\n 0: \"F\",\n free: \"F\",\n 1: \"1\",\n 2: \"2\",\n 3: \"3\",\n \"1 or 2\": \"1/2\",\n \"1 to 3\": \"1 - 3\",\n \"2 or 3\": \"2/3\",\n \"2 rounds\": \"3,3\",\n reaction: \"R\",\n};\nfunction getActionIcon(action, fallback = SYSTEM.relativePath(\"icons/actions/Empty.webp\")) {\n if (action === null)\n return actionImgMap.passive();\n const value = typeof action !== \"object\" ? action : action.type === \"action\" ? action.value : action.type;\n const sanitized = String(value ?? \"\")\n .toLowerCase()\n .trim();\n return actionImgMap[sanitized]?.() ?? fallback;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/89892b6fafec1456a0358de8c6d7b102e3fe2da2/src/util/misc.ts#L205\n */\nfunction getActionGlyph(action) {\n if (!action && action !== 0)\n return \"\";\n const value = typeof action !== \"object\" ? action : action.type === \"action\" ? action.value : action.type;\n const sanitized = String(value ?? \"\")\n .toLowerCase()\n .trim();\n return actionGlyphMap[sanitized]?.replace(\"-\", \"\u2013\") ?? \"\";\n}\nfunction updateActionFrequency(event, item, virtualData) {\n const target = event.target;\n const frequency = item.frequency;\n if (!frequency || !(target instanceof HTMLInputElement))\n return;\n const value = Math.clamp(target.valueAsNumber, 0, frequency.max);\n if (value === frequency.value)\n return;\n if (virtualData) {\n const { parent, ruleIndex } = virtualData;\n const rule = parent.rules[ruleIndex];\n return rule.updateData({ frequency: value });\n }\n else {\n return item.update({ \"system.frequency.value\": value });\n }\n}\nasync function useAction(event, item, virtualData) {\n const macro = game.toolbelt?.getToolSetting(\"actionable\", \"action\")\n ? await game.toolbelt?.api.actionable.getActionMacro(item)\n : undefined;\n const use = async () => {\n if (item.crafting) {\n return game.pf2e.rollItemMacro(item.uuid, event);\n }\n if (item.system.frequency && item.system.frequency.value > 0) {\n const newValue = item.system.frequency.value - 1;\n if (virtualData) {\n const { parent, ruleIndex } = virtualData;\n const rule = parent.rules[ruleIndex];\n await rule.updateData({ frequency: newValue });\n }\n else {\n await item.update({ \"system.frequency.value\": newValue });\n }\n }\n if (item.system.selfEffect) {\n await applySelfEffect(item);\n }\n return item.toMessage(event);\n };\n if (!macro) {\n return use();\n }\n // we let the macro handle the action usage or cancelation\n return macro.execute({\n actor: item.actor,\n item,\n use,\n cancel: () => {\n const msg = game.toolbelt.localize(\"actionable.action.cancel\", item);\n return ui.notifications.warn(msg, { localize: false });\n },\n });\n}\nasync function applySelfEffect(item) {\n const effect = item.system.selfEffect && (await fromUuid(item.system.selfEffect.uuid));\n if (!effect)\n return;\n const actor = item.actor;\n const token = actor.getActiveTokens(true, true).shift() ?? null;\n const traits = item.system.traits.value?.filter((trait) => trait in CONFIG.PF2E.Item.documentClasses.effect.validTraits);\n const effectSource = foundry.utils.mergeObject(effect.toObject(), {\n _id: null,\n system: {\n context: {\n origin: {\n actor: actor.uuid,\n token: token?.uuid ?? null,\n item: item.uuid,\n spellcasting: null,\n rollOptions: item.getOriginData().rollOptions,\n },\n target: {\n actor: actor.uuid,\n token: token?.uuid ?? null,\n },\n roll: null,\n },\n traits: { value: traits },\n },\n });\n await actor.createEmbeddedDocuments(\"Item\", [effectSource]);\n}\nfunction isDefaultActionIcon(img, action) {\n return img === getActionIcon(action);\n}\nexport { applySelfEffect, getActionGlyph, getActionIcon, isDefaultActionIcon, updateActionFrequency, useAction };\n", "const PARTY_ACTOR_ID = \"xxxPF2ExPARTYxxx\";\nfunction getDispositionColor(actor) {\n const alliance = actor?.alliance;\n const colorValue = !actor\n ? CONFIG.Canvas.dispositionColors.NEUTRAL\n : alliance === \"party\"\n ? actor.hasPlayerOwner\n ? CONFIG.Canvas.dispositionColors.PARTY\n : CONFIG.Canvas.dispositionColors.FRIENDLY\n : alliance === \"opposition\"\n ? CONFIG.Canvas.dispositionColors.HOSTILE\n : CONFIG.Canvas.dispositionColors.NEUTRAL;\n return new Color(colorValue);\n}\nfunction actorsRespectAlliance(origin, target, alliance = \"all\") {\n return alliance === \"allies\" ? target.isAllyOf(origin) : alliance === \"enemies\" ? target.isEnemyOf(origin) : true;\n}\nfunction belongToPartyAlliance(actor) {\n return actor.system.details.alliance === \"party\";\n}\nfunction oppositeAlliance(alliance) {\n return alliance === \"party\" ? \"opposition\" : alliance === \"opposition\" ? \"party\" : null;\n}\nfunction isAllyActor(actor) {\n return actor.alliance === \"party\" || actor.testUserPermission(game.user, \"OBSERVER\");\n}\nfunction isMerchant(actor) {\n return !!actor?.isOfType(\"loot\") && actor.isMerchant;\n}\nfunction getMythicOrHeroPoints(actor) {\n const slug = actor.system.resources.mythicPoints.max ? \"mythic-points\" : \"hero-points\";\n const resource = actor.getResource(slug);\n return {\n slug,\n name: slug === \"hero-points\" ? \"heroPoints\" : \"mythicPoints\",\n max: resource.max,\n value: resource.value,\n };\n}\nfunction getActorMaster(actor) {\n if (!actor)\n return null;\n return (actor.master ?? game.toolbelt?.api.shareData.getMasterInMemory(actor) ?? null);\n}\nfunction getActorSize(actor) {\n const ActorSizeCls = actor.system.traits.size.constructor;\n return new ActorSizeCls({\n value: actor.system.traits.naturalSize ?? actor.size,\n smallIsMedium: true,\n });\n}\nexport { actorsRespectAlliance, belongToPartyAlliance, getActorMaster, getActorSize, getDispositionColor, getMythicOrHeroPoints, isAllyActor, isMerchant, oppositeAlliance, PARTY_ACTOR_ID, };\n", "import { isInstanceOf, R } from \".\";\nfunction renderApplications(type) {\n const types = Array.isArray(type) ? type : [type];\n const apps = [...R.values(ui.windows), ...foundry.applications.instances.values()].filter((app) => types.some((x) => isInstanceOf(app, x)));\n for (const app of apps) {\n app.render();\n }\n}\nfunction renderCharacterSheets() {\n renderApplications(\"CharacterSheetPF2e\");\n}\nfunction renderActorSheets(type = [\"ActorSheetPF2e\"]) {\n renderApplications(type);\n}\nfunction renderItemSheets(type = [\"ItemSheetPF2e\"]) {\n renderApplications(type);\n}\nfunction enrichHTML(content, options) {\n return foundry.applications.ux.TextEditor.implementation.enrichHTML(content, options);\n}\nexport { enrichHTML, renderActorSheets, renderCharacterSheets, renderItemSheets };\n", "import { R } from \".\";\nclass CycleArray extends Array {\n #index = 0;\n get index() {\n if (this.#index > this.length - 1) {\n this.#index = this.length - 1;\n }\n return this.#index;\n }\n get current() {\n return this.at(this.index);\n }\n get isLast() {\n return this.index === this.length - 1;\n }\n get isFirst() {\n return this.index === 0;\n }\n setFromValue(value) {\n const index = this.indexOf(value);\n this.#index = index >= 0 ? index : this.#index;\n }\n increment() {\n this.#index = (this.index + 1) % this.length;\n return this.current;\n }\n decrement() {\n const modulo = this.length;\n const value = this.index - 1;\n this.#index = ((value % modulo) + modulo) % modulo;\n return this.current;\n }\n cycle(direction) {\n return Number(direction) > 0 ? this.increment() : this.decrement();\n }\n}\nfunction removeIndexFromArray(array, index, copy = true) {\n const usedArray = (copy ? array.slice() : array);\n if (index < 0 || index >= array.length) {\n return usedArray;\n }\n usedArray.splice(index, 1);\n return usedArray;\n}\nfunction arraysEqual(arr1, arr2) {\n arr1 = R.unique(arr1);\n arr2 = R.unique(arr2);\n return arr1.length === arr2.length && arr1.every((entry) => arr2.includes(entry));\n}\nfunction includesAny(haystack, needles) {\n if (!needles)\n return false;\n for (const entry of needles) {\n if (haystack.includes(entry)) {\n return true;\n }\n }\n return false;\n}\nfunction includesAll(arr, entries) {\n for (const entry of entries) {\n if (!arr.includes(entry)) {\n return false;\n }\n }\n return true;\n}\nexport { arraysEqual, CycleArray, includesAll, includesAny, removeIndexFromArray };\n", "import { enrichHTML, R, SYSTEM } from \".\";\nfunction* latestChatMessages(nb, fromMessage) {\n if (!ui.chat)\n return;\n const messages = game.messages.contents;\n const startMessageIndex = fromMessage\n ? messages.findLastIndex((message) => message === fromMessage)\n : messages.length;\n const startIndex = startMessageIndex - 1;\n for (let i = startIndex; i >= startIndex - nb; i--) {\n const message = messages[i];\n if (message) {\n yield message;\n }\n }\n}\nasync function refreshLatestMessages(nb) {\n const chat = ui.chat?.element;\n if (!chat)\n return;\n const messages = game.messages.contents;\n const startIndex = messages.length - 1;\n for (let i = startIndex; i >= startIndex - nb; i--) {\n const message = messages[i];\n if (message) {\n ui.chat.updateMessage(message, { notify: false });\n }\n }\n}\nfunction createChatLink(docOrUuid, { label, html } = {}) {\n const isDocument = docOrUuid instanceof foundry.abstract.Document;\n if (!label && isDocument) {\n label = docOrUuid.name ?? undefined;\n }\n let link = `@UUID[${isDocument ? docOrUuid.uuid : docOrUuid}]`;\n if (label) {\n link = `${link}{${label}}`;\n }\n return html ? enrichHTML(link) : link;\n}\nfunction isActionMessage(message) {\n const { origin, context } = message.flags[SYSTEM.id];\n return R.isIncludedIn(origin?.type, [\"feat\", \"action\"]) && !message.isCheckRoll && context?.type !== \"damage-taken\";\n}\nfunction isSpellMessage(message) {\n return R.isString(message.flags[SYSTEM.id].casting?.id);\n}\nexport { createChatLink, isActionMessage, isSpellMessage, latestChatMessages, refreshLatestMessages };\n", "import { createHTMLElement, htmlQuery } from \".\";\n/**\n * old system method that no longer exist\n */\nfunction filterTraits(traits, selected, condition) {\n const selectedTraits = selected.filter((s) => !s.not).map((s) => s.value);\n const notTraits = selected.filter((t) => t.not).map((s) => s.value);\n if (notTraits.some((t) => traits.includes(t))) {\n return false;\n }\n if (selectedTraits.length) {\n return condition === \"and\"\n ? selectedTraits.every((t) => traits.includes(t))\n : selectedTraits.some((t) => traits.includes(t));\n }\n return true;\n}\nasync function openBrowserTab(tab, data, filters) {\n const browser = game.pf2e.compendiumBrowser;\n if (browser.rendered) {\n await browser.close();\n }\n if (data) {\n Hooks.once(\"renderCompendiumBrowser\", (_tab, html) => {\n const controls = htmlQuery(html, \".window-header [data-action='toggleControls']\");\n const btn = createHTMLElement(\"button\", {\n content: data.label,\n });\n btn.addEventListener(\"click\", async (event) => {\n data.callback(event);\n browser.close();\n }, { once: true });\n requestAnimationFrame(() => {\n data.onRender?.(html);\n });\n controls?.replaceWith(btn);\n });\n }\n browser.openTab(tab, {\n filter: filters ?? (await browser.tabs[tab].getFilterData()),\n hideNavigation: true,\n });\n}\nexport { filterTraits, openBrowserTab };\n", "import { getTargetToken, R, SYSTEM } from \".\";\nconst _cached = {};\nfunction getDamageRollClass() {\n return (_cached.damageRoll ??= CONFIG.Dice.rolls.find((Roll) => Roll.name === \"DamageRoll\"));\n}\nfunction getDamageInstanceClass() {\n return (_cached.damageInstance ??= CONFIG.Dice.rolls.find((Roll) => Roll.name === \"DamageInstance\"));\n}\nasync function rollDamageFromFormula(formula, { actionName, extraRollOptions = [], item, notes = [], origin, skipDialog = false, target, toolbelt, }) {\n const { actor, token } = origin ?? {};\n const traits = R.filter(item?.system.traits.value ?? [], (trait) => trait in CONFIG.PF2E.actionTraits);\n const options = R.pipe([traits, actor?.getRollOptions(), item?.getRollOptions(\"item\"), extraRollOptions], R.flat(), R.filter(R.isTruthy));\n const targetToken = getTargetToken(target);\n const context = {\n type: \"damage-roll\",\n sourceType: \"attack\",\n actor: actor?.id ?? null,\n token: token?.id ?? null,\n target: target ? { actor: target.actor.uuid, token: targetToken?.uuid } : null,\n domains: [],\n options,\n mapIncreases: undefined,\n notes,\n secret: false,\n rollMode: \"roll\",\n traits,\n skipDialog,\n outcome: null,\n unadjustedOutcome: null,\n };\n const traitDescriptions = CONFIG.PF2E.traitsDescriptions;\n const flags = {\n core: {},\n [SYSTEM.id]: {\n context,\n origin: item?.getOriginData(),\n },\n };\n if (targetToken || toolbelt) {\n const targetUUID = targetToken?.uuid;\n const toolbeltFlag = toolbelt ?? {};\n if (targetUUID && !toolbeltFlag.targets?.includes(targetUUID)) {\n toolbeltFlag.targets ??= [];\n toolbeltFlag.targets.push(targetUUID);\n }\n flags[\"pf2e-toolbelt\"] = {\n targetHelper: toolbeltFlag,\n };\n }\n actionName ??= item?.name ?? game.i18n.localize(\"PF2E.DamageRoll\");\n let flavor = `

${actionName}

`;\n flavor += `
`;\n flavor += R.pipe(traits, R.map((tag) => {\n const label = game.i18n.localize(CONFIG.PF2E.actionTraits[tag]);\n const tooltip = traitDescriptions[tag];\n return `${label}`;\n }), R.join(\"\"));\n flavor += `

`;\n if (notes.length) {\n flavor += `
    `;\n flavor += R.pipe(notes, R.map((note) => {\n let content = \"\";\n if (note.title?.trim()) {\n content += `${note.title} `;\n }\n content += note.text;\n return `
  • ${content}
  • `;\n }));\n flavor += `
`;\n }\n const DamageRoll = getDamageRollClass();\n const roll = await new DamageRoll(formula, { actor, item }).evaluate();\n const speaker = getDocumentClass(\"ChatMessage\").getSpeaker({ actor, token });\n return roll.toMessage({\n flavor,\n speaker,\n flags,\n });\n}\nexport { getDamageInstanceClass, getDamageRollClass, rollDamageFromFormula };\n", "import { createFormData, htmlQuery, localize, MODULE, R, render } from \".\";\nasync function waitDialog({ classes = [], content, data, expand, i18n, no, onRender, position = {}, title, yes, }) {\n if (data) {\n data.i18n = i18n;\n }\n classes.push(MODULE.id);\n const dialogOptions = {\n buttons: [\n {\n action: \"yes\",\n icon: yes?.icon ?? \"fa-solid fa-check\",\n label: yes?.label ?? localize(i18n, \"yes\"),\n default: !no?.default,\n callback: yes?.callback ?? (async (_event, _btn, dialog) => createFormData(dialog.element, expand)),\n },\n {\n action: \"no\",\n icon: no?.icon ?? \"fa-solid fa-xmark\",\n label: no?.label ?? localize.ifExist(i18n, \"no\") ?? \"Cancel\",\n default: !!no?.default,\n callback: no?.callback ?? (() => false),\n },\n ],\n classes,\n content: await generateDialogContent(content, data),\n position,\n render: (event, dialog) => {\n requestAnimationFrame(() => {\n htmlQuery(dialog.element, `input[type=\"text\"]`)?.focus();\n });\n if (onRender) {\n onRender(event, dialog);\n }\n },\n window: {\n title: generateDialogTitle(i18n, title, data),\n },\n };\n return foundry.applications.api.DialogV2.wait(dialogOptions);\n}\nasync function confirmDialog(i18n, { classes = [], content, data = {}, no, title, yes } = {}) {\n const dialogOptions = {\n classes,\n content: content ?? localize.ifExist(i18n, \"content\", data) ?? (await generateDialogContent(i18n, data)),\n no: {\n default: !yes?.default,\n label: no ?? localize.ifExist(i18n, \"no\") ?? \"No\",\n },\n window: {\n title: generateDialogTitle(i18n, title, data),\n },\n yes: {\n default: !!yes?.default,\n label: yes?.label ?? localize.ifExist(i18n, \"yes\") ?? \"Yes\",\n },\n };\n return foundry.applications.api.DialogV2.confirm(dialogOptions);\n}\nfunction generateDialogTitle(i18n, title, data) {\n return R.isString(title) ? title : localize(i18n, \"title\", R.isObjectType(title) ? title : (data ?? {}));\n}\nasync function generateDialogContent(content, data) {\n if (R.isObjectType(data)) {\n return render(content, data);\n }\n else {\n return content.startsWith(\"<\") ? content : `
${content}
`;\n }\n}\nexport { confirmDialog, generateDialogContent, waitDialog };\n", "import { isTokenObject, MODULE, R } from \".\";\nasync function getDocumentFromUUID(type, uuid) {\n if (!uuid)\n return null;\n const DocumentCls = getDocumentClass(type);\n const doc = await fromUuid(uuid);\n return doc instanceof DocumentCls ? doc : null;\n}\nfunction getDocumentFromUUIDSync(type, uuid) {\n if (!uuid)\n return null;\n const DocumentCls = getDocumentClass(type);\n const doc = fromUuidSync(uuid);\n return doc instanceof DocumentCls ? doc : null;\n}\nfunction getInMemory(obj, ...path) {\n return foundry.utils.getProperty(obj, `modules.${MODULE.id}.${path.join(\".\")}`);\n}\nfunction setInMemory(obj, ...args) {\n const value = args.pop();\n return foundry.utils.setProperty(obj, `modules.${MODULE.id}.${args.join(\".\")}`, value);\n}\nfunction deleteInMemory(obj, ...path) {\n return foundry.utils.deleteProperty(obj, `modules.${MODULE.id}.${path.join(\".\")}`);\n}\nfunction isScriptMacro(doc) {\n return doc instanceof Macro && doc.type === \"script\";\n}\n// It also auto converts Token into TokenDocument directly in the provided obj\nfunction isValidTargetDocuments(target) {\n if (!R.isPlainObject(target))\n return false;\n if (!(target.actor instanceof Actor))\n return false;\n target.token = isTokenObject(target.token) ? target.token.document : target.token;\n return !target.token || target.token instanceof TokenDocument;\n}\nfunction isDocumentUUID(type, uuid, embedded) {\n if (typeof uuid !== \"string\")\n return false;\n try {\n const parseResult = foundry.utils.parseUuid(uuid);\n const isEmbedded = !!parseResult?.embedded.length;\n return parseResult?.type === type && (embedded === true ? isEmbedded : embedded === false ? !isEmbedded : true);\n }\n catch {\n return false;\n }\n}\nexport { deleteInMemory, getDocumentFromUUID, getDocumentFromUUIDSync, getInMemory, isDocumentUUID, isScriptMacro, isValidTargetDocuments, setInMemory, };\n", "function createCustomEffect({ badge, duration, img, itemSlug, level, name, rules, show, unidentified, }) {\n const system = {\n unidentified,\n duration,\n tokenIcon: { show },\n };\n if (rules?.length) {\n system.rules = rules;\n }\n if (itemSlug) {\n system.slug = itemSlug;\n }\n if (badge) {\n system.badge = badge;\n }\n if (level) {\n system.level = { value: level };\n }\n if (duration?.origin) {\n const { actor, token } = duration.origin;\n system.context = {\n origin: {\n actor: actor.uuid,\n token: token?.uuid ?? actor.token?.uuid ?? null,\n item: null,\n spellcasting: null,\n },\n roll: null,\n target: null,\n };\n }\n return {\n type: \"effect\",\n name,\n img,\n system,\n };\n}\nfunction createCustomCondition(options) {\n const { alterations = [], counter = 1, img, name, slug } = options;\n const condition = game.pf2e.ConditionManager.conditions.get(slug);\n if (!condition)\n return;\n if (\n // we do not handle dying or unconcious condition+effect combo\n [\"dying\", \"unconscious\"].includes(slug) ||\n (slug === \"persistent-damage\" && !alterations.length)) {\n return;\n }\n const rule = {\n key: \"GrantItem\",\n uuid: condition.uuid,\n onDeleteActions: {\n grantee: \"restrict\",\n },\n alterations,\n };\n if (condition.system.value.isValued && counter > 1) {\n rule.inMemoryOnly = true;\n rule.alterations.push({\n mode: \"override\",\n property: \"badge-value\",\n value: counter,\n });\n }\n return createCustomEffect({\n ...options,\n name: name || `${game.i18n.localize(\"TYPES.Item.effect\")}: ${condition.name}`,\n img: img || condition.img,\n rules: [rule],\n show: false,\n });\n}\nexport { createCustomCondition, createCustomEffect };\n", "import { MODULE, R } from \".\";\nfunction flagPath(...path) {\n return `flags.${MODULE.path(...path)}`;\n}\nfunction getFlag(doc, ...path) {\n return doc.getFlag(MODULE.id, R.join(path, \".\"));\n}\nfunction setFlag(doc, ...args) {\n const value = args.pop();\n return doc.setFlag(MODULE.id, R.join(args, \".\"), value);\n}\nfunction unsetFlag(doc, ...path) {\n return doc.unsetFlag(MODULE.id, R.join(path, \".\"));\n}\nfunction updateFlag(doc, updates, operation) {\n return doc.update({ flags: { [MODULE.id]: updates } }, operation);\n}\nfunction getFlagProperty(obj, ...path) {\n return foundry.utils.getProperty(obj, flagPath(...path));\n}\nfunction setFlagProperty(obj, ...args) {\n const value = args.pop();\n foundry.utils.setProperty(obj, flagPath(...args), value);\n return obj;\n}\nfunction setFlagProperties(obj, ...args) {\n const properties = args.pop();\n foundry.utils.setProperty(obj, flagPath(...args), properties);\n return obj;\n}\nfunction unsetFlagProperty(obj, ...path) {\n foundry.utils.setProperty(obj, flagPath(...path), _del);\n return obj;\n}\nfunction deleteFlagProperty(obj, ...path) {\n foundry.utils.deleteProperty(obj, flagPath(...path));\n return obj;\n}\nfunction updateSourceFlag(doc, ...args) {\n const value = args.pop();\n return doc.updateSource({ [flagPath(...args)]: value });\n}\nexport { deleteFlagProperty, getFlag, getFlagProperty, setFlag, setFlagProperties, setFlagProperty, unsetFlag, unsetFlagProperty, updateFlag, updateSourceFlag, };\n", "import { htmlQuery, localize, MODULE, R, SYSTEM } from \".\";\nfunction render(...args) {\n const data = args.at(-1);\n const template = args.slice(0, -1).join();\n const path = MODULE.templatePath(template);\n data.i18n = localize.i18n(R.isString(data.i18n) ? data.i18n : template.replace(/\\//, \".\"));\n data.isSF2e = SYSTEM.isSF2e;\n return foundry.applications.handlebars.renderTemplate(path, data);\n}\nfunction preSyncElement(newElement, priorElement, ...scrollable) {\n const state = { focus: undefined, scrollPositions: [] };\n if (!priorElement) {\n return state;\n }\n const focus = priorElement.querySelector(\":focus\");\n if (focus?.name) {\n state.focus = `${focus.tagName}[name=\"${focus.name}\"]`;\n }\n else if (focus?.dataset.itemId) {\n state.focus = `${focus.tagName}[data-item-id=\"${focus.dataset.itemId}\"]`;\n }\n if (scrollable.length === 0) {\n scrollable.push(\"\");\n }\n for (const selector of scrollable) {\n const el0 = selector === \"\" ? priorElement : htmlQuery(priorElement, selector);\n if (el0) {\n const el1 = selector === \"\" ? newElement : htmlQuery(newElement, selector);\n if (el1) {\n state.scrollPositions.push([el1, el0.scrollTop]);\n }\n }\n }\n return state;\n}\nfunction postSyncElement(newElement, state) {\n if (state.focus) {\n const newFocus = htmlQuery(newElement, state.focus);\n newFocus?.focus();\n }\n for (const [el, scrollTop] of state.scrollPositions) {\n el.scrollTop = scrollTop;\n }\n}\nexport { postSyncElement, preSyncElement, render };\n", "function registerUpstreamHook(event, listener, once) {\n const id = Hooks[once ? \"once\" : \"on\"](event, listener);\n const hook = Hooks.events[event].findSplice((x) => x.id === id);\n if (hook) {\n Hooks.events[event].unshift(hook);\n }\n return id;\n}\nfunction createToggleHook(hook, listener, options = {}) {\n const _ids = [];\n const _hook = Array.isArray(hook) ? hook : [hook];\n return {\n get enabled() {\n return _ids.length > 0;\n },\n activate() {\n if (this.enabled)\n return;\n for (const path of _hook) {\n const id = options.upstream ? registerUpstreamHook(path, listener) : Hooks.on(path, listener);\n _ids.push({ id, path });\n }\n options.onActivate?.();\n },\n disable() {\n if (!this.enabled)\n return;\n for (const { path, id } of _ids) {\n Hooks.off(path, id);\n }\n _ids.length = 0;\n options.onDisable?.();\n },\n toggle(enabled) {\n enabled ??= !this.enabled;\n if (enabled) {\n this.activate();\n }\n else {\n this.disable();\n }\n },\n };\n}\nfunction executeWhenReady(fn) {\n if (game.ready) {\n fn();\n }\n else {\n Hooks.once(\"ready\", fn);\n }\n}\nexport { createToggleHook, executeWhenReady, registerUpstreamHook };\n", "import { MODULE, R } from \".\";\nfunction htmlQuery(parent, selectors) {\n if (!(parent instanceof Element))\n return null;\n return parent.querySelector(selectors);\n}\nfunction htmlQueryAll(parent, selectors) {\n if (!(parent instanceof Element || parent instanceof Document))\n return [];\n return Array.from(parent.querySelectorAll(selectors));\n}\nfunction htmlClosest(child, selectors) {\n if (!(child instanceof Element))\n return null;\n return child.closest(selectors);\n}\nfunction htmlQueryIn(child, parentSelector, siblingSelector) {\n const parent = htmlClosest(child, parentSelector);\n return htmlQuery(parent, siblingSelector);\n}\nfunction firstElementWithText(el, skipEmpty = true) {\n if (!(el instanceof HTMLElement))\n return null;\n const childNodes = el.childNodes;\n if (!childNodes.length)\n return null;\n for (const child of childNodes) {\n if (child.nodeType === Node.TEXT_NODE && (!skipEmpty || child.textContent?.trim())) {\n return el;\n }\n }\n for (const child of el.children) {\n const withText = firstElementWithText(child);\n if (withText) {\n return withText;\n }\n }\n return null;\n}\nfunction createHTMLElement(nodeName, { classes = [], dataset = {}, content, id, style } = {}) {\n const element = document.createElement(nodeName);\n if (element instanceof HTMLButtonElement) {\n element.type = \"button\";\n }\n if (style) {\n assignStyle(element, style);\n }\n if (id) {\n element.id = id;\n }\n if (classes.length > 0) {\n element.classList.add(...classes);\n }\n for (const [key, value] of Object.entries(dataset)) {\n if (R.isNullish(value) || value === false)\n continue;\n element.dataset[key] = value === true ? \"\" : String(value);\n }\n if (R.isString(content)) {\n element.innerHTML = content;\n }\n else if (content instanceof Element) {\n element.append(content);\n }\n else if (content) {\n element.append(...content);\n }\n return element;\n}\nfunction createHTMLElementContent(options) {\n return createHTMLElement(\"div\", options).firstChild;\n}\nfunction createButtonElement(options) {\n let content = \"\";\n if (options.icon) {\n content += ` `;\n }\n if (options.label) {\n content += options.label;\n }\n return createHTMLElement(\"button\", { ...options, content });\n}\nfunction createInputElement(type, name, value, options) {\n const input = createHTMLElement(\"input\", options);\n input.type = type;\n input.name = name;\n if (type === \"text\") {\n input.value = String(value);\n }\n else if (type === \"number\") {\n input.valueAsNumber = Number(value) || 0;\n }\n else if (type === \"checkbox\") {\n input.checked = Boolean(value);\n }\n else {\n input.value = String(value);\n input.checked = !!options?.checked;\n }\n return input;\n}\nfunction createToggleEvent(event, selector, listener, options) {\n let enabled = false;\n const getElement = () => {\n return selector ? document.querySelector(selector) : document;\n };\n return {\n activate() {\n if (enabled)\n return;\n requestAnimationFrame(() => {\n getElement()?.addEventListener(event, listener, options);\n });\n enabled = true;\n },\n disable() {\n if (!enabled)\n return;\n getElement()?.removeEventListener(event, listener, options);\n enabled = false;\n },\n toggle(enabled) {\n if (enabled)\n this.activate();\n else\n this.disable();\n },\n };\n}\nfunction addListener(parent, selectors, ...args) {\n if (!(parent instanceof Element || parent instanceof Document))\n return;\n const element = parent.querySelector(selectors);\n if (!(element instanceof HTMLElement))\n return;\n const event = typeof args[0] === \"string\" ? args[0] : \"click\";\n const listener = typeof args[0] === \"function\" ? args[0] : args[1];\n const useCapture = typeof args[1] === \"boolean\" ? args[1] : args[2];\n element.addEventListener(event, (e) => listener(element, e), useCapture);\n}\nfunction addListenerAll(parent, selectors, ...args) {\n if (!(parent instanceof Element || parent instanceof Document))\n return;\n const elements = parent.querySelectorAll(selectors);\n const event = typeof args[0] === \"string\" ? args[0] : \"click\";\n const listener = typeof args[0] === \"function\" ? args[0] : args[1];\n const useCapture = typeof args[1] === \"boolean\" ? args[1] : args[2];\n for (const element of elements) {\n if (!(element instanceof HTMLElement))\n continue;\n element.addEventListener(event, (e) => listener(element, e), useCapture);\n }\n}\nfunction addEnterKeyListeners(html, inputType = \"all\") {\n const types = inputType === \"all\" ? [\"text\", \"number\"] : [inputType];\n const selector = types.map((type) => `input[type=\"${type}\"]`).join(\", \");\n addListenerAll(html, selector, \"keypress\", (el, event) => {\n if (event.key === \"Enter\") {\n event.stopPropagation();\n event.preventDefault();\n el.blur();\n }\n });\n}\nfunction getInputValue(el) {\n if (el instanceof HTMLSelectElement) {\n return el.value;\n }\n return el.nodeName === \"RANGE-PICKER\" || [\"number\", \"range\"].includes(el.type)\n ? el.valueAsNumber\n : el.type === \"checkbox\"\n ? el.checked\n : el.value;\n}\n/**\n * repurposed version of\n * https://github.com/foundryvtt/pf2e/blob/c0cfa1f4c266d7d843966b50a9fd1a34d42b2051/src/module/actor/sheet/item-summary-renderer.ts#L25\n */\nasync function toggleSummary(summaryElem) {\n const duration = 0.4;\n if (summaryElem.hidden) {\n await gsap.fromTo(summaryElem, { height: 0, opacity: 0, hidden: false }, { height: \"auto\", opacity: 1, duration });\n }\n else {\n await gsap.to(summaryElem, {\n height: 0,\n duration,\n opacity: 0,\n paddingTop: 0,\n paddingBottom: 0,\n margin: 0,\n clearProps: \"all\",\n onComplete: () => {\n summaryElem.hidden = true;\n },\n });\n }\n}\nfunction createFormData(html, expand = false) {\n const form = html instanceof HTMLFormElement ? html : htmlQuery(html, \"form\");\n if (!form)\n return null;\n const formData = new foundry.applications.ux.FormDataExtended(form, { disabled: true, readonly: true });\n const data = R.mapValues(formData.object, (value) => {\n return typeof value === \"string\" ? value.trim() : value;\n });\n for (const element of form.elements) {\n if (!(element instanceof HTMLInputElement) || element.type !== \"file\")\n continue;\n data[element.name] = element.files?.[0];\n }\n return (expand ? foundry.utils.expandObject(data) : data);\n}\nfunction dataToDatasetString(data) {\n return R.pipe(!R.isArray(data) ? R.entries(data) : data, R.map(([key, value]) => {\n if (R.isNullish(value))\n return;\n const sluggifiedKey = key.replace(/\\B([A-Z])/g, \"-$1\").toLowerCase();\n const stringified = R.isObjectType(value) ? foundry.utils.escapeHTML(JSON.stringify(value)) : value;\n return `data-${sluggifiedKey}='${stringified}'`;\n }), R.filter(R.isTruthy), R.join(\" \"));\n}\nfunction assignStyle(el, style) {\n Object.assign(el.style, style);\n}\nfunction styleValue(value) {\n return `${value}px`;\n}\nfunction setStyleProperty(html, property, value) {\n html?.style.setProperty(property, styleValue(value));\n}\nfunction setStyleProperties(el, properties) {\n for (const [property, value] of R.entries(properties)) {\n el.style.setProperty(property, String(value));\n }\n}\nfunction registerCustomElement(tag, element) {\n try {\n if (window.customElements.get(tag))\n return;\n window.customElements.define(tag, element);\n }\n catch (error) {\n MODULE.error(`an error occurred while registering a custom element: ${tag}`, error);\n }\n}\nexport { addEnterKeyListeners, addListener, addListenerAll, assignStyle, createButtonElement, createFormData, createHTMLElement, createHTMLElementContent, createInputElement, createToggleEvent, dataToDatasetString, firstElementWithText, getInputValue, htmlClosest, htmlQuery, htmlQueryAll, htmlQueryIn, registerCustomElement, setStyleProperties, setStyleProperty, styleValue, toggleSummary, };\n", "import { createHTMLElementContent, getActionGlyph, getDamageRollClass, htmlQuery, includesAny, R, setHasElement, SYSTEM, traitSlugToObject, } from \".\";\n/**\n * https://github.com/foundryvtt/pf2e/blob/1465f7190b2b8454094c50fa6d06e9902e0a3c41/src/module/item/base/data/values.ts#L23-L31\n */\nconst ITEM_CARRY_TYPES = Object.freeze([\n \"attached\",\n \"dropped\",\n \"held\",\n \"implanted\",\n \"installed\",\n \"stowed\",\n \"worn\",\n]);\n/**\n * https://github.com/foundryvtt/pf2e/blob/95e941aecaf1fa6082825b206b0ac02345d10538/src/module/item/physical/values.ts#L1\n */\nconst PHYSICAL_ITEM_TYPES = new Set([\n \"ammo\",\n \"armor\",\n \"backpack\",\n \"book\",\n \"consumable\",\n \"equipment\",\n \"shield\",\n \"treasure\",\n \"weapon\",\n]);\nconst ATTACHABLE_TYPES = {\n ammo: [\"weapon\"],\n equipment: [\"weapon\", \"armor\", \"shield\"],\n weapon: [\"shield\"],\n};\nfunction itemIsOfType(item, ...types) {\n return (typeof item.name === \"string\" &&\n types.some((t) => (t === \"physical\" ? setHasElement(PHYSICAL_ITEM_TYPES, item.type) : item.type === t)));\n}\nfunction getItemSource(item, clearId) {\n const source = item.toObject();\n source._stats.compendiumSource ??= item.uuid;\n if (clearId) {\n // @ts-expect-error\n delete source._id;\n }\n return source;\n}\nasync function getItemFromUuid(uuid, type) {\n if (!uuid)\n return null;\n const item = await fromUuid(uuid);\n return item instanceof Item && (!type || item.isOfType(type)) ? item : null;\n}\nasync function getItemSourceFromUuid(uuid, type) {\n const item = await getItemFromUuid(uuid, type);\n return !!item ? getItemSource(item) : null;\n}\nfunction* actorItems(actor, type) {\n const types = R.isArray(type) ? type : type ? [type] : R.keys(CONFIG.PF2E.Item.documentClasses);\n // we must add parent types for subitems lookup\n const attachables = type && types.filter((t) => t in ATTACHABLE_TYPES);\n if (attachables?.length) {\n for (const attachType of attachables) {\n for (const attachToType of ATTACHABLE_TYPES[attachType]) {\n if (!types.includes(attachToType)) {\n types.push(attachToType);\n }\n }\n }\n }\n for (const itemType of types) {\n for (const item of actor.itemTypes[itemType]) {\n yield item;\n // we also yield subitems because they are unnaccessible otherwise\n if (\"subitems\" in item) {\n for (const subitem of item.subitems) {\n yield subitem;\n }\n }\n }\n }\n}\nfunction findItemWithSourceId(actor, uuid, type) {\n for (const item of actorItems(actor, type)) {\n if (isSupressedFeat(item))\n continue;\n const sourceId = getItemSourceId(item);\n if (sourceId === uuid) {\n return item;\n }\n }\n return null;\n}\nfunction findItemWithSlug(actor, slug, type) {\n for (const item of actorItems(actor, type)) {\n if (isSupressedFeat(item))\n continue;\n const itemSlug = getItemSlug(item);\n if (itemSlug === slug) {\n return item;\n }\n }\n return null;\n}\nfunction hasAnyItemWithSourceId(actor, uuids, type) {\n for (const item of actorItems(actor, type)) {\n if (isSupressedFeat(item))\n continue;\n const sourceId = getItemSourceId(item);\n if (sourceId && uuids.includes(sourceId)) {\n return true;\n }\n }\n return false;\n}\nfunction getItemSourceId(item) {\n const isCompendiumItem = item._id && item.pack && !item.isEmbedded;\n return isCompendiumItem ? item.uuid : (item._stats.compendiumSource ?? item._stats.duplicateSource ?? item.uuid);\n}\nfunction getItemSlug(item) {\n return item instanceof Item ? item.slug || SYSTEM.sluggify(item._source.name) : SYSTEM.sluggify(item.name);\n}\nfunction getActorWeapons(actor) {\n return [\n ...actor.itemTypes.weapon,\n ...actor.itemTypes.shield.flatMap((shield) => shield.subitems.filter((item) => item.isOfType(\"weapon\"))),\n ];\n}\nfunction itemWithActor(actor, item) {\n return (item.parent ? item : new (getDocumentClass(\"Item\"))(item.toObject(), { parent: actor }));\n}\nasync function usePhysicalItem(event, item) {\n const isConsumable = item.isOfType(\"consumable\");\n if (isConsumable && isCastConsumable(item)) {\n return item.consume();\n }\n const macro = game.toolbelt?.getToolSetting(\"actionable\", \"item\")\n ? await game.toolbelt.api.actionable.getItemMacro(item)\n : undefined;\n const use = isConsumable ? () => consumeItem(event, item) : () => game.pf2e.rollItemMacro(item.uuid, event);\n if (macro) {\n // we let the macro handle item consumption\n return macro.execute({\n actor: item.actor,\n item,\n use,\n cancel: () => {\n const msg = game.toolbelt.localize(\"actionable.item.cancel\", item);\n return ui.notifications.warn(msg, { localize: false });\n },\n });\n }\n return use();\n}\n/**\n * upgraded version of\n * https://github.com/foundryvtt/pf2e/blob/eecf53f37490cbd228d8c74b290748b0188768b4/src/module/item/consumable/document.ts#L156\n * though stripped of scrolls & wands\n */\nasync function consumeItem(event, item) {\n const actor = item.actor;\n const speaker = ChatMessage.getSpeaker({ actor });\n const flags = {\n [SYSTEM.id]: {\n origin: {\n sourceId: item.sourceId,\n uuid: item.uuid,\n type: item.type,\n },\n },\n };\n const contentHTML = createHTMLElementContent({\n content: (await item.toMessage(event, { create: false }))?.content,\n });\n htmlQuery(contentHTML, \"footer\")?.remove();\n htmlQuery(contentHTML, \"button[data-action='consume']\")?.remove();\n const uses = item.uses;\n const content = contentHTML.outerHTML;\n if (item.system.damage) {\n const DamageRoll = getDamageRollClass();\n const { formula, type, kind } = item.system.damage;\n const roll = new DamageRoll(`(${formula})[${type},${kind}]`);\n roll.toMessage({ speaker, flavor: content, flags });\n }\n else {\n const key = uses.max > 1 && uses.value > 1 ? \"UseMulti\" : \"UseSingle\";\n const use = game.i18n.format(`PF2E.ConsumableMessage.${key}`, {\n name: item.name,\n current: uses.value - 1,\n });\n const flavor = `

${use}

`;\n ChatMessage.create({ speaker, content: `${flavor}${content}`, flags });\n }\n if (item.system.uses.autoDestroy && uses.value <= 1) {\n const newQuantity = Math.max(item.quantity - 1, 0);\n if (newQuantity <= 0) {\n await item.delete();\n }\n else {\n await item.update({\n \"system.quantity\": newQuantity,\n \"system.uses.value\": uses.max,\n });\n }\n }\n else {\n await item.update({\n \"system.uses.value\": Math.max(uses.value - 1, 0),\n });\n }\n}\nfunction getEquipAnnotation(item) {\n if (!item || item.isEquipped)\n return;\n const { type, hands = 0 } = item.system.usage;\n const annotation = item.carryType === \"dropped\" ? \"pick-up\" : item.isStowed ? \"retrieve\" : \"draw\";\n const fullAnnotation = `${annotation}${hands}H`;\n const purposeKey = SYSTEM.sluggify(fullAnnotation, { camel: \"bactrian\" });\n return {\n annotation,\n cost: annotation === \"retrieve\" ? 2 : 1,\n fullAnnotation,\n handsHeld: hands,\n label: `PF2E.Actions.Interact.${purposeKey}.Title`,\n carryType: type === \"worn\" ? \"worn\" : \"held\",\n };\n}\nfunction itemIsEquipped(item) {\n const equipableItem = item.parentItem ?? item;\n const isInvested = equipableItem.isInvested;\n return isInvested === true || (isInvested === null && equipableItem.isEquipped);\n}\n/**\n * repurposed version of\n * https://github.com/foundryvtt/pf2e/blob/6ff777170c93618f234929c6d483a98a37cbe363/src/module/actor/character/helpers.ts#L210\n */\nasync function equipItemToUse(actor, item, { carryType, handsHeld, fullAnnotation, cost, }) {\n await actor.changeCarryType(item, { carryType, handsHeld });\n if (!game.combat)\n return;\n const templates = {\n flavor: SYSTEM.relativePath(\"templates/chat/action/flavor.hbs\"),\n content: SYSTEM.relativePath(\"templates/chat/action/content.hbs\"),\n };\n const fullAnnotationKey = SYSTEM.sluggify(fullAnnotation, { camel: \"bactrian\" });\n const flavorAction = {\n title: `PF2E.Actions.Interact.Title`,\n subtitle: fullAnnotationKey ? `PF2E.Actions.Interact.${fullAnnotationKey}.Title` : null,\n glyph: getActionGlyph(cost),\n };\n const [traits, message] = [\n [traitSlugToObject(\"manipulate\", CONFIG.PF2E.actionTraits)],\n `PF2E.Actions.Interact.${fullAnnotationKey}.Description`,\n ];\n const flavor = await foundry.applications.handlebars.renderTemplate(templates.flavor, {\n action: flavorAction,\n traits,\n });\n const content = await foundry.applications.handlebars.renderTemplate(templates.content, {\n imgPath: item.img,\n message: game.i18n.format(message, {\n actor: actor.name,\n weapon: item.name,\n }),\n });\n const token = actor.getActiveTokens(false, true).shift();\n await getDocumentClass(\"ChatMessage\").create({\n content,\n speaker: ChatMessage.getSpeaker({ actor, token }),\n flavor,\n style: CONST.CHAT_MESSAGE_STYLES.EMOTE,\n });\n}\nfunction simulateDropItem(item, target, fromInventory) {\n const event = new DragEvent(\"dragstart\", {\n dataTransfer: new DataTransfer(),\n });\n const data = {\n fromInventory,\n itemType: item.type,\n type: \"Item\",\n uuid: item.uuid,\n };\n event.dataTransfer?.setData(\"text/plain\", JSON.stringify(data));\n target.sheet._onDrop(event);\n}\nfunction isSupressedFeat(item) {\n return item.isOfType(\"feat\") && item.suppressed;\n}\nfunction isCastConsumable(item) {\n return R.isIncludedIn(item.category, [\"scroll\", \"spell-gem\", \"wand\"]) && !!item.system.spell;\n}\nfunction isSF2eItem(item) {\n return includesAny(item._source.system.traits.value, [\"tech\", \"analog\"]);\n}\nfunction isAreaOrAutoFireType(type) {\n return R.isIncludedIn(type, [\"area-fire\", \"auto-fire\"]);\n}\nexport { actorItems, consumeItem, equipItemToUse, findItemWithSlug, findItemWithSourceId, getActorWeapons, getEquipAnnotation, getItemFromUuid, getItemSlug, getItemSource, getItemSourceFromUuid, getItemSourceId, hasAnyItemWithSourceId, isAreaOrAutoFireType, isCastConsumable, isSF2eItem, isSupressedFeat, ITEM_CARRY_TYPES, itemIsEquipped, itemIsOfType, itemWithActor, PHYSICAL_ITEM_TYPES, simulateDropItem, usePhysicalItem, };\n", "import { createHTMLElement, htmlQuery, localize, MODULE, R, } from \".\";\nfunction isHoldingModifierKey(key) {\n const keys = R.isArray(key) ? key : [key];\n return keys.some((key) => game.keyboard.isModifierActive(key));\n}\nfunction registerKeybind(name, data) {\n game.keybindings.register(MODULE.id, name, {\n ...data,\n name: data.name ?? MODULE.path(\"keybindings\", name, \"name\"),\n hint: data.hint ?? MODULE.path(\"keybindings\", name, \"hint\"),\n });\n}\nfunction registerModuleKeybinds(keybinds) {\n for (const [group, entries] of R.entries(keybinds)) {\n for (const keybind of entries) {\n game.keybindings.register(MODULE.id, `${group}-${keybind.name}`, {\n ...keybind,\n name: MODULE.path(\"keybindings\", group, keybind.name, \"name\"),\n hint: MODULE.path(\"keybindings\", group, keybind.name, \"hint\"),\n });\n }\n }\n Hooks.on(\"renderControlsConfig\", (_, html, options) => {\n onRenderControlsConfig(html, options, keybinds);\n });\n}\nfunction onRenderControlsConfig(html, options, keybinds) {\n const id = MODULE.id;\n const tab = htmlQuery(html, `[data-application-part=\"main\"] [data-group=\"categories\"][data-tab=\"${id}\"][data-category=\"${id}\"]`);\n if (!tab)\n return;\n const keybindKeys = R.keys(keybinds);\n for (let i = 0; i < keybindKeys.length; i++) {\n const key = keybindKeys[i];\n if (!key)\n continue;\n const group = htmlQuery(tab, `.form-group[data-action-id^=\"${MODULE.id}.${key}\"]`);\n const title = createHTMLElement(\"h4\", {\n content: localize.ifExist(\"keybindings\", key, \"title\") ?? localize(\"settings\", key, \"title\"),\n });\n title.style.marginBlock = i === 0 ? \"0\" : \"0.5em 0em\";\n group?.before(title);\n }\n}\nfunction createToggleKeybind(options) {\n const _actions = {\n onDown: (context) => { },\n onUp: (context) => { },\n };\n return {\n configs: {\n ...options,\n onDown: (context) => {\n _actions.onDown(context);\n },\n onUp: (context) => {\n _actions.onUp(context);\n },\n },\n activate() {\n _actions.onDown = (context) => {\n options.onDown?.(context);\n };\n _actions.onUp = (context) => {\n options.onUp?.(context);\n };\n },\n disable() {\n _actions.onDown = (context) => { };\n _actions.onUp = (context) => { };\n },\n toggle(enabled) {\n if (enabled) {\n this.activate();\n }\n else {\n this.disable();\n }\n },\n };\n}\nexport { createToggleKeybind, isHoldingModifierKey, registerKeybind, registerModuleKeybinds };\n", "import { MODULE, R } from \".\";\nfunction registerWrapper(type, path, callback, context) {\n const ids = [];\n const paths = R.isArray(path) ? path : [path];\n const wrapped = context\n ? function (...args) {\n args.unshift(this);\n return callback.apply(context, args);\n }\n : callback;\n for (const key of paths) {\n const id = libWrapper.register(MODULE.id, key, wrapped, type);\n ids.push(id);\n }\n return ids;\n}\nfunction unregisterWrapper(id) {\n const ids = R.isArray(id) ? id : [id];\n for (const id of ids) {\n libWrapper.unregister(MODULE.id, id);\n }\n}\nfunction createSharedWrapper(type, path, sharedCallback) {\n let sharedId = null;\n const _registered = new Collection();\n function wrapper(wrapped, ...wrapperArgs) {\n const registered = R.pipe(_registered.contents, R.sortBy(R.prop(\"priority\")), R.filter(({ active }) => active), R.map(({ listener, context }) => {\n if (context) {\n return ((...args) => listener.call(context, this, ...args));\n }\n else {\n return ((...args) => listener.call(this, ...args));\n }\n }));\n return sharedCallback.call(this, registered, () => wrapped(...wrapperArgs), wrapperArgs);\n }\n const wrapperIsEnabled = () => {\n return _registered.some((x) => x.active);\n };\n const activateWrapper = (id) => {\n const registered = _registered.get(id);\n if (!registered)\n return;\n if (!sharedId) {\n sharedId = registerWrapper(type, path, wrapper);\n }\n registered.active = true;\n };\n const disableWrapper = (id) => {\n const registered = _registered.get(id);\n if (!registered)\n return;\n registered.active = false;\n if (sharedId && !wrapperIsEnabled()) {\n unregisterWrapper(sharedId);\n sharedId = null;\n }\n };\n function register(listener, { context, priority = 0 } = {}) {\n const registerId = foundry.utils.randomID();\n _registered.set(registerId, {\n listener,\n context,\n priority,\n active: false,\n });\n return {\n get enabled() {\n return !!_registered.get(registerId)?.active;\n },\n activate() {\n activateWrapper(registerId);\n },\n disable() {\n disableWrapper(registerId);\n },\n toggle(enabled) {\n enabled ??= !this.enabled;\n if (enabled) {\n this.activate();\n }\n else {\n this.disable();\n }\n },\n };\n }\n return {\n register,\n };\n}\nfunction createToggleWrapper(type, path, callback, options = {}) {\n let wrapperIds = null;\n return {\n get enabled() {\n return !!wrapperIds;\n },\n activate() {\n if (this.enabled)\n return;\n wrapperIds = registerWrapper(type, path, callback, options.context);\n options.onActivate?.();\n },\n disable() {\n if (!wrapperIds)\n return;\n unregisterWrapper(wrapperIds);\n wrapperIds = null;\n options.onDisable?.();\n },\n toggle(enabled) {\n enabled ??= !this.enabled;\n if (enabled) {\n this.activate();\n }\n else {\n this.disable();\n }\n },\n };\n}\nfunction createCreatureSheetWrapper(type, partialPath, callback, options = {}) {\n const partials = R.isArray(partialPath) ? partialPath : [partialPath];\n const paths = partials.flatMap((partial) => [\n `CONFIG.Actor.sheetClasses.character['pf2e.CharacterSheetPF2e'].cls.prototype.${partial}`,\n `CONFIG.Actor.sheetClasses.npc['pf2e.NPCSheetPF2e'].cls.prototype.${partial}`,\n `CONFIG.Actor.sheetClasses.familiar['pf2e.FamiliarSheetPF2e'].cls.prototype.${partial}`,\n ]);\n return createToggleWrapper(type, paths, callback, options);\n}\nexport { createCreatureSheetWrapper, createSharedWrapper, createToggleWrapper, registerWrapper, unregisterWrapper };\n", "import { MODULE, R } from \".\";\nclass Localize extends Function {\n constructor(...subkeys) {\n super();\n this.subkeys = subkeys;\n const self = this;\n function localize(...args) {\n const { data, path } = self.getLocalizeData(...args);\n return self.localizeOrFormat(path, data);\n }\n Object.assign(localize, this);\n Object.setPrototypeOf(localize, Object.getPrototypeOf(this));\n return localize;\n }\n path(...path) {\n return MODULE.path(...this.subkeys, ...path);\n }\n getLocalizeData(...args) {\n const data = R.isObjectType(args.at(-1)) ? args.pop() : undefined;\n const path = this.path(...args);\n return { path, data };\n }\n localizeOrFormat(path, data) {\n return typeof data === \"object\" ? game.i18n.format(path, data) : game.i18n.localize(path);\n }\n ifExist(...args) {\n const { data, path } = this.getLocalizeData(...args);\n if (game.i18n.has(path, true)) {\n return this.localizeOrFormat(path, data);\n }\n }\n notify(type, ...args) {\n const permanent = R.isBoolean(args.at(-1)) ? args.pop() : false;\n const str = this(...args);\n return ui.notifications.notify(str, type, { permanent });\n }\n success(...args) {\n return this.notify(\"success\", ...args);\n }\n info(...args) {\n return this.notify(\"info\", ...args);\n }\n warning(...args) {\n return this.notify(\"warning\", ...args);\n }\n error(...args) {\n return this.notify(\"error\", ...args);\n }\n sub(...subkeys) {\n return new Localize(...this.subkeys, ...subkeys);\n }\n shared(key) {\n return game.i18n.localize(`LEVIKTIMES.${key}`);\n }\n i18n(...subkeys) {\n const self = this;\n const getTemplateData = (...args) => {\n const data = R.isObjectType(args.at(-1)) ? args.pop() : undefined;\n const path = this.path(...subkeys, ...args);\n return { path, data: data?.hash };\n };\n function i18n(...args) {\n const { path, data } = getTemplateData(...args);\n return self.localizeOrFormat(path, data);\n }\n Object.defineProperties(i18n, {\n tooltip: {\n value: (...args) => {\n const tooltip = i18n(...args);\n return `data-tooltip=\"${tooltip}\"`;\n },\n enumerable: false,\n configurable: false,\n },\n root: {\n value: (...args) => {\n const data = R.isObjectType(args.at(-1)) ? args.pop() : undefined;\n const path = MODULE.path(...args);\n return self.localizeOrFormat(path, data?.hash);\n },\n enumerable: false,\n configurable: false,\n },\n });\n return i18n;\n }\n}\nfunction foundryLocalizeIfExist(key) {\n if (game.i18n.has(key, true)) {\n return game.i18n.localize(key);\n }\n}\nconst localize = new Localize();\nexport { localize, foundryLocalizeIfExist };\n", "function roundToStep(value, step) {\n step = value < 0 ? step * -1 : step;\n const half = step / 2;\n return value + half - ((value + half) % step);\n}\nfunction valueBetween(value, min, max) {\n return value >= min && value <= max;\n}\nexport { roundToStep, valueBetween };\n", "import { R } from \".\";\nclass MapOfArrays extends Map {\n constructor(entries) {\n if (entries && !(Symbol.iterator in entries)) {\n super(Object.entries(entries));\n }\n else {\n super(entries);\n }\n }\n add(key, entry, create = true) {\n const entries = R.isArray(entry) ? entry : [entry];\n const arr = this.get(key, create);\n arr?.push(...entries);\n }\n get(key, create = false) {\n const exist = super.get(key);\n if (exist || !create) {\n return exist;\n }\n else {\n const arr = [];\n this.set(key, arr);\n return arr;\n }\n }\n remove(key, entry) {\n const arr = this.get(key);\n return arr?.findSplice((x) => x === entry) ?? null;\n }\n removeBy(key, fn) {\n const arr = this.get(key);\n return arr?.findSplice(fn) ?? null;\n }\n map(fn) {\n let index = 0;\n const transformed = [];\n for (const [key, value] of this.entries()) {\n transformed.push(fn(value, key, index, this));\n index++;\n }\n return transformed;\n }\n toObject() {\n return Object.fromEntries(this);\n }\n toJSON() {\n return this.toObject();\n }\n}\nfunction isInstanceOf(obj, cls) {\n if (typeof obj !== \"object\" || obj === null)\n return false;\n let cursor = Reflect.getPrototypeOf(obj);\n while (cursor) {\n if (cursor.constructor.name === cls)\n return true;\n cursor = Reflect.getPrototypeOf(cursor);\n }\n return false;\n}\nfunction addToObjectIfNonNullish(obj, extra) {\n for (const [key, value] of R.entries(extra)) {\n if (value != null) {\n obj[key] = value;\n }\n }\n return obj;\n}\nfunction purgeObject(obj) {\n if (R.isArray(obj)) {\n const newObj = R.pipe(obj, R.map(purgeObject), R.filter(R.isNonNullish));\n return newObj.length ? newObj : undefined;\n }\n else if (R.isObjectType(obj)) {\n const newObj = R.pipe(obj, R.mapValues(purgeObject), R.pickBy(R.isNonNullish));\n return foundry.utils.isEmpty(newObj) ? undefined : newObj;\n }\n else {\n return obj === \"\" ? undefined : obj;\n }\n}\nexport { addToObjectIfNonNullish, isInstanceOf, MapOfArrays, purgeObject };\n", "import { splitListString } from \".\";\nimport { R } from \"..\";\nconst _cached = {};\nconst SAVE_TYPES = [\"fortitude\", \"reflex\", \"will\"];\nfunction getCheckRollClass() {\n return (_cached.checkRoll ??= CONFIG.Dice.rolls.find((Roll) => Roll.name === \"CheckRoll\"));\n}\nfunction getStatisticClass(actor) {\n return actor.skills.acrobatics.constructor;\n}\n/**\n * modified version of\n * https://github.com/foundryvtt/pf2e/blob/d179b37b0389a1d6b238f3dd2ad125a04b958184/src/scripts/ui/inline-roll-links.ts#L176\n * automatically add \"damaging-effect\" option if check is a basic save\n * traits & options can also be arrays of strings\n */\nfunction getExtraRollOptions({ traits, options } = {}, isBasic) {\n const maybeTraits = R.isString(traits) ? splitListString(traits) : (traits ?? []);\n const additionalTraits = maybeTraits.filter((t) => t in CONFIG.PF2E.actionTraits);\n const allOptions = R.isString(options) ? splitListString(options) : (options?.slice() ?? []);\n if (isBasic && !allOptions.includes(\"damaging-effect\")) {\n allOptions.push(\"damaging-effect\");\n }\n return R.unique([maybeTraits, additionalTraits.map((t) => `item:trait:${t}`), allOptions].flat());\n}\nexport { getCheckRollClass, getExtraRollOptions, getStatisticClass, SAVE_TYPES };\n", "import { R } from \"..\";\nconst DEGREE_OF_SUCCESS_STRINGS = [\"criticalFailure\", \"failure\", \"success\", \"criticalSuccess\"];\nconst DEGREE_VALUES = {\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3,\n criticalFailure: 0,\n failure: 1,\n success: 2,\n criticalSuccess: 3,\n};\nconst DEGREE_ADJUSTMENT_AMOUNTS = {\n LOWER_BY_TWO: -2,\n LOWER: -1,\n INCREASE: 1,\n INCREASE_BY_TWO: 2,\n TO_CRITICAL_FAILURE: \"criticalFailure\",\n TO_FAILURE: \"failure\",\n TO_SUCCESS: \"success\",\n TO_CRITICAL_SUCCESS: \"criticalSuccess\",\n};\n/**\n * https://github.com/foundryvtt/pf2e/blob/5967df95d2645162d06d6ee317e99cf9aa03477e/src/module/system/degree-of-success.ts#L8\n */\nclass DegreeOfSuccess {\n /** The calculated degree of success */\n value;\n /** The degree of success prior to adjustment. If there was no adjustment, it is identical to the `value` */\n unadjusted;\n /** A degree adjustment, usually from some character ability */\n adjustment;\n /** The result of a d20 roll */\n dieResult;\n /** The total of a roll, including the die result and total modifier */\n rollTotal;\n /** The check DC being rolled against */\n dc;\n constructor(roll, dc, dosAdjustments = null) {\n if (roll instanceof Roll) {\n this.dieResult =\n (roll.isDeterministic\n ? roll.terms.find((t) => t instanceof foundry.dice.terms.NumericTerm)\n : roll.dice.find((d) => d instanceof foundry.dice.terms.Die && d.faces === 20))?.total ?? 1;\n this.rollTotal = roll.total;\n }\n else {\n this.dieResult = roll.dieValue;\n this.rollTotal = roll.dieValue + roll.modifier;\n }\n this.dc = typeof dc === \"number\" ? { value: dc } : dc;\n this.unadjusted = this.#calculateDegreeOfSuccess();\n this.adjustment = this.#getDegreeAdjustment(this.unadjusted, dosAdjustments);\n this.value = this.adjustment\n ? this.#adjustDegreeOfSuccess(this.adjustment.amount, this.unadjusted)\n : this.unadjusted;\n }\n static CRITICAL_FAILURE = 0;\n static FAILURE = 1;\n static SUCCESS = 2;\n static CRITICAL_SUCCESS = 3;\n #getDegreeAdjustment(degree, adjustments) {\n if (!adjustments)\n return null;\n for (const outcome of [\"all\", ...DEGREE_OF_SUCCESS_STRINGS]) {\n const { label, amount } = adjustments[outcome] ?? {};\n if (amount &&\n label &&\n !(degree === DegreeOfSuccess.CRITICAL_SUCCESS && amount === DEGREE_ADJUSTMENT_AMOUNTS.INCREASE) &&\n !(degree === DegreeOfSuccess.CRITICAL_FAILURE && amount === DEGREE_ADJUSTMENT_AMOUNTS.LOWER) &&\n (outcome === \"all\" || DEGREE_OF_SUCCESS_STRINGS.indexOf(outcome) === degree)) {\n return { label, amount };\n }\n }\n return null;\n }\n #adjustDegreeOfSuccess(amount, degreeOfSuccess) {\n switch (amount) {\n case \"criticalFailure\":\n return 0;\n case \"failure\":\n return 1;\n case \"success\":\n return 2;\n case \"criticalSuccess\":\n return 3;\n default:\n return Math.clamp(degreeOfSuccess + amount, 0, 3);\n }\n }\n /**\n * @param degree The current success value\n * @return The new success value\n */\n #adjustDegreeByDieValue(degree) {\n if (this.dieResult === 20) {\n return this.#adjustDegreeOfSuccess(DEGREE_ADJUSTMENT_AMOUNTS.INCREASE, degree);\n }\n else if (this.dieResult === 1) {\n return this.#adjustDegreeOfSuccess(DEGREE_ADJUSTMENT_AMOUNTS.LOWER, degree);\n }\n return degree;\n }\n #calculateDegreeOfSuccess() {\n const dc = this.dc.value;\n if (this.rollTotal - dc >= 10) {\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.CRITICAL_SUCCESS);\n }\n else if (dc - this.rollTotal >= 10) {\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.CRITICAL_FAILURE);\n }\n else if (this.rollTotal >= dc) {\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.SUCCESS);\n }\n return this.#adjustDegreeByDieValue(DegreeOfSuccess.FAILURE);\n }\n}\nfunction degreeOfSuccessString(value) {\n return DEGREE_OF_SUCCESS_STRINGS.at(value);\n}\nfunction degreeOfSuccessNumber(value) {\n return DEGREE_VALUES[value];\n}\nfunction isDegreeOfSuccessValue(value) {\n return (R.isString(value) || R.isNumber(value)) && value in DEGREE_VALUES;\n}\nexport { DEGREE_ADJUSTMENT_AMOUNTS, DEGREE_OF_SUCCESS_STRINGS, DEGREE_VALUES, DegreeOfSuccess, degreeOfSuccessNumber, degreeOfSuccessString, isDegreeOfSuccessValue, };\n", "const dcAdjustments = new Map([\n [\"incredibly-easy\", -10],\n [\"very-easy\", -5],\n [\"easy\", -2],\n [\"normal\", 0],\n [\"hard\", 2],\n [\"very-hard\", 5],\n [\"incredibly-hard\", 10],\n]);\nconst dcByLevel = new Map([\n [-1, 13],\n [0, 14],\n [1, 15],\n [2, 16],\n [3, 18],\n [4, 19],\n [5, 20],\n [6, 22],\n [7, 23],\n [8, 24],\n [9, 26],\n [10, 27],\n [11, 28],\n [12, 30],\n [13, 31],\n [14, 32],\n [15, 34],\n [16, 35],\n [17, 36],\n [18, 38],\n [19, 39],\n [20, 40],\n [21, 42],\n [22, 44],\n [23, 46],\n [24, 48],\n [25, 50],\n]);\nconst simpleDCs = new Map([\n [\"untrained\", 10],\n [\"trained\", 15],\n [\"expert\", 20],\n [\"master\", 30],\n [\"legendary\", 40],\n]);\nconst simpleDCsWithoutLevel = new Map([\n [\"untrained\", 10],\n [\"trained\", 15],\n [\"expert\", 20],\n [\"master\", 25],\n [\"legendary\", 30],\n]);\nfunction rarityToDCAdjustment(rarity = \"common\") {\n switch (rarity) {\n case \"uncommon\":\n return \"hard\";\n case \"rare\":\n return \"very-hard\";\n case \"unique\":\n return \"incredibly-hard\";\n default:\n return \"normal\";\n }\n}\nfunction adjustDC(dc, adjustment = \"normal\") {\n return dc + (dcAdjustments.get(adjustment) ?? 0);\n}\nfunction adjustDCByRarity(dc, rarity = \"common\") {\n return adjustDC(dc, rarityToDCAdjustment(rarity));\n}\nfunction calculateDC(level, { pwol, rarity = \"common\" } = {}) {\n pwol ??= game.pf2e.settings.variants.pwol.enabled;\n // assume level 0 if garbage comes in. We cast level to number because the backing data may actually have it\n // stored as a string, which we can't catch at compile time\n const dc = dcByLevel.get(level) ?? 14;\n if (pwol) {\n // -1 shouldn't be subtracted since it's just\n // a creature level and not related to PC levels\n return adjustDCByRarity(dc - Math.max(level, 0), rarity);\n }\n else {\n return adjustDCByRarity(dc, rarity);\n }\n}\nfunction calculateSimpleDC(rank, { pwol = false } = {}) {\n if (pwol) {\n return simpleDCsWithoutLevel.get(rank) ?? 10;\n }\n else {\n return simpleDCs.get(rank) ?? 10;\n }\n}\nfunction calculateSpellDC(spellLevel, { pwol = false } = {}) {\n return calculateDC(spellLevel * 2 - 1, { pwol });\n}\nfunction calculateCreatureDC(actor, pwol) {\n return calculateDC(actor.level, { pwol, rarity: actor.rarity });\n}\nexport { adjustDCByRarity, calculateCreatureDC, calculateDC, calculateSimpleDC, calculateSpellDC };\n", "import { htmlClosest, isInstanceOf, } from \"..\";\n/**\n * https://github.com/foundryvtt/pf2e/blob/89892b6fafec1456a0358de8c6d7b102e3fe2da2/src/module/actor/item-transfer.ts#L117\n */\nfunction getPreferredName(document) {\n if (\"items\" in document) {\n // Use a special moniker for party actors\n if (document.isOfType(\"party\"))\n return game.i18n.localize(\"PF2E.loot.PartyStash\");\n // Synthetic actor: use its token name or, failing that, actor name\n if (document.token)\n return document.token.name;\n // Linked actor: use its token prototype name\n return document.prototypeToken?.name ?? document.name;\n }\n // User with an assigned character\n if (document.character) {\n const token = canvas.tokens.placeables.find((t) => t.actor?.id === document.id);\n return token?.name ?? document.character?.name;\n }\n // User with no assigned character (should never happen)\n return document.name;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/f7d7441acbf856b490a4e0c0d799809cd6e3dc5d/src/scripts/helpers.ts#L16\n */\nfunction resolveActorAndItemFromHTML(html) {\n const messageId = htmlClosest(html, \"[data-message-id]\")?.dataset.messageId;\n const message = messageId ? (game.messages.get(messageId) ?? null) : null;\n const sheetDocument = resolveSheetDocument(html);\n const sheetActor = isInstanceOf(sheetDocument, \"ActorPF2e\") ? sheetDocument : null;\n const sheetItem = isInstanceOf(sheetDocument, \"ItemPF2e\") ? sheetDocument : null;\n const item = (() => {\n if (isItemUUID(html.dataset.itemUuid)) {\n const document = fromUuidSync(html.dataset.itemUuid, { strict: false });\n if (isInstanceOf(document, \"ItemPF2e\"))\n return document;\n }\n if (sheetItem) {\n return sheetItem;\n }\n if (sheetActor) {\n const itemId = htmlClosest(html, \"[data-item-id]\")?.dataset.itemId;\n const document = itemId ? sheetActor.items.get(itemId) : null;\n if (document)\n return document;\n }\n return message?.item ?? null;\n })();\n return {\n sheetActor,\n actor: item?.actor ?? message?.actor ?? null,\n item,\n message,\n appDocument: message ?? sheetDocument,\n };\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/f7d7441acbf856b490a4e0c0d799809cd6e3dc5d/src/scripts/helpers.ts#L8\n */\nfunction resolveSheetDocument(html) {\n const sheet = ui.windows[Number(html.closest(\".app.sheet\")?.dataset.appid)] ?? null;\n const doc = sheet?.document;\n return doc instanceof Actor || doc instanceof Item || doc instanceof JournalEntry ? doc : null;\n}\nfunction isItemUUID(uuid, options = {}) {\n if (typeof uuid !== \"string\")\n return false;\n try {\n const parseResult = foundry.utils.parseUuid(uuid);\n const isEmbedded = !!parseResult && parseResult.embedded.length > 0;\n return (parseResult?.type === \"Item\" &&\n (options.embedded === true ? isEmbedded : options.embedded === false ? !isEmbedded : true));\n }\n catch {\n return false;\n }\n}\nexport { getPreferredName, resolveActorAndItemFromHTML };\n", "import { adjustDCByRarity, calculateDC, MAGIC_TRADITIONS, setHasElement } from \".\";\nimport { R, SYSTEM } from \"..\";\n/**\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/item/identification.ts#L30\n */\nfunction getDcRarity(item) {\n return item.traits.has(\"cursed\") ? \"unique\" : item.rarity;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/item/identification.ts#L63\n * with option fallback\n */\nfunction getItemIdentificationDCs(item, { pwol = false, notMatchingTraditionModifier } = {\n pwol: game.pf2e.settings.variants.pwol.enabled,\n notMatchingTraditionModifier: game.settings.get(SYSTEM.id, \"identifyMagicNotMatchingTraditionModifier\"),\n}) {\n const baseDC = calculateDC(item.level, { pwol });\n const rarity = getDcRarity(item);\n const dc = adjustDCByRarity(baseDC, rarity);\n if (item.isMagical) {\n return getIdentifyMagicDCs(item, dc, notMatchingTraditionModifier);\n }\n else {\n return { crafting: dc };\n }\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/item/identification.ts#L22\n */\nfunction getMagicTraditions(item) {\n const traits = item.system.traits.value;\n return new Set(traits.filter((t) => setHasElement(MAGIC_TRADITIONS, t)));\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/item/identification.ts#L37\n */\nfunction getIdentifyMagicDCs(item, baseDC, notMatchingTraditionModifier) {\n const result = {\n occult: baseDC,\n primal: baseDC,\n divine: baseDC,\n arcane: baseDC,\n };\n const traditions = getMagicTraditions(item);\n for (const key of MAGIC_TRADITIONS) {\n // once an item has a magic tradition, all skills\n // that don't match the tradition are hard\n if (traditions.size > 0 && !traditions.has(key)) {\n result[key] = baseDC + notMatchingTraditionModifier;\n }\n }\n return { arcana: result.arcane, nature: result.primal, religion: result.divine, occultism: result.occult };\n}\n/**\n * modified version of\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/actor/sheet/popups/identify-popup.ts#L7\n */\nclass IdentifyItemPopup extends foundry.appv1.api.FormApplication {\n static get defaultOptions() {\n return {\n ...super.defaultOptions,\n id: \"identify-item\",\n title: game.i18n.localize(\"PF2E.identification.Identify\"),\n template: `systems/${SYSTEM.id}/templates/actors/identify-item.hbs`,\n width: \"auto\",\n classes: [\"identify-popup\"],\n };\n }\n dcs = getItemIdentificationDCs(this.object);\n async getData() {\n const item = this.object;\n return {\n ...(await super.getData()),\n isMagic: item.isMagical,\n isAlchemical: item.isAlchemical,\n dcs: this.dcs,\n };\n }\n // we extracted that part from activateListeners so it can be called from third party\n async postSkillChecks() {\n const item = this.object;\n const identifiedName = item.system.identification.identified.name;\n const dcs = this.dcs;\n const action = item.isMagical ? \"identify-magic\" : item.isAlchemical ? \"identify-alchemy\" : \"recall-knowledge\";\n const path = `systems/${SYSTEM.id}/templates/actors/identify-item-chat-skill-checks.hbs`;\n const content = await foundry.applications.handlebars.renderTemplate(path, {\n identifiedName,\n action,\n skills: R.omit(dcs, [\"dc\"]),\n unidentified: item.system.identification.unidentified,\n uuid: item.uuid,\n });\n await getDocumentClass(\"ChatMessage\").create({ author: game.user.id, content });\n }\n activateListeners($html) {\n const html = $html[0];\n const updateButton = html.querySelector(\"button.update-identification\");\n updateButton?.addEventListener(\"click\", () => {\n this.submit({ updateData: { status: updateButton.value } });\n });\n // Add listener on Post skill checks to chat button that posts item unidentified img and name and skill checks\n html.querySelector(\"button.post-skill-checks\")?.addEventListener(\"click\", async () => {\n await this.postSkillChecks();\n });\n }\n async _updateObject(_event, formData) {\n const status = formData[\"status\"];\n if (status === \"identified\") {\n return this.object.setIdentificationStatus(status);\n }\n }\n}\nexport { getItemIdentificationDCs, IdentifyItemPopup };\n", "import { R, SYSTEM } from \"..\";\nconst COIN_DENOMINATIONS = [\"pp\", \"gp\", \"sp\", \"cp\"];\nconst COIN_COMPENDIUM_UUIDS = {\n pp: SYSTEM.itemUuid(\"Compendium.pf2e.equipment-srd.Item.JuNPeK5Qm1w6wpb4\", \"Compendium.pf2e-anachronism.equipment.Item.JuNPeK5Qm1w6wpb4\"),\n gp: SYSTEM.itemUuid(\"Compendium.pf2e.equipment-srd.Item.B6B7tBWJSqOBz5zz\", \"Compendium.pf2e-anachronism.equipment.Item.B6B7tBWJSqOBz5zz\"),\n sp: SYSTEM.itemUuid(\"Compendium.pf2e.equipment-srd.Item.5Ew82vBF9YfaiY9f\", \"Compendium.pf2e-anachronism.equipment.Item.5Ew82vBF9YfaiY9f\"),\n cp: SYSTEM.itemUuid(\"Compendium.pf2e.equipment-srd.Item.lzJ8AVhRcbFul5fh\", \"Compendium.pf2e-anachronism.equipment.Item.lzJ8AVhRcbFul5fh\"),\n};\nlet _physicalItemTypes;\nfunction getPhysicalItemTypes() {\n return (_physicalItemTypes ??= R.pipe(R.entries(CONFIG.PF2E.Item.documentClasses), R.filter(([_, x]) => Reflect.getPrototypeOf(x).name === \"PhysicalItemPF2e\"), R.map(([type]) => type)));\n}\nexport { COIN_COMPENDIUM_UUIDS, COIN_DENOMINATIONS, getPhysicalItemTypes };\n", "import { R } from \"..\";\n/**\n * https://github.com/foundryvtt/pf2e/blob/f7d7441acbf856b490a4e0c0d799809cd6e3dc5d/src/util/misc.ts#L259\n */\nfunction splitListString(str, { delimiter = \",\", unique = true } = {}) {\n const list = str\n .split(delimiter)\n .map((el) => el.trim())\n .filter((el) => el !== \"\");\n return unique ? R.unique(list) : list;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/95e941aecaf1fa6082825b206b0ac02345d10538/src/util/misc.ts#L58\n */\nfunction setHasElement(set, value) {\n return set.has(value);\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/78e7f116221c6138e4f3d7e03177bd85936c6939/src/util/misc.ts#L216\n */\nfunction ErrorPF2e(message) {\n return Error(`PF2e System | ${message}`);\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/07c666035850e084835e0c8c3ca365b06dcd0a75/src/util/tags.ts#L8\n */\nfunction traitSlugToObject(trait, dictionary) {\n // Look up trait labels from `npcAttackTraits` instead of `weaponTraits` in case a battle form attack is\n // in use, which can include what are normally NPC-only traits\n const traitObject = {\n name: trait,\n label: game.i18n.localize(dictionary[trait] ?? trait),\n description: null,\n };\n if (objectHasKey(CONFIG.PF2E.traitsDescriptions, trait)) {\n traitObject.description = CONFIG.PF2E.traitsDescriptions[trait];\n }\n return traitObject;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/002ba0bf6d15dfc0d87a96009f02fb0743fb000b/src/module/sheet/helpers.ts#L158-L161\n */\nfunction isControlDown(event) {\n return foundry.helpers.interaction.KeyboardManager.CONTROL_KEY_STRING === \"\u2318\" ? event.metaKey : event.ctrlKey;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/07c666035850e084835e0c8c3ca365b06dcd0a75/src/util/misc.ts#L48\n */\nfunction objectHasKey(obj, key) {\n return (typeof key === \"string\" || typeof key === \"number\") && key in obj;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/07c666035850e084835e0c8c3ca365b06dcd0a75/src/module/sheet/helpers.ts#L125\n */\nfunction isRelevantEvent(event) {\n return !!event && \"ctrlKey\" in event && \"metaKey\" in event && \"shiftKey\" in event;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/07c666035850e084835e0c8c3ca365b06dcd0a75/src/module/sheet/helpers.ts#L149\n */\nfunction eventToRollMode(event) {\n if (!isRelevantEvent(event) || !(event.ctrlKey || event.metaKey))\n return \"roll\";\n return game.user.isGM ? \"gmroll\" : \"blindroll\";\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/5967df95d2645162d06d6ee317e99cf9aa03477e/src/module/sheet/helpers.ts#L132\n */\nfunction eventToRollParams(event, rollType) {\n const key = rollType.type === \"check\" ? \"showCheckDialogs\" : \"showDamageDialogs\";\n const skipDefault = !game.user.settings[key];\n if (!isRelevantEvent(event))\n return { skipDialog: skipDefault };\n const params = { skipDialog: event.shiftKey ? !skipDefault : skipDefault };\n if (event.ctrlKey || event.metaKey) {\n params.rollMode = game.user.isGM ? \"gmroll\" : \"blindroll\";\n }\n return params;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/f7d7441acbf856b490a4e0c0d799809cd6e3dc5d/src/module/system/text-editor.ts#L344\n */\nfunction parseInlineParams(paramString, options = {}) {\n const parts = splitListString(paramString, { delimiter: \"|\" });\n const result = parts.reduce((result, part, idx) => {\n if (idx === 0 && options.first && !part.includes(\":\")) {\n result[options.first] = part.trim();\n return result;\n }\n const colonIdx = part.indexOf(\":\");\n const portions = colonIdx >= 0 ? [part.slice(0, colonIdx), part.slice(colonIdx + 1)] : [part, \"\"];\n result[portions[0]] = portions[1];\n return result;\n }, {});\n return result;\n}\nlet pluralRules;\n/**\n * https://github.com/foundryvtt/pf2e/blob/5ebcd0359d1358bb00b76c47e7b84289239234b9/src/util/misc.ts#L226\n */\nfunction ordinalString(value) {\n pluralRules ??= new Intl.PluralRules(game.i18n.lang, { type: \"ordinal\" });\n const suffix = game.i18n.localize(`PF2E.OrdinalSuffixes.${pluralRules.select(value)}`);\n return game.i18n.format(\"PF2E.OrdinalNumber\", { value, suffix });\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/895e512a3346ae9e7eeafbc59fdbac1b68651afa/src/util/misc.ts#L352\n */\nfunction localizer(prefix) {\n return (...[suffix, formatArgs]) => formatArgs ? game.i18n.format(`${prefix}.${suffix}`, formatArgs) : game.i18n.localize(`${prefix}.${suffix}`);\n}\nlet intlNumberFormat;\n/**\n * https://github.com/foundryvtt/pf2e/blob/142b2ce5524f3f331298f97f0b759dcb842731ad/src/util/misc.ts#L72\n */\nfunction signedInteger(value, { emptyStringZero = false, zeroIsNegative = false } = {}) {\n if (value === 0 && emptyStringZero)\n return \"\";\n const nf = (intlNumberFormat ??= new Intl.NumberFormat(game.i18n.lang, {\n maximumFractionDigits: 0,\n signDisplay: \"always\",\n }));\n const maybeNegativeZero = zeroIsNegative && value === 0 ? -0 : value;\n return nf.format(maybeNegativeZero);\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/0191f1fdac24c3903a939757a315043d1fcbfa59/src/util/misc.ts#L56\n */\nfunction tupleHasValue(array, value) {\n return array.includes(value);\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/f26bfcc353ebd58efd6d1140cdb8e20688acaea8/src/module/item/spell/helpers.ts#L16\n */\nfunction createSpellAreaLabel(areaData) {\n const formatString = \"PF2E.Item.Spell.Area\";\n const shape = game.i18n.localize(`PF2E.Area.Shape.${areaData.type}`);\n // Handle special cases of very large areas\n const largeAreaLabel = {\n 1320: \"PF2E.Area.Size.Quarter\",\n 2640: \"PF2E.Area.Size.Half\",\n 5280: \"1\",\n }[areaData.value];\n if (largeAreaLabel) {\n const size = game.i18n.localize(largeAreaLabel);\n const unit = game.i18n.localize(\"PF2E.Area.Size.Mile\");\n return game.i18n.format(formatString, { shape, size, unit, units: unit });\n }\n const size = Number(areaData.value);\n const unit = game.i18n.localize(\"PF2E.Foot.Label\");\n const units = game.i18n.localize(\"PF2E.Foot.Plural\");\n return game.i18n.format(formatString, { shape, size, unit, units });\n}\nfunction sluggify(text, options) {\n return game.pf2e.system.sluggify(text, options);\n}\nexport { createSpellAreaLabel, ErrorPF2e, eventToRollMode, eventToRollParams, isControlDown, localizer, objectHasKey, ordinalString, parseInlineParams, setHasElement, signedInteger, sluggify, splitListString, traitSlugToObject, tupleHasValue, };\n", "import { R } from \"..\";\n/**\n * https://github.com/foundryvtt/pf2e/blob/5a1089c6aa4725c2e73f60d67a3be01115896592/src/module/rules/helpers.ts#L88\n */\nasync function extractEphemeralEffects({ affects, origin, target, item, domains, options, }) {\n if (!(origin && target))\n return [];\n const [effectsFrom, effectsTo] = affects === \"target\" ? [origin, target] : [target, origin];\n const fullOptions = [...options, effectsFrom.getRollOptions(domains), effectsTo.getSelfRollOptions(affects)].flat();\n const resolvables = item ? (item.isOfType(\"spell\") ? { spell: item } : { weapon: item }) : {};\n return (await Promise.all(domains\n .flatMap((s) => effectsFrom.synthetics.ephemeralEffects[s]?.[affects] ?? [])\n .map((d) => d({ test: fullOptions, resolvables }))))\n .filter(R.isNonNull)\n .map((effect) => {\n effect.system.context = {\n origin: {\n actor: effectsFrom.uuid,\n item: null,\n rollOptions: [],\n spellcasting: null,\n token: null,\n },\n target: { actor: effectsTo.uuid, token: null },\n roll: null,\n };\n if (effect.type === \"effect\") {\n effect.system.duration = {\n value: -1,\n unit: \"unlimited\",\n expiry: null,\n sustained: false,\n };\n }\n return effect;\n });\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/360c60f68dad3cee456f328e48043283939582ec/src/module/rules/helpers.ts#L41\n */\nfunction extractModifierAdjustments(adjustmentsRecord, selectors, slug) {\n const adjustments = R.unique(selectors.flatMap((s) => adjustmentsRecord[s] ?? []));\n return adjustments.filter((a) => [slug, null].includes(a.slug));\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/5967df95d2645162d06d6ee317e99cf9aa03477e/src/module/rules/helpers.ts#L60\n */\nfunction extractNotes(rollNotes, selectors) {\n return selectors.flatMap((s) => (rollNotes[s] ?? []).map((n) => n.clone()));\n}\nexport { extractEphemeralEffects, extractModifierAdjustments, extractNotes };\n", "import { createHTMLElement } from \"..\";\n/**\n * https://github.com/foundryvtt/pf2e/blob/5967df95d2645162d06d6ee317e99cf9aa03477e/src/module/notes.ts#L7\n */\nclass RollNotePF2e {\n /** The selector used to determine on which rolls the note will be shown for. */\n selector;\n /** An optional title for the note */\n title;\n /** The text content of this note. */\n text;\n /** If true, these dice are user-provided/custom. */\n predicate;\n /** List of outcomes to show this note for; or all outcomes if none are specified */\n outcome;\n /** An optional visibility restriction for the note */\n visibility;\n /** The originating rule element of this modifier, if any: used to retrieve \"parent\" item roll options */\n rule;\n constructor(params) {\n this.selector = params.selector;\n this.title = params.title ?? null;\n this.text = params.text;\n this.predicate = new game.pf2e.Predicate(params.predicate ?? []);\n this.outcome = [...(params.outcome ?? [])];\n this.visibility = params.visibility ?? null;\n this.rule = params.rule ?? null;\n }\n /** Convert an array of notes to a UL element, or null if the array is empty. */\n static notesToHTML(notes) {\n if (notes.length === 0)\n return null;\n return createHTMLElement(\"ul\", {\n classes: [\"notes\"],\n content: [...notes.flatMap((n) => [\"\\n\", n.toHTML()]), \"\\n\"],\n });\n }\n toHTML() {\n const element = createHTMLElement(\"li\", {\n classes: [\"roll-note\"],\n dataset: {\n itemId: this.rule?.item.id,\n visibility: this.visibility,\n },\n content: game.i18n.localize(this.text),\n });\n // Remove wrapping elements, such as from item descriptions\n if (element.childNodes.length === 1 && element.firstChild instanceof HTMLElement) {\n element.innerHTML = element.firstChild.innerHTML;\n }\n if (this.title) {\n const strong = createHTMLElement(\"strong\", { content: game.i18n.localize(this.title) });\n element.prepend(strong, \" \");\n }\n return element;\n }\n clone() {\n return new RollNotePF2e({ ...this.toObject(), rule: this.rule });\n }\n toObject() {\n return {\n selector: this.selector,\n title: this.title,\n text: this.text,\n predicate: this.predicate.toObject(),\n outcome: this.outcome,\n visibility: this.visibility,\n };\n }\n}\nexport { RollNotePF2e };\n", "import { ordinalString } from \".\";\nconst MAGIC_TRADITIONS = new Set([\"arcane\", \"divine\", \"occult\", \"primal\"]);\n/**\n * https://github.com/foundryvtt/pf2e/blob/5ebcd0359d1358bb00b76c47e7b84289239234b9/src/module/item/spellcasting-entry/helpers.ts#L43\n */\nfunction getSpellRankLabel(group) {\n return group === 0 || group === \"cantrips\"\n ? game.i18n.localize(\"PF2E.Actor.Creature.Spellcasting.Cantrips\")\n : game.i18n.format(\"PF2E.Item.Spell.Rank.Ordinal\", { rank: ordinalString(group) });\n}\nexport { getSpellRankLabel, MAGIC_TRADITIONS };\n", "import { ErrorPF2e, MAGIC_TRADITIONS, objectHasKey, setHasElement } from \".\";\nimport { R, SYSTEM } from \"..\";\nconst CANTRIP_DECK_UUID = SYSTEM.itemUuid(\"Compendium.pf2e.equipment-srd.Item.tLa4bewBhyqzi6Ow\", \"Compendium.pf2e-anachronism.equipment.Item.tLa4bewBhyqzi6Ow\");\n/**\n * slightly modified version of\n * https://github.com/reonZ/pf2e/blob/6e5481af7bb1e1b9d28d35fb3ad324511c5170d1/src/module/item/consumable/spell-consumables.ts#L21\n */\nasync function createConsumableFromSpell(spell, { type, heightenedLevel: rank = spell.baseRank, mystified = false, itemImg, itemName, temp, }) {\n const data = objectHasKey(CONFIG.PF2E.spellcastingItems, type) ? CONFIG.PF2E.spellcastingItems[type] : null;\n const uuids = data?.compendiumUuids ?? [];\n const uuid = uuids?.[rank] ?? (type === \"cantripDeck5\" ? CANTRIP_DECK_UUID() : null);\n const consumable = uuid ? await fromUuid(uuid) : null;\n if (!consumable?.isOfType(\"consumable\")) {\n throw ErrorPF2e(\"Failed to retrieve consumable item\");\n }\n const consumableSource = { ...consumable.toObject(), _id: null }; // Clear _id\n const traits = consumableSource.system.traits;\n traits.value = R.unique([...traits.value, ...spell.system.traits.value]);\n traits.rarity = spell.rarity;\n if (traits.value.includes(\"magical\") && traits.value.some((t) => setHasElement(MAGIC_TRADITIONS, t))) {\n traits.value.splice(traits.value.indexOf(\"magical\"), 1);\n }\n traits.value.sort();\n const nameTemplate = type === \"cantripDeck5\" ? \"PF2E.Item.Physical.FromSpell.CantripDeck5\" : data?.nameTemplate;\n consumableSource.name =\n nameTemplate && !itemName\n ? game.i18n.format(nameTemplate, { name: spell.name, level: rank })\n : `${itemName ?? type} of ${spell.name} (Rank ${rank})`;\n const description = consumableSource.system.description.value;\n consumableSource.system.description.value = (() => {\n const paragraphElement = document.createElement(\"p\");\n paragraphElement.append(spell.sourceId ? `@UUID[${spell.sourceId}]{${spell.name}}` : spell.description);\n const containerElement = document.createElement(\"div\");\n const hrElement = document.createElement(\"hr\");\n containerElement.append(paragraphElement, hrElement);\n hrElement.insertAdjacentHTML(\"afterend\", description);\n return containerElement.innerHTML;\n })();\n // Cantrip deck casts at level 1\n if (type !== \"cantripDeck5\") {\n consumableSource.system.spell = foundry.utils.mergeObject(spell._source, { _id: foundry.utils.randomID(), system: { location: { value: null, heightenedLevel: rank } } }, { inplace: false });\n }\n if (mystified) {\n consumableSource.system.identification.status = \"unidentified\";\n }\n if (typeof itemImg === \"string\") {\n consumableSource.img = itemImg;\n }\n if (temp) {\n consumableSource.system.temporary = true;\n }\n return consumableSource;\n}\nexport { createConsumableFromSpell };\n", "import { getSpellRankLabel, localizer } from \".\";\nimport { R } from \"..\";\nconst SPELLCASTING_CATEGORIES = [\"prepared\", \"spontaneous\", \"innate\", \"focus\", \"items\", \"ritual\"];\nfunction spellSlotGroupIdToNumber(groupId) {\n if (groupId === \"cantrips\")\n return 0;\n const numericValue = Number(groupId ?? NaN);\n return numericValue.between(0, 10) ? numericValue : null;\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/895e512a3346ae9e7eeafbc59fdbac1b68651afa/src/module/item/spellcasting-entry/collection.ts#L343\n */\nfunction warnInvalidDrop(warning, { spell, groupId }) {\n const localize = localizer(\"PF2E.Item.Spell.Warning\");\n if (warning === \"invalid-rank\" && typeof groupId === \"number\") {\n const spellRank = getSpellRankLabel(spell.baseRank);\n const targetRank = getSpellRankLabel(groupId);\n ui.notifications.warn(localize(\"InvalidRank\", { spell: spell.name, spellRank, targetRank }));\n }\n else if (warning === \"cantrip-mismatch\") {\n const locKey = spell.isCantrip ? \"CantripToRankedSlots\" : \"NonCantripToCantrips\";\n ui.notifications.warn(localize(locKey, { spell: spell.name }));\n }\n else if (warning === \"invalid-spell\") {\n const type = game.i18n.format(\"PF2E.TraitFocus\");\n ui.notifications.warn(localize(\"WrongSpellType\", { type }));\n }\n}\n/**\n * https://github.com/foundryvtt/pf2e/blob/49dc6d70c7e7bb26d8039c97361e638bdef6a3bd/src/module/item/spellcasting-entry/helpers.ts#L10\n */\nfunction createCounteractStatistic(ability) {\n const actor = ability.actor;\n // NPCs have neither a proficiency bonus nor specified attribute modifier: use their base attack roll modifier\n const baseModifier = actor.isOfType(\"npc\")\n ? ability.statistic.check.modifiers.find((m) => m.type === \"untyped\" && m.slug === \"base\")?.clone()\n : null;\n const StatisticCls = actor.skills.acrobatics.constructor;\n return new StatisticCls(actor, {\n slug: \"counteract\",\n label: \"PF2E.Item.Spell.Counteract.Label\",\n attribute: ability.statistic.attribute,\n rank: ability.statistic.rank || 1,\n check: { type: \"check\", modifiers: [baseModifier].filter(R.isTruthy) },\n });\n}\nexport { createCounteractStatistic, SPELLCASTING_CATEGORIES, spellSlotGroupIdToNumber, warnInvalidDrop };\n", "function getRuleElementCls() {\n return game.pf2e.RuleElement;\n}\nfunction ruleElementResolveField(options, context) {\n const BaseSpeedCls = game.pf2e.RuleElements.builtin.BaseSpeed;\n const ResolveFieldCls = BaseSpeedCls.defineSchema().value.constructor;\n return new ResolveFieldCls(options, context);\n}\nfunction getChoiceSetSelection(item, { option, flag } = {}) {\n const rules = item._source.system.rules;\n const rule = rules.find((rule) => {\n return rule.key === \"ChoiceSet\" && (!option || rule.rollOption === option) && (!flag || rule.flag === flag);\n });\n return rule?.selection;\n}\nexport { getChoiceSetSelection, getRuleElementCls, ruleElementResolveField };\n", "import { createHTMLElement, htmlClosest, htmlQuery, localize, MODULE, R, userIsGM, } from \".\";\nfunction settingPath(...path) {\n return MODULE.path(\"settings\", ...path);\n}\nfunction getSetting(key) {\n return game.settings.get(MODULE.id, key);\n}\nfunction setSetting(key, value) {\n return game.settings.set(MODULE.id, key, value);\n}\nfunction registerSetting(key, options) {\n const isGM = userIsGM();\n if ((options.gmOnly && !isGM) || (options.playerOnly && isGM))\n return;\n if (\"choices\" in options && Array.isArray(options.choices)) {\n options.choices = R.fromKeys(options.choices, (choice) => settingPath(key, \"choices\", choice));\n }\n options.name ??= settingPath(key, \"name\");\n options.hint ??= settingPath(key, \"hint\");\n options.config ??= true;\n if (options.scope === \"user\" && !options.broadcast && options.onChange) {\n const _onChange = options.onChange;\n options.onChange = (value, operation, userId) => {\n if (userId !== game.userId)\n return;\n _onChange(value, operation, userId);\n };\n }\n game.settings.register(MODULE.id, key, options);\n}\nfunction registerSettingMenu(key, options) {\n options.name ??= settingPath(\"menus\", key, \"name\");\n options.label ??= settingPath(\"menus\", key, \"label\");\n options.hint ??= settingPath(\"menus\", key, \"hint\");\n options.icon ??= \"fas fa-cogs\";\n game.settings.registerMenu(MODULE.id, key, options);\n}\nfunction registerModuleSettings(settings) {\n for (const [group, entries] of R.entries(settings)) {\n for (const setting of entries) {\n setting.key = group ? `${group}.${setting.key}` : setting.key;\n registerSetting(setting.key, setting);\n }\n }\n Hooks.on(\"renderSettingsConfig\", (_, html, options) => onRenderSettingsConfig(html, options, settings));\n}\nfunction getUserSetting(key, userId) {\n const moduleKey = MODULE.path(key);\n const storage = game.settings.storage.get(\"user\");\n return userId\n ? storage.find((setting) => setting.user === userId && setting.key === moduleKey)\n : storage.filter((setting) => !!setting.user && setting.key === moduleKey);\n}\n/**\n * modified version of\n * client/helpers/client-settings.mjs#266\n */\nasync function setUserSetting(user, key, value) {\n if (!game.ready) {\n throw new Error(\"You may not set a World-level Setting before the Game is ready.\");\n }\n const setting = assertSetting(MODULE.id, key);\n if (!setting.id)\n return;\n const userId = user instanceof User ? user.id : user;\n const json = cleanJSON(setting, value);\n const current = game.settings.storage.get(\"user\").getSetting(setting.id, userId);\n if (current?._id) {\n await current.update({ value: json });\n return current;\n }\n return getDocumentClass(\"Setting\").create({ key: setting.id, user: userId, value: json });\n}\n/**\n * client/helpers/client-settings.mjs#247\n */\nfunction assertSetting(namespace, key) {\n const id = `${namespace}.${key}`;\n if (!namespace || !key) {\n throw new Error(`You must specify both namespace and key portions of the setting, you provided \"${id}\"`);\n }\n const setting = game.settings.settings.get(id);\n if (!setting)\n throw new Error(`\"${id}\" is not a registered game setting`);\n return setting;\n}\n/**\n * client/helpers/client-settings.mjs#315\n */\nfunction cleanJSON(setting, value) {\n // Assign using DataField\n if (setting.type instanceof foundry.data.fields.DataField) {\n value = setting.type.clean(value);\n const err = setting.type.validate(value, { fallback: false });\n if (err instanceof foundry.data.validation.DataModelValidationFailure)\n throw err.asError();\n }\n // Assign using DataModel\n if (foundry.utils.isSubclass(setting.type, foundry.abstract.DataModel)) {\n value = setting.type.fromSource(value || {}, { strict: true });\n }\n // Plain default value\n else if (value === undefined)\n value = setting.default;\n return JSON.stringify(value);\n}\nfunction onRenderSettingsConfig(html, options, settings) {\n const id = MODULE.id;\n const category = options.categories[id];\n if (!category)\n return;\n const tab = htmlQuery(html, `[data-application-part=\"main\"] [data-group=\"categories\"][data-tab=\"${id}\"][data-category=\"${id}\"]`);\n if (!tab)\n return;\n const gmOnlyLabel = localize.shared(\"gmOnly\");\n const playerOnlyLabel = localize.shared(\"playerOnly\");\n const reloadLabel = localize.shared(\"reloadRequired\");\n const gmOnly = ``;\n const player = ``;\n const reload = ``;\n for (const entry of category.entries) {\n if (entry.menu)\n continue;\n const name = entry.field.name;\n const extras = [];\n const setting = game.settings.settings.get(name);\n if (!setting)\n continue;\n if (setting.gmOnly) {\n extras.push(gmOnly);\n }\n if (setting.playerOnly) {\n extras.push(player);\n }\n if (setting.requiresReload) {\n extras.push(reload);\n }\n if (!extras.length)\n continue;\n const input = htmlQuery(tab, `[name=\"${name}\"]`);\n const group = htmlClosest(input, \".form-group\");\n const label = htmlQuery(group, \"label\");\n const span = createHTMLElement(\"span\", {\n content: ` ${extras.join(\", \")}`,\n });\n label?.append(span);\n }\n const settingKeys = R.keys(settings);\n for (let i = 0; i < settingKeys.length; i++) {\n const key = settingKeys[i];\n if (!key)\n continue;\n const input = htmlQuery(tab, `[name^=\"${MODULE.id}.${key}\"]`);\n const group = htmlClosest(input, \".form-group\");\n const title = createHTMLElement(\"h4\", {\n content: localize(\"settings\", key, \"title\"),\n });\n title.style.marginBlock = i === 0 ? \"0\" : \"0.5em 0em\";\n group?.before(title);\n }\n}\nexport { getSetting, getUserSetting, registerModuleSettings, registerSetting, registerSettingMenu, setSetting, settingPath, setUserSetting, };\n", "import { createHTMLElement, isTokenObject, isValidTargetDocuments, localize, MODULE, R, userIsGM } from \".\";\nconst EMITING_STYLE = {\n alignItems: \"center\",\n background: \"linear-gradient(90deg, #00000000 0%, #0000001a 20%, #00000066 50%, #0000001a 80%, #00000000 100%)\",\n color: \"#efe6d8c9\",\n display: \"flex\",\n fontSize: \"3.6rem\",\n gap: \"0.8rem\",\n justifyContent: \"center\",\n left: \"0\",\n paddingBlock: \"0.2rem\",\n position: \"absolute\",\n right: \"0\",\n textShadow: \"#000000 0px 0px 6px\",\n top: \"10%\",\n zIndex: \"2147483647\",\n};\nfunction socketOn(callback) {\n game.socket.on(`module.${MODULE.id}`, callback);\n}\nfunction socketOff(callback) {\n game.socket.off(`module.${MODULE.id}`, callback);\n}\nfunction socketEmit(packet) {\n game.socket.emit(`module.${MODULE.id}`, packet);\n}\nlet _emitingElement;\nfunction displayEmiting() {\n const emitingElement = (_emitingElement ??= (() => {\n const label = localize.shared(\"emiting.label\");\n return createHTMLElement(\"div\", {\n classes: [\"lvk-emitter\"],\n content: `${label}`,\n style: EMITING_STYLE,\n });\n })());\n document.body.append(emitingElement);\n setTimeout(() => {\n emitingElement.remove();\n }, 600);\n}\nfunction createEmitable(prefix, callback) {\n let _enabled = false;\n const onSocket = async (packet, userId) => {\n if (packet.__type__ !== prefix || !game.user.isActiveGM)\n return;\n const callOptions = await convertToCallOptions(packet);\n callback(callOptions, userId);\n };\n const emit = (options) => {\n if (!game.users.activeGM) {\n ui.notifications.error(localize.shared(\"emiting.noGm\"));\n return;\n }\n displayEmiting();\n const packet = convertToEmitOptions(options);\n packet.__type__ = prefix;\n socketEmit(packet);\n };\n return {\n get enabled() {\n return _enabled;\n },\n async call(options) {\n if (!R.isPlainObject(options))\n return;\n if (game.user.isActiveGM) {\n return callback(options, game.userId);\n }\n else {\n emit(options);\n }\n },\n emit,\n activate() {\n if (this.enabled || !userIsGM())\n return;\n _enabled = true;\n socketOn(onSocket);\n },\n disable() {\n if (!this.enabled)\n return;\n _enabled = false;\n socketOff(onSocket);\n },\n toggle(enabled) {\n enabled ??= !this.enabled;\n if (enabled) {\n this.activate();\n }\n else {\n this.disable();\n }\n },\n };\n}\nasync function convertToCallOptions(options) {\n const __converter__ = options.__converter__;\n const __source__ = options.__source__;\n // @ts-expect-error\n delete options.__converter__;\n // @ts-expect-error\n delete options.__source__;\n // @ts-expect-error\n delete options.__type__;\n await Promise.all(R.entries(options).map(async () => { }));\n const converted = (__source__ === \"array\" ? [] : {});\n await Promise.all(R.entries(options).map(async ([key, value]) => {\n converted[key] = await convertToCallOption(value, __converter__[key]);\n }));\n return converted;\n}\nasync function convertToCallOption(value, __converter__) {\n switch (__converter__) {\n case \"document\": {\n return fromUuid(value);\n }\n case \"target\": {\n return convertTargetFromPacket(value);\n }\n case \"token\": {\n const tokenDocument = await fromUuid(value);\n return tokenDocument?.object;\n }\n default: {\n return value;\n }\n }\n}\nasync function convertTargetFromPacket(target) {\n const actor = await fromUuid(target.actor);\n if (!(actor instanceof Actor))\n return;\n return {\n actor,\n token: (target.token && (await fromUuid(target.token))) || undefined,\n };\n}\nfunction convertToEmitOptions(options) {\n const __converter__ = {};\n const convertedOptions = R.mapValues(options, (value, key) => {\n if (value instanceof foundry.abstract.Document) {\n __converter__[key] = \"document\";\n return value.uuid;\n }\n if (isTokenObject(value)) {\n __converter__[key] = \"token\";\n return value.document.uuid;\n }\n if (isValidTargetDocuments(value)) {\n __converter__[key] = \"target\";\n return {\n actor: value.actor.uuid,\n token: value.token?.uuid,\n };\n }\n return value;\n });\n convertedOptions.__converter__ = __converter__;\n convertedOptions.__source__ = R.isArray(options) ? \"array\" : \"object\";\n return convertedOptions;\n}\nexport { convertTargetFromPacket, convertToCallOptions, convertToEmitOptions, createEmitable, displayEmiting, socketEmit, socketOff, socketOn, };\n", "const ROMAN_RANKS = [\"\", \"\u2160\", \"\u2161\", \"\u2162\", \"\u2163\", \"\u2164\", \"\u2165\", \"\u2166\", \"\u2167\", \"\u2168\", \"\u2169\"];\nfunction getSpellCollectionCls(actor) {\n return actor.spellcasting.get(\"rituals\").spells.constructor;\n}\nfunction getActorMaxRank(actor) {\n return Math.max(1, Math.ceil(actor.level / 2));\n}\nfunction createSpellcastingSource({ name, category, attribute, flags, proficiencyRank, proficiencySlug, showSlotlessRanks, sort, tradition, }) {\n return {\n type: \"spellcastingEntry\",\n name,\n sort: sort ?? 0,\n system: {\n ability: {\n value: (!proficiencySlug && attribute) || \"\",\n },\n prepared: {\n value: category ?? \"innate\",\n },\n showSlotlessLevels: {\n value: showSlotlessRanks ?? false,\n },\n proficiency: {\n value: proficiencyRank ?? 1,\n slug: proficiencySlug ?? \"\",\n },\n tradition: {\n value: tradition ?? \"arcane\",\n },\n },\n flags: flags ?? {},\n };\n}\nexport { getSpellCollectionCls, createSpellcastingSource, getActorMaxRank, ROMAN_RANKS };\n", "import { DateTime } from \"luxon\";\nimport { R } from \".\";\nvar TimeChangeMode;\n(function (TimeChangeMode) {\n TimeChangeMode[TimeChangeMode[\"ADVANCE\"] = 0] = \"ADVANCE\";\n TimeChangeMode[TimeChangeMode[\"RETRACT\"] = 1] = \"RETRACT\";\n})(TimeChangeMode || (TimeChangeMode = {}));\n/**\n * https://github.com/foundryvtt/pf2e/blob/e215ebfbb287190d313fe0441e0362439766786d/src/module/apps/world-clock/time-of-day.ts#L8\n */\nclass TimeOfDay {\n hour;\n minute;\n second;\n constructor(hour, minute, second) {\n this.hour = hour;\n this.minute = minute;\n this.second = second;\n }\n /** Point in morning twilight where dim light begins */\n static DAWN = new TimeOfDay(4, 58, 54);\n static NOON = new TimeOfDay(12, 0, 0);\n /** Point in evening twilight where dim light begins */\n static DUSK = new TimeOfDay(18, 34, 6);\n static MIDNIGHT = new TimeOfDay(0, 0, 0);\n /**\n * Returns positive or negative number of seconds to add to current\n * game time advance function https://foundryvtt.com/api/GameTime.hbs#advance\n * @param worldTime the current time as luxon DateTime\n * @param mode whether to go back to that point in time or to advance\n */\n diffSeconds(worldTime, mode) {\n const targetTime = worldTime.set(this);\n const targetDayDifference = TimeOfDay.diffDays(worldTime, targetTime, mode);\n const targetDay = worldTime.plus({ day: targetDayDifference });\n return targetDay.set(this).diff(worldTime, \"seconds\").seconds;\n }\n static diffDays(currentTime, targetTime, mode) {\n // if we have the same point in time, we always want to either skip or rewind a full day\n if (currentTime >= targetTime && mode === TimeChangeMode.ADVANCE) {\n // case: now: 12:01 and advance to 12:00 -> we need to add 1 day to calculate the difference\n return 1;\n }\n else if (currentTime <= targetTime && mode === TimeChangeMode.RETRACT) {\n // case: now: 12:00 and retract to 12:01 -> we need to subtract 1 day to calculate the difference\n return -1;\n }\n else {\n return 0;\n }\n }\n}\nfunction createTimeout(callback, options) {\n let timeoutId = null;\n const usedOptions = R.isNumber(options) ? { defaultDelay: options } : options;\n const minDelay = Math.max(usedOptions?.minDelay ?? 0, 0);\n const defaultDelay = Math.max(usedOptions?.defaultDelay ?? 1, minDelay);\n return {\n start(...args) {\n if (timeoutId !== null) {\n this.stop();\n }\n if (defaultDelay < 1) {\n callback(...args);\n }\n else {\n timeoutId = setTimeout(callback, defaultDelay, ...args);\n }\n },\n startWithDelay(delay, ...args) {\n if (timeoutId !== null) {\n this.stop();\n }\n const usedDelay = Math.max(delay, minDelay);\n if (usedDelay < 1) {\n callback(...args);\n }\n else {\n timeoutId = setTimeout(callback, usedDelay, ...args);\n }\n },\n stop() {\n if (timeoutId === null)\n return;\n clearTimeout(timeoutId);\n timeoutId = null;\n },\n };\n}\n/**\n * slightly modified (also fixed the typo)\n * https://github.com/foundryvtt/pf2e/blob/e215ebfbb287190d313fe0441e0362439766786d/src/module/apps/world-clock/app.ts#L237\n */\nfunction calculateTimeIncrement(interval, intervalMode) {\n const worldTime = game.pf2e.worldClock.worldTime;\n const mode = intervalMode === \"+\" ? TimeChangeMode.ADVANCE : TimeChangeMode.RETRACT;\n switch (interval) {\n case \"dawn\":\n return TimeOfDay.DAWN.diffSeconds(worldTime, mode);\n case \"noon\":\n return TimeOfDay.NOON.diffSeconds(worldTime, mode);\n case \"dusk\":\n return TimeOfDay.DUSK.diffSeconds(worldTime, mode);\n case \"midnight\":\n return TimeOfDay.MIDNIGHT.diffSeconds(worldTime, mode);\n default: {\n const sign = mode === TimeChangeMode.ADVANCE ? 1 : -1;\n return Number(interval) * sign;\n }\n }\n}\nfunction getWorldTime() {\n return game.settings.get(\"core\", \"time\");\n}\nfunction getTimeWithSeconds(time) {\n return game.pf2e.worldClock.timeConvention === 24\n ? time.toFormat(\"HH:mm:ss\")\n : time.toLocaleString(DateTime.TIME_WITH_SECONDS);\n}\nfunction waitTimeout(time = 1) {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\nasync function advanceTime(interval, direction) {\n const sign = direction === \"+\" ? 1 : -1;\n const increment = Number(interval) * sign;\n if (increment !== 0) {\n return game.time.advance(increment);\n }\n}\nfunction getShortTime(time) {\n return game.pf2e.worldClock.timeConvention === 24\n ? time.toFormat(\"HH:mm\")\n : time.toLocaleString(DateTime.TIME_SIMPLE);\n}\nfunction getShortDateTime() {\n const worldClock = game.pf2e.worldClock;\n const worldTime = worldClock.worldTime;\n const time = getShortTime(worldTime);\n const date = worldClock.dateTheme === \"CE\"\n ? worldTime.toLocaleString(DateTime.DATE_SHORT)\n : DateTime.local(worldClock[\"year\"], worldTime.month, worldTime.day).toLocaleString(DateTime.DATE_SHORT);\n return {\n worldClock,\n worldTime,\n time,\n date,\n };\n}\nfunction timestampToLocalTime(time) {\n return new Date(time).toLocaleString();\n}\nexport { advanceTime, calculateTimeIncrement, createTimeout, getShortDateTime, getShortTime, getTimeWithSeconds, getWorldTime, timestampToLocalTime, waitTimeout, };\n", "import { isInstanceOf, R } from \".\";\nfunction isTokenObject(token) {\n return token instanceof foundry.canvas.placeables.Token;\n}\nfunction getTokenDocument(token) {\n return isTokenObject(token)\n ? token.document\n : token instanceof TokenDocument\n ? token\n : undefined;\n}\nfunction getCurrentTargets({ types = [], user = game.user, uuid, } = {}) {\n const targets = user.targets.filter((target) => {\n const actor = target.actor;\n return !!actor && (!types.length || actor.isOfType(...types));\n });\n return uuid ? Array.from(targets.map((target) => target.document.uuid)) : Array.from(targets);\n}\nfunction selectTokens(tokens) {\n canvas.tokens.releaseAll();\n for (const target of tokens) {\n const token = target instanceof TokenDocument ? target.object : target;\n token?.control({ releaseOthers: false });\n }\n}\nfunction positionTokenFromCoords({ x, y }, token, snapped = true) {\n let position = token.getCenterPoint({ x: 0, y: 0 });\n position.x = x - position.x;\n position.y = y - position.y;\n if (snapped) {\n position = token.getSnappedPosition(position);\n }\n return position;\n}\nfunction getFirstActiveToken(actor, { linked, match = () => true, scene = canvas.scene } = {}) {\n const actorToken = actor.token;\n if (actorToken && match(actorToken)) {\n return actorToken;\n }\n if (!canvas.ready || !scene)\n return null;\n for (const token of actor.getDependentTokens({ linked, scenes: scene })) {\n if (token === scene.tokens.get(token.id) && match(token)) {\n return token;\n }\n }\n return null;\n}\nfunction getTargetToken(target, options) {\n if (!target)\n return undefined;\n return target.token ?? target.actor.token ?? getFirstActiveToken(target.actor, options) ?? undefined;\n}\nfunction getTargetsTokens(targets, uuid, options) {\n return R.pipe(targets, R.map((target) => {\n const token = getTargetToken(target, options);\n return uuid ? token?.uuid : token;\n }), R.filter(R.isTruthy));\n}\n/**\n * slightly modified core foundry version\n */\nasync function ping(origin, options) {\n const scene = canvas.scene;\n if (!scene)\n return false;\n // Don't allow pinging outside of the canvas bounds\n if (!canvas.dimensions.rect.contains(origin.x, origin.y))\n return false;\n // Configure the ping to be dispatched\n const types = CONFIG.Canvas.pings.types;\n const isPull = game.keyboard.isModifierActive(\"Shift\");\n const isAlert = game.keyboard.isModifierActive(\"Alt\");\n let style = types.PULSE;\n if (isPull)\n style = types.PULL;\n else if (isAlert)\n style = types.ALERT;\n let ping = { scene: scene.id, pull: isPull, style, zoom: canvas.stage.scale.x };\n ping = foundry.utils.mergeObject(ping, options);\n if (!options?.local) {\n // Broadcast the ping to other connected clients\n const activity = { cursor: origin, ping };\n game.user.broadcastActivity(activity);\n }\n // Display the ping locally\n return canvas.controls.handlePing(game.user, origin, ping);\n}\nasync function pingToken(token, local) {\n if (!canvas.ready)\n return false;\n return ping(token.center, { local });\n}\nfunction emitTokenHover(event, token, hover) {\n if (!canvas.ready)\n return;\n const tokenObj = isInstanceOf(token, \"TokenPF2e\") ? token : token.object;\n if (hover && tokenObj?.isVisible && !tokenObj.controlled) {\n tokenObj.emitHoverIn(event);\n }\n else if (!hover) {\n tokenObj?.emitHoverOut(event);\n }\n}\nfunction panToToken(token, control) {\n if (control) {\n const tokenObj = isInstanceOf(token, \"TokenPF2e\") ? token : token.object;\n tokenObj?.control({ releaseOthers: true });\n }\n canvas.animatePan(token.center);\n}\nexport { emitTokenHover, getCurrentTargets, getFirstActiveToken, getTargetsTokens, getTargetToken, getTokenDocument, isTokenObject, panToToken, ping, pingToken, positionTokenFromCoords, selectTokens, };\n", "import { R } from \".\";\nfunction getCurrentUser() {\n return game.user ?? game.data.users.find((x) => x._id === game.userId);\n}\nfunction getSelectedActor(fn = (actor) => true) {\n const selected = R.only(canvas.tokens.controlled)?.actor;\n if (selected && fn(selected)) {\n return selected;\n }\n const assigned = game.user.character;\n return assigned && fn(assigned) ? assigned : null;\n}\nfunction userIsGM(user = getCurrentUser()) {\n return user && user.role >= CONST.USER_ROLES.ASSISTANT;\n}\nfunction isPrimaryUpdater(actor) {\n return actor.primaryUpdater === game.user;\n}\nfunction primaryPlayerOwner(actor) {\n // even though we want a player, assigned users take priority\n const assigned = game.users.getDesignatedUser((user) => user.active && user.character === actor);\n return (assigned ??\n game.users.getDesignatedUser((user) => user.active && !user.isGM && actor.testUserPermission(user, \"OWNER\")));\n}\nfunction isPrimaryOwner(actor, user = game.user) {\n return user.isGM || primaryPlayerOwner(actor) === user;\n}\nfunction canObserveActor(actor, withParty = true) {\n if (!actor)\n return false;\n const user = game.user;\n if (actor.testUserPermission(user, \"OBSERVER\"))\n return true;\n return (!!withParty &&\n game.pf2e.settings.metagame.partyStats &&\n actor.parties?.some((party) => party.testUserPermission(user, \"LIMITED\")));\n}\nexport { canObserveActor, getCurrentUser, getSelectedActor, isPrimaryOwner, isPrimaryUpdater, primaryPlayerOwner, userIsGM, };\n", "import { R } from \".\";\nfunction activateHooksAndWrappers(entries) {\n for (const entry of entries) {\n entry.activate();\n }\n}\nfunction disableHooksAndWrappers(entries) {\n for (const entry of entries) {\n entry.disable();\n }\n}\nfunction toggleHooksAndWrappers(entries, enabled) {\n for (const entry of entries) {\n entry.toggle(enabled);\n }\n}\nfunction localeCompare(a, b) {\n return a.localeCompare(b, game.i18n.lang);\n}\nfunction sortByLocaleCompare(list, key) {\n list.sort((a, b) => localeCompare(a[key], b[key]));\n}\nfunction recordToSelectOptions(record) {\n return R.pipe(record, R.entries(), R.map(([value, label]) => {\n return { value, label };\n }));\n}\nfunction getDragEventData(event) {\n return foundry.applications.ux.TextEditor.implementation.getDragEventData(event);\n}\nfunction stringNumber(value) {\n return String(value);\n}\nfunction stringBoolean(value) {\n return String(value);\n}\nfunction createDuplicateMap(raw) {\n const duplicated = raw.flatMap(([_keys, entry]) => {\n const keys = R.isArray(_keys) ? _keys : [_keys];\n return keys.map((key) => [key, entry]);\n });\n return new Map(duplicated);\n}\nfunction createTargetDocuments(source) {\n const actor = source.actor ?? source.token?.actor;\n if (!actor)\n return;\n const token = source.token instanceof TokenDocument ? source.token : source.token?.document;\n return { actor, token };\n}\nexport { activateHooksAndWrappers, createDuplicateMap, createTargetDocuments, disableHooksAndWrappers, getDragEventData, localeCompare, recordToSelectOptions, sortByLocaleCompare, stringBoolean, stringNumber, toggleHooksAndWrappers, };\n", "import {\n ActorPF2e,\n ArmorPF2e,\n CharacterPF2e,\n CharacterSheetPF2e,\n ChatMessagePF2e,\n createSharedWrapper,\n NPCPF2e,\n WeaponPF2e,\n} from \"foundry-helpers\";\n\nconst sharedWeaponPrepareBaseData = createSharedWrapper, () => void, () => void>(\n \"WRAPPER\",\n \"CONFIG.PF2E.Item.documentClasses.weapon.prototype.prepareBaseData\",\n function (registered, wrapped) {\n for (const listener of registered) {\n listener();\n }\n\n wrapped();\n },\n);\n\nconst sharedArmorPrepareBaseData = createSharedWrapper, () => void, () => void>(\n \"WRAPPER\",\n \"CONFIG.PF2E.Item.documentClasses.armor.prototype.prepareBaseData\",\n function (registered, wrapped) {\n for (const listener of registered) {\n listener();\n }\n\n wrapped();\n },\n);\n\nconst sharedCharacterPrepareData = createSharedWrapper void, () => void>(\n \"WRAPPER\",\n \"CONFIG.PF2E.Actor.documentClasses.character.prototype.prepareData\",\n function (registered, wrapped) {\n wrapped();\n\n for (const listener of registered) {\n listener();\n }\n },\n);\n\nconst sharedNpcPrepareData = createSharedWrapper void, () => void>(\n \"WRAPPER\",\n \"CONFIG.PF2E.Actor.documentClasses.npc.prototype.prepareData\",\n function (registered, wrapped) {\n wrapped();\n\n for (const listener of registered) {\n listener();\n }\n },\n);\n\nconst sharedMessageRenderHTML = createSharedWrapper<\n ChatMessagePF2e,\n (...args: any[]) => Promise,\n (html: HTMLElement) => Promise\n>(\"WRAPPER\", \"ChatMessage.prototype.renderHTML\", async function (registered, wrapped, _args) {\n const html = await wrapped();\n await Promise.all(registered.map((listener) => listener(html)));\n return html;\n});\n\nconst sharedCharacterSheetActivateListeners = createSharedWrapper<\n CharacterSheetPF2e,\n ($html: JQuery) => void,\n (html: HTMLElement) => void\n>(\n \"WRAPPER\",\n \"CONFIG.Actor.sheetClasses.character['pf2e.CharacterSheetPF2e'].cls.prototype.activateListeners\",\n function (registered, wrapped, [$html]) {\n wrapped();\n\n const html = $html[0];\n\n for (const listener of registered) {\n listener(html);\n }\n },\n);\n\nexport {\n sharedArmorPrepareBaseData,\n sharedCharacterPrepareData,\n sharedCharacterSheetActivateListeners,\n sharedMessageRenderHTML,\n sharedNpcPrepareData,\n sharedWeaponPrepareBaseData,\n};\n", "import {\n ActionCost,\n ActorPF2e,\n createFormData,\n enrichHTML,\n getActionGlyph,\n getPreferredName,\n PhysicalItemPF2e,\n R,\n SYSTEM,\n} from \"foundry-helpers\";\n\nasync function createTradeMessage({\n cost,\n item,\n message,\n quantity,\n source,\n subtitle,\n target,\n userId,\n}: TradeMessageOptions) {\n const sourceName = getPreferredName(source);\n const targetName = target ? getPreferredName(target) : \"\";\n\n const formattedMessageData = {\n source: sourceName,\n target: targetName,\n seller: sourceName,\n buyer: targetName,\n quantity: quantity ?? 1,\n item: await enrichHTML(item.link),\n };\n\n const glyph = getActionGlyph(cost ?? (source.isOfType(\"loot\") && target?.isOfType(\"loot\") ? 2 : 1));\n\n const flavor = await foundry.applications.handlebars.renderTemplate(\n SYSTEM.relativePath(\"templates/chat/action/flavor.hbs\"),\n {\n action: { title: \"PF2E.Actions.Interact.Title\", subtitle, glyph },\n traits: [\n {\n name: \"manipulate\",\n label: CONFIG.PF2E.featTraits.manipulate,\n description: CONFIG.PF2E.traitsDescriptions.manipulate,\n },\n ],\n },\n );\n\n const content = await foundry.applications.handlebars.renderTemplate(\n SYSTEM.relativePath(\"templates/chat/action/content.hbs\"),\n {\n imgPath: item.img,\n message: game.i18n.format(message, formattedMessageData).replace(/\\b1 \u00D7 /, \"\"),\n },\n );\n\n return getDocumentClass(\"ChatMessage\").create({\n author: userId ?? game.userId,\n speaker: { alias: sourceName },\n style: CONST.CHAT_MESSAGE_STYLES.EMOTE,\n flavor,\n content,\n });\n}\n\nasync function createTradeQuantityDialog(options: TradeQuantityDialogOptions): Promise {\n const data = {\n ...options,\n maxQuantity: options.maxQuantity ?? options.item.quantity,\n mode: R.isBoolean(options.lockStack) ? \"\" : \"gift\",\n quantity: options.quantity ?? options.item.quantity,\n rootId: \"item-transfer-dialog\",\n };\n\n const content = await foundry.applications.handlebars.renderTemplate(\n SYSTEM.relativePath(\"templates/popups/item-transfer-dialog.hbs\"),\n data,\n );\n\n return new Promise((resolve) => {\n foundry.applications.api.DialogV2.wait({\n buttons: [\n {\n ...options.button,\n type: \"submit\",\n callback: (_event, _button, dialog) => {\n const data = createFormData(dialog.element) as TradeQuantityDialogData;\n resolve(data);\n },\n },\n ],\n content,\n id: \"item-transfer-dialog\",\n position: {\n width: 450,\n },\n window: {\n icon: options.button.icon,\n contentClasses: [\"standard-form\"],\n title: options.title,\n },\n close: () => {\n resolve(null);\n },\n });\n });\n}\n\nfunction lineIntersect(origin: Point, target: Point, debug: boolean): boolean {\n const intersects = CONFIG.Canvas.polygonBackends.move.testCollision(origin, target, { type: \"move\", mode: \"any\" });\n\n if (debug) {\n drawDebugLine(origin, target, intersects ? \"red\" : \"green\");\n }\n\n return intersects;\n}\n\nfunction drawDebugLine(origin: Point, target: Point, color: \"blue\" | \"green\" | \"red\") {\n const hex = color === \"blue\" ? 0x0066cc : color === \"red\" ? 0xff0000 : 0x16a103;\n canvas.controls.debug.lineStyle(4, hex).moveTo(origin.x, origin.y).lineTo(target.x, target.y);\n}\n\ntype TradeQuantityDialogOptions = {\n button: {\n action: string;\n icon: string;\n label: string;\n };\n item: PhysicalItemPF2e;\n lockStack?: boolean;\n maxQuantity?: number;\n prompt: string;\n quantity?: number;\n targetActor?: ActorPF2e;\n title: string;\n};\n\ntype TradeQuantityDialogData = {\n quantity: number;\n newStack?: boolean;\n};\n\ntype TradeMessageOptions = {\n /** localization key */\n cost?: string | number | null | ActionCost;\n item: PhysicalItemPF2e;\n message: string;\n quantity?: number;\n source: ActorPF2e;\n subtitle: string;\n target?: ActorPF2e;\n userId?: string;\n};\n\nexport { createTradeMessage, createTradeQuantityDialog, drawDebugLine, lineIntersect };\nexport type { TradeMessageOptions, TradeQuantityDialogData };\n", "import {\n AbilityItemPF2e,\n AbilityViewData,\n getActionGlyph,\n R,\n traitSlugToObject,\n ImageFilePath,\n CharacterSheetData,\n FeatPF2e,\n ActorGroupUpdate,\n ActorPF2e,\n} from \"foundry-helpers\";\nimport { getActionIcon } from \"foundry-helpers/dist\";\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/e215ebfbb287190d313fe0441e0362439766786d/src/module/actor/sheet/helpers.ts#L67-L79\n */\nfunction createAbilityViewData(item: AbilityItemPF2e | FeatPF2e): AbilityViewData {\n return {\n ...R.pick(item, [\"id\", \"uuid\", \"img\", \"name\", \"actionCost\", \"frequency\"]),\n glyph: getActionGlyph(item.actionCost),\n usable: !!item.system.selfEffect || !!item.system?.frequency || !!item.crafting,\n traits: item.system.traits.value.map((t) => traitSlugToObject(t, CONFIG.PF2E.actionTraits)),\n has: {\n aura: item.traits.has(\"aura\") || item.system.rules.some((r) => r.key === \"Aura\"),\n deathNote: item.isOfType(\"action\") && item.system.deathNote,\n selfEffect: !!item.system.selfEffect,\n },\n };\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/e215ebfbb287190d313fe0441e0362439766786d/src/module/actor/character/sheet.ts#L434\n */\nfunction getActionSheetData(item: AbilityItemPF2e | FeatPF2e): CharacterAbilityViewData {\n const baseData = createAbilityViewData(item);\n\n return {\n ...baseData,\n img: ((): ImageFilePath => {\n const actionIcon = getActionIcon(item.actionCost);\n const defaultIcon = getDocumentClass(\"Item\").getDefaultArtwork(item._source).img;\n const commonFeatIcon = \"icons/sundries/books/book-red-exclamation.webp\";\n const isDefaultImage = [actionIcon, defaultIcon, commonFeatIcon].includes(item.img);\n if (item.isOfType(\"action\") && !isDefaultImage) {\n return item.img;\n }\n return item.system.selfEffect?.img ?? (baseData.usable && !isDefaultImage ? item.img : actionIcon);\n })(),\n feat: item.isOfType(\"feat\") ? item : null,\n toggles: item.system.traits.toggles?.getSheetData() ?? [],\n };\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/e215ebfbb287190d313fe0441e0362439766786d/src/module/actor/helpers.ts#L1002\n */\nasync function applyActorGroupUpdate(\n actor: ActorPF2e,\n data: Partial,\n { render = true, keepId }: { render?: boolean; keepId?: boolean } = {},\n): Promise {\n const actorUpdates = data.actorUpdates && !R.isEmpty(data.actorUpdates) ? data.actorUpdates : null;\n const itemCreates = data.itemCreates ?? [];\n const itemUpdates = data.itemUpdates ?? [];\n const itemDeletes = data.itemDeletes ?? [];\n\n // Determine which one is last so that we cause the re-render then\n // If we manually re-render, other users will fail to re-render\n const lastRender = !render\n ? null\n : itemDeletes.length\n ? \"delete\"\n : itemUpdates.length\n ? \"update\"\n : itemCreates.length\n ? \"create\"\n : \"actorUpdate\";\n\n if (actorUpdates) {\n await actor.update(actorUpdates, { render: lastRender === \"actorUpdate\" });\n }\n if (itemCreates.length > 0) {\n await actor.createEmbeddedDocuments(\"Item\", itemCreates, { render: lastRender === \"create\", keepId });\n }\n if (itemUpdates.length > 0) {\n await actor.updateEmbeddedDocuments(\"Item\", itemUpdates, { render: lastRender === \"update\" });\n }\n if (itemDeletes.length > 0) {\n await actor.deleteEmbeddedDocuments(\"Item\", itemDeletes, { render: lastRender === \"delete\" });\n }\n}\n\ntype CharacterAbilityViewData = CharacterSheetData[\"actions\"][\"encounter\"][\"action\"][\"actions\"][number];\n\nexport { applyActorGroupUpdate, getActionSheetData };\n", "import { Localize } from \"foundry-helpers\";\nimport { ModuleTool } from \"module-tool\";\n\nabstract class ModuleToolApplication extends foundry.applications.api.ApplicationV2 {\n #localize?: Localize;\n #tool: TTool;\n\n constructor(tool: TTool, options: DeepPartial = {}) {\n super(options);\n\n this.#tool = tool;\n }\n\n abstract get key(): string;\n\n get tool(): TTool {\n return this.#tool;\n }\n\n get title(): string {\n return this.localize(\"title\");\n }\n\n get toolKey(): string {\n return this.tool.key;\n }\n\n get settings(): TTool[\"settings\"] {\n return this.tool.settings;\n }\n\n get localize(): Localize {\n return (this.#localize ??= this.tool.localize.sub(this.key));\n }\n\n path(...path: string[]): string {\n return this.tool.path(this.key, ...path);\n }\n\n templatePath(...path: string[]): string {\n return this.tool.templatePath(this.key, ...path);\n }\n\n protected _renderHTML(context: fa.ApplicationRenderContext, options: fa.ApplicationRenderOptions): Promise {\n return this.tool.render(this.key, context);\n }\n\n protected _replaceHTML(result: string, content: HTMLElement, options: fa.ApplicationRenderOptions): void {\n content.innerHTML = result;\n content.dataset.tooltipDirection = \"UP\";\n content.dataset.tooltipClass = \"pf2e\";\n\n this._activateListeners(content);\n }\n\n protected _activateListeners(html: HTMLElement) {}\n}\n\nexport { ModuleToolApplication };\n", "import {\n AttributeString,\n CharacterPF2e,\n CompendiumIndexData,\n htmlClosest,\n htmlQuery,\n htmlQueryAll,\n ImageFilePath,\n ItemPF2e,\n ItemUUID,\n MagicTradition,\n OneToTen,\n PhysicalItemPF2e,\n R,\n ROMAN_RANKS,\n} from \"foundry-helpers\";\nimport { ModuleToolApplication } from \"module-tool-application\";\nimport {\n ActionableTool,\n generateItemCastRuleSource,\n ItemCastRuleElement,\n ItemCastRuleSource,\n ItemCastRuleSourceData,\n} from \"..\";\n\nconst ITEM_CAST_REGEX =\n /
]+data-type=\"Item\")(?=[^>]+data-uuid=\"([a-z0-9\\.-]+)\").+?>.+?<\\/a>(?:<\\/em>)?/gim;\nconst ITEM_CAST_DC_REGEX = /^[^<]+dc (\\d+)/im;\nconst ITEM_CAST_RANK_REGEX = /^[^<]+heightened to (\\d+)/im;\n\nclass GenerateItemCast extends ModuleToolApplication {\n #data: Record = {};\n #item: PhysicalItemPF2e;\n\n static DEFAULT_OPTIONS: DeepPartial = {\n classes: [\"pf2e-toolbelt-actionable-generate-cast\"],\n // tag: \"form\",\n };\n\n constructor(\n item: PhysicalItemPF2e,\n tool: ActionableTool,\n options?: DeepPartial,\n ) {\n super(tool, options);\n this.#item = item;\n }\n\n get key(): string {\n return \"generate-cast\";\n }\n\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\n const item = this.#item;\n const description = (await item.getDescription()).value;\n\n let match: RegExpExecArray | null = null;\n\n const spells: GenerateItemCastData[] = [];\n const existingUUIDs = R.pipe(\n item.rules,\n R.filter((rule): rule is ItemCastRuleElement => {\n return rule.key === \"ItemCast\" && R.isString((rule as ItemCastRuleElement).uuid);\n }),\n R.map(({ uuid }) => uuid),\n );\n\n while ((match = ITEM_CAST_REGEX.exec(description))) {\n const uuid = match[1] as ItemUUID;\n if (existingUUIDs.includes(uuid)) continue;\n\n const item = fromUuidSync(uuid, { strict: false });\n if (item?.type !== \"spell\") continue;\n\n const index = match.index + match[0].length;\n const segment = description.slice(index);\n const savedData = this.#data[uuid];\n\n const data: GenerateItemCastData = {\n ...savedData,\n img: item.img,\n name: item.name,\n uuid,\n };\n\n if (!data.dc) {\n const dcRaw = ITEM_CAST_DC_REGEX.exec(segment)?.[1];\n data.dc = dcRaw ? Number(dcRaw) : undefined;\n }\n\n if (!data.rank) {\n const rankRaw = ITEM_CAST_RANK_REGEX.exec(segment)?.[1];\n data.rank = rankRaw ? (Number(rankRaw) as OneToTen) : undefined;\n }\n\n spells.push(data);\n }\n\n return {\n attributes: R.pick(CONFIG.PF2E.abilities, [\"cha\", \"int\", \"wis\"]),\n ranks: ROMAN_RANKS,\n spells,\n traditions: CONFIG.PF2E.magicTraditions,\n };\n }\n\n protected _onClickAction(_event: PointerEvent, target: HTMLElement) {\n const action = target.dataset.action as EventAction;\n const parent = htmlClosest(target, \"[data-uuid]\");\n if (!parent) return;\n\n switch (action) {\n case \"add-rule\":\n return this.#addRule(parent);\n }\n }\n\n generateRuleData(target: HTMLElement): ItemCastRuleSourceData {\n return {\n attribute: getValueFromSelect(target, \"attribute\"),\n dc: getValueFromInputNumber(target, \"dc\"),\n max: getValueFromInputNumber(target, \"max\"),\n predicate: getPredicateFromInput(target),\n rank: (Number(getValueFromSelect(target, \"rank\")) || undefined) as OneToTen | undefined,\n recharge: htmlQuery(target, `[name=\"recharge\"]`)?.checked,\n statistic: getValueFromInputText(target, \"statistic\"),\n tradition: getValueFromSelect(target, \"tradition\"),\n };\n }\n\n async #addRule(target: HTMLElement) {\n const uuid = target.dataset.uuid as ItemUUID;\n const item = await fromUuid(uuid);\n if (!item?.isOfType(\"spell\")) return;\n\n this.#data = R.pipe(\n htmlQueryAll(this.element, \".window-content .spell\"),\n R.map((el) => [el.dataset.uuid as ItemUUID, this.generateRuleData(el)] as const),\n R.fromEntries(),\n ) as Record;\n\n const rules = this.#item._source.system.rules.slice() as ItemCastRuleSource[];\n const rule = generateItemCastRuleSource(item, this.#data[uuid]);\n\n rules.push(rule);\n\n delete this.#data[uuid];\n\n await this.#item.update({ \"system.rules\": rules });\n this.render();\n }\n}\n\nfunction getPredicateFromInput(target: HTMLElement): readonly unknown[] {\n try {\n const rawPredicate = getValueFromInputText(target, \"predicate\");\n if (!rawPredicate) return [];\n\n const parsed = JSON.parse(rawPredicate);\n return R.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction getValueFromInputText(target: HTMLElement, name: \"predicate\" | \"statistic\"): string | undefined {\n const input = htmlQuery(target, `[name=\"${name}\"]`);\n return input?.value.trim() || undefined;\n}\n\nfunction getValueFromInputNumber(target: HTMLElement, name: \"dc\" | \"max\"): number | undefined {\n const input = htmlQuery(target, `[name=\"${name}\"]`);\n return input?.valueAsNumber || undefined;\n}\n\nfunction getValueFromSelect(\n target: HTMLElement,\n name: \"attribute\" | \"rank\" | \"statistic\" | \"tradition\",\n): Exclude | undefined {\n const select = htmlQuery(target, `[name=\"${name}\"]`);\n return (select?.value.trim() || undefined) as Exclude | undefined;\n}\n\ntype EventAction = \"add-rule\";\n\ntype GenerateItemCastContext = fa.ApplicationRenderContext & {\n attributes: Pick;\n ranks: typeof ROMAN_RANKS;\n spells: GenerateItemCastData[];\n traditions: typeof CONFIG.PF2E.magicTraditions;\n};\n\ntype GenerateItemCastData = Prettify & {\n img: ImageFilePath;\n name: string;\n uuid: ItemUUID;\n};\n\nexport { GenerateItemCast };\n", "import {\n AttributeString,\n CastOptions,\n CharacterPF2e,\n MagicTradition,\n OneToTen,\n PhysicalItemPF2e,\n Predicate,\n SpellcastingEntry,\n SpellcastingSheetData,\n SpellcastingSlotGroup,\n SpellCollection,\n SpellCollectionData,\n SpellPF2e,\n Statistic,\n} from \"foundry-helpers\";\nimport { createCounteractStatistic, ordinalString, R } from \"foundry-helpers/dist\";\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/522dec9d289c7da8b69ac0167b11ccd639871fef/src/module/item/spellcasting-entry/item-spellcasting.ts#L13\n */\nclass ItemCastSpellcasting implements SpellcastingEntry {\n id: string;\n\n name: string;\n\n actor: CharacterPF2e;\n\n statistic: Statistic;\n\n tradition: MagicTradition | null;\n\n original: SpellcastingEntry | null;\n\n castPredicate: Predicate;\n\n constructor({\n id,\n name,\n actor,\n statistic,\n tradition,\n original,\n castPredicate,\n }: {\n id: string;\n name: string;\n actor: CharacterPF2e;\n statistic: Statistic;\n tradition: Maybe;\n original: Maybe>;\n castPredicate: Predicate;\n }) {\n this.id = id;\n this.name = name;\n this.actor = actor;\n this.statistic = statistic;\n this.tradition = tradition ?? null;\n this.original = original ?? null;\n this.castPredicate = castPredicate;\n }\n\n get counteraction(): Statistic {\n return createCounteractStatistic(this);\n }\n\n get attribute(): AttributeString {\n return this.statistic.attribute ?? \"cha\";\n }\n\n get category(): \"items\" {\n return \"items\";\n }\n\n get sort(): number {\n return Math.max(0, ...this.actor.itemTypes.spellcastingEntry.map((e) => e.sort)) + 10;\n }\n\n get spells(): null {\n return null;\n }\n\n get isFlexible(): false {\n return false;\n }\n\n get isFocusPool(): false {\n return false;\n }\n\n get isEphemeral(): true {\n return true;\n }\n\n get isVirtual(): true {\n return true;\n }\n\n canCast(spell: SpellPF2e, { origin }: { origin?: Maybe } = {}): boolean {\n if (!origin || !spell.actor?.isOfType(\"character\")) return false;\n const rollOptions = new Set([\n ...this.actor.getRollOptions(),\n ...origin.getRollOptions(\"item\"),\n ...spell.getRollOptions(\"spell\", { includeVariants: true }),\n ]);\n return this.castPredicate.test(rollOptions);\n }\n\n async cast(spell: SpellPF2e, options: CastOptions = {}): Promise {\n const message = options.message ?? true;\n if (message && this.canCast(spell, { origin: spell.parentItem })) {\n spell.system.location.value = this.id;\n await spell.toMessage(null, { rollMode: options.rollMode, data: { castRank: spell.rank } });\n }\n }\n\n async getSheetData({ spells }: { spells?: SpellCollection } = {}): Promise {\n const collectionData = spells ? this.#getEphemeralData(spells) : { groups: [], prepList: null };\n\n return {\n ...R.pick(this, [\"category\", \"tradition\", \"sort\", \"isFlexible\", \"isFocusPool\", \"isEphemeral\", \"isVirtual\"]),\n ...collectionData,\n id: spells?.id ?? this.id,\n name: spells?.name ?? this.name,\n statistic: this.statistic.getChatData(),\n attribute: this.statistic.attribute,\n hasCollection: !!spells?.size,\n usesSpellProficiency: false,\n };\n }\n\n /**\n * modified version of\n * https://github.com/foundryvtt/pf2e/blob/a83c14115be999c773bee2c05c59348adf631650/src/module/item/spellcasting-entry/collection.ts#L310\n * to handle cantrips\n */\n #getEphemeralData(collection: SpellCollection): SpellCollectionData {\n const groupedByRank = R.groupBy(Array.from(collection.values()), (s) => s.rank);\n const groups = R.entries(groupedByRank)\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([rankStr, [spell]]): SpellcastingSlotGroup => {\n const rank = spell.isCantrip && !spell.system.location.autoHeightenLevel ? 0 : Number(rankStr);\n const label =\n rank === 0\n ? \"PF2E.Actor.Creature.Spellcasting.Cantrips\"\n : game.i18n.format(\"PF2E.Item.Spell.Rank.Ordinal\", { rank: ordinalString(rank) });\n\n return {\n id: rank === 0 ? \"cantrips\" : (rank as OneToTen),\n label,\n maxRank: 10,\n active: [{ spell, expended: spell.parentItem?.uses.value === 0 }],\n };\n });\n\n return { groups, prepList: null };\n }\n}\n\nexport { ItemCastSpellcasting };\n", "import {\n CharacterPF2e,\n getRuleElementCls,\n itemIsEquipped,\n ItemPF2e,\n ItemSourcePF2e,\n ModelPropsFromRESchema,\n PhysicalItemPF2e,\n R,\n RuleElement,\n RuleElementOptions,\n RuleElementSource,\n} from \"foundry-helpers\";\nimport { SourceFromSchema } from \"foundry-helpers/src\";\nimport { actionable } from \"..\";\n\nfunction createActionableRuleElement() {\n class ActionableRuleElement extends getRuleElementCls() {\n constructor(data: ActionableSource, options: RuleElementOptions) {\n data.priority ??= 99;\n data.requiresEquipped = false;\n data.requiresInvestment = false;\n\n super(data, options);\n\n if (!this.item.isOfType(\"physical\")) {\n this.failValidation(\"parent item must be physical\");\n }\n\n const uuid = this.resolveInjectedProperties(this.uuid);\n const type = fromUuidSync(uuid, { strict: false })?.type;\n if (!R.isIncludedIn(type, [\"action\", \"feat\"])) {\n this.failValidation(\"uuid must be a valid encounter action source uuid\");\n }\n }\n\n static override defineSchema(): ActionableSchema {\n const fields = foundry.data.fields;\n return {\n ...super.defineSchema(),\n data: new fields.ObjectField(),\n uuid: new fields.DocumentUUIDField({\n required: true,\n nullable: false,\n label: \"PF2E.UUID.Label\",\n type: \"Item\",\n }),\n };\n }\n\n override async preUpdateActor(): Promise<{ create: ItemSourcePF2e[]; delete: string[] }> {\n return { create: [], delete: [] };\n }\n\n override onApplyActiveEffects() {\n if (this.invalid || !this.actor.isOfType(\"character\")) return;\n\n if (!this.data.id || this.data.sourceId !== this.uuid) {\n return this.#setData();\n }\n\n if (this.test()) {\n actionable.setInMemory(this.actor, \"virtual\", this.data.id, {\n data: this.data,\n parent: this.item,\n ruleIndex: this.sourceIndex as number,\n });\n }\n }\n\n test(rollOptions?: string[] | Set | undefined): boolean {\n return super.test(rollOptions) && itemIsEquipped(this.item);\n }\n\n updateData(changes: ActionableUpdateDataArgs, sourceOnly: true): EmbeddedDocumentUpdateData | undefined;\n updateData(\n changes: ActionableUpdateDataArgs,\n sourceOnly?: boolean,\n ): Promise | undefined> | undefined;\n updateData(\n changes: ActionableUpdateDataArgs,\n sourceOnly?: boolean,\n ): EmbeddedDocumentUpdateData | Promise | undefined> | undefined {\n const item = this.item;\n const sourceIndex = this.sourceIndex ?? -1;\n const rules = foundry.utils.deepClone(item._source.system.rules);\n const rule = rules[sourceIndex] as DeepPartial | undefined;\n if (!rule?.data) return;\n\n foundry.utils.mergeObject(rule.data, changes);\n\n if (sourceOnly) {\n const parentItem = item.parentItem;\n if (parentItem) {\n const subitems = foundry.utils.deepClone(parentItem._source.system.subitems);\n const subitem = subitems?.find((i) => i._id === item.id);\n\n if (subitem) {\n subitem.system.rules = rules;\n }\n\n return { _id: parentItem.id, \"system.subitems\": subitems };\n } else {\n return { _id: item.id, \"system.rules\": rules };\n }\n } else {\n return item.update({ \"system.rules\": rules });\n }\n }\n\n static async setData(parent: PhysicalItemPF2e, source: RuleElementSource): Promise {\n try {\n const rule = new ActionableRuleElement(source, { parent });\n\n const data: ActionableData = ((source as ActionableRuleSource).data = {\n id: foundry.utils.randomID(),\n sourceId: rule.uuid,\n });\n\n await rule.setDataFrequency(data);\n } catch (error: any) {}\n }\n\n async setDataFrequency(data: DeepPartial) {\n const action = await fromUuid(this.uuid);\n\n if (action?.isOfType(\"action\", \"feat\") && action.frequency) {\n data.frequency = action.frequency.max;\n } else {\n delete data.frequency;\n }\n }\n\n async #setData() {\n const sourceIndex = this.sourceIndex ?? -1;\n if (sourceIndex < 0) return;\n\n const rules = foundry.utils.deepClone(this.item._source.system.rules);\n const rule = rules[sourceIndex] as DeepPartial | undefined;\n if (!rule) return;\n\n rule.data ??= {};\n rule.data.id ??= foundry.utils.randomID();\n rule.data.sourceId = this.uuid;\n await this.setDataFrequency(rule.data);\n\n await this.item.update({ \"system.rules\": rules });\n }\n }\n\n interface ActionableRuleElement extends RuleElement, ModelPropsFromRESchema {\n get actor(): CharacterPF2e;\n get item(): PhysicalItemPF2e;\n }\n\n return ActionableRuleElement;\n}\n\ninterface ActionableSource extends RuleElementSource {\n data?: unknown;\n uuid?: unknown;\n}\n\ntype ActionableRuleSource = SourceFromSchema;\ntype ActionableSchema = toolbelt.actionable.ActionableSchema;\ntype ActionableData = toolbelt.actionable.ActionableData;\ntype VirtualActionData = toolbelt.actionable.VirtualActionData;\ntype ActionableRuleElement = toolbelt.actionable.ActionableRuleElement;\ntype ActionableUpdateDataArgs = toolbelt.actionable.ActionableRuleElement;\n\nexport { createActionableRuleElement };\nexport type { ActionableData, ActionableRuleElement, ActionableRuleSource, VirtualActionData };\n", "import { GamePF2e } from \"@7h3laughingman/pf2e-types\";\nimport { ClientDocument, CompendiumCollection, DocumentUUID, R } from \".\";\nimport { CompendiumUUID } from \"@7h3laughingman/foundry-types/client/utils/_module.mjs\";\nimport {\n ActorUUID,\n CompendiumDocument,\n ItemUUID,\n TokenDocumentUUID,\n} from \"@7h3laughingman/foundry-types/client/documents/_module.mjs\";\n\nclass SYSTEM {\n static get id(): SystemId {\n return game.system.id as SystemId;\n }\n\n static get oppositeId(): SystemId {\n return this.id === \"pf2e\" ? \"sf2e\" : \"pf2e\";\n }\n\n static get anachronismId(): `${SystemId}-anachronism` {\n return `${this.oppositeId}-anachronism`;\n }\n\n static get isPF2e(): boolean {\n return this.id === \"pf2e\";\n }\n\n static get isSF2e(): boolean {\n return this.id === \"sf2e\";\n }\n\n static get isPathfinder(): boolean {\n return R.isIncludedIn(this.id, [\"pf2e\", \"sf2e\"]);\n }\n\n static relativePath(tail: T): `systems/${SystemId}/${T}`;\n static relativePath(...path: string[]): string;\n static relativePath(...path: string[]) {\n const tail = R.join(path, \"/\");\n return `systems/${this.id}/${tail}`;\n }\n\n static path(tail: T): () => `systems/${SystemId}/${T}`;\n static path(...path: string[]): () => string;\n static path(...path: string[]) {\n return () => this.relativePath(...path);\n }\n\n static uuid

(pf2e: P, sf2e: P): () => P {\n return (): P => {\n return this.isSF2e ? sf2e : pf2e;\n };\n }\n\n static itemUuid(pf2e: ItemUUID, sf2e: ItemUUID): () => ItemUUID {\n return (): ItemUUID => {\n return this.isSF2e ? sf2e : pf2e;\n };\n }\n\n static uuids

(entries: [pf2e: P, sf2e: P][]): () => P[] {\n return (): P[] => {\n const index = this.isSF2e ? 1 : 0;\n return entries.map((entry) => entry[index]);\n };\n }\n\n static fromUuid(uuid: () => CompendiumUUID): Promise;\n static fromUuid(uuid: () => ActorUUID): Promise;\n static fromUuid(uuid: () => ItemUUID): Promise;\n static fromUuid(uuid: () => TokenDocumentUUID): Promise;\n static fromUuid(uuid: () => DocumentUUID): Promise;\n static fromUuid(uuid: () => DocumentUUID): Promise {\n const singleUuid = uuid();\n return fromUuid(singleUuid);\n }\n\n static pack(pf2e: string, sf2e: string): () => CompendiumCollection | undefined {\n return () => {\n return this.getPack(pf2e, sf2e);\n };\n }\n\n static sluggify(text: string, options?: { camel?: SlugCamel }): string {\n return game.pf2e.system.sluggify(text, options);\n }\n\n static getPack(pf2e: string, sf2e: string): CompendiumCollection | undefined {\n const name = this.isSF2e ? sf2e : pf2e;\n return game.packs.get(name);\n }\n\n static getSystemPack(name: string): CompendiumCollection | undefined {\n return game.packs.get(`${this.id}.${name}`);\n }\n\n static getAnachronismPack(name: string): CompendiumCollection | undefined {\n return game.packs.get(`${this.anachronismId}.${name}`);\n }\n}\n\ntype SlugCamel = \"dromedary\" | \"bactrian\" | null;\n\ntype PackCollection = GamePF2e[\"packs\"] extends Collection ? T : never;\ntype PackContent = PackCollection extends CompendiumCollection ? T : never;\n\nexport { SYSTEM };\nexport type { SlugCamel };\n", "import { ImageFileExtension } from \"@7h3laughingman/foundry-types/common/constants.mjs\";\nimport { getSetting, ImageFilePath, localize, Module, R } from \".\";\n\nclass CustomModule {\n #api: Record = {};\n #current?: Module;\n #debug: Record = {};\n #globalName: string = \"\";\n #group: string | boolean = false;\n #id?: string;\n\n get id(): string {\n if (!this.#id) {\n throw new Error(\"Module needs to be registered.\");\n }\n return this.#id;\n }\n\n get current(): Module {\n return (this.#current ??= game.modules.get(this.id) as Module);\n }\n\n get name(): string {\n return this.current.title;\n }\n\n get isDebug(): boolean {\n return foundry.utils.getProperty(CONFIG, `debug.${this.id}`) === true;\n }\n\n register(id: string, globalName?: string) {\n if (this.#id) {\n throw new Error(\"Module was already registered.\");\n }\n\n this.#id = id;\n this.#globalName = globalName || id.replace(/^pf2e-/, \"\").replace(/-(\\w)/g, (_, c) => c.toUpperCase());\n\n Hooks.once(\"init\", () => {\n const self = this;\n const context = {};\n\n Object.defineProperties(context, {\n active: {\n get(): boolean {\n return self.current.active;\n },\n configurable: false,\n enumerable: false,\n },\n api: {\n get() {\n return self.#api;\n },\n configurable: false,\n enumerable: false,\n },\n debug: {\n get() {\n return self.isDebug ? self.#debug : undefined;\n },\n configurable: false,\n enumerable: false,\n },\n getSetting: {\n value: function (setting: string): unknown {\n return getSetting(setting);\n },\n writable: false,\n configurable: false,\n enumerable: false,\n },\n localize: {\n value: localize.sub(id),\n configurable: false,\n enumerable: false,\n writable: false,\n },\n });\n\n Object.defineProperty(game, this.#globalName, {\n value: context,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n });\n }\n\n group(label: string) {\n this.groupEnd();\n this.#group = label;\n }\n\n groupEnd() {\n console.groupEnd();\n this.#group = false;\n }\n\n log(...args: any[]) {\n if (R.isString(this.#group)) {\n console.group(`[${this.name}] ${this.#group}`);\n this.#group = true;\n }\n\n if (this.#group) {\n console.log(...args);\n } else {\n console.log(`[${this.name}]`, ...args);\n }\n }\n\n debug(...args: any[]) {\n if (this.isDebug) {\n this.log(...args);\n }\n }\n\n globalPath(...path: string[]): string {\n const joined = R.join(path, \".\");\n return joined ? `${this.#globalName}.${joined}` : `${this.#globalName}`;\n }\n\n path(...path: string[]): string {\n const joined = R.join(path, \".\");\n return joined ? `${this.id}.${joined}` : `${this.id}`;\n }\n\n relativePath(...path: string[]): string {\n const tail = R.join(path, \"/\");\n return `modules/${this.id}/${tail}`;\n }\n\n imagePath(...path: [...string[], ImageFileExtension]): ImageFilePath {\n const ext = path.pop() as ImageFileExtension;\n const root = this.relativePath(\"images\", ...path);\n return `${root}.${ext}`;\n }\n\n templatePath(...path: string[]): `${string}.hbs` {\n const root = this.relativePath(\"templates\", ...path);\n return `${root}.hbs`;\n }\n\n Error(str: string): Error {\n return new Error(`\\n[${this.name}] ${str}`);\n }\n\n error(str: string, error?: Error) {\n let message = `[${this.name}] ${str}`;\n\n if (error instanceof Error) {\n message += `\\n${error.message}`;\n } else if (typeof error === \"string\") {\n message += `\\n${error}`;\n }\n\n console.error(message);\n }\n\n apiExpose(key: string, toExpose: Record | Function) {\n if (foundry.utils.hasProperty(this.#api, key)) {\n throw this.Error(`the api key was already defined: ${key}`);\n }\n\n const exposed = R.isObjectType(toExpose) ? foundry.utils.deepClone(toExpose) : toExpose;\n\n Object.freeze(exposed);\n Object.defineProperty(this.#api, key, {\n value: exposed,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n }\n\n debugExpose(key: string, toExpose: any) {\n if (foundry.utils.hasProperty(this.#debug, key)) {\n throw this.Error(`the debug key was already defined: ${key}`);\n }\n\n const exposed = foundry.utils.deepClone(toExpose);\n\n Object.freeze(exposed);\n Object.defineProperty(this.#debug, key, {\n value: exposed,\n configurable: false,\n enumerable: false,\n writable: false,\n });\n }\n}\n\nfunction getActiveModule(key: string): ActiveModule | undefined {\n const module = game.modules.get(key);\n if (!module?.active) return;\n\n return {\n ...module,\n getSetting(...path: string[]) {\n return game.settings.get(module.id, R.join(path, \".\")) as T;\n },\n } as ActiveModule;\n}\n\nconst MODULE = new CustomModule();\n\ntype ExtendedModule = TModule & {\n getSetting(key: string): T;\n setSetting(key: string, value: T): Promise;\n};\n\ntype ActiveModule = Module & {\n getSetting(...path: string[]): T;\n};\n\nexport { getActiveModule, MODULE };\nexport type { ExtendedModule };\n", "import { AbilityItemPF2e, ActionCost, ActorPF2e, EffectPF2e, EffectSource, FeatPF2e } from \"@7h3laughingman/pf2e-types\";\r\nimport { ImageFilePath, R, SYSTEM } from \".\";\r\n\r\n/**\r\n * https://github.com/foundryvtt/pf2e/blob/37b0dcab08141b3e9e4e0f44e51df9f4dfd52a71/src/util/misc.ts#L160C1-L171C3\r\n */\r\nconst actionImgMap = R.mapValues(\r\n {\r\n 0: \"icons/actions/FreeAction.webp\",\r\n free: \"icons/actions/FreeAction.webp\",\r\n 1: \"icons/actions/OneAction.webp\",\r\n 2: \"icons/actions/TwoActions.webp\",\r\n 3: \"icons/actions/ThreeActions.webp\",\r\n \"1 or 2\": \"icons/actions/OneTwoActions.webp\",\r\n \"1 to 3\": \"icons/actions/OneThreeActions.webp\",\r\n \"2 or 3\": \"icons/actions/TwoThreeActions.webp\",\r\n reaction: \"icons/actions/Reaction.webp\",\r\n passive: \"icons/actions/Passive.webp\",\r\n },\r\n (tail) => SYSTEM.path(tail),\r\n) as Record ImageFilePath>;\r\n\r\n/**\r\n * https://github.com/foundryvtt/pf2e/blob/89892b6fafec1456a0358de8c6d7b102e3fe2da2/src/util/misc.ts#L188C1-L199C3\r\n */\r\nconst actionGlyphMap: Record = {\r\n 0: \"F\",\r\n free: \"F\",\r\n 1: \"1\",\r\n 2: \"2\",\r\n 3: \"3\",\r\n \"1 or 2\": \"1/2\",\r\n \"1 to 3\": \"1 - 3\",\r\n \"2 or 3\": \"2/3\",\r\n \"2 rounds\": \"3,3\",\r\n reaction: \"R\",\r\n};\r\n\r\n/**\r\n * https://github.com/foundryvtt/pf2e/blob/6e5481af7bb1e1b9d28d35fb3ad324511c5170d1/src/module/sheet/helpers.ts#L304\r\n */\r\nfunction getActionIcon(action: ActionIconType, fallback: ImageFilePath): ImageFilePath;\r\nfunction getActionIcon(action: ActionIconType, fallback: ImageFilePath | null): ImageFilePath | null;\r\nfunction getActionIcon(action: ActionIconType): ImageFilePath;\r\nfunction getActionIcon(\r\n action: ActionIconType,\r\n fallback: ImageFilePath | null = SYSTEM.relativePath(\"icons/actions/Empty.webp\"),\r\n): ImageFilePath | null {\r\n if (action === null) return actionImgMap.passive();\r\n const value = typeof action !== \"object\" ? action : action.type === \"action\" ? action.value : action.type;\r\n const sanitized = String(value ?? \"\")\r\n .toLowerCase()\r\n .trim();\r\n return actionImgMap[sanitized]?.() ?? fallback;\r\n}\r\n\r\n/**\r\n * https://github.com/foundryvtt/pf2e/blob/89892b6fafec1456a0358de8c6d7b102e3fe2da2/src/util/misc.ts#L205\r\n */\r\nfunction getActionGlyph(action: string | number | null | ActionCost): string {\r\n if (!action && action !== 0) return \"\";\r\n\r\n const value = typeof action !== \"object\" ? action : action.type === \"action\" ? action.value : action.type;\r\n const sanitized = String(value ?? \"\")\r\n .toLowerCase()\r\n .trim();\r\n\r\n return actionGlyphMap[sanitized]?.replace(\"-\", \"\u2013\") ?? \"\";\r\n}\r\n\r\nfunction updateActionFrequency(\r\n event: Event,\r\n item: AbilityItemPF2e | FeatPF2e,\r\n virtualData?: toolbelt.actionable.VirtualActionData,\r\n): Promise | undefined {\r\n const target = event.target;\r\n const frequency = item.frequency;\r\n if (!frequency || !(target instanceof HTMLInputElement)) return;\r\n\r\n const value = Math.clamp(target.valueAsNumber, 0, frequency.max);\r\n if (value === frequency.value) return;\r\n\r\n if (virtualData) {\r\n const { parent, ruleIndex } = virtualData;\r\n const rule = parent.rules[ruleIndex] as toolbelt.actionable.ActionableRuleElement;\r\n return rule.updateData({ frequency: value });\r\n } else {\r\n return item.update({ \"system.frequency.value\": value });\r\n }\r\n}\r\n\r\nasync function useAction(\r\n event: Event,\r\n item: AbilityItemPF2e | FeatPF2e,\r\n virtualData?: toolbelt.actionable.VirtualActionData,\r\n) {\r\n const macro = game.toolbelt?.getToolSetting(\"actionable\", \"action\")\r\n ? await game.toolbelt?.api.actionable.getActionMacro(item)\r\n : undefined;\r\n\r\n const use = async () => {\r\n if (item.crafting) {\r\n return game.pf2e.rollItemMacro(item.uuid, event);\r\n }\r\n\r\n if (item.system.frequency && item.system.frequency.value > 0) {\r\n const newValue = item.system.frequency.value - 1;\r\n\r\n if (virtualData) {\r\n const { parent, ruleIndex } = virtualData;\r\n const rule = parent.rules[ruleIndex] as toolbelt.actionable.ActionableRuleElement;\r\n await rule.updateData({ frequency: newValue });\r\n } else {\r\n await item.update({ \"system.frequency.value\": newValue });\r\n }\r\n }\r\n\r\n if (item.system.selfEffect) {\r\n await applySelfEffect(item);\r\n }\r\n\r\n return item.toMessage(event);\r\n };\r\n\r\n if (!macro) {\r\n return use();\r\n }\r\n\r\n // we let the macro handle the action usage or cancelation\r\n return macro.execute({\r\n actor: item.actor,\r\n item,\r\n use,\r\n cancel: () => {\r\n const msg = game.toolbelt!.localize(\"actionable.action.cancel\", item);\r\n return ui.notifications.warn(msg, { localize: false });\r\n },\r\n });\r\n}\r\n\r\nasync function applySelfEffect(item: AbilityItemPF2e | FeatPF2e) {\r\n const effect = item.system.selfEffect && (await fromUuid(item.system.selfEffect.uuid));\r\n if (!effect) return;\r\n\r\n const actor = item.actor;\r\n const token = actor.getActiveTokens(true, true).shift() ?? null;\r\n const traits = item.system.traits.value?.filter(\r\n (trait) => trait in CONFIG.PF2E.Item.documentClasses.effect.validTraits,\r\n );\r\n\r\n const effectSource: EffectSource = foundry.utils.mergeObject(effect.toObject(), {\r\n _id: null,\r\n system: {\r\n context: {\r\n origin: {\r\n actor: actor.uuid,\r\n token: token?.uuid ?? null,\r\n item: item.uuid,\r\n spellcasting: null,\r\n rollOptions: item.getOriginData().rollOptions,\r\n },\r\n target: {\r\n actor: actor.uuid,\r\n token: token?.uuid ?? null,\r\n },\r\n roll: null,\r\n },\r\n traits: { value: traits },\r\n },\r\n });\r\n\r\n await actor.createEmbeddedDocuments(\"Item\", [effectSource]);\r\n}\r\n\r\nfunction isDefaultActionIcon(img: string, action: string | ActionCost | null) {\r\n return img === getActionIcon(action);\r\n}\r\n\r\ntype ActionIconType = string | number | ActionCost | null;\r\n\r\nexport { applySelfEffect, getActionGlyph, getActionIcon, isDefaultActionIcon, updateActionFrequency, useAction };\r\nexport type { ActionIconType };\r\n", "import { MODULE, R } from \".\";\n\nfunction htmlQuery(\n parent: MaybeHTML,\n selectors: K,\n): HTMLElementTagNameMap[K] | null;\nfunction htmlQuery(parent: MaybeHTML, selectors: string): E | null;\nfunction htmlQuery(parent: MaybeHTML, selectors: string): HTMLElement | null;\nfunction htmlQuery(parent: MaybeHTML, selectors: string): HTMLElement | null {\n if (!(parent instanceof Element)) return null;\n return parent.querySelector(selectors);\n}\n\nfunction htmlQueryAll(\n parent: MaybeHTML,\n selectors: K,\n): HTMLElementTagNameMap[K][];\nfunction htmlQueryAll(parent: MaybeHTML, selectors: string): E[];\nfunction htmlQueryAll(parent: MaybeHTML, selectors: string): HTMLElement[];\nfunction htmlQueryAll(parent: MaybeHTML, selectors: string): HTMLElement[] {\n if (!(parent instanceof Element || parent instanceof Document)) return [];\n return Array.from(parent.querySelectorAll(selectors));\n}\n\nfunction htmlClosest(\n child: MaybeHTML,\n selectors: K,\n): HTMLElementTagNameMap[K] | null;\nfunction htmlClosest(child: MaybeHTML, selectors: string): HTMLElement | null;\nfunction htmlClosest(child: MaybeHTML, selectors: string): E | null;\nfunction htmlClosest(child: MaybeHTML, selectors: string): HTMLElement | null {\n if (!(child instanceof Element)) return null;\n return child.closest(selectors);\n}\n\nfunction htmlQueryIn(\n child: MaybeHTML,\n parentSelector: string,\n siblingSelector: K,\n): HTMLElementTagNameMap[K] | null;\nfunction htmlQueryIn(child: MaybeHTML, parentSelector: string, siblingSelector: string): HTMLElement | null;\nfunction htmlQueryIn(\n child: MaybeHTML,\n parentSelector: string,\n siblingSelector: string,\n): E | null;\nfunction htmlQueryIn(child: MaybeHTML, parentSelector: string, siblingSelector: string): HTMLElement | null {\n const parent = htmlClosest(child, parentSelector);\n return htmlQuery(parent, siblingSelector);\n}\n\nfunction firstElementWithText(el: Maybe, skipEmpty = true): HTMLElement | null {\n if (!(el instanceof HTMLElement)) return null;\n\n const childNodes = el.childNodes;\n if (!childNodes.length) return null;\n\n for (const child of childNodes) {\n if (child.nodeType === Node.TEXT_NODE && (!skipEmpty || child.textContent?.trim())) {\n return el;\n }\n }\n\n for (const child of el.children) {\n const withText = firstElementWithText(child);\n if (withText) {\n return withText;\n }\n }\n\n return null;\n}\n\nfunction createHTMLElement(\n nodeName: K,\n { classes = [], dataset = {}, content, id, style }: CreateHTMLElementOptions = {},\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(nodeName);\n\n if (element instanceof HTMLButtonElement) {\n element.type = \"button\";\n }\n\n if (style) {\n assignStyle(element, style);\n }\n\n if (id) {\n element.id = id;\n }\n\n if (classes.length > 0) {\n element.classList.add(...classes);\n }\n\n for (const [key, value] of Object.entries(dataset)) {\n if (R.isNullish(value) || value === false) continue;\n element.dataset[key] = value === true ? \"\" : String(value);\n }\n\n if (R.isString(content)) {\n element.innerHTML = content;\n } else if (content instanceof Element) {\n element.append(content);\n } else if (content) {\n element.append(...content);\n }\n\n return element;\n}\n\nfunction createHTMLElementContent(options?: CreateHTMLElementOptions): HTMLElement {\n return createHTMLElement(\"div\", options).firstChild as HTMLElement;\n}\n\nfunction createButtonElement(options: CreateHTMLButtonElementOptions): HTMLButtonElement {\n let content = \"\";\n\n if (options.icon) {\n content += ` `;\n }\n\n if (options.label) {\n content += options.label;\n }\n\n return createHTMLElement(\"button\", { ...options, content });\n}\n\nfunction createInputElement(\n type: \"text\" | \"number\" | \"radio\" | \"checkbox\",\n name: string,\n value: string | number | boolean,\n options?: CreateHTMLInputElementOptions,\n): HTMLInputElement {\n const input = createHTMLElement(\"input\", options);\n\n input.type = type;\n input.name = name;\n\n if (type === \"text\") {\n input.value = String(value);\n } else if (type === \"number\") {\n input.valueAsNumber = Number(value) || 0;\n } else if (type === \"checkbox\") {\n input.checked = Boolean(value);\n } else {\n input.value = String(value);\n input.checked = !!options?.checked;\n }\n\n return input;\n}\n\nfunction createToggleEvent(\n event: TEvent,\n selector: null,\n listener: (ev: DocumentEventMap[TEvent]) => any,\n options?: boolean | AddEventListenerOptions,\n): ToggleEvent;\nfunction createToggleEvent(\n event: TEvent,\n selector: string,\n listener: (ev: HTMLElementEventMap[TEvent]) => any,\n options?: boolean | AddEventListenerOptions,\n): ToggleEvent;\nfunction createToggleEvent(\n event: EventType,\n selector: string | null,\n listener: (ev: Event) => any,\n options?: boolean | AddEventListenerOptions,\n) {\n let enabled = false;\n\n const getElement = (): Document | HTMLElement | null => {\n return selector ? document.querySelector(selector) : document;\n };\n\n return {\n activate() {\n if (enabled) return;\n\n requestAnimationFrame(() => {\n getElement()?.addEventListener(event, listener, options);\n });\n\n enabled = true;\n },\n disable() {\n if (!enabled) return;\n\n getElement()?.removeEventListener(event, listener, options);\n\n enabled = false;\n },\n toggle(enabled: boolean) {\n if (enabled) this.activate();\n else this.disable();\n },\n };\n}\n\nfunction addListener(\n parent: MaybeHTML,\n selectors: K,\n ...args: ListenerCallbackArgs\n): void;\nfunction addListener(\n parent: MaybeHTML,\n selectors: string,\n ...args: ListenerCallbackArgs\n): void;\nfunction addListener(\n parent: MaybeHTML,\n selectors: string,\n ...args: ListenerCallbackArgs\n): void;\nfunction addListener(\n parent: MaybeHTML,\n selectors: string,\n ...args: ListenerCallbackArgs\n): void {\n if (!(parent instanceof Element || parent instanceof Document)) return;\n\n const element = parent.querySelector(selectors);\n if (!(element instanceof HTMLElement)) return;\n\n const event = typeof args[0] === \"string\" ? args[0] : \"click\";\n const listener = typeof args[0] === \"function\" ? args[0] : args[1];\n const useCapture = typeof args[1] === \"boolean\" ? args[1] : args[2];\n\n element.addEventListener(event, (e) => listener(element, e), useCapture);\n}\n\nfunction addListenerAll(\n parent: MaybeHTML,\n selectors: K,\n ...args: ListenerCallbackArgs\n): void;\nfunction addListenerAll(\n parent: MaybeHTML,\n selectors: string,\n ...args: ListenerCallbackArgs\n): void;\nfunction addListenerAll(\n parent: MaybeHTML,\n selectors: string,\n ...args: ListenerCallbackArgs\n): void;\nfunction addListenerAll(\n parent: MaybeHTML,\n selectors: string,\n ...args: ListenerCallbackArgs\n): void {\n if (!(parent instanceof Element || parent instanceof Document)) return;\n\n const elements = parent.querySelectorAll(selectors);\n const event = typeof args[0] === \"string\" ? args[0] : \"click\";\n const listener = typeof args[0] === \"function\" ? args[0] : args[1];\n const useCapture = typeof args[1] === \"boolean\" ? args[1] : args[2];\n\n for (const element of elements) {\n if (!(element instanceof HTMLElement)) continue;\n element.addEventListener(event, (e) => listener(element, e), useCapture);\n }\n}\n\nfunction addEnterKeyListeners(html: HTMLElement, inputType: \"number\" | \"text\" | \"all\" = \"all\") {\n const types: (\"text\" | \"number\")[] = inputType === \"all\" ? [\"text\", \"number\"] : [inputType];\n const selector = types.map((type) => `input[type=\"${type}\"]`).join(\", \");\n\n addListenerAll(html, selector, \"keypress\", (el, event) => {\n if (event.key === \"Enter\") {\n event.stopPropagation();\n event.preventDefault();\n el.blur();\n }\n });\n}\n\nfunction getInputValue(el: HTMLInputElement | HTMLSelectElement) {\n if (el instanceof HTMLSelectElement) {\n return el.value;\n }\n\n return el.nodeName === \"RANGE-PICKER\" || [\"number\", \"range\"].includes(el.type)\n ? el.valueAsNumber\n : el.type === \"checkbox\"\n ? el.checked\n : el.value;\n}\n\n/**\n * repurposed version of\n * https://github.com/foundryvtt/pf2e/blob/c0cfa1f4c266d7d843966b50a9fd1a34d42b2051/src/module/actor/sheet/item-summary-renderer.ts#L25\n */\nasync function toggleSummary(summaryElem: HTMLElement) {\n const duration = 0.4;\n\n if (summaryElem.hidden) {\n await gsap.fromTo(\n summaryElem,\n { height: 0, opacity: 0, hidden: false },\n { height: \"auto\", opacity: 1, duration },\n );\n } else {\n await gsap.to(summaryElem, {\n height: 0,\n duration,\n opacity: 0,\n paddingTop: 0,\n paddingBottom: 0,\n margin: 0,\n clearProps: \"all\",\n onComplete: () => {\n summaryElem.hidden = true;\n },\n });\n }\n}\n\nfunction createFormData>(html: HTMLFormElement, expand?: boolean): T;\nfunction createFormData>(html: HTMLElement, expand?: boolean): T | null;\nfunction createFormData>(\n html: HTMLElement | HTMLFormElement,\n expand: boolean = false,\n): T | null {\n const form = html instanceof HTMLFormElement ? html : htmlQuery(html, \"form\");\n if (!form) return null;\n\n const formData = new foundry.applications.ux.FormDataExtended(form, { disabled: true, readonly: true });\n const data = R.mapValues(formData.object, (value) => {\n return typeof value === \"string\" ? value.trim() : value;\n });\n\n for (const element of form.elements) {\n if (!(element instanceof HTMLInputElement) || element.type !== \"file\") continue;\n\n data[element.name] = element.files?.[0];\n }\n\n return (expand ? (foundry.utils.expandObject(data) as Record) : data) as T;\n}\n\nfunction dataToDatasetString(data: DatasetData): string {\n return R.pipe(\n !R.isArray(data) ? R.entries(data) : data,\n R.map(([key, value]): string | undefined => {\n if (R.isNullish(value)) return;\n\n const sluggifiedKey = key.replace(/\\B([A-Z])/g, \"-$1\").toLowerCase();\n const stringified = R.isObjectType(value) ? foundry.utils.escapeHTML(JSON.stringify(value)) : value;\n\n return `data-${sluggifiedKey}='${stringified}'`;\n }),\n R.filter(R.isTruthy),\n R.join(\" \"),\n );\n}\n\nfunction assignStyle(el: HTMLElement, style: Partial) {\n Object.assign(el.style, style);\n}\n\nfunction styleValue(value: number): `${number}px` {\n return `${value}px`;\n}\n\nfunction setStyleProperty(html: Maybe, property: string, value: number) {\n html?.style.setProperty(property, styleValue(value));\n}\n\nfunction setStyleProperties(el: HTMLElement, properties: Record) {\n for (const [property, value] of R.entries(properties)) {\n el.style.setProperty(property, String(value));\n }\n}\n\nfunction registerCustomElement(tag: string, element: CustomElementConstructor) {\n try {\n if (window.customElements.get(tag)) return;\n window.customElements.define(tag, element);\n } catch (error: any) {\n MODULE.error(`an error occurred while registering a custom element: ${tag}`, error);\n }\n}\n\ntype CreateHTMLElementOptions = {\n classes?: string[];\n content?: string | HTMLCollection | (Element | string)[] | Element;\n dataset?: Record;\n id?: string;\n style?: Partial;\n};\n\ntype CreateHTMLButtonElementOptions = Omit &\n RequireAtLeastOne<{ icon?: string; label?: string }>;\n\ntype ListenerCallbackArgs =\n | [TEvent, ListenerCallback, boolean]\n | [TEvent, ListenerCallback]\n | [ListenerCallback, boolean]\n | [ListenerCallback];\n\ntype ListenerCallback = (\n element: TElement,\n event: HTMLElementEventMap[TEvent],\n) => void;\n\ntype CreateHTMLInputElementOptions = Omit & {\n checked?: boolean;\n};\n\ntype ToggleEvent = {\n activate(): void;\n disable(): void;\n toggle(enabled: boolean): void;\n};\n\ntype DatasetValue = Maybe;\ntype DatasetData = Record | [string, DatasetValue][];\n\nexport {\n addEnterKeyListeners,\n addListener,\n addListenerAll,\n assignStyle,\n createButtonElement,\n createFormData,\n createHTMLElement,\n createHTMLElementContent,\n createInputElement,\n createToggleEvent,\n dataToDatasetString,\n firstElementWithText,\n getInputValue,\n htmlClosest,\n htmlQuery,\n htmlQueryAll,\n htmlQueryIn,\n registerCustomElement,\n setStyleProperties,\n setStyleProperty,\n styleValue,\n toggleSummary,\n};\nexport type { CreateHTMLButtonElementOptions, CreateHTMLElementOptions };\n", "import {\n ActorPF2e,\n CharacterPF2e,\n ConsumablePF2e,\n CreaturePF2e,\n EquipmentPF2e,\n ItemInstances,\n ItemPF2e,\n ItemSourcePF2e,\n ItemType,\n PhysicalItemPF2e,\n WeaponPF2e,\n ZeroToTwo,\n} from \"@7h3laughingman/pf2e-types\";\nimport {\n CompendiumIndexData,\n createHTMLElementContent,\n getActionGlyph,\n getDamageRollClass,\n htmlQuery,\n includesAny,\n ItemUUID,\n R,\n setHasElement,\n SYSTEM,\n traitSlugToObject,\n} from \".\";\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/1465f7190b2b8454094c50fa6d06e9902e0a3c41/src/module/item/base/data/values.ts#L23-L31\n */\nconst ITEM_CARRY_TYPES = Object.freeze([\n \"attached\",\n \"dropped\",\n \"held\",\n \"implanted\",\n \"installed\",\n \"stowed\",\n \"worn\",\n] as const);\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/95e941aecaf1fa6082825b206b0ac02345d10538/src/module/item/physical/values.ts#L1\n */\nconst PHYSICAL_ITEM_TYPES = new Set([\n \"ammo\",\n \"armor\",\n \"backpack\",\n \"book\",\n \"consumable\",\n \"equipment\",\n \"shield\",\n \"treasure\",\n \"weapon\",\n] as const);\n\nconst ATTACHABLE_TYPES = {\n ammo: [\"weapon\"],\n equipment: [\"weapon\", \"armor\", \"shield\"],\n weapon: [\"shield\"],\n} as const;\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/95e941aecaf1fa6082825b206b0ac02345d10538/src/module/item/helpers.ts#L13\n */\nfunction itemIsOfType(\n item: ItemOrSource,\n ...types: TType[]\n): item is ItemInstances[TType] | ItemInstances[TType][\"_source\"];\nfunction itemIsOfType(\n item: ItemOrSource,\n ...types: TType[]\n): item is TType extends \"physical\"\n ? PhysicalItemPF2e | PhysicalItemPF2e[\"_source\"]\n : TType extends ItemType\n ? ItemInstances[TType] | ItemInstances[TType][\"_source\"]\n : never;\nfunction itemIsOfType(\n item: ItemOrSource,\n type: \"physical\",\n): item is PhysicalItemPF2e | PhysicalItemPF2e[\"_source\"];\nfunction itemIsOfType(item: ItemOrSource, ...types: string[]): boolean {\n return (\n typeof item.name === \"string\" &&\n types.some((t) => (t === \"physical\" ? setHasElement(PHYSICAL_ITEM_TYPES, item.type) : item.type === t))\n );\n}\n\nfunction getItemSource(item: T, clearId?: boolean): T[\"_source\"] {\n const source = item.toObject();\n source._stats.compendiumSource ??= item.uuid;\n\n if (clearId) {\n // @ts-expect-error\n delete source._id;\n }\n\n return source;\n}\n\nasync function getItemFromUuid(\n uuid: Maybe,\n type: T,\n): Promise[T] | null>;\nasync function getItemFromUuid(uuid: Maybe, type: \"physical\"): Promise | null>;\nasync function getItemFromUuid(uuid: Maybe, type?: ItemType | \"physical\"): Promise;\nasync function getItemFromUuid(uuid: Maybe, type?: ItemType | \"physical\") {\n if (!uuid) return null;\n const item = await fromUuid(uuid);\n return item instanceof Item && (!type || item.isOfType(type)) ? item : null;\n}\n\nasync function getItemSourceFromUuid(\n uuid: string,\n type: T,\n): Promise[T][\"_source\"] | null>;\nasync function getItemSourceFromUuid(uuid: string, type: \"physical\"): Promise;\nasync function getItemSourceFromUuid(uuid: string, type?: ItemType | \"physical\"): Promise;\nasync function getItemSourceFromUuid(uuid: string, type?: ItemType | \"physical\") {\n const item = await getItemFromUuid(uuid, type);\n return !!item ? getItemSource(item) : null;\n}\n\nfunction* actorItems(\n actor: TActor,\n type?: TType | TType[],\n): Generator : TType, TActor>> {\n const types = R.isArray(type) ? type : type ? [type] : R.keys(CONFIG.PF2E.Item.documentClasses);\n\n // we must add parent types for subitems lookup\n const attachables = type && types.filter((t): t is AttachableType => t in ATTACHABLE_TYPES);\n if (attachables?.length) {\n for (const attachType of attachables) {\n for (const attachToType of ATTACHABLE_TYPES[attachType]) {\n if (!types.includes(attachToType)) {\n types.push(attachToType);\n }\n }\n }\n }\n\n for (const itemType of types) {\n for (const item of actor.itemTypes[itemType]) {\n yield item as any;\n\n // we also yield subitems because they are unnaccessible otherwise\n if (\"subitems\" in item) {\n for (const subitem of item.subitems) {\n yield subitem as any;\n }\n }\n }\n }\n}\n\nfunction findItemWithSourceId(\n actor: TActor,\n uuid: string,\n type?: TType,\n): ActorItemInstances | null {\n for (const item of actorItems(actor, type)) {\n if (isSupressedFeat(item)) continue;\n\n const sourceId = getItemSourceId(item);\n if (sourceId === uuid) {\n return item as any;\n }\n }\n\n return null;\n}\n\nfunction findItemWithSlug(\n actor: TActor,\n slug: string,\n type?: TType,\n): ActorItemInstances | null {\n for (const item of actorItems(actor, type)) {\n if (isSupressedFeat(item)) continue;\n\n const itemSlug = getItemSlug(item);\n if (itemSlug === slug) {\n return item as any;\n }\n }\n\n return null;\n}\n\nfunction hasAnyItemWithSourceId(actor: ActorPF2e, uuids: string[], type?: ItemType): boolean {\n for (const item of actorItems(actor, type)) {\n if (isSupressedFeat(item)) continue;\n\n const sourceId = getItemSourceId(item);\n if (sourceId && uuids.includes(sourceId)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getItemSourceId(item: ItemPF2e): ItemUUID {\n const isCompendiumItem = item._id && item.pack && !item.isEmbedded;\n return isCompendiumItem ? item.uuid : (item._stats.compendiumSource ?? item._stats.duplicateSource ?? item.uuid);\n}\n\nfunction getItemSlug(item: ItemPF2e | CompendiumIndexData): string {\n return item instanceof Item ? item.slug || SYSTEM.sluggify(item._source.name) : SYSTEM.sluggify(item.name);\n}\n\nfunction getActorWeapons(actor: TActor): WeaponPF2e[] {\n return [\n ...actor.itemTypes.weapon,\n ...actor.itemTypes.shield.flatMap((shield) =>\n shield.subitems.filter((item): item is WeaponPF2e => item.isOfType(\"weapon\")),\n ),\n ];\n}\n\nfunction itemWithActor>(actor: ActorPF2e, item: ItemPF2e): T {\n return (item.parent ? item : new (getDocumentClass(\"Item\"))(item.toObject(), { parent: actor })) as T;\n}\n\nasync function usePhysicalItem(event: Event, item: EquipmentPF2e | ConsumablePF2e) {\n const isConsumable = item.isOfType(\"consumable\");\n\n if (isConsumable && isCastConsumable(item)) {\n return item.consume();\n }\n\n const macro = game.toolbelt?.getToolSetting(\"actionable\", \"item\")\n ? await game.toolbelt.api.actionable.getItemMacro(item)\n : undefined;\n\n const use = isConsumable ? () => consumeItem(event, item) : () => game.pf2e.rollItemMacro(item.uuid, event);\n\n if (macro) {\n // we let the macro handle item consumption\n return macro.execute({\n actor: item.actor,\n item,\n use,\n cancel: () => {\n const msg = game.toolbelt!.localize(\"actionable.item.cancel\", item);\n return ui.notifications.warn(msg, { localize: false });\n },\n });\n }\n\n return use();\n}\n\n/**\n * upgraded version of\n * https://github.com/foundryvtt/pf2e/blob/eecf53f37490cbd228d8c74b290748b0188768b4/src/module/item/consumable/document.ts#L156\n * though stripped of scrolls & wands\n */\nasync function consumeItem(event: Event, item: ConsumablePF2e) {\n const actor = item.actor;\n const speaker = ChatMessage.getSpeaker({ actor });\n const flags = {\n [SYSTEM.id]: {\n origin: {\n sourceId: item.sourceId,\n uuid: item.uuid,\n type: item.type,\n },\n },\n };\n\n const contentHTML = createHTMLElementContent({\n content: (await item.toMessage(event, { create: false }))?.content,\n });\n\n htmlQuery(contentHTML, \"footer\")?.remove();\n htmlQuery(contentHTML, \"button[data-action='consume']\")?.remove();\n\n const uses = item.uses;\n const content = contentHTML.outerHTML;\n\n if (item.system.damage) {\n const DamageRoll = getDamageRollClass();\n const { formula, type, kind } = item.system.damage;\n const roll = new DamageRoll(`(${formula})[${type},${kind}]`);\n\n roll.toMessage({ speaker, flavor: content, flags });\n } else {\n const key = uses.max > 1 && uses.value > 1 ? \"UseMulti\" : \"UseSingle\";\n const use = game.i18n.format(`PF2E.ConsumableMessage.${key}`, {\n name: item.name,\n current: uses.value - 1,\n });\n const flavor = `

${use}

`;\n\n ChatMessage.create({ speaker, content: `${flavor}${content}`, flags });\n }\n\n if (item.system.uses.autoDestroy && uses.value <= 1) {\n const newQuantity = Math.max(item.quantity - 1, 0);\n if (newQuantity <= 0) {\n await item.delete();\n } else {\n await item.update({\n \"system.quantity\": newQuantity,\n \"system.uses.value\": uses.max,\n });\n }\n } else {\n await item.update({\n \"system.uses.value\": Math.max(uses.value - 1, 0),\n });\n }\n}\n\nfunction getEquipAnnotation(item: Maybe): EquipAnnotationData | undefined {\n if (!item || item.isEquipped) return;\n\n const { type, hands = 0 } = item.system.usage;\n const annotation = item.carryType === \"dropped\" ? \"pick-up\" : item.isStowed ? \"retrieve\" : \"draw\";\n const fullAnnotation = `${annotation}${hands}H`;\n const purposeKey = SYSTEM.sluggify(fullAnnotation, { camel: \"bactrian\" });\n\n return {\n annotation,\n cost: annotation === \"retrieve\" ? 2 : 1,\n fullAnnotation,\n handsHeld: hands,\n label: `PF2E.Actions.Interact.${purposeKey}.Title`,\n carryType: type === \"worn\" ? \"worn\" : \"held\",\n };\n}\n\nfunction itemIsEquipped(item: PhysicalItemPF2e): boolean {\n const equipableItem = item.parentItem ?? item;\n const isInvested = equipableItem.isInvested;\n return isInvested === true || (isInvested === null && equipableItem.isEquipped);\n}\n\n/**\n * repurposed version of\n * https://github.com/foundryvtt/pf2e/blob/6ff777170c93618f234929c6d483a98a37cbe363/src/module/actor/character/helpers.ts#L210\n */\nasync function equipItemToUse(\n actor: CharacterPF2e,\n item: PhysicalItemPF2e,\n {\n carryType,\n handsHeld,\n fullAnnotation,\n cost,\n }: Pick,\n) {\n await actor.changeCarryType(item, { carryType, handsHeld });\n if (!game.combat) return;\n\n const templates = {\n flavor: SYSTEM.relativePath(\"templates/chat/action/flavor.hbs\"),\n content: SYSTEM.relativePath(\"templates/chat/action/content.hbs\"),\n };\n\n const fullAnnotationKey = SYSTEM.sluggify(fullAnnotation, { camel: \"bactrian\" });\n const flavorAction = {\n title: `PF2E.Actions.Interact.Title`,\n subtitle: fullAnnotationKey ? `PF2E.Actions.Interact.${fullAnnotationKey}.Title` : null,\n glyph: getActionGlyph(cost),\n };\n\n const [traits, message] = [\n [traitSlugToObject(\"manipulate\", CONFIG.PF2E.actionTraits)],\n `PF2E.Actions.Interact.${fullAnnotationKey}.Description`,\n ];\n\n const flavor = await foundry.applications.handlebars.renderTemplate(templates.flavor, {\n action: flavorAction,\n traits,\n });\n\n const content = await foundry.applications.handlebars.renderTemplate(templates.content, {\n imgPath: item.img,\n message: game.i18n.format(message, {\n actor: actor.name,\n weapon: item.name,\n }),\n });\n\n const token = actor.getActiveTokens(false, true).shift();\n\n await getDocumentClass(\"ChatMessage\").create({\n content,\n speaker: ChatMessage.getSpeaker({ actor, token }),\n flavor,\n style: CONST.CHAT_MESSAGE_STYLES.EMOTE,\n });\n}\n\nfunction simulateDropItem(item: ItemPF2e, target: ActorPF2e, fromInventory: boolean) {\n const event = new DragEvent(\"dragstart\", {\n dataTransfer: new DataTransfer(),\n });\n\n const data = {\n fromInventory,\n itemType: item.type,\n type: \"Item\",\n uuid: item.uuid,\n };\n\n event.dataTransfer?.setData(\"text/plain\", JSON.stringify(data));\n target.sheet._onDrop(event);\n}\n\nfunction isSupressedFeat(item: ItemPF2e): boolean {\n return item.isOfType(\"feat\") && item.suppressed;\n}\n\nfunction isCastConsumable(item: ConsumablePF2e): boolean {\n return R.isIncludedIn(item.category, [\"scroll\", \"spell-gem\", \"wand\"]) && !!item.system.spell;\n}\n\nfunction isSF2eItem(item: T): boolean {\n return includesAny(item._source.system.traits.value, [\"tech\", \"analog\"]);\n}\n\nfunction isAreaOrAutoFireType(type: string): type is \"area-fire\" | \"auto-fire\" {\n return R.isIncludedIn(type, [\"area-fire\", \"auto-fire\"]);\n}\n\ntype AttachableType = keyof typeof ATTACHABLE_TYPES;\ntype AttachToType = (typeof ATTACHABLE_TYPES)[T][number];\n\ntype ActorItemInstances = ItemInstances[TType extends\n | \"weapon\"\n | \"shield\"\n ? TType | \"weapon\" | \"equipment\"\n : TType];\n\ntype ItemOrSource = PreCreate | CompendiumIndexData | ItemPF2e;\n\ntype EquipAnnotationData = {\n annotation: AuxiliaryAnnotation;\n cost: 1 | 2;\n fullAnnotation: string;\n handsHeld: ZeroToTwo;\n label: string;\n carryType: \"held\" | \"worn\";\n};\n\ntype AuxiliaryAnnotation = \"draw\" | \"pick-up\" | \"retrieve\" | \"sheathe\";\n\nexport {\n actorItems,\n consumeItem,\n equipItemToUse,\n findItemWithSlug,\n findItemWithSourceId,\n getActorWeapons,\n getEquipAnnotation,\n getItemFromUuid,\n getItemSlug,\n getItemSource,\n getItemSourceFromUuid,\n getItemSourceId,\n hasAnyItemWithSourceId,\n isAreaOrAutoFireType,\n isCastConsumable,\n isSF2eItem,\n isSupressedFeat,\n ITEM_CARRY_TYPES,\n itemIsEquipped,\n itemIsOfType,\n itemWithActor,\n PHYSICAL_ITEM_TYPES,\n simulateDropItem,\n usePhysicalItem,\n};\nexport type { EquipAnnotationData, ItemOrSource };\n", "import { HelperDelegate, HelperOptions } from \"handlebars\";\nimport { MODULE, R } from \".\";\n\nclass Localize extends Function {\n declare subkeys: string[];\n\n constructor(...subkeys: string[]) {\n super();\n\n this.subkeys = subkeys;\n\n const self = this;\n\n function localize(...args: LocalizeArgs): string {\n const { data, path } = self.getLocalizeData(...args);\n return self.localizeOrFormat(path, data);\n }\n\n Object.assign(localize, this);\n Object.setPrototypeOf(localize, Object.getPrototypeOf(this));\n\n return localize as Localize;\n }\n\n path(...path: string[]): string {\n return MODULE.path(...this.subkeys, ...path);\n }\n\n getLocalizeData(...args: LocalizeArgs): { path: string; data?: LocalizeData } {\n const data = R.isObjectType(args.at(-1)) ? (args.pop() as LocalizeData) : undefined;\n const path = this.path(...(args as string[]));\n return { path, data };\n }\n\n localizeOrFormat(path: string, data?: LocalizeData): string {\n return typeof data === \"object\" ? game.i18n.format(path, data) : game.i18n.localize(path);\n }\n\n ifExist(...args: LocalizeArgs): string | undefined {\n const { data, path } = this.getLocalizeData(...args);\n if (game.i18n.has(path, true)) {\n return this.localizeOrFormat(path, data);\n }\n }\n\n notify(type: \"info\" | \"warning\" | \"error\" | \"success\", ...args: NotificationArgs): fa.ui.Notification {\n const permanent = R.isBoolean(args.at(-1)) ? (args.pop() as boolean) : false;\n const str = this(...(args as LocalizeArgs));\n return ui.notifications.notify(str, type, { permanent });\n }\n\n success(...args: NotificationArgs): fa.ui.Notification {\n return this.notify(\"success\", ...args);\n }\n\n info(...args: NotificationArgs): fa.ui.Notification {\n return this.notify(\"info\", ...args);\n }\n\n warning(...args: NotificationArgs): fa.ui.Notification {\n return this.notify(\"warning\", ...args);\n }\n\n error(...args: NotificationArgs): fa.ui.Notification {\n return this.notify(\"error\", ...args);\n }\n\n sub(...subkeys: string[]): Localize {\n return new Localize(...this.subkeys, ...subkeys);\n }\n\n shared(key: CollapseOf): string {\n return game.i18n.localize(`LEVIKTIMES.${key}`);\n }\n\n i18n(...subkeys: string[]): TemplateLocalize {\n const self = this;\n\n const getTemplateData = (...args: TemplateLocalizeArgs): { path: string; data?: LocalizeData } => {\n const data = R.isObjectType(args.at(-1)) ? (args.pop() as HelperOptions) : undefined;\n const path = this.path(...subkeys, ...(args as string[]));\n return { path, data: data?.hash };\n };\n\n function i18n(...args: TemplateLocalizeArgs): string {\n const { path, data } = getTemplateData(...args);\n return self.localizeOrFormat(path, data);\n }\n\n Object.defineProperties(i18n, {\n tooltip: {\n value: (...args: TemplateLocalizeArgs): string => {\n const tooltip = i18n(...args);\n return `data-tooltip=\"${tooltip}\"`;\n },\n enumerable: false,\n configurable: false,\n },\n root: {\n value: (...args: TemplateLocalizeArgs) => {\n const data = R.isObjectType(args.at(-1)) ? (args.pop() as HelperOptions) : undefined;\n const path = MODULE.path(...(args as string[]));\n return self.localizeOrFormat(path, data?.hash);\n },\n enumerable: false,\n configurable: false,\n },\n });\n\n return i18n as TemplateLocalize;\n }\n}\n\nfunction foundryLocalizeIfExist(key: string): string | undefined {\n if (game.i18n.has(key, true)) {\n return game.i18n.localize(key);\n }\n}\n\ninterface Localize {\n (...args: LocalizeArgs): string;\n}\n\ninterface TemplateLocalize {\n (...args: TemplateLocalizeArgs): string;\n root(...args: TemplateLocalizeArgs): string;\n tooltip(...args: TemplateLocalizeArgs): string;\n}\n\nconst localize = new Localize();\n\ntype LocalizeData = Record;\n\ntype LocalizeArgs = string[] | [...string[], string | LocalizeData];\n\ntype NotificationArgs = LocalizeArgs | [...LocalizeArgs, string | LocalizeData | boolean];\n\ntype TemplateLocalizeArgs = Parameters;\n\nexport { localize, foundryLocalizeIfExist };\nexport type { Localize, LocalizeArgs, LocalizeData, NotificationArgs, TemplateLocalizeArgs, TemplateLocalize };\n", "import {\n CreaturePF2e,\n DCAdjustment,\n DCOptions,\n PositiveDCAdjustment,\n ProficiencyRank,\n Rarity,\n} from \"@7h3laughingman/pf2e-types\";\n\nconst dcAdjustments = new Map([\n [\"incredibly-easy\", -10],\n [\"very-easy\", -5],\n [\"easy\", -2],\n [\"normal\", 0],\n [\"hard\", 2],\n [\"very-hard\", 5],\n [\"incredibly-hard\", 10],\n]);\n\nconst dcByLevel = new Map([\n [-1, 13],\n [0, 14],\n [1, 15],\n [2, 16],\n [3, 18],\n [4, 19],\n [5, 20],\n [6, 22],\n [7, 23],\n [8, 24],\n [9, 26],\n [10, 27],\n [11, 28],\n [12, 30],\n [13, 31],\n [14, 32],\n [15, 34],\n [16, 35],\n [17, 36],\n [18, 38],\n [19, 39],\n [20, 40],\n [21, 42],\n [22, 44],\n [23, 46],\n [24, 48],\n [25, 50],\n]);\n\nconst simpleDCs = new Map([\n [\"untrained\", 10],\n [\"trained\", 15],\n [\"expert\", 20],\n [\"master\", 30],\n [\"legendary\", 40],\n]);\n\nconst simpleDCsWithoutLevel = new Map([\n [\"untrained\", 10],\n [\"trained\", 15],\n [\"expert\", 20],\n [\"master\", 25],\n [\"legendary\", 30],\n]);\n\nfunction rarityToDCAdjustment(rarity: Rarity = \"common\"): PositiveDCAdjustment {\n switch (rarity) {\n case \"uncommon\":\n return \"hard\";\n case \"rare\":\n return \"very-hard\";\n case \"unique\":\n return \"incredibly-hard\";\n default:\n return \"normal\";\n }\n}\n\nfunction adjustDC(dc: number, adjustment: DCAdjustment = \"normal\"): number {\n return dc + (dcAdjustments.get(adjustment) ?? 0);\n}\n\nfunction adjustDCByRarity(dc: number, rarity: Rarity = \"common\"): number {\n return adjustDC(dc, rarityToDCAdjustment(rarity));\n}\n\nfunction calculateDC(level: number, { pwol, rarity = \"common\" }: DCOptions = {}): number {\n pwol ??= game.pf2e.settings.variants.pwol.enabled;\n\n // assume level 0 if garbage comes in. We cast level to number because the backing data may actually have it\n // stored as a string, which we can't catch at compile time\n const dc = dcByLevel.get(level) ?? 14;\n if (pwol) {\n // -1 shouldn't be subtracted since it's just\n // a creature level and not related to PC levels\n return adjustDCByRarity(dc - Math.max(level, 0), rarity);\n } else {\n return adjustDCByRarity(dc, rarity);\n }\n}\n\nfunction calculateSimpleDC(rank: ProficiencyRank, { pwol = false }: DCOptions = {}): number {\n if (pwol) {\n return simpleDCsWithoutLevel.get(rank) ?? 10;\n } else {\n return simpleDCs.get(rank) ?? 10;\n }\n}\n\nfunction calculateSpellDC(spellLevel: number, { pwol = false }: DCOptions = {}): number {\n return calculateDC(spellLevel * 2 - 1, { pwol });\n}\n\nfunction calculateCreatureDC(actor: CreaturePF2e, pwol?: boolean) {\n return calculateDC(actor.level, { pwol, rarity: actor.rarity });\n}\n\nexport { adjustDCByRarity, calculateCreatureDC, calculateDC, calculateSimpleDC, calculateSpellDC };\n", "import {\n DCOptions,\n IdentifyAlchemyDCs,\n IdentifyMagicDCs,\n MagicTradition,\n PhysicalItemPF2e,\n Rarity,\n} from \"@7h3laughingman/pf2e-types\";\nimport { adjustDCByRarity, calculateDC, MAGIC_TRADITIONS, setHasElement } from \".\";\nimport { R, SYSTEM } from \"..\";\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/item/identification.ts#L30\n */\nfunction getDcRarity(item: PhysicalItemPF2e): Rarity {\n return item.traits.has(\"cursed\") ? \"unique\" : item.rarity;\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/item/identification.ts#L63\n * with option fallback\n */\nfunction getItemIdentificationDCs(\n item: PhysicalItemPF2e,\n { pwol = false, notMatchingTraditionModifier }: IdentifyItemOptions = {\n pwol: game.pf2e.settings.variants.pwol.enabled,\n notMatchingTraditionModifier: game.settings.get(SYSTEM.id, \"identifyMagicNotMatchingTraditionModifier\"),\n },\n): IdentifyMagicDCs | IdentifyAlchemyDCs {\n const baseDC = calculateDC(item.level, { pwol });\n const rarity = getDcRarity(item);\n const dc = adjustDCByRarity(baseDC, rarity);\n if (item.isMagical) {\n return getIdentifyMagicDCs(item, dc, notMatchingTraditionModifier);\n } else {\n return { crafting: dc };\n }\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/item/identification.ts#L22\n */\nfunction getMagicTraditions(item: PhysicalItemPF2e): Set {\n const traits: string[] = item.system.traits.value;\n return new Set(traits.filter((t): t is MagicTradition => setHasElement(MAGIC_TRADITIONS, t)));\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/item/identification.ts#L37\n */\nfunction getIdentifyMagicDCs(\n item: PhysicalItemPF2e,\n baseDC: number,\n notMatchingTraditionModifier: number,\n): IdentifyMagicDCs {\n const result = {\n occult: baseDC,\n primal: baseDC,\n divine: baseDC,\n arcane: baseDC,\n };\n const traditions = getMagicTraditions(item);\n for (const key of MAGIC_TRADITIONS) {\n // once an item has a magic tradition, all skills\n // that don't match the tradition are hard\n if (traditions.size > 0 && !traditions.has(key)) {\n result[key] = baseDC + notMatchingTraditionModifier;\n }\n }\n return { arcana: result.arcane, nature: result.primal, religion: result.divine, occultism: result.occult };\n}\n\n/**\n * modified version of\n * https://github.com/foundryvtt/pf2e/blob/578620c2a35a76d904938fb3d4984ad0e14be241/src/module/actor/sheet/popups/identify-popup.ts#L7\n */\nclass IdentifyItemPopup extends foundry.appv1.api.FormApplication {\n static override get defaultOptions(): foundry.appv1.api.FormApplicationOptions {\n return {\n ...super.defaultOptions,\n id: \"identify-item\",\n title: game.i18n.localize(\"PF2E.identification.Identify\"),\n template: `systems/${SYSTEM.id}/templates/actors/identify-item.hbs`,\n width: \"auto\",\n classes: [\"identify-popup\"],\n };\n }\n\n dcs = getItemIdentificationDCs(this.object);\n\n override async getData(): Promise {\n const item = this.object;\n return {\n ...(await super.getData()),\n isMagic: item.isMagical,\n isAlchemical: item.isAlchemical,\n dcs: this.dcs,\n };\n }\n\n // we extracted that part from activateListeners so it can be called from third party\n async postSkillChecks() {\n const item = this.object;\n const identifiedName = item.system.identification.identified.name;\n const dcs: Record = this.dcs;\n const action = item.isMagical ? \"identify-magic\" : item.isAlchemical ? \"identify-alchemy\" : \"recall-knowledge\";\n\n const path = `systems/${SYSTEM.id}/templates/actors/identify-item-chat-skill-checks.hbs`;\n const content = await foundry.applications.handlebars.renderTemplate(path, {\n identifiedName,\n action,\n skills: R.omit(dcs, [\"dc\"]),\n unidentified: item.system.identification.unidentified,\n uuid: item.uuid,\n });\n\n await getDocumentClass(\"ChatMessage\").create({ author: game.user.id, content });\n }\n\n override activateListeners($html: JQuery): void {\n const html = $html[0];\n\n const updateButton = html.querySelector(\"button.update-identification\");\n updateButton?.addEventListener(\"click\", () => {\n this.submit({ updateData: { status: updateButton.value } });\n });\n\n // Add listener on Post skill checks to chat button that posts item unidentified img and name and skill checks\n html.querySelector(\"button.post-skill-checks\")?.addEventListener(\"click\", async () => {\n await this.postSkillChecks();\n });\n }\n\n protected override async _updateObject(_event: Event, formData: Record): Promise {\n const status = formData[\"status\"];\n if (status === \"identified\") {\n return this.object.setIdentificationStatus(status);\n }\n }\n}\n\ninterface IdentifyPopupData extends foundry.appv1.api.FormApplicationData {\n isMagic: boolean;\n isAlchemical: boolean;\n dcs: IdentifyMagicDCs | IdentifyAlchemyDCs;\n}\n\ninterface IdentifyItemOptions extends DCOptions {\n notMatchingTraditionModifier: number;\n}\n\nexport { getItemIdentificationDCs, IdentifyItemPopup };\n", "import { ItemPF2e, PhysicalItemType } from \"@7h3laughingman/pf2e-types\";\nimport { R, SYSTEM } from \"..\";\n\nconst COIN_DENOMINATIONS = [\"pp\", \"gp\", \"sp\", \"cp\"] as const;\n\nconst COIN_COMPENDIUM_UUIDS = {\n pp: SYSTEM.itemUuid(\n \"Compendium.pf2e.equipment-srd.Item.JuNPeK5Qm1w6wpb4\",\n \"Compendium.pf2e-anachronism.equipment.Item.JuNPeK5Qm1w6wpb4\",\n ),\n gp: SYSTEM.itemUuid(\n \"Compendium.pf2e.equipment-srd.Item.B6B7tBWJSqOBz5zz\",\n \"Compendium.pf2e-anachronism.equipment.Item.B6B7tBWJSqOBz5zz\",\n ),\n sp: SYSTEM.itemUuid(\n \"Compendium.pf2e.equipment-srd.Item.5Ew82vBF9YfaiY9f\",\n \"Compendium.pf2e-anachronism.equipment.Item.5Ew82vBF9YfaiY9f\",\n ),\n cp: SYSTEM.itemUuid(\n \"Compendium.pf2e.equipment-srd.Item.lzJ8AVhRcbFul5fh\",\n \"Compendium.pf2e-anachronism.equipment.Item.lzJ8AVhRcbFul5fh\",\n ),\n};\n\nlet _physicalItemTypes: PhysicalItemType[] | undefined;\nfunction getPhysicalItemTypes() {\n return (_physicalItemTypes ??= R.pipe(\n R.entries(CONFIG.PF2E.Item.documentClasses),\n R.filter(([_, x]) => (Reflect.getPrototypeOf(x) as typeof ItemPF2e).name === \"PhysicalItemPF2e\"),\n R.map(([type]) => type as PhysicalItemType),\n ));\n}\n\nexport { COIN_COMPENDIUM_UUIDS, COIN_DENOMINATIONS, getPhysicalItemTypes };\n", "import { SpellArea } from \"@7h3laughingman/pf2e-types\";\nimport { Localization, R, RollMode } from \"..\";\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/f7d7441acbf856b490a4e0c0d799809cd6e3dc5d/src/util/misc.ts#L259\n */\nfunction splitListString(str: string, { delimiter = \",\", unique = true }: SplitListStringOptions = {}): string[] {\n const list = str\n .split(delimiter)\n .map((el) => el.trim())\n .filter((el) => el !== \"\");\n return unique ? R.unique(list) : list;\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/95e941aecaf1fa6082825b206b0ac02345d10538/src/util/misc.ts#L58\n */\nfunction setHasElement>(set: T, value: unknown): value is SetElement {\n return set.has(value);\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/78e7f116221c6138e4f3d7e03177bd85936c6939/src/util/misc.ts#L216\n */\nfunction ErrorPF2e(message: string): Error {\n return Error(`PF2e System | ${message}`);\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/07c666035850e084835e0c8c3ca365b06dcd0a75/src/util/tags.ts#L8\n */\nfunction traitSlugToObject(trait: string, dictionary: Record): TraitViewData {\n // Look up trait labels from `npcAttackTraits` instead of `weaponTraits` in case a battle form attack is\n // in use, which can include what are normally NPC-only traits\n const traitObject: TraitViewData = {\n name: trait,\n label: game.i18n.localize(dictionary[trait] ?? trait),\n description: null,\n };\n if (objectHasKey(CONFIG.PF2E.traitsDescriptions, trait)) {\n traitObject.description = CONFIG.PF2E.traitsDescriptions[trait];\n }\n\n return traitObject;\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/002ba0bf6d15dfc0d87a96009f02fb0743fb000b/src/module/sheet/helpers.ts#L158-L161\n */\nfunction isControlDown(event: PointerEvent | KeyboardEvent | TouchEvent | WheelEvent): boolean {\n return foundry.helpers.interaction.KeyboardManager.CONTROL_KEY_STRING === \"\u2318\" ? event.metaKey : event.ctrlKey;\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/07c666035850e084835e0c8c3ca365b06dcd0a75/src/util/misc.ts#L48\n */\nfunction objectHasKey(obj: O, key: unknown): key is keyof O {\n return (typeof key === \"string\" || typeof key === \"number\") && key in obj;\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/07c666035850e084835e0c8c3ca365b06dcd0a75/src/module/sheet/helpers.ts#L125\n */\nfunction isRelevantEvent(event: Maybe): event is MouseEvent | TouchEvent | KeyboardEvent | WheelEvent {\n return !!event && \"ctrlKey\" in event && \"metaKey\" in event && \"shiftKey\" in event;\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/07c666035850e084835e0c8c3ca365b06dcd0a75/src/module/sheet/helpers.ts#L149\n */\nfunction eventToRollMode(event: Maybe): RollMode | \"roll\" {\n if (!isRelevantEvent(event) || !(event.ctrlKey || event.metaKey)) return \"roll\";\n return game.user.isGM ? \"gmroll\" : \"blindroll\";\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/5967df95d2645162d06d6ee317e99cf9aa03477e/src/module/sheet/helpers.ts#L132\n */\nfunction eventToRollParams(event: Maybe, rollType: { type: \"check\" | \"damage\" }): ParamsFromEvent {\n const key = rollType.type === \"check\" ? \"showCheckDialogs\" : \"showDamageDialogs\";\n const skipDefault = !game.user.settings[key];\n if (!isRelevantEvent(event)) return { skipDialog: skipDefault };\n\n const params: ParamsFromEvent = { skipDialog: event.shiftKey ? !skipDefault : skipDefault };\n if (event.ctrlKey || event.metaKey) {\n params.rollMode = game.user.isGM ? \"gmroll\" : \"blindroll\";\n }\n\n return params;\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/f7d7441acbf856b490a4e0c0d799809cd6e3dc5d/src/module/system/text-editor.ts#L344\n */\nfunction parseInlineParams(\n paramString: string,\n options: { first?: string } = {},\n): Record | null {\n const parts = splitListString(paramString, { delimiter: \"|\" });\n const result = parts.reduce(\n (result, part, idx) => {\n if (idx === 0 && options.first && !part.includes(\":\")) {\n result[options.first] = part.trim();\n return result;\n }\n\n const colonIdx = part.indexOf(\":\");\n const portions = colonIdx >= 0 ? [part.slice(0, colonIdx), part.slice(colonIdx + 1)] : [part, \"\"];\n result[portions[0]] = portions[1];\n\n return result;\n },\n {} as Record,\n );\n\n return result;\n}\n\nlet pluralRules: Intl.PluralRules;\n/**\n * https://github.com/foundryvtt/pf2e/blob/5ebcd0359d1358bb00b76c47e7b84289239234b9/src/util/misc.ts#L226\n */\nfunction ordinalString(value: number): string {\n pluralRules ??= new Intl.PluralRules(game.i18n.lang, { type: \"ordinal\" });\n const suffix = game.i18n.localize(`PF2E.OrdinalSuffixes.${pluralRules.select(value)}`);\n return game.i18n.format(\"PF2E.OrdinalNumber\", { value, suffix });\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/895e512a3346ae9e7eeafbc59fdbac1b68651afa/src/util/misc.ts#L352\n */\nfunction localizer(prefix: string): (...args: Parameters) => string {\n return (...[suffix, formatArgs]: Parameters) =>\n formatArgs ? game.i18n.format(`${prefix}.${suffix}`, formatArgs) : game.i18n.localize(`${prefix}.${suffix}`);\n}\n\nlet intlNumberFormat: Intl.NumberFormat;\n/**\n * https://github.com/foundryvtt/pf2e/blob/142b2ce5524f3f331298f97f0b759dcb842731ad/src/util/misc.ts#L72\n */\nfunction signedInteger(value: number, { emptyStringZero = false, zeroIsNegative = false } = {}): string {\n if (value === 0 && emptyStringZero) return \"\";\n const nf = (intlNumberFormat ??= new Intl.NumberFormat(game.i18n.lang, {\n maximumFractionDigits: 0,\n signDisplay: \"always\",\n }));\n const maybeNegativeZero = zeroIsNegative && value === 0 ? -0 : value;\n\n return nf.format(maybeNegativeZero);\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/0191f1fdac24c3903a939757a315043d1fcbfa59/src/util/misc.ts#L56\n */\nfunction tupleHasValue(array: A, value: unknown): value is A[number] {\n return array.includes(value);\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/f26bfcc353ebd58efd6d1140cdb8e20688acaea8/src/module/item/spell/helpers.ts#L16\n */\nfunction createSpellAreaLabel(areaData: SpellArea): string {\n const formatString = \"PF2E.Item.Spell.Area\";\n const shape = game.i18n.localize(`PF2E.Area.Shape.${areaData.type}`);\n\n // Handle special cases of very large areas\n const largeAreaLabel = {\n 1320: \"PF2E.Area.Size.Quarter\",\n 2640: \"PF2E.Area.Size.Half\",\n 5280: \"1\",\n }[areaData.value];\n if (largeAreaLabel) {\n const size = game.i18n.localize(largeAreaLabel);\n const unit = game.i18n.localize(\"PF2E.Area.Size.Mile\");\n return game.i18n.format(formatString, { shape, size, unit, units: unit });\n }\n\n const size = Number(areaData.value);\n const unit = game.i18n.localize(\"PF2E.Foot.Label\");\n const units = game.i18n.localize(\"PF2E.Foot.Plural\");\n return game.i18n.format(formatString, { shape, size, unit, units });\n}\n\nfunction sluggify(text: string, options?: { camel?: \"dromedary\" | \"bactrian\" }): string {\n return game.pf2e.system.sluggify(text, options);\n}\n\ninterface SplitListStringOptions {\n delimiter?: string | RegExp;\n unique?: boolean;\n}\n\ninterface TraitViewData {\n /** The name of this action. */\n name: string;\n /** The label for this action which will be rendered on the UI. */\n label: string;\n /** The roll this trait applies to, if relevant. */\n rollName?: string;\n /** The option that this trait applies to the roll (of type `rollName`). */\n rollOption?: string;\n /** An extra css class added to the UI marker for this trait. */\n cssClass?: string;\n /** The description of the trait */\n description: string | null;\n}\n\ntype ParamsFromEvent = { skipDialog: boolean; rollMode?: RollMode | \"roll\" };\n\nexport {\n createSpellAreaLabel,\n ErrorPF2e,\n eventToRollMode,\n eventToRollParams,\n isControlDown,\n localizer,\n objectHasKey,\n ordinalString,\n parseInlineParams,\n setHasElement,\n signedInteger,\n sluggify,\n splitListString,\n traitSlugToObject,\n tupleHasValue,\n};\n", "import { ordinalString } from \".\";\n\nconst MAGIC_TRADITIONS = new Set([\"arcane\", \"divine\", \"occult\", \"primal\"] as const);\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/5ebcd0359d1358bb00b76c47e7b84289239234b9/src/module/item/spellcasting-entry/helpers.ts#L43\n */\nfunction getSpellRankLabel(group: \"cantrips\" | number): string {\n return group === 0 || group === \"cantrips\"\n ? game.i18n.localize(\"PF2E.Actor.Creature.Spellcasting.Cantrips\")\n : game.i18n.format(\"PF2E.Item.Spell.Rank.Ordinal\", { rank: ordinalString(group) });\n}\n\nexport { getSpellRankLabel, MAGIC_TRADITIONS };\n", "import { ConsumableSource, ItemPF2e, SpellConsumableItemType, SpellPF2e } from \"@7h3laughingman/pf2e-types\";\nimport { ErrorPF2e, MAGIC_TRADITIONS, objectHasKey, setHasElement } from \".\";\nimport { ImageFilePath, R, SYSTEM } from \"..\";\n\nconst CANTRIP_DECK_UUID = SYSTEM.itemUuid(\n \"Compendium.pf2e.equipment-srd.Item.tLa4bewBhyqzi6Ow\",\n \"Compendium.pf2e-anachronism.equipment.Item.tLa4bewBhyqzi6Ow\",\n);\n\n/**\n * slightly modified version of\n * https://github.com/reonZ/pf2e/blob/6e5481af7bb1e1b9d28d35fb3ad324511c5170d1/src/module/item/consumable/spell-consumables.ts#L21\n */\nasync function createConsumableFromSpell(\n spell: SpellPF2e,\n {\n type,\n heightenedLevel: rank = spell.baseRank,\n mystified = false,\n itemImg,\n itemName,\n temp,\n }: {\n type: SpellConsumableItemType;\n heightenedLevel?: number;\n mystified?: boolean;\n // added stuff\n temp?: boolean;\n itemName?: string;\n itemImg?: ImageFilePath;\n },\n): Promise {\n const data = objectHasKey(CONFIG.PF2E.spellcastingItems, type) ? CONFIG.PF2E.spellcastingItems[type] : null;\n const uuids: Record = data?.compendiumUuids ?? [];\n const uuid = uuids?.[rank] ?? (type === \"cantripDeck5\" ? CANTRIP_DECK_UUID() : null);\n const consumable = uuid ? await fromUuid(uuid) : null;\n if (!consumable?.isOfType(\"consumable\")) {\n throw ErrorPF2e(\"Failed to retrieve consumable item\");\n }\n\n const consumableSource = { ...consumable.toObject(), _id: null }; // Clear _id\n\n const traits = consumableSource.system.traits;\n traits.value = R.unique([...traits.value, ...spell.system.traits.value]);\n traits.rarity = spell.rarity;\n if (traits.value.includes(\"magical\") && traits.value.some((t) => setHasElement(MAGIC_TRADITIONS, t))) {\n traits.value.splice(traits.value.indexOf(\"magical\"), 1);\n }\n traits.value.sort();\n\n const nameTemplate = type === \"cantripDeck5\" ? \"PF2E.Item.Physical.FromSpell.CantripDeck5\" : data?.nameTemplate;\n consumableSource.name =\n nameTemplate && !itemName\n ? game.i18n.format(nameTemplate, { name: spell.name, level: rank })\n : `${itemName ?? type} of ${spell.name} (Rank ${rank})`;\n const description = consumableSource.system.description.value;\n\n consumableSource.system.description.value = (() => {\n const paragraphElement = document.createElement(\"p\");\n paragraphElement.append(spell.sourceId ? `@UUID[${spell.sourceId}]{${spell.name}}` : spell.description);\n\n const containerElement = document.createElement(\"div\");\n const hrElement = document.createElement(\"hr\");\n containerElement.append(paragraphElement, hrElement);\n hrElement.insertAdjacentHTML(\"afterend\", description);\n\n return containerElement.innerHTML;\n })();\n\n // Cantrip deck casts at level 1\n if (type !== \"cantripDeck5\") {\n consumableSource.system.spell = foundry.utils.mergeObject(\n spell._source,\n { _id: foundry.utils.randomID(), system: { location: { value: null, heightenedLevel: rank } } },\n { inplace: false },\n );\n }\n\n if (mystified) {\n consumableSource.system.identification.status = \"unidentified\";\n }\n\n if (typeof itemImg === \"string\") {\n consumableSource.img = itemImg;\n }\n\n if (temp) {\n consumableSource.system.temporary = true;\n }\n\n return consumableSource;\n}\n\nexport { createConsumableFromSpell };\n", "import { UserPF2e } from \"@7h3laughingman/pf2e-types\";\nimport {\n createHTMLElement,\n htmlClosest,\n htmlQuery,\n localize,\n MODULE,\n R,\n SettingConfig,\n SettingSubmenuConfig,\n userIsGM,\n} from \".\";\n\nfunction settingPath(...path: string[]): string {\n return MODULE.path(\"settings\", ...path);\n}\n\nfunction getSetting(key: string): T;\nfunction getSetting(key: string) {\n return game.settings.get(MODULE.id, key);\n}\n\nfunction setSetting(key: string, value: TSetting): Promise;\nfunction setSetting(key: string, value: any) {\n return game.settings.set(MODULE.id, key, value);\n}\n\nfunction registerSetting(key: string, options: RegisterSettingOptions) {\n const isGM = userIsGM();\n if ((options.gmOnly && !isGM) || (options.playerOnly && isGM)) return;\n\n if (\"choices\" in options && Array.isArray(options.choices)) {\n options.choices = R.fromKeys(options.choices, (choice) => settingPath(key, \"choices\", choice));\n }\n\n options.name ??= settingPath(key, \"name\");\n options.hint ??= settingPath(key, \"hint\");\n options.config ??= true;\n\n if (options.scope === \"user\" && !options.broadcast && options.onChange) {\n const _onChange = options.onChange;\n options.onChange = (value, operation, userId) => {\n if (userId !== game.userId) return;\n _onChange(value, operation, userId);\n };\n }\n\n game.settings.register(MODULE.id, key, options as SettingRegistration);\n}\n\nfunction registerSettingMenu(key: string, options: RegisterSettingMenuOptions) {\n options.name ??= settingPath(\"menus\", key, \"name\");\n options.label ??= settingPath(\"menus\", key, \"label\");\n options.hint ??= settingPath(\"menus\", key, \"hint\");\n options.icon ??= \"fas fa-cogs\";\n\n game.settings.registerMenu(MODULE.id, key, options as SettingSubmenuConfig);\n}\n\nfunction registerModuleSettings(settings: ModuleSettingsRegistration) {\n for (const [group, entries] of R.entries(settings)) {\n for (const setting of entries) {\n setting.key = group ? `${group}.${setting.key}` : setting.key;\n registerSetting(setting.key, setting);\n }\n }\n\n Hooks.on(\"renderSettingsConfig\", (_, html, options: RenderSettingsConfigOptions) =>\n onRenderSettingsConfig(html, options, settings),\n );\n}\n\nfunction getUserSetting(key: string, userId: string): UserSetting | undefined;\nfunction getUserSetting(key: string, userId?: string): UserSetting[];\nfunction getUserSetting(key: string, userId?: string): UserSetting | UserSetting[] | undefined {\n const moduleKey = MODULE.path(key);\n const storage = game.settings.storage.get(\"user\");\n return userId\n ? (storage.find((setting) => setting.user === userId && setting.key === moduleKey) as any)\n : (storage.filter((setting) => !!setting.user && setting.key === moduleKey) as any);\n}\n\n/**\n * modified version of\n * client/helpers/client-settings.mjs#266\n */\nasync function setUserSetting(user: UserPF2e | string, key: string, value: any) {\n if (!game.ready) {\n throw new Error(\"You may not set a World-level Setting before the Game is ready.\");\n }\n\n const setting = assertSetting(MODULE.id, key);\n if (!setting.id) return;\n\n const userId = user instanceof User ? user.id : user;\n const json = cleanJSON(setting, value);\n const current = game.settings.storage.get(\"user\").getSetting(setting.id, userId);\n\n if (current?._id) {\n await current.update({ value: json });\n return current;\n }\n\n return getDocumentClass(\"Setting\").create({ key: setting.id, user: userId, value: json });\n}\n\n/**\n * client/helpers/client-settings.mjs#247\n */\nfunction assertSetting(namespace: string, key: string): SettingConfig {\n const id = `${namespace}.${key}`;\n if (!namespace || !key) {\n throw new Error(`You must specify both namespace and key portions of the setting, you provided \"${id}\"`);\n }\n const setting = game.settings.settings.get(id);\n if (!setting) throw new Error(`\"${id}\" is not a registered game setting`);\n return setting;\n}\n\n/**\n * client/helpers/client-settings.mjs#315\n */\nfunction cleanJSON(setting: SettingConfig, value: unknown): string {\n // Assign using DataField\n if (setting.type instanceof foundry.data.fields.DataField) {\n value = setting.type.clean(value);\n const err = setting.type.validate(value, { fallback: false });\n if (err instanceof foundry.data.validation.DataModelValidationFailure) throw err.asError();\n }\n\n // Assign using DataModel\n if (foundry.utils.isSubclass(setting.type, foundry.abstract.DataModel)) {\n value = setting.type.fromSource(value || {}, { strict: true });\n }\n\n // Plain default value\n else if (value === undefined) value = setting.default;\n return JSON.stringify(value);\n}\n\nfunction onRenderSettingsConfig(\n html: HTMLElement,\n options: RenderSettingsConfigOptions,\n settings: ModuleSettingsRegistration,\n) {\n const id = MODULE.id;\n const category = options.categories[id];\n if (!category) return;\n\n const tab = htmlQuery(\n html,\n `[data-application-part=\"main\"] [data-group=\"categories\"][data-tab=\"${id}\"][data-category=\"${id}\"]`,\n );\n\n if (!tab) return;\n\n const gmOnlyLabel = localize.shared(\"gmOnly\");\n const playerOnlyLabel = localize.shared(\"playerOnly\");\n const reloadLabel = localize.shared(\"reloadRequired\");\n const gmOnly = ``;\n const player = ``;\n const reload = ``;\n\n for (const entry of category.entries) {\n if (entry.menu) continue;\n\n const name = entry.field.name;\n const extras: string[] = [];\n const setting = game.settings.settings.get(name) as RegisterSettingOptions;\n if (!setting) continue;\n\n if (setting.gmOnly) {\n extras.push(gmOnly);\n }\n\n if (setting.playerOnly) {\n extras.push(player);\n }\n\n if (setting.requiresReload) {\n extras.push(reload);\n }\n\n if (!extras.length) continue;\n\n const input = htmlQuery(tab, `[name=\"${name}\"]`);\n const group = htmlClosest(input, \".form-group\");\n const label = htmlQuery(group, \"label\");\n const span = createHTMLElement(\"span\", {\n content: ` ${extras.join(\", \")}`,\n });\n\n label?.append(span);\n }\n\n const settingKeys = R.keys(settings);\n for (let i = 0; i < settingKeys.length; i++) {\n const key = settingKeys[i];\n if (!key) continue;\n\n const input = htmlQuery(tab, `[name^=\"${MODULE.id}.${key}\"]`);\n const group = htmlClosest(input, \".form-group\");\n const title = createHTMLElement(\"h4\", {\n content: localize(\"settings\", key, \"title\"),\n });\n\n title.style.marginBlock = i === 0 ? \"0\" : \"0.5em 0em\";\n\n group?.before(title);\n }\n}\n\ntype ModuleSettingsRegistration = Record>;\n\ntype SettingRegistration = Parameters[2];\n\ntype RegisterSettingMenuOptions = PartialExcept;\n\ntype RegisterSettingOptions = Omit & {\n broadcast?: boolean;\n choices?: Record | string[] | ReadonlyArray;\n gmOnly?: boolean;\n name?: string;\n onChange?: (value: any, operation: object, userId: string) => void | Promise;\n playerOnly?: boolean;\n range?: { min?: number; max?: number; step?: number };\n scope: \"world\" | \"user\";\n};\n\ntype RenderSettingsConfigOptions = {\n categories: Record;\n};\n\ntype RenderSettingsConfigCategory = {\n id: string;\n entries: RenderSettingsConfigCategoryEntry[];\n};\n\ntype RenderSettingsConfigCategoryEntry = {\n label: string;\n} & ({ menu: true; key: string } | { menu: false; field: { name: string } });\n\ntype UserSetting = Omit & { value: T; user: string };\n\nexport {\n getSetting,\n getUserSetting,\n registerModuleSettings,\n registerSetting,\n registerSettingMenu,\n setSetting,\n settingPath,\n setUserSetting,\n};\nexport type {\n ModuleSettingsRegistration,\n RegisterSettingMenuOptions,\n RegisterSettingOptions,\n RenderSettingsConfigOptions,\n SettingRegistration,\n};\n", "import { DateTime, HourNumbers, MinuteNumbers, SecondNumbers } from \"luxon\";\nimport { R } from \".\";\n\nenum TimeChangeMode {\n ADVANCE,\n RETRACT,\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/e215ebfbb287190d313fe0441e0362439766786d/src/module/apps/world-clock/time-of-day.ts#L8\n */\nclass TimeOfDay {\n constructor(\n public readonly hour: HourNumbers,\n public readonly minute: MinuteNumbers,\n public readonly second: SecondNumbers,\n ) {}\n\n /** Point in morning twilight where dim light begins */\n static DAWN = new TimeOfDay(4, 58, 54);\n\n static NOON = new TimeOfDay(12, 0, 0);\n\n /** Point in evening twilight where dim light begins */\n static DUSK = new TimeOfDay(18, 34, 6);\n\n static MIDNIGHT = new TimeOfDay(0, 0, 0);\n\n /**\n * Returns positive or negative number of seconds to add to current\n * game time advance function https://foundryvtt.com/api/GameTime.hbs#advance\n * @param worldTime the current time as luxon DateTime\n * @param mode whether to go back to that point in time or to advance\n */\n diffSeconds(worldTime: DateTime, mode: TimeChangeMode): number {\n const targetTime = worldTime.set(this);\n const targetDayDifference = TimeOfDay.diffDays(worldTime, targetTime, mode);\n const targetDay = worldTime.plus({ day: targetDayDifference });\n\n return targetDay.set(this).diff(worldTime, \"seconds\").seconds;\n }\n\n private static diffDays(currentTime: DateTime, targetTime: DateTime, mode: TimeChangeMode): -1 | 0 | 1 {\n // if we have the same point in time, we always want to either skip or rewind a full day\n if (currentTime >= targetTime && mode === TimeChangeMode.ADVANCE) {\n // case: now: 12:01 and advance to 12:00 -> we need to add 1 day to calculate the difference\n return 1;\n } else if (currentTime <= targetTime && mode === TimeChangeMode.RETRACT) {\n // case: now: 12:00 and retract to 12:01 -> we need to subtract 1 day to calculate the difference\n return -1;\n } else {\n return 0;\n }\n }\n}\n\nfunction createTimeout(\n callback: (...args: TArgs) => void,\n options?: PersistentTimeoutOptions | number,\n) {\n let timeoutId: NodeJS.Timeout | null = null;\n\n const usedOptions = R.isNumber(options) ? { defaultDelay: options } : options;\n\n const minDelay = Math.max(usedOptions?.minDelay ?? 0, 0);\n const defaultDelay = Math.max(usedOptions?.defaultDelay ?? 1, minDelay);\n\n return {\n start(...args: TArgs) {\n if (timeoutId !== null) {\n this.stop();\n }\n\n if (defaultDelay < 1) {\n callback(...args);\n } else {\n timeoutId = setTimeout(callback, defaultDelay, ...args);\n }\n },\n startWithDelay(delay: number, ...args: TArgs) {\n if (timeoutId !== null) {\n this.stop();\n }\n\n const usedDelay = Math.max(delay, minDelay);\n\n if (usedDelay < 1) {\n callback(...args);\n } else {\n timeoutId = setTimeout(callback, usedDelay, ...args);\n }\n },\n stop() {\n if (timeoutId === null) return;\n\n clearTimeout(timeoutId);\n timeoutId = null;\n },\n };\n}\n\n/**\n * slightly modified (also fixed the typo)\n * https://github.com/foundryvtt/pf2e/blob/e215ebfbb287190d313fe0441e0362439766786d/src/module/apps/world-clock/app.ts#L237\n */\nfunction calculateTimeIncrement(interval: string, intervalMode: \"+\" | \"-\"): number {\n const worldTime = game.pf2e.worldClock.worldTime;\n const mode = intervalMode === \"+\" ? TimeChangeMode.ADVANCE : TimeChangeMode.RETRACT;\n\n switch (interval) {\n case \"dawn\":\n return TimeOfDay.DAWN.diffSeconds(worldTime, mode);\n case \"noon\":\n return TimeOfDay.NOON.diffSeconds(worldTime, mode);\n case \"dusk\":\n return TimeOfDay.DUSK.diffSeconds(worldTime, mode);\n case \"midnight\":\n return TimeOfDay.MIDNIGHT.diffSeconds(worldTime, mode);\n default: {\n const sign = mode === TimeChangeMode.ADVANCE ? 1 : -1;\n return Number(interval) * sign;\n }\n }\n}\n\nfunction getWorldTime(): number {\n return game.settings.get(\"core\", \"time\") as number;\n}\n\nfunction getTimeWithSeconds(time: DateTime) {\n return game.pf2e.worldClock.timeConvention === 24\n ? time.toFormat(\"HH:mm:ss\")\n : time.toLocaleString(DateTime.TIME_WITH_SECONDS);\n}\n\nfunction waitTimeout(time: number = 1): Promise {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\n\nasync function advanceTime(interval: TimeInterval, direction: \"+\" | \"-\"): Promise {\n const sign = direction === \"+\" ? 1 : -1;\n const increment = Number(interval) * sign;\n\n if (increment !== 0) {\n return game.time.advance(increment);\n }\n}\n\nfunction getShortTime(time: DateTime) {\n return game.pf2e.worldClock.timeConvention === 24\n ? time.toFormat(\"HH:mm\")\n : time.toLocaleString(DateTime.TIME_SIMPLE);\n}\n\nfunction getShortDateTime() {\n const worldClock = game.pf2e.worldClock;\n const worldTime = worldClock.worldTime;\n const time = getShortTime(worldTime);\n\n const date =\n worldClock.dateTheme === \"CE\"\n ? worldTime.toLocaleString(DateTime.DATE_SHORT)\n : DateTime.local(worldClock[\"year\"], worldTime.month, worldTime.day).toLocaleString(DateTime.DATE_SHORT);\n\n return {\n worldClock,\n worldTime,\n time,\n date,\n };\n}\n\nfunction timestampToLocalTime(time: number) {\n return new Date(time).toLocaleString();\n}\n\ntype TimeInterval = \"dawn\" | \"noon\" | \"dusk\" | \"midnight\" | `${number}` | number;\n\ntype PersistentTimeout = {\n start: (delay: number, ...args: TArgs) => void;\n stop(): void;\n};\n\ntype PersistentTimeoutOptions = {\n defaultDelay?: number;\n minDelay?: number;\n};\n\nexport {\n advanceTime,\n calculateTimeIncrement,\n createTimeout,\n getShortDateTime,\n getShortTime,\n getTimeWithSeconds,\n getWorldTime,\n timestampToLocalTime,\n waitTimeout,\n};\nexport type { PersistentTimeout };\n", "import {\n AttributeString,\n CharacterPF2e,\n ConsumablePF2e,\n ConsumableSource,\n ConsumableTrait,\n ItemPF2e,\n ItemSourcePF2e,\n ItemUUID,\n MagicTradition,\n ModelPropsFromRESchema,\n ModelPropsFromSchema,\n OneToTen,\n PhysicalItemPF2e,\n R,\n ResolvableValueField,\n RuleElement,\n RuleElementOptions,\n RuleElementSchema,\n RuleElementSource,\n SpellPF2e,\n SpellSource,\n getRuleElementCls,\n isCastConsumable,\n ruleElementResolveField,\n setHasElement,\n} from \"foundry-helpers\";\nimport { MAGIC_TRADITIONS, SourceFromSchema } from \"foundry-helpers/dist\";\nimport { splitListString } from \"foundry-helpers/src\";\nimport { actionable } from \"..\";\nimport fields = foundry.data.fields;\n\nfunction createItemCastRuleElement() {\n class ItemCastRuleElement extends getRuleElementCls() {\n // static autogenForms = true;\n #isAmmo: boolean = false;\n #isConsumable: boolean = false;\n #isWeapon: boolean = false;\n\n constructor(data: RuleElementSource, options: RuleElementOptions) {\n data.priority ??= 99;\n data.requiresEquipped = false;\n data.requiresInvestment = false;\n\n super(data, options);\n\n if (!this.item.isOfType(\"physical\")) {\n this.failValidation(\"parent item must be physical\");\n }\n\n if (this.item.isOfType(\"consumable\")) {\n this.#isConsumable = true;\n\n if (isCastConsumable(this.item)) {\n this.failValidation(\"parent item cannot be a scroll/wand\");\n }\n } else {\n this.#isAmmo = this.item.isOfType(\"ammo\");\n this.#isWeapon = this.item.isOfType(\"weapon\");\n }\n\n if (!R.isIncludedIn(this.dc, [null, undefined]) && !R.isIncludedIn(typeof this.dc, [\"string\", \"number\"])) {\n this.failValidation(\"dc must be a number, string, null or undefined\");\n }\n\n const uuid = this.resolveInjectedProperties(this.uuid);\n const type = fromUuidSync(uuid, { strict: false })?.type;\n if (type !== \"spell\") {\n this.failValidation(\"uuid must be a valid spell uuid\");\n }\n }\n\n static override defineSchema(): ItemCastSchema {\n return {\n ...super.defineSchema(),\n attribute: new fields.StringField({\n required: false,\n nullable: true,\n blank: false,\n choices: R.keys(CONFIG.PF2E.abilities),\n initial: undefined,\n }),\n data: new fields.ObjectField(),\n dc: ruleElementResolveField({\n required: false,\n nullable: true,\n initial: undefined,\n }),\n max: ruleElementResolveField({\n required: false,\n nullable: true,\n initial: undefined,\n }),\n rank: new fields.NumberField({\n required: false,\n nullable: true,\n integer: true,\n min: 0,\n max: 10,\n initial: undefined,\n }),\n recharge: new fields.BooleanField({\n required: false,\n nullable: false,\n initial: true,\n }),\n statistic: new fields.ArrayField(\n new fields.StringField({\n required: true,\n nullable: false,\n blank: false,\n initial: undefined,\n }),\n {\n required: false,\n nullable: true,\n initial: undefined,\n },\n ),\n tradition: new fields.StringField({\n required: false,\n nullable: true,\n blank: false,\n choices: R.keys(CONFIG.PF2E.magicTraditions),\n initial: undefined,\n }),\n uuid: new fields.DocumentUUIDField({\n required: true,\n nullable: false,\n label: \"PF2E.UUID.Label\",\n type: \"Item\",\n }),\n };\n }\n\n get isConsumable(): boolean {\n return this.#isConsumable;\n }\n\n get isAmmo(): boolean {\n return this.#isAmmo;\n }\n\n get isWeapon(): boolean {\n return this.#isWeapon;\n }\n\n get resolvedMax(): number | undefined {\n if (this.isAmmo) {\n return undefined;\n }\n\n if (this.isConsumable) {\n return (this.item as ConsumablePF2e).uses.max;\n }\n\n switch (typeof this.max) {\n case \"number\":\n return Math.max(this.max, 0);\n case \"string\":\n const resolved = Number(this.resolveValue(this.max));\n return Math.max(Math.trunc(resolved), 0);\n default:\n return undefined;\n }\n }\n\n get resolvedDc(): number | undefined {\n switch (typeof this.dc) {\n case \"number\":\n return Math.max(this.dc, 1);\n case \"string\":\n const resolved = Number(this.resolveValue(this.dc));\n return Math.max(Math.trunc(resolved), 1);\n default:\n return undefined;\n }\n }\n\n get usableMax(): number {\n return this.resolvedMax || 1;\n }\n\n get usableValue(): number {\n if (this.isAmmo) {\n return 1;\n }\n\n if (this.isConsumable) {\n return (this.item as ConsumablePF2e).uses.value;\n }\n\n const max = this.usableMax;\n return Math.clamp(this.data.value ?? max, 0, max);\n }\n\n override async preUpdateActor(): Promise<{ create: ItemSourcePF2e[]; delete: string[] }> {\n return { create: [], delete: [] };\n }\n\n override onApplyActiveEffects() {\n if (this.invalid || !this.actor.isOfType(\"character\")) return;\n\n if (this.data.sourceId !== this.uuid || this.missingSpellData()) {\n return this.#setData();\n }\n\n if (!this.test()) return;\n\n const entryId = this.data.entryId as string;\n const spellId = this.data.spell?._id as string;\n const existAmmo = this.isWeapon && actionable.getInMemory(this.actor, \"ammos\", spellId);\n\n // we are a weapon and found existing ammo, we set it up in place of the weapon\n if (existAmmo) {\n existAmmo.parent = this.item;\n actionable.setInMemory(this.actor, \"spells\", spellId, existAmmo);\n actionable.setInMemory(this.actor, \"spellcasting\", entryId, existAmmo);\n return;\n }\n\n const item = this.createConsumable();\n\n const data: VirtualSpellData = {\n ...R.pick(this, [\"attribute\", \"statistic\", \"tradition\"]),\n dc: this.resolvedDc,\n entryId,\n item,\n max: this.resolvedMax,\n parent: this.item,\n recharge: this.recharge,\n ruleIndex: this.sourceIndex as number,\n spellId,\n };\n\n if (this.isAmmo) {\n actionable.setInMemory(this.actor, \"ammos\", spellId, data);\n\n const existWeapon = actionable.getInMemory(this.actor, \"spells\", spellId);\n\n if (existWeapon?.parent.isOfType(\"weapon\")) {\n // we replace this parent with the found weapon parent, making it looks like the RE is on the weapon\n data.parent = existWeapon.parent;\n } else {\n // we are an ammo and haven't found an already existing weapon, so we skip\n // the idea is that parentless ammo will never generate the spell\n return;\n }\n }\n\n actionable.setInMemory(this.actor, \"spells\", spellId, data);\n actionable.setInMemory(this.actor, \"spellcasting\", entryId, data);\n }\n\n test(rollOptions?: string[] | Set | undefined): boolean {\n return super.test(rollOptions) && !this.missingSpellData();\n }\n\n missingSpellData() {\n return (\n !R.isString(this.data.entryId) ||\n !R.isPlainObject(this.data.spell) ||\n !R.isString(this.data.spell._id) ||\n this.data.spell.type !== \"spell\"\n );\n }\n\n createConsumable(): ConsumablePF2e {\n const actor = this.actor;\n const spellSource = this.data.spell as SpellSource & { _id: string };\n const isCantrip = spellSource.system.traits.value.includes(\"cantrip\");\n\n spellSource.system.location = {\n autoHeightenLevel: (isCantrip && this.rank) || undefined,\n heightenedLevel: (!isCantrip && this.rank) || undefined,\n value: this.data.entryId as string,\n };\n\n const traits = {\n rarity: spellSource.system.traits.rarity,\n value: [\"consumable\", ...spellSource.system.traits.value] as ConsumableTrait[],\n };\n\n if (traits.value.includes(\"magical\") && traits.value.some((t) => setHasElement(MAGIC_TRADITIONS, t))) {\n traits.value.splice(traits.value.indexOf(\"magical\"), 1);\n }\n\n traits.value.sort();\n\n const source: PreCreate = {\n _id: this.data.entryId,\n img: this.item.img,\n name: this.item.name,\n system: {\n bulk: { value: 0 },\n category: \"wand\",\n equipped: { carryType: \"worn\", handsHeld: 0 },\n level: { value: this.item.level },\n spell: spellSource,\n traits,\n usage: { value: \"worn\" },\n uses: { value: this.usableValue, max: this.usableMax, autoDestroy: false },\n },\n type: \"consumable\",\n };\n\n const item = new Item.implementation(source, { parent: actor }) as ConsumablePF2e;\n\n item.consume = async (thisMany = 1) => {\n if (actor.spellcasting.canCastConsumable(item)) {\n item.castEmbeddedSpell();\n } else {\n const formatParams = { actor: actor.name, spell: item.name };\n const message = game.i18n.format(\"PF2E.LackCastConsumableCapability\", formatParams);\n ui.notifications.warn(message);\n return;\n }\n\n if (this.isConsumable) {\n // we consume parent instead of using spell uses\n const parent = this.item as ConsumablePF2e;\n const newValue = Math.max(this.usableValue - thisMany, 0);\n\n if (newValue < 1 && parent.system.uses.autoDestroy) {\n await parent.delete();\n } else {\n await parent.update({ \"system.uses.value\": newValue });\n }\n } else if (this.resolvedMax) {\n // non infinite cast\n const newValue = Math.max(this.usableValue - thisMany, 0);\n await this.updateData({ value: newValue });\n }\n };\n\n return item;\n }\n\n updateData(changes: ItemCastUpdateDataArgs, sourceOnly: true): EmbeddedDocumentUpdateData | undefined;\n updateData(\n changes: ItemCastUpdateDataArgs,\n sourceOnly?: boolean,\n ): Promise | undefined> | undefined;\n updateData(\n changes: ItemCastUpdateDataArgs,\n sourceOnly?: boolean,\n ): EmbeddedDocumentUpdateData | Promise | undefined> | undefined {\n const item = this.item;\n const sourceIndex = this.sourceIndex ?? -1;\n const rules = foundry.utils.deepClone(item._source.system.rules);\n const rule = rules[sourceIndex] as DeepPartial | undefined;\n if (!rule?.data) return;\n\n foundry.utils.mergeObject(rule.data, changes);\n\n if (sourceOnly) {\n const parentItem = item.parentItem;\n if (parentItem) {\n const subitems = foundry.utils.deepClone(parentItem._source.system.subitems);\n const subitem = subitems?.find((i) => i._id === item.id);\n\n if (subitem) {\n subitem.system.rules = rules;\n }\n\n return { _id: parentItem.id, \"system.subitems\": subitems };\n } else {\n return { _id: item.id, \"system.rules\": rules };\n }\n } else {\n return item.update({ \"system.rules\": rules });\n }\n }\n\n static async setData(parent: PhysicalItemPF2e, source: RuleElementSource): Promise {\n try {\n const rule = new ItemCastRuleElement(source, { parent });\n\n const data: ItemCastRuleData = ((source as ItemCastRuleSource).data = {\n entryId: foundry.utils.randomID(),\n sourceId: rule.uuid,\n spell: await rule.getSpellSource(),\n });\n\n rule.setDataValue(data);\n } catch (error: any) {}\n }\n\n setDataValue(data: DeepPartial): void {\n const max = this.resolvedMax;\n if (max && (!R.isNumber(data.value) || data.value > max)) {\n data.value = max;\n } else if (!max && R.isNumber(data.value)) {\n delete data.value;\n }\n }\n\n async getSpellSource(): Promise<(SpellSource & { _id: string }) | undefined> {\n const spell = await fromUuid(this.uuid);\n if (!spell) return;\n\n const spellSource = spell.toObject();\n spellSource._id = foundry.utils.randomID();\n\n return spellSource as SpellSource & { _id: string };\n }\n\n async #setData() {\n const sourceIndex = this.sourceIndex ?? -1;\n if (sourceIndex < 0) return;\n\n const rules = foundry.utils.deepClone(this.item._source.system.rules);\n const rule = rules[sourceIndex] as DeepPartial | undefined;\n if (!rule) return;\n\n rule.data ??= {};\n rule.data.entryId ??= foundry.utils.randomID();\n rule.data.sourceId = this.uuid;\n rule.data.spell = await this.getSpellSource();\n this.setDataValue(rule.data);\n\n await this.item.update({ \"system.rules\": rules });\n }\n }\n\n interface ItemCastRuleElement extends RuleElement, ModelPropsFromRESchema {\n get actor(): CharacterPF2e;\n get item(): PhysicalItemPF2e;\n }\n\n return ItemCastRuleElement;\n}\n\nfunction generateItemCastRuleSource(\n spell: SpellPF2e,\n { attribute, dc, max, rank, recharge = true, statistic, tradition }: ItemCastRuleSourceData,\n): ItemCastRuleSource {\n const uuid = spell.uuid;\n const spellSource = spell.toObject() as SpellSource & { _id: string };\n spellSource._id = foundry.utils.randomID();\n\n const data: WithPartial, \"value\"> = {\n entryId: foundry.utils.randomID(),\n sourceId: uuid,\n spell: spellSource,\n value: max || undefined,\n };\n\n return {\n attribute,\n data,\n dc,\n key: \"ItemCast\",\n max,\n rank,\n recharge,\n statistic: splitListString(statistic ?? \"\"),\n tradition,\n uuid,\n };\n}\n\ninterface ItemCastRuleElement extends RuleElement, ModelPropsFromRESchema {\n get actor(): CharacterPF2e;\n get item(): PhysicalItemPF2e;\n get resolvedDc(): number | undefined;\n get resolvedMax(): number | undefined;\n get usableMax(): number;\n get usableValue(): number;\n updateData(changes: ItemCastUpdateDataArgs, sourceOnly: true): EmbeddedDocumentUpdateData | undefined;\n updateData(changes: ItemCastUpdateDataArgs, sourceOnly?: boolean): Promise> | undefined;\n updateData(\n changes: ItemCastUpdateDataArgs,\n sourceOnly?: boolean,\n ): EmbeddedDocumentUpdateData | Promise> | undefined;\n}\n\ntype ItemCastSource = Prettify>;\n\ntype BaseItemCastSchema = {\n attribute: fields.StringField;\n data: fields.ObjectField;\n /** if no static dc, we use existing entries */\n dc: ResolvableValueField;\n max: ResolvableValueField;\n rank: fields.NumberField;\n recharge: fields.BooleanField;\n statistic: fields.ArrayField<\n fields.StringField,\n string[],\n string[],\n false,\n true,\n false\n >;\n tradition: fields.StringField;\n uuid: fields.StringField;\n};\n\ntype ItemCastSchema = RuleElementSchema & BaseItemCastSchema;\n\ntype BaseItemCastRule = ModelPropsFromSchema;\ntype ItemCastRule = ModelPropsFromSchema;\n\ntype ItemCastRuleSourceData = toolbelt.actionable.ItemCastRuleSourceData;\ntype ItemCastRuleSource = RuleElementSource &\n Omit, keyof RuleElementSchema> & { key: \"ItemCast\" };\n\ntype ItemCastRuleData = {\n entryId?: string;\n sourceId?: ItemUUID;\n spell?: SpellSource & { _id: string };\n value?: number;\n};\n\ntype ItemCastUpdateDataArgs = {\n value?: number;\n};\n\ntype VirtualSpellData = toolbelt.actionable.VirtualSpellData;\n\nexport { createItemCastRuleElement, generateItemCastRuleSource };\nexport type {\n BaseItemCastRule,\n ItemCastRuleElement,\n ItemCastRuleSource,\n ItemCastRuleSourceData,\n ItemCastSource,\n VirtualSpellData,\n};\n", "import {\r\n ClientDocument,\r\n deleteFlagProperty,\r\n deleteInMemory,\r\n getFlag,\r\n getInMemory,\r\n getSetting,\r\n HandlebarsRenderData,\r\n KeybindingActionConfig,\r\n Localize,\r\n localize,\r\n R,\r\n RegisterSettingOptions,\r\n render,\r\n setFlag,\r\n setFlagProperties,\r\n setFlagProperty,\r\n setInMemory,\r\n setSetting,\r\n Token,\r\n unsetFlag,\r\n unsetFlagProperty,\r\n updateSourceFlag,\r\n} from \"foundry-helpers\";\r\nimport DataField = foundry.data.fields.DataField;\r\n\r\nabstract class ModuleTool = Record> {\r\n #localize?: Localize;\r\n #settings: Record = {};\r\n\r\n declare settings: TSettings;\r\n\r\n abstract get key(): string;\r\n abstract get settingsSchema(): ToolSettingsList;\r\n\r\n get keybindsSchema(): KeybindingActionConfig[] {\r\n return [];\r\n }\r\n\r\n get api(): Record {\r\n return {};\r\n }\r\n\r\n get localize(): Localize {\r\n return (this.#localize ??= localize.sub(this.key));\r\n }\r\n\r\n init(isGM: boolean) {}\r\n setup(isGM: boolean) {}\r\n ready(isGM: boolean) {}\r\n _configurate() {}\r\n\r\n /** debounce version of _configurate */\r\n configurate = foundry.utils.debounce(this._configurate, 1);\r\n\r\n path(...path: string[]) {\r\n return R.join([this.key, ...path], \".\");\r\n }\r\n\r\n templatePath(...path: string[]) {\r\n return R.join([this.key, ...path], \"/\");\r\n }\r\n\r\n getSettingKey(setting: K): string {\r\n return `${this.key}.${setting}`;\r\n }\r\n\r\n setSetting(key: K, value: TSettings[K]): Promise {\r\n return setSetting(this.getSettingKey(key), value);\r\n }\r\n\r\n getFlag(doc: ClientDocument, ...path: string[]): T | undefined {\r\n return getFlag(doc, this.key, ...path);\r\n }\r\n\r\n setFlag(doc: D, ...args: [...string[], T]): Promise {\r\n return setFlag(doc, this.key, ...args);\r\n }\r\n\r\n unsetFlag(doc: D, ...path: string[]): Promise {\r\n return unsetFlag(doc, this.key, ...path);\r\n }\r\n\r\n setFlagProperty(obj: T, ...args: [...string[], any]): T {\r\n return setFlagProperty(obj, this.key, ...args);\r\n }\r\n\r\n setFlagProperties(obj: T, ...args: [...string[], properties: Record]): T {\r\n return setFlagProperties(obj, this.key, ...args);\r\n }\r\n\r\n unsetFlagProperty(obj: T, ...path: [string, ...string[]]): T {\r\n return unsetFlagProperty(obj, this.key, ...path);\r\n }\r\n\r\n deleteFlagProperty(obj: T, ...path: string[]): T {\r\n return deleteFlagProperty(obj, this.key, ...path);\r\n }\r\n\r\n updateSourceFlag(doc: T, ...args: [...string[], any]): DeepPartial {\r\n return updateSourceFlag(doc, this.key, ...args);\r\n }\r\n\r\n getInMemory(obj: ClientDocument | Token, ...path: string[]): T | undefined {\r\n return getInMemory(obj, this.key, ...path);\r\n }\r\n\r\n setInMemory(obj: ClientDocument | Token, ...args: [...string[], T]): boolean {\r\n return setInMemory(obj, this.key, ...args);\r\n }\r\n\r\n deleteInMemory(obj: ClientDocument | Token, ...path: string[]): boolean {\r\n return deleteInMemory(obj, this.key, ...path);\r\n }\r\n\r\n render>(template: string, data: T & HandlebarsRenderData): Promise {\r\n return render(`${this.key}/${template}`, data);\r\n }\r\n\r\n _initialize(isGM: boolean) {\r\n const settings = {};\r\n const self = this;\r\n\r\n for (const setting of this.settingsSchema) {\r\n if (isGM && setting.playerOnly) continue;\r\n if (!isGM && setting.gmOnly) continue;\r\n\r\n const key = this.getSettingKey(setting.key);\r\n this.#settings[key] = getSetting(key);\r\n\r\n Object.defineProperty(settings, setting.key, {\r\n get() {\r\n return self.#settings[key];\r\n },\r\n set(value) {\r\n setSetting(key, value);\r\n },\r\n });\r\n }\r\n\r\n Object.defineProperty(this, \"settings\", {\r\n get() {\r\n return settings;\r\n },\r\n });\r\n }\r\n\r\n _getToolSettings(): ToolSettingsList {\r\n return this.settingsSchema.map((setting) => {\r\n const _onChange = setting.onChange;\r\n\r\n setting.onChange = (value, operation, userId) => {\r\n if (setting.scope !== \"user\" || userId === game.userId) {\r\n this.#settings[setting.key] = value;\r\n }\r\n\r\n _onChange?.(value, operation, userId);\r\n };\r\n\r\n return setting;\r\n });\r\n }\r\n}\r\n\r\ntype ToolSetting> =\r\n TSettings extends Record\r\n ? RegisterSettingOptions & { key: K; type: FromPrimitive | DataField }\r\n : never;\r\n\r\ntype ToolSettingsList> = ReadonlyArray>;\r\n\r\nexport { ModuleTool };\r\nexport type { ToolSettingsList };\r\n", "import {\n AbilityItemPF2e,\n AbilitySheetPF2e,\n AbilityViewData,\n ActionType,\n ActorPF2e,\n ActorRechargeData,\n ActorSheetOptions,\n ActorSheetPF2e,\n addListener,\n addListenerAll,\n AttributeString,\n CastOptions,\n CharacterPF2e,\n CharacterSheetData,\n CharacterSheetPF2e,\n ConsumablePF2e,\n ConsumableSheetPF2e,\n createHTMLElement,\n createHTMLElementContent,\n createToggleHook,\n createToggleWrapper,\n CreaturePF2e,\n DatabaseCreateOperation,\n Duration,\n EffectPF2e,\n EquipmentPF2e,\n EquipmentSheetPF2e,\n ErrorPF2e,\n FeatPF2e,\n FeatSheetPF2e,\n getActionGlyph,\n getItemSourceId,\n getSpellCollectionCls,\n getStatisticClass,\n htmlQuery,\n ImageFilePath,\n includesAny,\n InventoryItem,\n isCastConsumable,\n isDefaultActionIcon,\n isScriptMacro,\n itemIsEquipped,\n ItemPF2e,\n ItemSheetDataPF2e,\n ItemSheetPF2e,\n ItemSourcePF2e,\n itemWithActor,\n LaxSchemaField,\n MacroPF2e,\n MagicTradition,\n MODULE,\n NPCPF2e,\n NPCSheetData,\n PhysicalItemPF2e,\n PhysicalItemSheetPF2e,\n R,\n registerWrapper,\n renderCharacterSheets,\n renderItemSheets,\n RuleElement,\n RuleElementOptions,\n RuleElementSchema,\n RuleElementSource,\n SpellcastingEntry,\n SpellcastingEntryPF2e,\n SpellPF2e,\n SpellSheetPF2e,\n Statistic,\n StatisticData,\n toggleHooksAndWrappers,\n toggleSummary,\n updateActionFrequency,\n useAction,\n usePhysicalItem,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { isPhysicalCategory, sharedCharacterPrepareData, sharedCharacterSheetActivateListeners } from \"tools\";\nimport {\n ActionableData,\n ActionableRuleElement,\n applyActorGroupUpdate,\n createActionableRuleElement,\n createItemCastRuleElement,\n GenerateItemCast,\n generateItemCastRuleSource,\n getActionSheetData,\n ItemCastRuleElement,\n ItemCastSpellcasting,\n VirtualActionData,\n VirtualSpellData,\n} from \".\";\n\nclass ActionableTool extends ModuleTool {\n #renderCreatureSheetPF2eHook = createToggleHook(\n [\"renderCharacterSheetPF2e\", \"renderNPCSheetPF2e\"],\n this.#onRenderCreatureSheetPF2e.bind(this),\n );\n\n #actionWrappers = [\n createToggleWrapper(\n \"WRAPPER\",\n [\n \"CONFIG.Item.sheetClasses.action['pf2e.AbilitySheetPF2e'].cls.prototype._renderInner\",\n \"CONFIG.Item.sheetClasses.feat['pf2e.FeatSheetPF2e'].cls.prototype._renderInner\",\n ],\n this.#actionSheetRenderInner,\n { context: this },\n ),\n createToggleWrapper(\n \"OVERRIDE\",\n [\n \"CONFIG.Item.sheetClasses.action['pf2e.AbilitySheetPF2e'].cls.prototype._onDrop\",\n \"CONFIG.Item.sheetClasses.feat['pf2e.FeatSheetPF2e'].cls.prototype._onDrop\",\n ],\n this.#actionSheetPF2eOnDrop,\n { context: this },\n ),\n ];\n\n #itemWrappers = [\n createToggleWrapper(\n \"WRAPPER\",\n [\n \"CONFIG.Item.sheetClasses.consumable['pf2e.ConsumableSheetPF2e'].cls.prototype._renderInner\",\n \"CONFIG.Item.sheetClasses.equipment['pf2e.EquipmentSheetPF2e'].cls.prototype._renderInner\",\n ],\n this.#itemSheetRenderInner,\n { context: this },\n ),\n ];\n\n #spellWrappers = [\n createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.Item.sheetClasses.spell['pf2e.SpellSheetPF2e'].cls.prototype._renderInner\",\n this.#itemSheetRenderInner,\n { context: this },\n ),\n createToggleWrapper(\n \"MIXED\",\n \"CONFIG.PF2E.Item.documentClasses.spellcastingEntry.prototype.cast\",\n this.#spellcastingEntryCast,\n { context: this },\n ),\n ];\n\n get key(): \"actionable\" {\n return \"actionable\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"action\",\n type: Boolean,\n default: false,\n scope: \"world\",\n onChange: () => {\n this.configurate();\n },\n },\n {\n key: \"item\",\n type: Boolean,\n default: false,\n scope: \"world\",\n onChange: () => {\n this.configurate();\n },\n },\n {\n key: \"spell\",\n type: Boolean,\n default: false,\n scope: \"world\",\n onChange: (value) => {\n toggleHooksAndWrappers(this.#spellWrappers, value);\n renderItemSheets(\"SpellSheetPF2e\");\n },\n },\n {\n key: \"physical\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"cast\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"use\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: () => {\n this.configurate();\n },\n },\n {\n key: \"apply\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: (value) => {\n this.configurate();\n },\n },\n ];\n }\n\n get api(): toolbelt.Api[\"actionable\"] {\n return {\n generateItemCastRuleSource,\n getActionMacro: this.getActionMacro.bind(this),\n getItemMacro: this.getItemMacro.bind(this),\n getVirtualAction: this.getVirtualAction.bind(this),\n getVirtualActionsData: this.getVirtualActionsData.bind(this),\n getVirtualSpellData: (actor, id) => this.getVirtualSpellsData(actor)?.[id],\n getVirtualSpellcastingData: this.getVirtualSpellcastingData.bind(this),\n rechargeVirtualSpell: this.#rechargeVirtualSpell.bind(this),\n updateVirtualSpellValue: this.#updateVirtualSpellValue.bind(this),\n updateActionFrequency: (event, item, virtualData) => updateActionFrequency(event, item, virtualData),\n useAction: (event, item, virtualData) => useAction(event, item, virtualData),\n };\n }\n\n init() {\n const castEnabled = this.settings.cast;\n const physicalEnabled = this.settings.physical;\n\n if (physicalEnabled) {\n game.pf2e.RuleElements.custom.Actionable = createActionableRuleElement();\n }\n\n if (castEnabled) {\n sharedCharacterPrepareData\n .register(this.#characterPrepareData, { context: this, priority: 100 })\n .activate();\n game.pf2e.RuleElements.custom.ItemCast = createItemCastRuleElement();\n Hooks.on(\"renderCharacterSheetPF2e\", this.#onRenderCharacterSheetPF2e.bind(this));\n Hooks.on(\"renderPhysicalItemSheetPF2e\", this.#onRenderPhysicalItemSheetPF2e.bind(this));\n }\n\n if (castEnabled || physicalEnabled) {\n registerWrapper(\n \"WRAPPER\",\n \"CONFIG.PF2E.Actor.documentClasses.character.prototype.createEmbeddedDocuments\",\n this.#characterCreateEmbeddedDocuments,\n this,\n );\n registerWrapper(\n \"WRAPPER\",\n \"CONFIG.PF2E.Actor.documentClasses.character.prototype.prepareEmbeddedDocuments\",\n this.#characterPrepareEmbeddedDocuments,\n this,\n );\n registerWrapper(\n \"WRAPPER\",\n \"CONFIG.PF2E.Actor.documentClasses.character.prototype.recharge\",\n this.#characterRecharge,\n this,\n );\n }\n }\n\n ready() {\n this._configurate(true);\n toggleHooksAndWrappers(this.#spellWrappers, this.settings.spell);\n\n if (this.settings.physical) {\n registerWrapper(\n \"WRAPPER\",\n \"CONFIG.Actor.sheetClasses.character['pf2e.CharacterSheetPF2e'].cls.prototype.getData\",\n this.#characterSheetGetData,\n this,\n );\n sharedCharacterSheetActivateListeners\n .register(this.#characterSheetActivateListeners, { context: this })\n .activate();\n }\n }\n\n _configurate(skipRenders?: boolean): void {\n const actionEnabled = this.settings.action;\n const itemEnabled = this.settings.item;\n\n toggleHooksAndWrappers(this.#actionWrappers, actionEnabled);\n toggleHooksAndWrappers(this.#itemWrappers, itemEnabled);\n\n this.#renderCreatureSheetPF2eHook.toggle(\n actionEnabled || itemEnabled || this.settings.use || this.settings.apply,\n );\n\n if (!skipRenders) {\n renderItemSheets([\"AbilitySheetPF2e\", \"ConsumableSheetPF2e\", \"EquipmentSheetPF2e\", \"FeatSheetPF2e\"]);\n renderCharacterSheets();\n }\n }\n\n async getActionMacro(action: AbilityItemPF2e | FeatPF2e): Promise> {\n if (action.system.selfEffect || action.crafting) return;\n return this.getItemMacro(action);\n }\n\n async getItemMacro(action: ItemPF2e): Promise> {\n const uuid = this.getFlag(action, \"linked\");\n const macro = uuid ? await fromUuid(uuid) : undefined;\n return isScriptMacro(macro) ? macro : undefined;\n }\n\n isPassiveAction(item: AbilityItemPF2e | FeatPF2e): boolean {\n return item.system.actionType.value === \"passive\";\n }\n\n isCraftingAction(item: AbilityItemPF2e | FeatPF2e): boolean {\n return !!item.crafting;\n }\n\n getVirtualActionsData(actor: CharacterPF2e): Record {\n return this.getInMemory(actor, \"virtual\") ?? {};\n }\n\n getVirtualSpellsData(actor: ActorPF2e): Record | undefined {\n return this.getInMemory(actor, \"spells\");\n }\n\n getVirtualSpellcastingData(actor: ActorPF2e, id: string): VirtualSpellData | undefined {\n return this.getInMemory(actor, \"spellcasting\", id);\n }\n\n async getVirtualAction(data: ActionableData): Promise {\n const action = await fromUuid(data.sourceId);\n if (!action?.actionCost || includesAny(action.system.traits.value, [\"exploration\", \"downtime\"])) return null;\n\n const cloneData: Record = {\n _id: data.id,\n };\n\n if (!action.sourceId) {\n cloneData[\"_stats.duplicateSource\"] = data.sourceId;\n }\n\n if (action.frequency) {\n cloneData[\"system.frequency.value\"] = R.isNumber(data.frequency) ? data.frequency : action.frequency.max;\n }\n\n return action.clone(cloneData, { keepId: true });\n }\n\n #onRenderPhysicalItemSheetPF2e(sheet: PhysicalItemSheetPF2e>, $html: JQuery) {\n if (!sheet.isEditable || sheet.item.isOfType(\"consumable\")) return;\n\n const actor = sheet.actor;\n if (!actor?.isOfType(\"character\")) return;\n\n const html = $html[0];\n const tab = htmlQuery(html, `.tab[data-tab=\"rules\"]`);\n const nerdDetails = htmlQuery(tab, \".nerd-details\");\n if (!nerdDetails) return;\n\n const lastGroup = nerdDetails.lastElementChild as HTMLElement | null;\n const group = htmlQuery(lastGroup, \"input\") ? createHTMLElement(\"div\", { classes: [\"form-group\"] }) : lastGroup;\n\n const label = this.localize(\"generate-cast.label\");\n const tooltip = this.localize(\"generate-cast.title\");\n const btn = createHTMLElement(\"button\", {\n classes: [\"pf2e-toolbelt-actionable-generate-cast\"],\n content: ` ${label}`,\n dataset: { tooltip: tooltip },\n });\n btn.addEventListener(\"click\", () => new GenerateItemCast(sheet.item, this).render(true));\n group?.prepend(btn);\n }\n\n #characterPrepareData(actor: CharacterPF2e) {\n const virtualSpellData = this.getVirtualSpellsData(actor);\n if (!virtualSpellData) return;\n\n const SpellCollectionCls = getSpellCollectionCls(actor);\n\n for (const [spellId, data] of R.entries(virtualSpellData)) {\n const parent = data.item;\n const spell = parent.embeddedSpell;\n if (!spell) continue;\n\n const actorStatistic = getFirstStatistic(actor, data.statistic);\n const dc = !actorStatistic && data.dc;\n const existingEntry = !actorStatistic && !dc ? getExistingSpellcastingEntry(actor, spell, parent) : null;\n if (!actorStatistic && !dc && !existingEntry) return;\n\n const attribute = actorStatistic?.attribute ?? data.attribute ?? existingEntry?.attribute ?? \"cha\";\n const tradition = data.tradition ?? existingEntry?.tradition ?? spell.traditions.first();\n\n const statistic =\n this.#extendActorStatistic(actor, actorStatistic, tradition) ??\n existingEntry?.statistic ??\n this.#createSpellcastingStatistic(actor, attribute, tradition, dc as number);\n\n const itemCasting = new ItemCastSpellcasting({\n id: parent.id,\n name: parent.name,\n actor,\n statistic,\n tradition,\n original: existingEntry,\n castPredicate: new game.pf2e.Predicate([`item:id:${parent.id}`, `spell:id:${spellId}`]),\n });\n\n spell.system.location.value = itemCasting.id;\n\n const collection = new SpellCollectionCls(itemCasting);\n collection.set(spellId, spell);\n actor.spellcasting.set(itemCasting.id, itemCasting);\n actor.spellcasting.collections.set(itemCasting.id, collection);\n }\n }\n\n async #characterCreateEmbeddedDocuments(\n actor: CharacterPF2e,\n wrapped: libWrapper.RegisterCallback,\n embeddedName: \"ActiveEffect\" | \"Item\",\n data: PreCreate[],\n operation?: Partial>,\n ): Promise[]> {\n if (embeddedName !== \"Item\") {\n return wrapped(embeddedName, data, operation);\n }\n\n const ItemCls = getDocumentClass(\"Item\");\n\n await Promise.all(\n data.map(async (itemSource) => {\n if (!isPhysicalCategory(itemSource.type) || !itemSource.system?.rules?.length) return;\n\n const item = new ItemCls(itemSource, { parent: actor }) as PhysicalItemPF2e;\n\n await Promise.all(\n itemSource.system.rules.map((ruleSource) => {\n if (!ruleSource.key || !R.isIncludedIn(ruleSource.key, [\"Actionable\", \"ItemCast\"])) return;\n\n const RuleElementCls = game.pf2e.RuleElements.custom[ruleSource.key] as RuleElementConstructor;\n return RuleElementCls.setData(item, ruleSource as RuleElementSource);\n }),\n );\n }),\n );\n\n return wrapped(embeddedName, data, operation);\n }\n\n #characterPrepareEmbeddedDocuments(actor: CharacterPF2e, wrapped: libWrapper.RegisterCallback) {\n this.deleteInMemory(actor);\n wrapped();\n }\n\n /**\n * https://github.com/foundryvtt/pf2e/blob/e215ebfbb287190d313fe0441e0362439766786d/src/module/actor/base.ts#L531\n * modified to update the rule data\n */\n async #characterRecharge(\n actor: CharacterPF2e,\n wrapped: libWrapper.RegisterCallback,\n options: Parameters[0],\n ): Promise {\n const elapsed = options.duration;\n const specificDurations = [\"turn\", \"round\", \"day\"];\n\n const virtualActions = this.settings.physical ? this.getVirtualActionsData(actor) : {};\n const virtualSpells = (this.settings.cast && elapsed === \"day\" && this.getVirtualSpellsData(actor)) || {};\n // we do that to we can make sure only a single update per type is ever done\n const originalCommit = options.commit;\n options.commit = false;\n\n const commitData: ActorRechargeData = await wrapped(options);\n\n await Promise.all(\n R.values(virtualActions).map(async ({ data, parent, ruleIndex }) => {\n const frequency = (await this.getVirtualAction(data))?.frequency;\n if (!frequency || frequency.value >= frequency.max) return;\n\n const per = frequency.per;\n\n const specificPerIdx = specificDurations.indexOf(per);\n if (specificPerIdx >= 0 || elapsed === \"day\") {\n const performUpdate =\n specificPerIdx >= 0\n ? specificDurations.indexOf(elapsed) >= specificPerIdx\n : Duration.fromISO(per) <= Duration.fromISO(\"PT8H\");\n\n if (performUpdate) {\n const rule = parent.rules[ruleIndex] as ActionableRuleElement;\n const update = rule.updateData({ frequency: frequency.max }, true);\n\n if (update) {\n commitData.itemUpdates.push(update);\n commitData.affected.frequencies = true;\n }\n }\n }\n }),\n );\n\n await Promise.all(\n R.values(virtualSpells).map(async ({ max, parent, recharge, ruleIndex }) => {\n if (!max || !recharge) return;\n\n const rule = parent.rules[ruleIndex] as ItemCastRuleElement;\n const update = rule.updateData({ value: max }, true);\n\n if (update) {\n commitData.itemUpdates.push(update);\n commitData.affected.spellSlots = true;\n }\n }),\n );\n\n // the original intent was to commit the updates, so we do it\n if (originalCommit !== false) {\n await applyActorGroupUpdate(actor, commitData);\n }\n\n return commitData;\n }\n\n async #characterSheetGetData(\n sheet: CharacterSheetPF2e,\n wrapped: libWrapper.RegisterCallback,\n options?: ActorSheetOptions,\n ): Promise> {\n const virtuals = this.getVirtualActionsData(sheet.actor);\n const sheetData = (await wrapped(options)) as CharacterSheetData;\n const getActionMacro = this.settings.action ? this.getActionMacro.bind(this) : () => null;\n\n const addedTypes: Record, boolean> = {\n action: false,\n free: false,\n reaction: false,\n };\n\n await Promise.all(\n R.values(virtuals).map(async ({ data }) => {\n const action = await this.getVirtualAction(data);\n if (!action) return;\n\n const type = action.actionCost?.type ?? \"free\";\n const macro = await getActionMacro(action);\n const actionData = getActionSheetData(action);\n\n if (macro?.img && isDefaultActionIcon(actionData.img, action.actionCost)) {\n actionData.img = macro.img;\n }\n\n addedTypes[type] = true;\n sheetData.actions.encounter[type].actions.push(actionData);\n }),\n );\n\n for (const [type, added] of R.entries(addedTypes)) {\n if (!added) continue;\n sheetData.actions.encounter[type].actions.sort((a, b) => a.name.localeCompare(b.name, game.i18n.lang));\n }\n\n return sheetData;\n }\n\n async #characterSheetActivateListeners(sheet: CharacterSheetPF2e, html: HTMLElement) {\n const actor = sheet.actor;\n const virtuals = this.getVirtualActionsData(actor);\n\n const tab = htmlQuery(html, \".tab[data-tab=actions] .tab-content .tab[data-tab=encounter]\");\n if (!tab) return;\n\n for (const virtualData of R.values(virtuals)) {\n const { data, parent } = virtualData;\n const action = await this.getVirtualAction(data);\n if (!action) return;\n\n const li = htmlQuery(html, `.item.action[data-item-id=\"${data.id}\"]`);\n const controls = htmlQuery(li, \".item-controls\");\n const summaryBtn = htmlQuery(li, `[data-action=\"toggle-summary\"]`);\n const imageBtn = htmlQuery(li, `[data-action=\"item-to-chat\"]`);\n const useBtn = htmlQuery(li, \"button[data-action='use-action']\");\n\n const lock = createHTMLElement(\"div\", {\n content: ``,\n dataset: {\n tooltip: `${this.localize(\"virtual\")}
${parent.name}`,\n },\n });\n\n controls?.replaceChildren(lock);\n\n const addCaptureListener = (\n el: Maybe,\n type: T,\n listener: (el: E, event: HTMLElementEventMap[T]) => any,\n ) => {\n el?.addEventListener(\n type,\n (event) => {\n event.preventDefault();\n event.stopPropagation();\n listener(el, event);\n },\n { capture: true },\n );\n };\n\n addCaptureListener(summaryBtn, \"click\", async () => {\n const summary = htmlQuery(li, `.item-summary`);\n if (!summary) return;\n\n if (!summary.hasChildNodes()) {\n const item = itemWithActor(actor, action);\n const chatData = await item.getChatData({ secrets: item.isOwner });\n await sheet.itemRenderer.renderItemSummary(summary, item, chatData);\n }\n\n toggleSummary(summary);\n });\n\n addCaptureListener(imageBtn, \"click\", (_el, event) => {\n const item = itemWithActor(actor, action);\n item.toMessage(event);\n });\n\n addCaptureListener(useBtn, \"click\", (_el, event) => {\n const item = itemWithActor>(actor, action);\n useAction(event, item, virtualData);\n });\n\n const frequency = action.frequency;\n if (frequency) {\n const frequencyInput = htmlQuery(li, `[data-item-property=\"system.frequency.value\"]`);\n\n addCaptureListener(frequencyInput, \"change\", async (_el, event) => {\n await updateActionFrequency(event, action, virtualData);\n });\n }\n }\n }\n\n #onRenderCharacterSheetPF2e(sheet: CharacterSheetPF2e, $html: JQuery) {\n const virtualSpells = this.getVirtualSpellsData(sheet.actor);\n if (!virtualSpells) return;\n\n const html = $html[0];\n const tab = htmlQuery(html, `.tab[data-tab=\"spellcasting\"] .tab[data-tab=\"activations\"]`);\n\n for (const [spellId, { item, max, parent, ruleIndex }] of R.entries(virtualSpells)) {\n const equipped = itemIsEquipped(parent);\n const spellSection = htmlQuery(tab, `.spell[data-item-id=\"${spellId}\"]`);\n\n if (!equipped) {\n const castBtn = htmlQuery(spellSection, \"button.cast-spell\");\n\n if (castBtn) {\n castBtn.classList.add(\"unequipped\");\n castBtn.innerHTML = ``;\n castBtn.dataset.tooltip = this.localize.path(\"cast.equipped\");\n delete castBtn.dataset.action;\n }\n }\n\n const headerRow = spellSection?.previousElementSibling as Maybe;\n const nameDiv = htmlQuery(headerRow, \".item-name\");\n if (!nameDiv) continue;\n\n if (headerRow?.dataset.groupId === \"cantrips\") {\n if (max) {\n while (nameDiv.childElementCount > 1) {\n nameDiv.removeChild(nameDiv.lastElementChild!);\n }\n } else {\n continue;\n }\n }\n\n const template = max\n ? `\n \n \n /\n \n \n \n
`\n : `\u221E\n / \n \u221E`;\n\n const outer = createHTMLElement(\"div\", { content: template });\n nameDiv.append(...outer.children);\n\n if (!max) continue;\n\n addListener(nameDiv, \"input\", \"change\", async (el) => {\n await this.#updateVirtualSpellValue(parent, ruleIndex, el.valueAsNumber);\n });\n\n addListener(nameDiv, \"a\", async () => {\n await this.#rechargeVirtualSpell(parent, ruleIndex);\n });\n }\n }\n\n #updateVirtualSpellValue(\n parent: PhysicalItemPF2e,\n ruleIndex: number,\n value: number,\n ): Promise | undefined> | undefined {\n if (parent.isOfType(\"ammo\")) return;\n\n if (parent.isOfType(\"consumable\")) {\n if (isCastConsumable(parent)) return;\n\n const { autoDestroy, max } = parent.system.uses;\n const min = autoDestroy ? 1 : 0;\n\n return parent.update({ \"system.uses.value\": Math.clamp(value, min, max) });\n }\n\n const rule = parent.rules[ruleIndex] as ItemCastRuleElement;\n if (rule.key !== \"ItemCast\") return;\n\n const max = rule.resolvedMax;\n return max ? rule.updateData({ value: Math.clamp(value, 0, max) }) : undefined;\n }\n\n #rechargeVirtualSpell(\n parent: PhysicalItemPF2e,\n ruleIndex: number,\n ): Promise | undefined> | undefined {\n return this.#updateVirtualSpellValue(parent, ruleIndex, Infinity);\n }\n\n #onRenderCreatureSheetPF2e(\n sheet: ActorSheetPF2e,\n $html: JQuery,\n data: CharacterSheetData | NPCSheetData,\n ) {\n if (!sheet.isEditable) return;\n\n const html = $html[0];\n\n if (this.settings.apply || this.settings.action) {\n this.#updateActorActions(sheet, html, data);\n }\n\n if (this.settings.use || this.settings.item) {\n this.#updateActorItems(sheet, html, data);\n }\n }\n\n async #updateActorItems(\n sheet: ActorSheetPF2e,\n html: HTMLElement,\n data: CharacterSheetData | NPCSheetData,\n ) {\n if (!sheet.isEditable) return;\n\n const useConsumables = this.settings.use;\n const getItemMacro = this.settings.item ? this.getItemMacro.bind(this) : () => null;\n\n const items = R.pipe(\n data.inventory.sections,\n R.intersectionWith([\"consumable\", \"equipment\", \"backpack\"], (section, type) => {\n return section.types.includes(type);\n }),\n R.flatMap((section) => getSectionItems(section.items)),\n R.filter((item): item is EquipmentPF2e | ConsumablePF2e => {\n return item.isOfType(\"equipment\", \"consumable\") && item.isIdentified;\n }),\n );\n\n const panel = htmlQuery(html, `.tab[data-tab=\"inventory\"] .inventory-pane`);\n\n const itemsPromise = items.map(async (item) => {\n const isConsumable = item.isOfType(\"consumable\");\n const canUseMacro = !isConsumable || !isCastConsumable(item);\n const macro = canUseMacro && !!(await getItemMacro(item));\n const isUsable = useConsumables && isConsumable;\n if (!macro && !isUsable) return;\n\n const el = htmlQuery(panel, `[data-item-id=\"${item.id}\"]`);\n if (!el) return;\n\n const btn = createHTMLElement(\"a\", {\n classes: [\"actionable-use\"],\n content: ``,\n dataset: {\n tooltip: \"PF2E.Action.Use\",\n },\n style: {\n marginRight: \"0.15rem\",\n },\n });\n\n if (isConsumable) {\n el.setAttribute(\"data-actionable-use\", \"true\");\n }\n\n if (!item.quantity || (isConsumable && item.uses.value <= 0)) {\n btn.classList.add(\"disabled\");\n } else {\n btn.addEventListener(\"click\", (event) => {\n usePhysicalItem(event, item);\n });\n }\n\n htmlQuery(el, \".item-controls\")?.prepend(btn);\n });\n\n Promise.all(itemsPromise);\n }\n\n async #updateActorActions(\n sheet: ActorSheetPF2e,\n html: HTMLElement,\n data: CharacterSheetData | NPCSheetData,\n ) {\n const actor = sheet.actor as CreaturePF2e;\n const isCharacter = actor.isOfType(\"character\");\n const getActionMacro = this.settings.action ? this.getActionMacro.bind(this) : () => null;\n\n const actionGroups: Record =\n \"encounter\" in data.actions ? data.actions.encounter : R.pick(data.actions, [\"active\"]);\n const actions = R.pipe(\n actionGroups,\n R.values(),\n R.flatMap((group) => group.actions),\n );\n\n const useLabel = game.i18n.localize(\"PF2E.Action.Use\");\n const panel = htmlQuery(\n html,\n isCharacter\n ? `.tab[data-tab=\"actions\"] .tab-content .tab[data-tab=\"encounter\"]`\n : `.tab[data-tab=\"main\"] .actions.section-container .section-body`,\n );\n\n const autoApply = this.settings.apply;\n const actionable = this.settings.action;\n\n const actionsPromise = actions.map(async ({ id: itemId, img: actionImg }) => {\n const item = actor.items.get(itemId);\n if (!item?.isOfType(\"action\", \"feat\") || this.isPassiveAction(item) || this.isCraftingAction(item)) return;\n\n const selfEffect = autoApply && item.system.selfEffect;\n const macro = actionable && (await getActionMacro(item));\n if (!selfEffect && !macro) return;\n\n const el = htmlQuery(panel, `.actions-list .action[data-item-id=\"${itemId}\"]`);\n if (!el) return;\n\n const actionCost = item.actionCost;\n const glyph = getActionGlyph(actionCost);\n const existingBtn = htmlQuery(el, \"button[data-action='use-action']\");\n\n const btn = createHTMLElement(\"button\", {\n classes: [\"use-action\"],\n content: `${useLabel}${glyph}`,\n });\n\n btn.addEventListener(\"click\", (event) => {\n useAction(event, item);\n });\n\n if (existingBtn) {\n existingBtn.replaceWith(btn);\n } else if (isCharacter) {\n htmlQuery(el, \".button-group\")?.append(btn);\n } else {\n const wrapper = createHTMLElement(\"div\", {\n classes: [\"button-group\"],\n content: btn,\n });\n htmlQuery(el, \".controls\")?.after(wrapper);\n }\n\n if (macro && isCharacter) {\n // we replace the action image if it is the default\n const imgEl = htmlQuery(el, \".item-image img\");\n if (imgEl && macro.img && isDefaultActionIcon(actionImg, actionCost)) {\n imgEl.src = macro.img;\n }\n }\n });\n\n Promise.all(actionsPromise);\n }\n\n async #renderDropzone(\n sheet: ItemSheetPF2e,\n linked: Maybe,\n type: \"action\" | \"item\" | \"spell\",\n ): Promise {\n const isEditable = sheet.isEditable;\n const dropzone = createHTMLElementContent({\n content: await this.render(\"dropzone\", {\n linked,\n i18n: `${this.key}.${type}`,\n }),\n });\n\n addListenerAll(dropzone, \"[data-action]\", (el) => {\n const action = el.dataset.action as \"open-link-sheet\" | \"delete-link\";\n\n if (action === \"delete-link\") {\n isEditable && this.unsetFlag(sheet.item, \"linked\");\n } else if (action === \"open-link-sheet\") {\n linked?.sheet.render(true);\n }\n });\n\n if (type !== \"action\" && isEditable) {\n dropzone.addEventListener(\"drop\", async (event) => {\n const droppedItem = await this.#resolveDroppedItem(event, true);\n\n if (droppedItem) {\n return this.setFlag(sheet.item, \"linked\", droppedItem.uuid);\n }\n\n throw ErrorPF2e(\"Invalid item drop\");\n });\n }\n\n return dropzone;\n }\n\n async #actionSheetRenderInner(\n sheet: AbilitySheetPF2e | FeatSheetPF2e,\n wrapped: libWrapper.RegisterCallback,\n data: ItemSheetDataPF2e,\n ): Promise {\n const item = sheet.item;\n const $html: JQuery = await wrapped(data);\n\n if (this.isPassiveAction(item) || this.isCraftingAction(item)) {\n return $html;\n }\n\n const html = $html[0];\n const macro = await this.getActionMacro(item);\n const dropzone = htmlQuery(html, `.tab[data-tab=\"details\"] .form-group[data-drop-zone=\"self-applied-effect\"]`);\n\n if (macro) {\n const newDropzone = createHTMLElementContent({\n content: await this.#renderDropzone(sheet, macro, \"action\"),\n });\n\n dropzone?.replaceWith(newDropzone);\n } else {\n const label = htmlQuery(dropzone, \"label\");\n if (label) {\n label.innerText = this.localize(\"action.label\");\n }\n\n const hint = htmlQuery(dropzone, \".hint\");\n if (hint) {\n hint.innerHTML = this.localize(\"action.hint\");\n }\n }\n\n return $html;\n }\n\n async #actionSheetPF2eOnDrop(sheet: AbilitySheetPF2e | FeatSheetPF2e, event: DragEvent) {\n const sheetItem = sheet.item;\n if (!sheet.isEditable || this.isPassiveAction(sheetItem)) return;\n\n const droppedItem = await this.#resolveDroppedItem(event, false);\n if (!droppedItem) return;\n\n if (droppedItem instanceof Macro) {\n if (this.isCraftingAction(sheetItem)) {\n throw ErrorPF2e(\"Invalid item drop\");\n }\n\n const updates = {\n \"system.selfEffect\": null,\n };\n\n this.setFlagProperty(updates, \"linked\", droppedItem.uuid);\n\n return sheetItem.update(updates);\n }\n\n if (droppedItem.isOfType(\"effect\")) {\n const updates = {\n \"system.selfEffect\": { uuid: droppedItem.uuid, name: droppedItem.name },\n };\n\n this.setFlagProperty(updates, \"macro\", _del);\n\n return sheetItem.update(updates);\n } else if (\n sheetItem.isOfType(\"feat\") &&\n droppedItem.isOfType(\"feat\") &&\n droppedItem.category === \"classfeature\"\n ) {\n const droppedSourceId = getItemSourceId(droppedItem);\n\n if (!droppedSourceId || droppedSourceId === getItemSourceId(sheetItem)) {\n throw ErrorPF2e(\"Invalid item drop\");\n }\n\n const feats = sheetItem._source.system.subfeatures?.suppressedFeatures ?? [];\n if (!feats.includes(droppedSourceId)) {\n const newFeatures = [...feats, droppedSourceId];\n await sheetItem.update({ \"system.subfeatures.suppressedFeatures\": newFeatures });\n }\n\n return;\n }\n\n throw ErrorPF2e(\"Invalid item drop\");\n }\n\n async #itemSheetRenderInner(\n sheet: EquipmentSheetPF2e | ConsumableSheetPF2e | SpellSheetPF2e,\n wrapped: libWrapper.RegisterCallback,\n data: ItemSheetDataPF2e,\n ): Promise {\n const item = sheet.item;\n const $html: JQuery = await wrapped(data);\n\n if ((item.isOfType(\"spell\") && item.original) || (item.isOfType(\"consumable\") && isCastConsumable(item))) {\n return $html;\n }\n\n const html = $html[0];\n const macro = await this.getItemMacro(item);\n const tab = htmlQuery(html, `.tab[data-tab=\"details\"]`);\n const dropzone = createHTMLElement(\"fieldset\", {\n classes: [\"linked\"],\n content: await this.#renderDropzone(sheet, macro, item.isOfType(\"spell\") ? \"spell\" : \"item\"),\n });\n\n tab?.prepend(dropzone);\n\n return $html;\n }\n\n async #spellcastingEntryCast(\n _entry: SpellcastingEntryPF2e,\n wrapped: libWrapper.RegisterCallback,\n spell: SpellPF2e,\n options: CastOptions = {},\n ) {\n const actor = spell.actor;\n const macro = await this.getItemMacro(spell);\n\n if (macro) {\n // we let the macro handle the cast or cancelation of the spell\n return macro.execute({\n actor,\n spell,\n options,\n cast: (macroOptions: CastOptions = {}) => {\n return wrapped(spell, foundry.utils.mergeObject(options, macroOptions, { inplace: false }));\n },\n cancel: () => {\n return this.localize.warning(\"spell.cancel\", { name: spell.name });\n },\n });\n }\n\n wrapped(spell, options);\n }\n\n async #resolveDroppedItem(event: DragEvent, effectOnly: true): Promise>;\n async #resolveDroppedItem(event: DragEvent, effectOnly: false): Promise>;\n async #resolveDroppedItem(event: DragEvent, effectOnly: boolean): Promise> {\n try {\n const dataString = event.dataTransfer?.getData(\"text/plain\");\n const dropData = JSON.parse(dataString ?? \"\");\n\n if (typeof dropData !== \"object\") {\n throw new Error(\"invalid data type.\");\n }\n\n if (dropData.type === \"Item\") {\n const item = await getDocumentClass(\"Item\").fromDropData(dropData);\n return !effectOnly || item?.isOfType(\"effect\") ? item : null;\n }\n\n if (dropData.type === \"Macro\") {\n const macro = await getDocumentClass(\"Macro\").fromDropData(dropData);\n return isScriptMacro(macro) ? macro : null;\n }\n\n throw new Error(\"invalid data type.\");\n } catch (err: any) {\n throw MODULE.error(\"an error occured while trying to resolve data drop\", err);\n }\n }\n\n #extendActorStatistic(\n actor: CharacterPF2e,\n statistic: Statistic | null,\n tradition: MagicTradition | undefined,\n ): Statistic | null {\n if (!statistic) return null;\n\n const data = foundry.utils.deepClone(statistic[\"data\"]) as DeepRequired;\n if (!data || !data.check || !data.dc || !data.domains) return null;\n\n data.domains.push(\"spell-attack-dc\");\n\n data.check.type = \"attack-roll\";\n data.check.domains.push(`${statistic.slug}-attack-roll`, \"spell-attack\", \"spell-attack-roll\");\n\n data.dc.domains.push(\"spell-dc\");\n\n if (tradition) {\n data.check.domains.push(`${tradition}-spell-attack`);\n data.dc.domains.push(`${tradition}-spell-dc`);\n }\n\n const Statistic = getStatisticClass(actor);\n return new Statistic(actor, data);\n }\n\n #createSpellcastingStatistic(\n actor: CharacterPF2e,\n attribute: AttributeString,\n tradition: MagicTradition | undefined = \"arcane\",\n dc: number,\n ): Statistic {\n const domains = [`${attribute}-based`, \"all\", \"spell-attack-dc\"];\n const saveSelectors = [`${tradition}-spell-dc`, \"spell-dc\"];\n const attackSelectors = [\n `${tradition}-spell-attack`,\n \"spell-attack\",\n \"spell-attack-roll\",\n \"attack\",\n \"attack-roll\",\n ];\n\n const Statistic = getStatisticClass(actor);\n const modifiers = [\n new game.pf2e.Modifier({\n label: this.localize(\"cast.label\"),\n modifier: dc - 10,\n domains,\n slug: \"item-cast\",\n }),\n ];\n\n return new Statistic(actor, {\n attribute: null,\n check: {\n type: \"attack-roll\",\n modifiers: [],\n domains: attackSelectors,\n },\n dc: {\n modifiers: [],\n domains: saveSelectors,\n },\n domains,\n label: CONFIG.PF2E.magicTraditions[tradition],\n modifiers,\n rank: undefined,\n slug: `temporary-${tradition}`,\n });\n }\n}\n\nfunction getFirstStatistic(actor: CharacterPF2e, statistics: Maybe): Statistic | null {\n if (!statistics?.length) return null;\n\n for (const slug of statistics) {\n const statistic = actor.getStatistic(slug);\n if (statistic) return statistic;\n }\n\n return null;\n}\n\nfunction getSectionItems(items: InventoryItem[]): PhysicalItemPF2e[] {\n return items.flatMap(({ item, heldItems }) => {\n return heldItems?.length ? [item, ...getSectionItems(heldItems)] : [item];\n });\n}\n\nfunction getExistingSpellcastingEntry(\n actor: CharacterPF2e,\n spell: SpellPF2e,\n parent: PhysicalItemPF2e,\n): SpellcastingEntry | null {\n const regularEntries = actor.spellcasting.regular;\n const matching = regularEntries.filter((entry) => entry.canCast(spell, { origin: parent }));\n const entries = matching.length ? matching : regularEntries;\n\n return entries.reduce((best: SpellcastingEntry | null, entry) => {\n return best === null ? entry : entry.statistic.dc.value > best.statistic.dc.value ? entry : best;\n }, null);\n}\n\nconst actionable = new ActionableTool();\n\ntype DropZoneData = {\n linked: Maybe<{\n img: Maybe;\n name: string;\n }>;\n};\n\ntype ToolSettings = toolbelt.Settings[\"actionable\"];\n\ntype RuleElementConstructor = {\n schema: LaxSchemaField;\n LOCALIZATION_PREFIXES: string[];\n} & (new (data: RuleElementSource, options: RuleElementOptions) => RuleElement) & {\n setData(parent: PhysicalItemPF2e, source: RuleElementSource): Promise;\n };\n\nexport { actionable };\nexport type { ActionableTool };\n", "import {\n ChatLogPF2e,\n ChatMessagePF2e,\n ContextMenuEntry,\n createToggleHook,\n CreaturePF2e,\n htmlQuery,\n isActionMessage,\n R,\n SpellcastingEntrySlots,\n SpellPF2e,\n SYSTEM,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { sharedMessageRenderHTML } from \".\";\n\nexport const TRAITS_BLACKLIST = [\"curse\", \"disease\", \"fortune\", \"incapacitation\", \"misfortune\", \"mythic\"] as const;\n\nconst TRAITS_SETTING = [\"disabled\", \"all\", \"blacklist\"] as const;\n\nconst CONTEXT_OPTIONS: {\n type: \"action\" | \"spell\";\n icon: string;\n test: (message: Maybe) => message is ChatMessagePF2e;\n}[] = [\n {\n type: \"action\",\n icon: `1`,\n test: (message) => isValidMessage(message) && isValidActionMessage(message),\n },\n {\n type: \"spell\",\n icon: ``,\n test: (message) => isValidMessage(message) && isValidSpellMessage(message),\n },\n];\n\nclass AnonymousTool extends ModuleTool {\n #traitsBlacklist?: string[];\n\n #getChatContextOptionsHook = createToggleHook(\n \"getChatMessageContextOptions\",\n this.#onGetChatMessageContextOptions.bind(this),\n );\n\n #messageRenderHTMLWrapper = sharedMessageRenderHTML.register(this.#messageRenderHTML, { context: this });\n\n get key(): \"anonymous\" {\n return \"anonymous\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"action\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"spell\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"traits\",\n type: String,\n default: \"disabled\",\n scope: \"world\",\n choices: TRAITS_SETTING,\n requiresReload: true,\n },\n ];\n }\n\n get traitsBlacklist() {\n return (this.#traitsBlacklist ??= TRAITS_BLACKLIST.map((trait) => CONFIG.PF2E.traitsDescriptions[trait]));\n }\n\n init(isGM: boolean): void {\n if (this.settings.spell || this.settings.action) {\n this.#messageRenderHTMLWrapper.activate();\n this.#getChatContextOptionsHook.toggle(isGM);\n }\n }\n\n #onGetChatMessageContextOptions(_chat: ChatLogPF2e, options: ContextMenuEntry[]) {\n const getMessage = (el: HTMLElement) => {\n const messageId = el.dataset.messageId;\n return game.messages.get(messageId ?? \"\");\n };\n\n for (const { icon, test, type } of CONTEXT_OPTIONS) {\n options.push({\n label: this.localize.path(`${type}.context`),\n icon,\n visible: (el: HTMLElement) => {\n const msg = getMessage(el);\n return this.settings[type] && test(msg) && !this.getFlag(msg, \"revealed\");\n },\n onClick: (_event, el) => {\n const message = getMessage(el);\n if (message) {\n this.setFlag(message, \"revealed\", true);\n }\n },\n });\n }\n }\n\n async #messageRenderHTML(message: ChatMessagePF2e, html: HTMLElement) {\n if (this.getFlag(message, \"revealed\") || !isValidMessage(message)) return;\n\n const isSpell = this.settings.spell && isValidSpellMessage(message);\n const isAction = !isSpell && this.settings.action && isValidActionMessage(message);\n if (!isSpell && !isAction) return;\n\n if (isSpell) {\n const members = partyKnowsSpell(message.item).map((actor) => actor.name);\n\n if (members.length) {\n const label = this.localize(\"revealed\");\n const msg = `${label} ${members.join(\", \")}`;\n const line = `

${msg}

`;\n\n htmlQuery(html, \".card-content\")?.insertAdjacentHTML(\"afterbegin\", line);\n return;\n }\n }\n\n if (game.user.isGM) {\n html.classList.add(\"pf2e-toolbelt-anonymous-gm\");\n return;\n }\n\n html.classList.add(\"pf2e-toolbelt-anonymous-player\");\n\n const traits = this.settings.traits;\n const isSpellDamage = isSpell && message.flags[SYSTEM.id].context?.type === \"damage-roll\";\n const tagsSelector = isSpellDamage ? \".flavor-text > .tags:not(.modifiers)\" : \".card-header > .tags\";\n const tags = htmlQuery(html, tagsSelector);\n\n if (traits === \"blacklist\") {\n for (const child of (tags?.children ?? []) as HTMLElement[]) {\n if (R.isIncludedIn(child.dataset.tooltip, this.traitsBlacklist)) {\n child.remove();\n }\n }\n }\n\n if (isSpellDamage) {\n const action = htmlQuery(html, \".flavor-text > .action\");\n\n if (action) {\n const label = this.localize(\"spell.damage\");\n action.innerHTML = `${label}`;\n }\n\n if (traits === \"disabled\") {\n tags?.remove();\n }\n } else {\n const cardHeader = htmlQuery(html, \".card-header\");\n\n if (cardHeader) {\n const type = isSpell ? \"spell\" : \"action\";\n\n cardHeader.innerHTML = `

${this.localize(`${type}.header`)}

`;\n\n if (traits !== \"disabled\") {\n cardHeader.innerHTML = `${tags?.outerHTML ?? \"\"}${cardHeader.innerHTML}`;\n }\n }\n }\n\n htmlQuery(html, \".card-content\")?.remove();\n htmlQuery(html, \".chat-card > footer\")?.remove();\n }\n}\n\nfunction partyKnowsSpell(spell: SpellPF2e | null): CreaturePF2e[] {\n if (!spell) return [];\n\n const sourceId = spell.sourceId;\n const members = game.actors.party?.members ?? [];\n\n return members.filter((actor) => {\n return actor.itemTypes.spell.some((spell) => {\n if (spell.sourceId !== sourceId) return false;\n\n const entry = spell.spellcasting;\n if (!entry) return false;\n\n if (entry.category !== \"prepared\") {\n return true;\n } else if (entry.isFlexible) {\n return !!spell.system.location.signature;\n } else {\n const spellId = spell.id;\n return R.values(entry.system?.slots ?? ({} as SpellcastingEntrySlots)).some((slot) => {\n return slot.prepared.some((prepared) => prepared.id === spellId);\n });\n }\n });\n });\n}\n\nfunction isValidActionMessage(message: ChatMessagePF2e): message is ChatMessagePF2e {\n return isActionMessage(message);\n}\n\nfunction isValidSpellMessage(message: ChatMessagePF2e): message is ChatMessagePF2e & { item: SpellPF2e | null } {\n return message.flags[SYSTEM.id].origin?.type === \"spell\";\n}\n\nfunction isValidMessage(message: Maybe): message is ChatMessagePF2e {\n if (!message) return false;\n\n const actor = message.actor;\n return !!actor && !actor.hasPlayerOwner;\n}\n\nconst anonymousTool = new AnonymousTool();\n\ntype ToolSettings = {\n action: boolean;\n spell: boolean;\n traits: (typeof TRAITS_SETTING)[number];\n};\n\nexport { anonymousTool };\nexport type { AnonymousTool };\n", "import {\n activateHooksAndWrappers,\n ActorPF2e,\n ArmorPF2e,\n createToggleWrapper,\n isSF2eItem,\n R,\n RawCoins,\n ShieldPF2e,\n SYSTEM,\n WeaponPF2e,\n ZeroToFour,\n ZeroToSix,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { sharedArmorPrepareBaseData, sharedWeaponPrepareBaseData } from \".\";\n\nconst HANDWRAPS_SLUG = \"handwraps-of-mighty-blows\";\nconst STRIKING_SHIELDS = [\"shield-boss\", \"shield-spikes\"] as const;\n\nconst GRADES = [\"commercial\", \"tactical\", \"advanced\", \"superior\", \"elite\", \"ultimate\", \"paragon\"] as const;\n\nclass ArpTool extends ModuleTool {\n #baseWrappers = [\n sharedWeaponPrepareBaseData.register(this.#weaponPrepareBaseData, { context: this }),\n sharedArmorPrepareBaseData.register(this.#armorPrepareBaseData, { context: this }),\n ];\n\n #basePriceWrappers = [\n createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.PF2E.Item.documentClasses.weapon.prototype.prepareDerivedData\",\n this.#weaponPrepareDerivedData,\n { context: this },\n ),\n createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.PF2E.Item.documentClasses.armor.prototype.prepareDerivedData\",\n this.#armorPrepareDerivedData,\n { context: this },\n ),\n ];\n\n #shieldPrepareBaseDataWrapper = createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.PF2E.Item.documentClasses.shield.prototype.prepareBaseData\",\n this.#shieldPrepareBaseData,\n { context: this },\n );\n #shieldPrepareDeriveDataWrapper = createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.PF2E.Item.documentClasses.shield.prototype.prepareDerivedData\",\n this.#shieldPrepareDerivedData,\n { context: this },\n );\n\n static WEAPON_POTENCY_PRICE = {\n 1: 35,\n 2: 935,\n 3: 8935,\n 4: 8935,\n };\n\n static WEAPON_STRIKING_PRICE = {\n 1: 65,\n 2: 1065,\n 3: 31065,\n 4: 31065,\n };\n\n static ARMOR_POTENCY_PRICE = {\n 1: 160,\n 2: 1060,\n 3: 20560,\n 4: 20560,\n };\n\n static ARMOR_RESILIENCY_PRICE = {\n 1: 340,\n 2: 3440,\n 3: 49440,\n 4: 49440,\n };\n\n static SHIELD_REINFORCING_PRICE = {\n 1: 75,\n 2: 300,\n 3: 900,\n 4: 2500,\n 5: 8000,\n 6: 32000,\n };\n\n static SHIELD_HP = {\n 0: { extra: 0, max: 0 },\n 1: { extra: 44, max: 64 },\n 2: { extra: 52, max: 80 },\n 3: { extra: 64, max: 104 },\n 4: { extra: 80, max: 120 },\n 5: { extra: 84, max: 136 },\n 6: { extra: 108, max: 160 },\n };\n\n get key(): \"arp\" {\n return \"arp\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"force\",\n type: Boolean,\n default: true,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"price\",\n type: Boolean,\n default: true,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"shield\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n ];\n }\n\n init(): void {\n if (!this.settings.enabled) return;\n\n const priceEnabled = this.settings.price;\n\n activateHooksAndWrappers(this.#baseWrappers);\n\n if (priceEnabled) {\n activateHooksAndWrappers(this.#basePriceWrappers);\n }\n\n if (this.settings.shield) {\n this.#shieldPrepareBaseDataWrapper.activate();\n\n if (priceEnabled) {\n this.#shieldPrepareDeriveDataWrapper.activate();\n }\n }\n }\n\n // this is a shared wrapper listener\n #weaponPrepareBaseData(weapon: WeaponPF2e) {\n const actor = weapon.actor;\n if (!isValidActor(actor, true) || !isValidWeapon(weapon)) return;\n\n const force = this.settings.force;\n const level = actor.level;\n\n if (isSF2eItem(weapon)) {\n updateItemGrade(level, force, weapon);\n return;\n }\n\n const expectedPotency: ZeroToFour = level < 2 ? 0 : level < 10 ? 1 : level < 16 ? 2 : 3;\n const expectedStriking: ZeroToFour = level < 4 ? 0 : level < 12 ? 1 : level < 19 ? 2 : 3;\n\n if (force || weapon.system.runes.potency < expectedPotency) {\n weapon.system.runes.potency = expectedPotency;\n }\n\n if (force || weapon.system.runes.striking < expectedStriking) {\n weapon.system.runes.striking = expectedStriking;\n }\n }\n\n #weaponPrepareDerivedData(weapon: WeaponPF2e, wrapped: libWrapper.RegisterCallback) {\n wrapped();\n\n if (!isValidActor(weapon.actor) || !isValidWeapon(weapon)) return;\n\n const coins = weapon.price.value.toObject();\n if (!coins.gp) return;\n\n if (isSF2eItem(weapon)) {\n updateItemPriceByGrade(coins, weapon);\n return;\n }\n\n const potency = weapon.system.runes.potency;\n const striking = weapon.system.runes.striking;\n\n if (potency) {\n coins.gp -= ArpTool.WEAPON_POTENCY_PRICE[potency];\n }\n\n if (striking) {\n coins.gp -= ArpTool.WEAPON_STRIKING_PRICE[striking];\n }\n\n let newPrice = new game.pf2e.Coins(coins);\n\n if ((potency || striking) && !weapon.system.runes.property.length) {\n newPrice = newPrice.plus(weapon._source.system.price.value);\n }\n\n weapon.system.price.value = newPrice;\n }\n\n // this is a shared wrapper listener\n #armorPrepareBaseData(armor: ArmorPF2e) {\n const actor = armor.actor;\n if (!isValidActor(actor, true) || !isValidArmor(armor)) return;\n\n const force = this.settings.force;\n const level = actor.level;\n\n if (isSF2eItem(armor)) {\n updateItemGrade(level, force, armor);\n return;\n }\n\n const expectedPotency: ZeroToFour = level < 5 ? 0 : level < 11 ? 1 : level < 18 ? 2 : 3;\n const expectedResilient: ZeroToFour = level < 8 ? 0 : level < 14 ? 1 : level < 20 ? 2 : 3;\n\n if (force || armor.system.runes.potency < expectedPotency) {\n armor.system.runes.potency = expectedPotency;\n }\n\n if (force || armor.system.runes.resilient < expectedResilient) {\n armor.system.runes.resilient = expectedResilient;\n }\n }\n\n #armorPrepareDerivedData(armor: ArmorPF2e, wrapped: libWrapper.RegisterCallback) {\n wrapped();\n\n if (!isValidActor(armor.actor) || !isValidArmor(armor)) return;\n\n const coins = armor.price.value.toObject();\n if (!coins.gp) return;\n\n if (isSF2eItem(armor)) {\n updateItemPriceByGrade(coins, armor);\n return;\n }\n\n const potency = armor.system.runes.potency;\n const resiliency = armor.system.runes.resilient;\n\n if (potency) {\n coins.gp -= ArpTool.ARMOR_POTENCY_PRICE[potency];\n }\n\n if (resiliency) {\n coins.gp -= ArpTool.ARMOR_RESILIENCY_PRICE[resiliency];\n }\n\n let newPrice = new game.pf2e.Coins(coins);\n\n if ((potency || resiliency) && !armor.system.runes.property.length) {\n newPrice = newPrice.plus(armor._source.system.price.value);\n }\n\n armor.system.price.value = newPrice;\n }\n\n #shieldPrepareBaseData(shield: ShieldPF2e, wrapped: libWrapper.RegisterCallback) {\n const actor = shield.actor;\n\n if (!isValidActor(actor, true) || !isValidShield(shield)) {\n wrapped();\n return;\n }\n\n const force = this.settings.force;\n const level = actor.level;\n\n if (isSF2eItem(shield)) {\n updateItemGrade(level, force, shield);\n } else {\n // 4, 7, 10, 13, 16, 19\n const expected = Math.min(Math.ceil((level - 3) / 3), 6) as ZeroToSix;\n\n if (force || shield.system.runes.reinforcing < expected) {\n shield.system.runes.reinforcing = expected;\n }\n }\n\n wrapped();\n }\n\n #shieldPrepareDerivedData(shield: ShieldPF2e, wrapped: libWrapper.RegisterCallback) {\n wrapped();\n\n if (!isValidActor(shield.actor) || !isValidShield(shield)) return;\n\n const coins = shield.price.value.toObject();\n if (!coins.gp) return;\n\n if (isSF2eItem(shield)) {\n updateItemPriceByGrade(coins, shield);\n return;\n }\n\n const reinforcing = shield.system.runes.reinforcing;\n\n if (reinforcing) {\n coins.gp -= ArpTool.SHIELD_REINFORCING_PRICE[reinforcing];\n }\n\n shield.system.price.value = new game.pf2e.Coins(coins);\n }\n}\n\nfunction isValidActor(actor: Maybe, characterOnly = false): actor is ActorPF2e {\n return !!actor && !actor.getFlag(SYSTEM.id, \"disableABP\") && (!characterOnly || actor.isOfType(\"character\"));\n}\n\nfunction isValidWeapon(weapon: WeaponPF2e): boolean {\n const { specific, category, group, baseItem, traits } = weapon._source.system;\n\n if (specific || baseItem === \"grenade\") {\n return false;\n }\n\n if (group === \"shield\" && (!baseItem || !R.isIncludedIn(baseItem, STRIKING_SHIELDS))) {\n return false;\n }\n\n if (category === \"unarmed\" && !isHandwrap(weapon)) {\n return hasHandwrap(weapon.actor);\n }\n\n return !traits.value.includes(\"alchemical\") && !traits.value.includes(\"bomb\");\n}\n\nfunction isValidArmor(armor: ArmorPF2e): boolean {\n return !armor._source.system.specific;\n}\n\nfunction isValidShield(shield: ShieldPF2e): boolean {\n return !shield._source.system.specific;\n}\n\nfunction updateItemGrade(level: number, force: boolean, item: HandledItem) {\n const type = item.type as ItemCategory;\n const expected = getExpectedGrade(level, type);\n\n if (force || GRADES.indexOf(item.system.grade ?? \"commercial\") < expected) {\n item.system.grade = GRADES[expected];\n }\n\n return;\n}\n\nfunction updateItemPriceByGrade(coins: RawCoins, item: HandledItem) {\n const grade = item.system.grade;\n\n if (R.isIncludedIn(grade, GRADES)) {\n const type = item.type as ItemCategory;\n (coins as { gp: number }).gp -= CONFIG.PF2E[`${type}Improvements`][grade].credits / 10;\n item.system.price.value = new game.pf2e.Coins(coins);\n }\n}\n\nfunction getExpectedGrade(level: number, type: ItemCategory): number {\n const improvements = CONFIG.PF2E[`${type}Improvements`];\n\n for (let i = 0; i < 6; i++) {\n const nextGrade = GRADES[i + 1];\n const nextLevel = improvements[nextGrade].level;\n\n if (level < nextLevel) {\n return i;\n }\n }\n\n return 6;\n}\n\nfunction isHandwrap(weapon: WeaponPF2e): boolean {\n const { slug, traits } = weapon._source.system;\n return slug === HANDWRAPS_SLUG || traits.otherTags.includes(HANDWRAPS_SLUG);\n}\n\nfunction hasHandwrap(actor: ActorPF2e): boolean {\n return actor.itemTypes.weapon.some((weapon) => {\n const { equipped, identification, category, traits } = weapon._source.system;\n const { carryType, invested, inSlot } = equipped;\n\n return (\n category === \"unarmed\" &&\n isHandwrap(weapon) &&\n carryType === \"worn\" &&\n inSlot &&\n identification.status === \"identified\" &&\n (!traits.value.includes(\"invested\") || invested)\n );\n });\n}\n\ntype HandledItem = WeaponPF2e | ArmorPF2e | ShieldPF2e;\n\ntype ItemCategory = \"weapon\" | \"armor\" | \"shield\";\n\ntype ToolSettings = {\n enabled: boolean;\n force: boolean;\n price: boolean;\n shield: boolean;\n};\n\nexport { ArpTool };\n", "const COVER_VALUES = {\r\n none: 0,\r\n lesser: 1,\r\n standard: 2,\r\n greater: 3,\r\n \"greater-prone\": 4,\r\n} as const;\r\n\r\nconst SIZES = {\r\n tiny: 0,\r\n sm: 1,\r\n med: 2,\r\n lg: 3,\r\n huge: 4,\r\n grg: 5,\r\n};\r\n\r\ntype CoverLevel = keyof typeof COVER_VALUES;\r\n\r\nexport { COVER_VALUES, SIZES };\r\nexport type { CoverLevel };\r\n", "import { TokenPF2e } from \"foundry-helpers\";\nimport { lineIntersect } from \"tools\";\n\nconst RECT_CORNERS = [\n { x: 0, y: 0 },\n { x: 1, y: 0 },\n { x: 0, y: 1 },\n { x: 1, y: 1 },\n];\n\nconst RECT_SPREAD = [\n { x: 0.25, y: 0.25 },\n { x: 0.75, y: 0.25 },\n { x: 0.25, y: 0.75 },\n { x: 0.75, y: 0.75 },\n];\n\nfunction getRectPoint(point: Point, rect: Rectangle): Point {\n return { x: rect.x + rect.width * point.x, y: rect.y + rect.height * point.y };\n}\n\nfunction getRectEdges(rect: Rectangle, margin: number): RectEdges {\n const opposite = 1 - margin;\n return {\n top: {\n A: getRectPoint({ x: margin, y: margin }, rect),\n B: getRectPoint({ x: opposite, y: margin }, rect),\n },\n right: {\n A: getRectPoint({ x: opposite, y: margin }, rect),\n B: getRectPoint({ x: opposite, y: opposite }, rect),\n },\n bottom: {\n A: getRectPoint({ x: opposite, y: opposite }, rect),\n B: getRectPoint({ x: margin, y: opposite }, rect),\n },\n left: {\n A: getRectPoint({ x: margin, y: opposite }, rect),\n B: getRectPoint({ x: margin, y: margin }, rect),\n },\n };\n}\n\nfunction* tokenSpread(token: TokenPF2e, type: \"spread\" | \"corner\"): Generator {\n const rect = token.bounds;\n const spread = type === \"spread\" ? RECT_SPREAD : RECT_CORNERS;\n\n for (const point of spread) {\n yield getRectPoint(point, rect);\n }\n}\n\nfunction tokenToSpread(origin: TokenPF2e, target: TokenPF2e, type: \"spread\" | \"corner\", debug: boolean): boolean {\n const originCenter = origin.center;\n\n for (const point of tokenSpread(target, type)) {\n if (lineIntersect(originCenter, point, debug)) return true;\n }\n\n return false;\n}\n\nfunction spreadToToken(origin: TokenPF2e, type: \"spread\" | \"corner\", target: TokenPF2e, debug: boolean): boolean {\n const targetCenter = target.center;\n\n for (const point of tokenSpread(origin, type)) {\n if (!lineIntersect(point, targetCenter, debug)) {\n return false;\n }\n }\n\n return true;\n}\n\n// function spreadToSpread(\n// origin: TokenPF2e,\n// originType: \"spread\" | \"corner\",\n// target: TokenPF2e,\n// targetType: \"spread\" | \"corner\",\n// debug: boolean,\n// ): boolean {\n// for (const originPoint of tokenSpread(origin, originType)) {\n// for (const targetPoint of tokenSpread(target, targetType)) {\n// if (lineIntersect(originPoint, targetPoint, debug)) return true;\n// }\n// }\n\n// return false;\n// }\n\ntype RectEdge = { A: Point; B: Point };\ntype RectEdges = Record<\"top\" | \"right\" | \"bottom\" | \"left\", RectEdge>;\n\nexport { getRectEdges, spreadToToken, tokenToSpread };\nexport type { RectEdge, RectEdges };\n", "import { TokenPF2e } from \"foundry-helpers\";\nimport { AutoCoverTool, CoverLevel } from \".\";\n\n/**\n * reused version of\n * https://github.com/foundryvtt/pf2e/blob/a52286c2efdd55c2911bf704be1f61fa1ba698d3/src/module/canvas/token/flanking-highlight/renderer.ts\n */\nclass CoverHighlightRenderer {\n #layer: PIXI.Graphics | null = null;\n #token: TokenPF2e;\n #tool: AutoCoverTool;\n\n constructor(token: TokenPF2e, tool: AutoCoverTool) {\n this.#token = token;\n this.#tool = tool;\n }\n\n /** Get existing layer graphics object or create one if one does not exist */\n get layer(): PIXI.Graphics {\n return this.#layer ?? this.#addLayer();\n }\n\n /**\n * Whether the flank highlight should be rendered to the user:\n * Canvas must be ready with a scene in focus, the user must own or have selected this token,\n * and the token must not be a preview or animating.\n */\n get #shouldRender(): boolean {\n return canvas.ready && !!canvas.scene && this.#tokenIsEligible;\n }\n\n /** The token must be controlled or the user's assigned character, and it must not be a preview or animating. */\n get #tokenIsEligible(): boolean {\n return !!(\n ((this.#token.controlled && this.#token.isOwner) ||\n (this.#token.actor && this.#token.actor?.id === game.user.character?.id)) &&\n !(this.#token.isPreview || this.#token.isAnimating)\n );\n }\n\n getLineColor(level: CoverLevel): number {\n return level !== \"none\" ? CONFIG.Canvas.dispositionColors.HOSTILE : CONFIG.Canvas.dispositionColors.PARTY;\n }\n\n draw(): void {\n this.clear();\n if (canvas.tokens.highlightObjects && game.user.targets.size && this.#shouldRender) {\n for (const target of game.user.targets) {\n const { level } = this.#tool.calculateCover(this.#token, target);\n this.drawLine(target, level);\n this.drawLabel(target, level);\n }\n }\n }\n\n drawLine(target: TokenPF2e, level: CoverLevel): void {\n const thickness = CONFIG.Canvas.objectBorderThickness;\n const outerThickness = Math.round(thickness * 1.5);\n const radius = Math.round(thickness * 2);\n const lineColor = this.getLineColor(level);\n\n // Draw line\n this.layer\n .lineStyle(outerThickness, 0x000000, 0.5)\n .moveTo(this.#token.center.x, this.#token.center.y)\n .lineTo(target.center.x, target.center.y);\n this.layer\n .lineStyle(thickness, lineColor, 0.5)\n .moveTo(this.#token.center.x, this.#token.center.y)\n .lineTo(target.center.x, target.center.y);\n\n // Draw circles on tokens\n this.layer\n .beginFill(lineColor)\n .lineStyle(1, 0x000000)\n .drawCircle(this.#token.center.x, this.#token.center.y, radius);\n this.layer.beginFill(lineColor).lineStyle(1, 0x000000).drawCircle(target.center.x, target.center.y, radius);\n }\n\n drawLabel(target: TokenPF2e, level: CoverLevel): void {\n // Midpoint coordinate between tokens\n const mid_x = Math.round((this.#token.center.x + target.center.x) / 2);\n const mid_y = Math.round((this.#token.center.y + target.center.y) / 2);\n\n // Vector between tokens\n const vect_x = target.center.x - this.#token.center.x;\n const vect_y = target.center.y - this.#token.center.y;\n\n // find the perpendicular vector \"above\" the line\n const perp_vect_x = vect_x <= -vect_x ? vect_y : -vect_y;\n const perp_vect_y = vect_x <= -vect_x ? -vect_x : vect_x;\n\n // Midpoint coordinate offset perpendicularly above line\n const offsetPixels = 20.0;\n const offsetScale = offsetPixels / Math.sqrt(perp_vect_x ** 2 + perp_vect_y ** 2);\n const perp_x = mid_x + Math.round(perp_vect_x * offsetScale);\n const perp_y = mid_y + Math.round(perp_vect_y * offsetScale);\n\n // Styling\n const style = CONFIG.canvasTextStyle.clone();\n const dimensions = canvas.dimensions;\n style.fontSize = dimensions.size >= 200 ? 28 : dimensions.size < 50 ? 20 : 24;\n style.fill = this.getLineColor(level);\n style.stroke = 0x000000;\n\n const labelText = this.#tool.localize(level);\n const text = new foundry.canvas.containers.PreciseText(labelText, style);\n text.anchor.set(0.5, 0.5);\n\n // Rotate text to match line, ensuring it is not upside-down\n let rotation = Math.atan2(vect_y, vect_x);\n if (rotation > Math.PI / 2) {\n rotation = rotation - Math.PI;\n } else if (rotation < -Math.PI / 2) {\n rotation = rotation + Math.PI;\n }\n text.rotation = rotation;\n\n text.position.set(perp_x, perp_y);\n this.layer.addChild(text);\n }\n\n /** Destroys and removes layer graphics, incuding any text children */\n clear(): void {\n this.#layer?.destroy({ children: true });\n this.#layer = null;\n }\n\n /** Alias of `clear` */\n destroy(): void {\n this.clear();\n }\n\n /** Creates layer graphics object */\n #addLayer(): PIXI.Graphics {\n this.#layer = new PIXI.Graphics();\n return this.#token.layer.addChild(this.#layer);\n }\n}\n\nexport { CoverHighlightRenderer };\n", "import {\n ActorPF2e,\n CharacterPF2e,\n Check,\n CheckCheckContext,\n CheckModifier,\n CheckModifiersDialog,\n CheckRoll,\n CheckRollCallback,\n createHTMLElement,\n createToggleHook,\n createToggleWrapper,\n EffectPF2e,\n getChoiceSetSelection,\n getFirstActiveToken,\n getItemSourceId,\n htmlQuery,\n ItemSourcePF2e,\n MODULE,\n R,\n Rolled,\n signedInteger,\n SYSTEM,\n toggleHooksAndWrappers,\n TokenPF2e,\n ZeroToFour,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport {\n COVER_VALUES,\n CoverHighlightRenderer,\n CoverLevel,\n getRectEdges,\n RectEdge,\n SIZES,\n spreadToToken,\n tokenToSpread,\n} from \".\";\nimport { drawDebugLine, lineIntersect } from \"tools\";\n\nconst CREATURE_SETTINGS = [\"disabled\", \"cross\", \"zero\", \"ten\", \"twenty\"] as const;\n\nconst WALL_INTERSECTIONS_SETTING = [\n \"disabled\",\n \"center-center\",\n \"center-spread\",\n \"center-corner\",\n \"corner-center\",\n] as const;\n\nconst COVER_UUID = SYSTEM.itemUuid(\n \"Compendium.pf2e.other-effects.Item.I9lfZUiCwMiGogVi\",\n \"Compendium.sf2e.other-effects.Item.I9lfZUiCwMiGogVi\",\n);\n\nclass AutoCoverTool extends ModuleTool {\n #wrappers = [\n createToggleWrapper(\"WRAPPER\", \"game.pf2e.Check.roll\", this.#checkRoll, { context: this }),\n createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.Token.objectClass.prototype._refreshVisibility\",\n this.#tokenRefreshVisibility,\n { context: this },\n ),\n createToggleWrapper(\"WRAPPER\", \"CONFIG.Token.objectClass.prototype._destroy\", this.#tokenDestroy, {\n context: this,\n }),\n createToggleHook(\"renderCheckModifiersDialog\", this.#onRenderCheckModifiersDialog.bind(this)),\n ];\n\n get key(): \"autoCover\" {\n return \"autoCover\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"wall\",\n type: String,\n default: \"disabled\",\n scope: \"world\",\n choices: WALL_INTERSECTIONS_SETTING,\n onChange: () => {\n this.configurate();\n },\n },\n {\n key: \"creature\",\n type: String,\n default: \"disabled\",\n scope: \"world\",\n choices: CREATURE_SETTINGS,\n onChange: () => {\n this.configurate();\n },\n },\n {\n key: \"dead\",\n type: Boolean,\n default: true,\n scope: \"world\",\n },\n {\n key: \"prone\",\n type: Boolean,\n default: true,\n scope: \"world\",\n },\n ];\n }\n\n _configurate(): void {\n const enabled = this.settings.creature !== \"disabled\" || this.settings.wall !== \"disabled\";\n toggleHooksAndWrappers(this.#wrappers, enabled);\n }\n\n init(): void {\n this._configurate();\n }\n\n getCoverHighlight(token: TokenPF2e, fallback: true): CoverHighlightRenderer;\n getCoverHighlight(token: TokenPF2e, fallback: boolean): CoverHighlightRenderer | undefined;\n getCoverHighlight(token: TokenPF2e, fallback: boolean) {\n const current = this.getInMemory(token, \"coverHighlight\");\n return fallback ? (current ?? new CoverHighlightRenderer(token, this)) : current;\n }\n\n getExistingCovers(actor: ActorPF2e): EffectPF2e[] {\n const coverUUID = COVER_UUID();\n return actor.itemTypes.effect.filter((effect) => getItemSourceId(effect) === coverUUID);\n }\n\n getHighestCoverSelection(effects: EffectPF2e[], isProne: boolean): CoverSelection {\n const allSelections = effects.map((effect): CoverSelection => {\n const level = getChoiceSetSelection<{ level: CoverLevel }>(effect)?.level ?? \"none\";\n return { level, value: COVER_VALUES[level] };\n });\n const selections = isProne ? allSelections : allSelections.filter(({ level }) => level !== \"greater-prone\");\n\n return R.firstBy(selections, [R.prop(\"value\"), \"desc\"]) ?? { level: \"none\", value: 0 };\n }\n\n isTargetProne(context: CheckCheckContext): boolean {\n return Array.isArray(context.options)\n ? context.options.includes(\"item:ranged\") && context.options.includes(\"target:condition:prone\")\n : !!(context.options?.has(\"item:ranged\") && context.options?.has(\"target:condition:prone\"));\n }\n\n getCoverBonus(level: CoverLevel): ZeroToFour {\n const rawBonus = COVER_VALUES[level];\n return rawBonus === 3 ? 4 : rawBonus;\n }\n\n calculateCover(origin: TokenPF2e, target: TokenPF2e): { type: \"wall\" | \"creature\"; level: CoverLevel } {\n const debug = MODULE.isDebug;\n\n if (debug) {\n canvas.controls.debug.clear();\n }\n\n if (this.intersectsWithWall(origin, target, debug)) {\n return { type: \"wall\", level: \"standard\" };\n }\n\n const cover = this.calculateCreaturesCover(origin, target, debug);\n return { type: \"creature\", level: cover };\n }\n\n intersectsWithWall(origin: TokenPF2e, target: TokenPF2e, debug: boolean = false): boolean {\n const setting = this.settings.wall;\n\n switch (setting) {\n case \"center-center\":\n return lineIntersect(origin.center, target.center, debug);\n case \"center-spread\":\n return tokenToSpread(origin, target, \"spread\", debug);\n case \"center-corner\":\n return tokenToSpread(origin, target, \"corner\", debug);\n case \"corner-center\":\n return spreadToToken(origin, \"corner\", target, debug);\n // case \"corner-spread\":\n // return spreadToSpread(origin, \"corner\", target, \"spread\", debug);\n // case \"corner-corner\":\n // return spreadToSpread(origin, \"corner\", target, \"corner\", debug);\n default:\n return false;\n }\n }\n\n calculateCreaturesCover(originToken: TokenPF2e, targetToken: TokenPF2e, debug: boolean = false): CoverLevel {\n const scene = originToken.scene;\n const setting = this.settings.creature;\n const originActor = originToken.actor;\n const targetActor = targetToken.actor;\n\n if (!scene || setting === \"disabled\" || !originActor || !targetActor) {\n return \"none\";\n }\n\n const origin = originToken.center;\n const target = targetToken.center;\n\n if (debug) {\n drawDebugLine(origin, target, \"blue\");\n }\n\n let cover: CoverLevel = \"none\";\n const skipDead = this.settings.dead;\n const skipProne = this.settings.prone;\n const originSize = SIZES[originActor.size];\n const targetSize = SIZES[targetActor.size];\n const margin = setting === \"ten\" ? 0.1 : setting === \"twenty\" ? 0.2 : 0;\n const canHaveExtraLarges = originSize < SIZES.huge && targetSize < SIZES.huge;\n\n const isExtraLarge = (actor: ActorPF2e) => {\n const size = SIZES[actor.size];\n return size - originSize >= 2 && size - targetSize >= 2;\n };\n\n const intersectsEdge = (edge: RectEdge): boolean => {\n const intersects = foundry.utils.lineSegmentIntersects(origin, target, edge.A, edge.B);\n\n if (debug) {\n drawDebugLine(edge.A, edge.B, intersects ? \"red\" : \"green\");\n }\n\n return intersects;\n };\n\n const intersectsWith = (token: TokenPF2e) => {\n const edges = getRectEdges(token.bounds, margin);\n\n if (setting === \"cross\") {\n return (\n (intersectsEdge(edges.top) && intersectsEdge(edges.bottom)) ||\n (intersectsEdge(edges.left) && intersectsEdge(edges.right))\n );\n } else {\n return Object.values(edges).some((edge) => intersectsEdge(edge));\n }\n };\n\n for (const tokenDocument of scene.tokens) {\n const token = tokenDocument.object;\n const actor = token?.actor;\n\n if (!token || !actor || tokenDocument.hidden) continue;\n if (token === originToken || token === targetToken) continue;\n if (skipDead && !actor.hitPoints?.value) continue;\n if (skipProne && actor.getCondition(\"prone\")) continue;\n\n // we handle the 'Aim-Aiding' armor rune\n if (\n actor.type === \"character\" &&\n actor.isAllyOf(originActor) &&\n (actor as CharacterPF2e).armorClass.options.has(\"armor:rune:property:aim-aiding\")\n )\n continue;\n\n const extraLarge = canHaveExtraLarges && isExtraLarge(actor);\n\n // we don't need to check intersection on that token as it won't give more than what we already have\n if (canHaveExtraLarges && !extraLarge && cover === \"lesser\") continue;\n // no intersection\n if (!intersectsWith(token)) continue;\n\n // we can't have extra large check so this is a much as we will ever get\n if (!canHaveExtraLarges) {\n return \"lesser\";\n }\n\n // we can never get anything beyond 'standard' so we check out now\n if (isExtraLarge(actor)) {\n return \"standard\";\n }\n\n // we can still have an extra large check later on so we have to keep going\n cover = \"lesser\";\n }\n\n return cover;\n }\n\n #tokenRefreshVisibility(token: TokenPF2e, wrapped: libWrapper.RegisterCallback) {\n wrapped();\n\n const coverHighlight = this.getCoverHighlight(token, true);\n coverHighlight.draw();\n this.setInMemory(token, \"coverHighlight\", coverHighlight);\n }\n\n #tokenDestroy(token: TokenPF2e, wrapped: libWrapper.RegisterCallback) {\n wrapped();\n\n const coverHighlight = this.getCoverHighlight(token, false);\n coverHighlight?.destroy();\n }\n\n async #checkRoll(\n _check: Check,\n wrapped: libWrapper.RegisterCallback,\n ...args: [check: CheckModifier, context?: CheckCheckContext, event?: Event | null, callback?: CheckRollCallback]\n ): Promise | null> {\n const context = args[1];\n\n if (\n !context?.target ||\n context.isReroll ||\n !context.createMessage ||\n context.type !== \"attack-roll\" ||\n (R.isNumber(context.target.distance) && context.target.distance <= 5)\n ) {\n return wrapped(...args);\n }\n\n const originActor = context.origin?.actor ?? context.actor;\n const targetActor = context.target.actor;\n\n if (!originActor || !targetActor || originActor.isOfType(\"hazard\")) {\n return wrapped(...args);\n }\n\n const originToken = (context.origin?.token ?? context.token ?? getFirstActiveToken(originActor))?.object;\n const targetToken = (context.target.token ?? getFirstActiveToken(targetActor))?.object;\n\n if (!originToken || !targetToken) {\n return wrapped(...args);\n }\n\n if (!R.isNumber(context.target.distance) && originToken.distanceTo(targetToken) <= 5) {\n return wrapped(...args);\n }\n\n const targetIsProne = this.isTargetProne(context);\n const existing = this.getHighestCoverSelection(this.getExistingCovers(targetActor), targetIsProne);\n if (existing.value >= COVER_VALUES.standard) {\n return wrapped(...args);\n }\n\n const cover = this.calculateCover(originToken, targetToken);\n\n if (COVER_VALUES[cover.level] > existing.value) {\n const items = foundry.utils.deepClone(targetActor._source.items);\n await this.#addCoverSourceToContext(context, items, cover.level, this.localize(cover.type));\n }\n\n return wrapped(...args);\n }\n\n #onRenderCheckModifiersDialog(dialog: CheckModifiersDialog, $html: JQuery) {\n const context = dialog.context;\n if (!context?.target || context.isReroll || !context.createMessage || context.type !== \"attack-roll\") return;\n\n const originActor = context.origin?.actor ?? context.actor;\n const targetActor = context.target.actor;\n if (!originActor || !targetActor || originActor.isOfType(\"hazard\")) return;\n\n const targetIsProne = this.isTargetProne(context);\n const coverEffects = this.getExistingCovers(targetActor);\n const current = this.getHighestCoverSelection(coverEffects, targetIsProne);\n\n const html = $html[0];\n const separator = document.createElement(\"hr\");\n\n const options = R.pipe(\n targetIsProne ? COVER_VALUES : R.omit(COVER_VALUES, [\"greater-prone\"]),\n R.keys(),\n R.map((slug) => {\n return { label: this.localize(slug), value: slug };\n }),\n );\n\n const select = foundry.applications.fields.createSelectInput({\n name: \"override-cover\",\n options,\n value: current.level,\n });\n\n const getDisplayedBonus = (level: CoverLevel): string => {\n const bonus = this.getCoverBonus(level);\n return signedInteger(bonus);\n };\n\n const bonusSpan = createHTMLElement(\"span\", {\n content: getDisplayedBonus(current.level),\n });\n\n const row = createHTMLElement(\"div\", {\n classes: [\"override-cover\"],\n content: ``,\n });\n\n row.append(bonusSpan, select);\n\n htmlQuery(html, \".add-modifier-panel\")?.after(separator, row);\n\n let cover = current.level;\n\n select.addEventListener(\"change\", () => {\n cover = select.value as CoverLevel;\n bonusSpan.innerText = getDisplayedBonus(cover);\n });\n\n htmlQuery(html, `button[type=\"submit\"]`)?.addEventListener(\n \"click\",\n async (event) => {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n if (cover !== current.level) {\n const ids = coverEffects.map((effect) => effect.id);\n const allItems = foundry.utils.deepClone(targetActor._source.items);\n const items = ids.length ? allItems.filter((item) => !R.isIncludedIn(item._id, ids)) : allItems;\n\n await this.#addCoverSourceToContext(context, items, cover, this.localize(\"overriden\"));\n }\n\n dialog.resolve(true);\n dialog.isResolved = true;\n dialog.close();\n },\n { capture: true },\n );\n\n dialog.setPosition();\n }\n\n async #addCoverSourceToContext(\n context: CheckCheckContext,\n items: ItemSourcePF2e[],\n level: CoverLevel,\n sourceName: string,\n ) {\n const coverUUID = COVER_UUID();\n const source = (await fromUuid(coverUUID))?.toObject();\n if (!source) return;\n\n source.name = sourceName;\n source.system.rules = this.#coverSourceRules(level);\n\n items.push(source);\n\n context.target!.actor = context.target!.actor!.clone({ items }, { keepId: true });\n\n if (context.dc?.slug) {\n const statistic = context.target!.actor.getStatistic(context.dc.slug)?.dc;\n\n if (statistic) {\n context.dc.value = statistic.value;\n context.dc.statistic = statistic;\n }\n }\n }\n\n #coverSourceRules(level: CoverLevel) {\n const bonus = this.getCoverBonus(level);\n\n return [\n {\n choices: [],\n flag: \"cover\",\n key: \"ChoiceSet\",\n prompt: \"PF2E.SpecificRule.Cover.Prompt\",\n selection: { bonus, level },\n },\n { key: \"RollOption\", option: `self:cover-bonus:${bonus}` },\n { key: \"RollOption\", option: `self:cover-level:${level}` },\n {\n key: \"FlatModifier\",\n predicate: [\n {\n or: [\n { and: [\"self:condition:prone\", \"item:ranged\"] },\n { not: \"self:cover-level:greater-prone\" },\n ],\n },\n ],\n selector: \"ac\",\n type: \"circumstance\",\n value: bonus,\n },\n {\n key: \"FlatModifier\",\n predicate: [\"area-effect\", { not: \"self:cover-level:greater-prone\" }],\n selector: \"reflex\",\n type: \"circumstance\",\n value: bonus,\n },\n {\n key: \"FlatModifier\",\n predicate: [\n { or: [\"action:hide\", \"action:sneak\", \"avoid-detection\"] },\n { not: \"self:cover-level:greater-prone\" },\n ],\n selector: \"stealth\",\n type: \"circumstance\",\n value: bonus,\n },\n {\n key: \"FlatModifier\",\n predicate: [\"action:avoid-notice\", { not: \"self:cover-level:greater-prone\" }],\n selector: \"initiative\",\n type: \"circumstance\",\n value: bonus,\n },\n ];\n }\n}\n\ntype ToolSettings = {\n creature: (typeof CREATURE_SETTINGS)[number];\n dead: boolean;\n prone: boolean;\n wall: (typeof WALL_INTERSECTIONS_SETTING)[number];\n};\n\ntype CoverSelection = { level: CoverLevel; value: ZeroToFour };\n\nexport { AutoCoverTool };\n", "import {\n ChatMessageFlagsPF2e,\n ChatMessagePF2e,\n ChatMessageSourcePF2e,\n createHTMLElement,\n DamageDamageContextFlag,\n DegreeOfSuccessString,\n htmlQueryAll,\n R,\n RollMode,\n SYSTEM,\n} from \"foundry-helpers\";\nimport { targetHelperTool } from \"tools\";\nimport { MergeData, MergeDataSource, zMergeData } from \".\";\nimport { BetterChatTool } from \"..\";\n\nfunction getMessageMergeFlagData(this: BetterChatTool, message: ChatMessagePF2e): MergeData[] | undefined {\n const flag = this.getFlag(message, \"mergeDamage.data\");\n if (!flag) return;\n\n return R.pipe(\n flag,\n R.map((data) => zMergeData.safeParse(data).data),\n R.filter(R.isTruthy),\n );\n}\n\nfunction getMessageMergeData(this: BetterChatTool, message: ChatMessagePF2e): MergeData[] {\n const data = getMessageMergeFlagData.call(this, message);\n if (data) return data;\n\n const source = message.toObject() as WithRequired, \"flags\">;\n\n delete source._id;\n delete source.timestamp;\n this.deleteFlagProperty(source, \"splitted\");\n\n const sourceFlag = source.flags[SYSTEM.id] as ChatMessageFlagsPF2e[\"pf2e\"] & {\n context?: DamageDamageContextFlag | SpellCastContextFlag;\n strike?: {\n actor: string;\n index: number;\n damaging: boolean;\n name: string;\n altUsage: null;\n };\n };\n\n const flavor = createHTMLElement(\"div\", { content: message.flavor });\n\n return [\n zMergeData.parse({\n source,\n name:\n sourceFlag.strike?.name ??\n message.item?.name ??\n flavor.querySelector(\":scope > h4.action\")?.innerText.trim() ??\n \"unknown\",\n outcome: sourceFlag.context?.outcome ?? null,\n options: sourceFlag.context?.options.filter((option) => /^(item|self):/.test(option)),\n modifiers: flavor.querySelector(\":scope > .tags.modifiers\")?.outerHTML.trim() ?? \"\",\n notes: htmlQueryAll(flavor, \":scope > .notes > .roll-note\").map((x) => x.outerHTML.trim()),\n tags: flavor.querySelector(\":scope > h4.action + .tags\")?.outerHTML.trim() ?? \"\",\n }),\n ];\n}\n\nfunction setMessageMergeUpdateFlags(\n this: BetterChatTool,\n updates: Record,\n message: ChatMessagePF2e,\n data: MergeData[],\n) {\n const targets = this.getMessageTargets(message);\n targetHelperTool.setMessageFlagTargets(updates, targets);\n\n this.setFlagProperties(updates, \"mergeDamage\", {\n merged: true,\n data,\n });\n}\n\ninterface SpellCastContextFlag {\n type: \"spell-cast\";\n domains: string[];\n options: string[];\n outcome?: DegreeOfSuccessString;\n /** The roll mode (i.e., 'roll', 'blindroll', etc) to use when rendering this roll. */\n rollMode?: RollMode;\n}\n\nexport { getMessageMergeData, getMessageMergeFlagData, setMessageMergeUpdateFlags };\n", "import { ChatMessageSourcePF2e, z } from \"foundry-helpers\";\nimport { DEGREE_OF_SUCCESS_STRINGS } from \"foundry-helpers/dist\";\n\nconst zMergeData = z.object({\n modifiers: z.string().default(\"\"),\n name: z.string().nonempty().default(\"unknown\"),\n notes: z.array(z.string()).default([]),\n options: z.array(z.string()).default([]),\n outcome: z.enum(DEGREE_OF_SUCCESS_STRINGS).nullish(),\n source: z.looseObject({}),\n tags: z.string().default(\"\"),\n});\n\ntype MergeDataSource = Omit, \"source\"> & {\n source?: DeepPartial;\n};\ntype MergeData = Omit, \"source\"> & {\n source: DeepPartial;\n};\n\nexport { zMergeData };\nexport type { MergeData, MergeDataSource };\n", "import {\n ArithmeticExpression,\n ChatMessagePF2e,\n DamageInstance,\n DamageRoll,\n DamageType,\n DegreeOfSuccessString,\n getDamageRollClass,\n GroupingData,\n MaterialDamageEffect,\n R,\n Rolled,\n RollJSON,\n RollTermData,\n SYSTEM,\n} from \"foundry-helpers\";\nimport { getMessageMergeData, setMessageMergeUpdateFlags } from \".\";\nimport { BetterChatTool } from \"..\";\n\nasync function mergeDamages(\n this: BetterChatTool,\n targetMessage: ChatMessagePF2e,\n originMessage: ChatMessagePF2e,\n options: MergeOptions,\n): Promise {\n const groups: Record = {};\n const damageLabel = game.i18n.localize(\"PF2E.DamageRoll\");\n\n const data = [\n ...getMessageMergeData.call(this, originMessage), //\n ...getMessageMergeData.call(this, targetMessage),\n ];\n\n for (const { name, notes, tags, modifiers, outcome } of data) {\n const group = (groups[name] ??= {\n label: `${damageLabel}: ${name}`,\n tags,\n notes: [],\n results: [],\n });\n\n for (const note of notes) {\n if (group.notes.includes(note)) continue;\n group.notes.push(note);\n }\n\n const exists = group.results.find((result) => result.outcome === outcome && result.modifiers === modifiers);\n\n if (exists) {\n exists.count++;\n } else {\n group.results.push({\n outcome,\n modifiers,\n label: game.i18n.localize(`PF2E.Check.Result.Degree.Attack.${outcome ?? \"success\"}`),\n count: 1,\n });\n }\n }\n\n const { rolls, showBreakdown } = groupRolls(targetMessage, originMessage, options);\n\n const messageData: ChatMessageData = {\n flavor: await this.render(\"merged\", {\n groups,\n showBreakdown,\n }),\n speaker: targetMessage.speaker,\n flags: {\n [SYSTEM.id]: {\n context: {\n options: R.unique(data.flatMap(({ options }) => options)),\n },\n },\n },\n rolls,\n sound: null,\n };\n\n setMessageMergeUpdateFlags.call(this, messageData, targetMessage, data);\n\n const ChatMessagePF2e = getDocumentClass(\"ChatMessage\");\n\n if (options.updateMessages !== false) {\n await ChatMessage.deleteDocuments([targetMessage.id, originMessage.id]);\n return ChatMessagePF2e.create(messageData as any);\n } else {\n return new ChatMessagePF2e(messageData as any);\n }\n}\n\nasync function injectDamage(\n this: BetterChatTool,\n targetMessage: ChatMessagePF2e,\n originMessage: ChatMessagePF2e,\n options: MergeOptions,\n): Promise<{ rolls: RollJSON[] }> {\n // since the previous message shouldn't be modified, we don't want to update its rolls\n delete options.originMerge;\n\n const { rolls } = groupRolls(targetMessage, originMessage, options);\n const data = [\n ...getMessageMergeData.call(this, originMessage), //\n ...getMessageMergeData.call(this, targetMessage),\n ];\n\n const updates = { rolls };\n\n setMessageMergeUpdateFlags.call(this, updates, originMessage, data);\n this.setFlagProperty(updates, \"injected\", true);\n\n if (options.updateMessages !== false) {\n await targetMessage.delete();\n originMessage.update(updates);\n }\n\n return updates;\n}\n\nfunction getRoll(roll: Rolled, mergeType: MergeType = \"full\"): Rolled {\n return (mergeType === \"full\" ? roll : roll.alter(mergeType === \"double\" ? 2 : 0.5, 0)) as Rolled;\n}\n\nfunction groupRolls(\n targetMessage: ChatMessagePF2e,\n originMessage: ChatMessagePF2e,\n { originMerge, targetMerge }: MergeOptions,\n) {\n const groupedInstances: GroupedInstance[] = [];\n const messageRoll = getRoll(targetMessage.rolls[0], targetMerge);\n const otherRoll = getRoll(originMessage.rolls[0], originMerge);\n\n for (const roll of [otherRoll, messageRoll]) {\n const instances = roll.instances as Rolled[];\n\n for (const instance of instances) {\n const exists = groupedInstances.find(\n (x) => x.type === instance.type && x.persistent === instance.persistent,\n );\n\n if (exists) {\n exists.total += instance.total;\n exists.terms.push(...instance.toJSON().terms);\n exists.formulas.push(...instance.terms.map((x) => x.expression));\n for (const material of instance.materials) {\n exists.materials.add(material);\n }\n } else {\n groupedInstances.push({\n type: instance.type,\n persistent: instance.persistent,\n total: instance.total,\n materials: new Set(instance.materials),\n terms: instance.toJSON().terms.slice(),\n formulas: instance.terms.map((x) => x.expression),\n formula: \"\",\n term: null,\n });\n }\n }\n }\n\n for (const group of groupedInstances) {\n if (group.persistent) {\n const DamageRoll = getDamageRollClass();\n const { index } = group.formulas.reduce(\n (prev, curr, index) => {\n const value = new DamageRoll(curr).expectedValue;\n if (value <= prev.value) return prev;\n return { value, index };\n },\n { value: 0, index: -1 },\n );\n\n group.formulas = [group.formulas[index]];\n group.terms = [group.terms[index]];\n }\n\n const type = R.filter(\n [group.type, group.persistent ? \"persistent\" : undefined, ...group.materials],\n R.isTruthy,\n ).join(\",\");\n\n group.formula = `(${group.formulas.join(\" + \")})[${type}]`;\n group.term = group.terms.length < 2 ? group.terms[0] : createTermGroup(group.terms);\n }\n\n const showBreakdown = messageRoll.options.showBreakdown && otherRoll.options.showBreakdown;\n const ignoredResistances = ((messageRoll.options.ignoredResistances ?? []) as string[]).concat(\n (otherRoll.options.ignoredResistances ?? []) as string[],\n );\n\n const roll = {\n class: \"DamageRoll\",\n options: {\n critRule: messageRoll.options.critRule,\n ignoredResistances: ignoredResistances,\n showBreakdown,\n },\n ghost: true,\n dice: [],\n formula: `{${groupedInstances.map(({ formula }) => formula).join(\", \")}}`,\n total: R.sumBy(groupedInstances, (x) => x.total),\n evaluated: true,\n terms: [\n {\n class: \"InstancePool\",\n options: {},\n evaluated: true,\n terms: groupedInstances.map(({ formula }) => formula),\n modifiers: [],\n rolls: groupedInstances.map(({ formula, total, term, type, materials, persistent }) => ({\n class: \"DamageInstance\",\n options: {\n flavor: R.pipe(\n [type, persistent ? \"persistent\" : undefined, ...materials],\n R.filter(R.isTruthy),\n R.join(\",\"),\n ),\n },\n dice: [],\n formula,\n total,\n terms: [term],\n evaluated: true,\n })),\n results: groupedInstances.map(({ total }) => ({\n result: total,\n active: true,\n })),\n },\n ],\n };\n\n const rolls: RollJSON[] = [roll];\n\n for (const [msg, mergeType] of [\n [originMessage, originMerge],\n [targetMessage, targetMerge],\n ] as const) {\n if (msg.rolls.length > 1) {\n rolls.push(...msg.rolls.slice(1).map((roll) => getRoll(roll, mergeType).toJSON()));\n }\n }\n\n return { rolls, showBreakdown };\n}\n\nfunction createTermGroup(\n terms: RollTermData[],\n): RollTermData & { class?: \"Grouping\"; term: ReturnType } {\n return {\n class: \"Grouping\",\n options: {},\n evaluated: true,\n term: {\n class: \"ArithmeticExpression\",\n options: {},\n evaluated: true,\n operator: \"+\",\n operands: [terms.shift()!, terms.length > 1 ? createTermGroup(terms) : terms[0]],\n },\n };\n}\n\ntype MessageGroup = {\n label: string;\n tags: string;\n notes: string[];\n results: {\n outcome: Maybe;\n modifiers: string;\n label: string;\n count: number;\n }[];\n};\n\ntype GroupedInstance = {\n type: DamageType;\n persistent: boolean;\n total: number;\n materials: Set;\n formulas: string[];\n formula: string;\n terms: RollTermData[];\n term: RollTermData | GroupingData | null;\n};\n\ntype MergeType = toolbelt.betterChat.mergeDamage.MergeType;\ntype MergeOptions = toolbelt.betterChat.mergeDamage.MergeOptions;\n\nexport { injectDamage, mergeDamages };\nexport type { MergeOptions, MergeType };\n", "import {\n addListenerAll,\n arraysEqual,\n ChatMessagePF2e,\n createHTMLElement,\n htmlQuery,\n latestChatMessages,\n R,\n waitDialog,\n} from \"foundry-helpers\";\nimport { getMessageMergeFlagData, injectDamage, mergeDamages, MergeOptions } from \".\";\nimport { BetterChatTool } from \"..\";\n\nconst _cached: { injected?: string; icons: PartialRecord } = { icons: {} };\n\nconst MERGE_MESSAGES = [\"targetMerge\", \"originMerge\"] as const;\nconst MERGE_TYPES = [\"full\", \"half\", \"double\"] as const;\n\nconst ICONS: Record = {\n inject: \"fa-solid fa-syringe\",\n merge: \"fa-duotone fa-merge\",\n split: \"fa-duotone fa-split\",\n};\n\nasync function renderChatMessageMergeDamage(this: BetterChatTool, targetMessage: ChatMessagePF2e, html: HTMLElement) {\n if (!isMessageOwner(targetMessage) || !targetMessage.isDamageRoll) return;\n\n const actor = targetMessage.actor;\n const targets = this.getMessageTargets(targetMessage);\n const injected = this.getFlag(targetMessage, \"mergeDamage.injected\");\n\n const buttons: ButtonType[] = [];\n\n if (injected || this.getFlag(targetMessage, \"mergeDamage.merged\")) {\n buttons.push(\"split\");\n } else if (this.settings.inject) {\n buttons.push(\"inject\");\n }\n\n if (this.settings.merge && actor) {\n buttons.push(\"merge\");\n }\n\n if (!buttons.length) return;\n\n const buttonsElement = createHTMLElement(\"div\", {\n classes: [\"pf2e-toolbelt-merge-buttons\"],\n content: buttons.map((type) => getButton.call(this, type)).join(\"\"),\n });\n\n htmlQuery(html, \".dice-result .dice-total\")?.append(buttonsElement);\n\n if (injected) {\n const action = htmlQuery(html, \".message-header .flavor-text .action\");\n action?.insertAdjacentHTML(\"afterbegin\", getInjectedIcon.call(this));\n }\n\n addListenerAll(buttonsElement, \"[data-action]\", async (el, event) => {\n event.stopPropagation();\n\n const action = el.dataset.action as EventAction;\n\n if (R.isIncludedIn(action, [\"merge-damage\", \"inject-damage\"] as const)) {\n for (const originMessage of latestChatMessages(5, targetMessage)) {\n if (!originMessage.isDamageRoll) continue;\n\n const isMerge = action === \"merge-damage\";\n if (isMerge && originMessage.actor !== actor) continue;\n\n const otherTargets = this.getMessageTargets(originMessage);\n if ((!isMerge && !targets.length) || arraysEqual(targets, otherTargets)) {\n const mergeOptions = event.shiftKey ? await mergeMenu.call(this, action) : {};\n if (!mergeOptions) return;\n\n if (isMerge) {\n return mergeDamages.call(this, targetMessage, originMessage, mergeOptions);\n } else {\n return injectDamage.call(this, targetMessage, originMessage, mergeOptions);\n }\n }\n }\n\n this.localize.warning(\"mergeDamage.noMatch\");\n } else if (action === \"split-damage\") {\n const data = getMessageMergeFlagData.call(this, targetMessage);\n if (!data) return;\n\n const sources = data.flatMap((data) => {\n const source = data.source;\n\n source.sound = null;\n this.setFlagProperty(source, \"splitted\", true);\n\n return source;\n });\n\n if (sources?.length) {\n await targetMessage.delete();\n\n const ChatMessagePF2e = getDocumentClass(\"ChatMessage\");\n\n for (const source of sources) {\n await ChatMessagePF2e.create(source);\n }\n }\n }\n });\n}\n\nasync function mergeMenu(\n this: BetterChatTool,\n action: \"merge-damage\" | \"inject-damage\",\n): Promise {\n const isInject = action === \"inject-damage\";\n const split = R.map(MERGE_MESSAGES, (message) => {\n const header = `

${this.localize(\"mergeDamage.menu\", message)}

`;\n\n const radios = R.map(MERGE_TYPES, (type) => {\n const label = this.localize(\"mergeDamage.menu\", action, type);\n const checked = type === \"full\" ? \"checked\" : \"\";\n const disabled = isInject && message === \"originMerge\" ? \"disabled\" : \"\";\n\n return ``;\n });\n\n return `
${header}${radios.join(\"\")}
`;\n });\n\n return waitDialog({\n classes: [\"pf2e-toolbelt-merge-damage-menu\"],\n content: split.join(\"\"),\n i18n: this.path(\"mergeDamage.menu\", action),\n yes: {\n icon: isInject ? \"fa-solid fa-syringe\" : \"fa-duotone fa-merge\",\n },\n });\n}\n\nfunction getButton(this: BetterChatTool, type: ButtonType) {\n return (_cached.icons[type] ??= (() => {\n const icon = ICONS[type];\n const main = this.localize(\"mergeDamage.buttons\", type);\n const tooltip = type === \"split\" ? main : main + \" \" + this.localize(\"mergeDamage.buttons.menu\", type);\n\n return ``;\n })());\n}\n\nfunction getInjectedIcon(this: BetterChatTool) {\n return (_cached.injected ??= (() => {\n const tooltip = this.localize(\"mergeDamage.injected\");\n return ` `;\n })());\n}\n\nfunction isMessageOwner(message: ChatMessagePF2e) {\n return game.user.isGM || message.isAuthor;\n}\n\ntype EventAction = \"merge-damage\" | \"split-damage\" | \"inject-damage\";\n\ntype ButtonType = \"merge\" | \"inject\" | \"split\";\n\nexport { renderChatMessageMergeDamage };\n", "import {\n ChatMessagePF2e,\n createToggleHook,\n DamageDamageContextFlag,\n DamageRoll,\n refreshLatestMessages,\n Rolled,\n RollJSON,\n SYSTEM,\n toggleHooksAndWrappers,\n TokenDocumentUUID,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { targetHelperTool } from \"tools\";\nimport { injectDamage, mergeDamages, MergeOptions, renderChatMessageMergeDamage } from \".\";\nimport { htmlQuery } from \"foundry-helpers/src\";\n\nconst AVERAGE_SETTING_TYPES = [\"disabled\", \"standalone\", \"background\"] as const;\n\nclass BetterChatTool extends ModuleTool {\n #mergeDamageHooks = [\n createToggleHook(\"renderChatMessageHTML\", renderChatMessageMergeDamage.bind(this)),\n createToggleHook(\"diceSoNiceMessageProcessed\", this.#onDiceSoNiceMessageProcessed.bind(this)),\n ];\n\n #averageHook = createToggleHook(\"renderChatMessageHTML\", this.#renderChatMessageAverageDamage.bind(this));\n\n get key(): \"betterChat\" {\n return \"betterChat\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"merge\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: () => {\n this.configurate();\n },\n },\n {\n key: \"inject\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: () => {\n this.configurate();\n },\n },\n {\n key: \"average\",\n type: String,\n default: \"disabled\",\n scope: \"user\",\n choices: AVERAGE_SETTING_TYPES,\n onChange: () => {\n this.configurate();\n },\n },\n ];\n }\n\n get api(): toolbelt.Api[\"betterChat\"] {\n return {\n injectDamageMessage: async (\n originMessage: ChatMessagePF2e,\n targetMessage: ChatMessagePF2e,\n options: Omit = {},\n ): Promise<{ rolls: RollJSON[] } | undefined> => {\n if (!originMessage.isDamageRoll || !targetMessage.isDamageRoll) return;\n return injectDamage.call(this, targetMessage, originMessage, options);\n },\n mergeDamageMessages: async (\n originMessage: ChatMessagePF2e,\n targetMessage: ChatMessagePF2e,\n options: MergeOptions = {},\n ): Promise => {\n if (!originMessage.isDamageRoll || !targetMessage.isDamageRoll) return;\n return mergeDamages.call(this, targetMessage, originMessage, options);\n },\n };\n }\n\n init(): void {\n this.configurate();\n }\n\n _configurate(): void {\n this.#averageHook.toggle(this.settings.average !== \"disabled\");\n toggleHooksAndWrappers(this.#mergeDamageHooks, this.settings.merge || this.settings.inject);\n refreshLatestMessages(20);\n }\n\n getMessageTargets(message: ChatMessagePF2e): TokenDocumentUUID[] {\n const targets = targetHelperTool.getMessageTargets(message);\n\n if (targets) {\n return targets.map((target) => target.uuid);\n }\n\n const target = (message.flags[SYSTEM.id].context as DamageDamageContextFlag | undefined)?.target?.token;\n return target ? [target] : [];\n }\n\n #renderChatMessageAverageDamage(message: ChatMessagePF2e, html: HTMLElement) {\n if (!message.isDamageRoll) return;\n\n const roll = message.rolls.find((roll): roll is Rolled => !roll.options.splashOnly);\n if (!roll || (!roll.options.showBreakdown && !game.user.isGM)) return;\n\n const minValue = roll.minimumValue;\n const maxValue = roll.maximumValue;\n if (minValue === maxValue) return;\n\n const total = roll.total;\n const ratio = (total - minValue) / (maxValue - minValue);\n const hue = (1 - ratio) * 120;\n\n if (this.settings.average === \"background\") {\n const formulaElement = htmlQuery(html, \".message-content .dice-result .dice-formula\");\n\n formulaElement?.classList.add(\"show-average\");\n formulaElement?.style.setProperty(\"--average-ratio\", `${ratio}`);\n formulaElement?.style.setProperty(\"--average-hue\", `${hue}`);\n\n return;\n }\n\n const diceRollElement = htmlQuery(html, \".dice-roll.damage-roll\");\n\n const template = `
\n ${minValue}\n ${maxValue}\n
`;\n\n diceRollElement?.insertAdjacentHTML(\"beforebegin\", template);\n }\n\n #onDiceSoNiceMessageProcessed(messageId: string, interception: { willTrigger3DRoll: boolean }) {\n const message = game.messages.get(messageId);\n if (!message) return;\n\n const flag = this.getFlag<{ merged?: boolean; splitted?: boolean }>(message, \"mergeDamage\") ?? {};\n\n if (flag.merged || flag.splitted) {\n interception.willTrigger3DRoll = false;\n }\n }\n}\n\ntype ToolSettings = {\n average: (typeof AVERAGE_SETTING_TYPES)[number];\n inject: boolean;\n merge: boolean;\n};\n\nexport { BetterChatTool };\n", "import { AbstractEffectPF2e, addListener, createToggleHook, EffectsPanel, EffectsPanelViewData } from \"foundry-helpers\";\r\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\r\n\r\nclass BetterEffectsPanelTool extends ModuleTool {\r\n #renderEffectsPanelHook = createToggleHook(\"renderEffectsPanel\", this.#onRenderEffectsPanel.bind(this));\r\n\r\n get key(): \"betterEffectsPanel\" {\r\n return \"betterEffectsPanel\";\r\n }\r\n\r\n get settingsSchema(): ToolSettingsList {\r\n return [\r\n {\r\n key: \"remove\",\r\n type: Boolean,\r\n default: false,\r\n scope: \"user\",\r\n onChange: (value) => {\r\n this.#renderEffectsPanelHook.toggle(value);\r\n },\r\n },\r\n ];\r\n }\r\n\r\n init(): void {\r\n this.#renderEffectsPanelHook.toggle(this.settings.remove);\r\n }\r\n\r\n #onRenderEffectsPanel(_panel: EffectsPanel, html: HTMLElement, data: EffectsPanelViewData) {\r\n const actor = data.actor;\r\n if (!actor) return;\r\n\r\n const effects = [...data.afflictions, ...data.conditions, ...data.effects].map((effect) => effect.effect);\r\n\r\n for (const effect of effects) {\r\n if (effect.isLocked || !effect.badge || effect.badge.type !== \"counter\") continue;\r\n\r\n addListener(\r\n html,\r\n `.effect-item[data-item-id=\"${effect.id}\"] .icon`,\r\n \"contextmenu\",\r\n (_el, event) => this.#onRemoveEffect(event, effect),\r\n true,\r\n );\r\n }\r\n }\r\n\r\n #onRemoveEffect(event: MouseEvent, effect: AbstractEffectPF2e) {\r\n if (!event.shiftKey) return;\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n event.stopImmediatePropagation();\r\n\r\n effect.delete();\r\n }\r\n}\r\n\r\ntype ToolSettings = {\r\n remove: boolean;\r\n};\r\n\r\nexport { BetterEffectsPanelTool };\r\n", "import {\n ActorPF2e,\n ActorSheetPF2e,\n Bulk,\n ConsumablePF2e,\n createButtonElement,\n createHTMLElement,\n createToggleHook,\n createToggleWrapper,\n EquipmentPF2e,\n getItemSourceId,\n htmlClosest,\n htmlQuery,\n InventoryBulk,\n ItemPF2e,\n MODULE,\n R,\n renderActorSheets,\n TreasurePF2e,\n waitDialog,\n waitTimeout,\n WeaponSheetPF2e,\n WeaponSource,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\n\nclass BetterInventoryTool extends ModuleTool {\n #actorPrepareEmbeddedDocumentsWrapper = createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.Actor.documentClass.prototype.prepareEmbeddedDocuments\",\n this.#actorPrepareEmbeddedDocuments,\n { context: this },\n );\n\n #treasurePreparedBaseDataWrapper = createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.PF2E.Item.documentClasses.treasure.prototype.prepareBaseData\",\n this.#treasurePreparedBaseData,\n { context: this },\n );\n\n #renderSheetSettingUpdate = foundry.utils.debounce(() => {\n this.#renderActorSheetHook.toggle(this.renderActorSheetEnabled);\n renderActorSheets();\n }, 1);\n\n #renderActorSheetHook = createToggleHook(\"renderActorSheet\", this.#onRenderActorSheet.bind(this));\n\n get key(): \"betterInventory\" {\n return \"betterInventory\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"coins\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"dropped\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"improvised\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: () => {\n this.#renderSheetSettingUpdate();\n },\n },\n {\n key: \"mergeItems\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: () => {\n this.#renderSheetSettingUpdate();\n },\n },\n {\n key: \"splitItem\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: () => {\n this.#renderSheetSettingUpdate();\n },\n },\n ];\n }\n\n get api(): Record {\n return {\n mergeItems: this.#mergeItems.bind(this),\n splitItem: this.#splitItem.bind(this),\n };\n }\n\n get renderActorSheetEnabled(): boolean {\n return this.settings.splitItem || this.settings.mergeItems || this.settings.improvised;\n }\n\n init(): void {\n this.#actorPrepareEmbeddedDocumentsWrapper.toggle(this.settings.dropped);\n this.#treasurePreparedBaseDataWrapper.toggle(this.settings.coins);\n }\n\n ready(): void {\n this.#renderActorSheetHook.toggle(this.renderActorSheetEnabled);\n }\n\n #actorPrepareEmbeddedDocuments(actor: ActorPF2e, wrapped: libWrapper.RegisterCallback) {\n wrapped();\n\n try {\n const InventoryBulkClass = actor.inventory.bulk.constructor as typeof InventoryBulk;\n\n // we cache the computed value\n let _value: Bulk | undefined;\n\n // our only/best solution is to re-define the ActorInventory#bulk#value getter\n Object.defineProperty(actor.inventory.bulk, \"value\", {\n get(this: InventoryBulk): Bulk {\n if (_value) {\n return _value;\n }\n\n _value = InventoryBulkClass.computeTotalBulk(\n this.actor.inventory.filter((item) => {\n return !item.isInContainer && item.system.equipped.carryType !== \"dropped\";\n }),\n this.actor,\n );\n\n return _value;\n },\n });\n } catch (error) {\n MODULE.error(\"An error occured while trying to make dropped items weighless.\");\n }\n }\n\n #treasurePreparedBaseData(treasure: TreasurePF2e, wrapped: libWrapper.RegisterCallback) {\n wrapped();\n\n if (treasure.isCoinage) {\n treasure.system.bulk.value = 0;\n }\n }\n\n #onRenderActorSheet(sheet: ActorSheetPF2e, $html: JQuery) {\n const actor = sheet.actor;\n if (!actor.isOwner) return;\n\n const html = $html[0];\n const inventory = htmlQuery(html, `.tab.inventory`);\n if (!inventory) return;\n\n if (this.settings.mergeItems) {\n const btn = createButtonElement({\n dataset: { tooltip: this.localize.path(\"sheet.merge\") },\n icon: \"fa-solid fa-merge\",\n });\n const li = createHTMLElement(\"li\", { content: btn });\n\n btn.addEventListener(\"click\", () => this.#mergeItems(actor, btn));\n\n htmlQuery(inventory, \".currency\")?.append(li);\n }\n\n if (this.settings.splitItem) {\n const elements = inventory.querySelectorAll(\".items [data-item-id] .quantity span\");\n\n for (const el of elements) {\n const quantity = Number(el.innerText);\n if (isNaN(quantity) || quantity <= 1) continue;\n\n const btn = createHTMLElement(\"a\", {\n content: el.innerText,\n dataset: { tooltip: this.localize.path(\"sheet.split\") },\n });\n\n btn.addEventListener(\"click\", () => {\n const itemId = htmlClosest(el, \"[data-item-id]\")?.dataset.itemId ?? \"\";\n const item = actor.items.get(itemId);\n this.#splitItem(item);\n });\n\n el.replaceChildren(btn);\n }\n }\n\n if (actor.isOfType(\"character\") && this.settings.improvised) {\n const btn = createHTMLElement(\"a\", {\n content: ``,\n dataset: { tooltip: this.localize.path(\"sheet.improvised\") },\n style: { marginRight: \"0.1em\" },\n });\n\n btn.addEventListener(\"click\", () => this.#createImprovisedWeapon(actor));\n\n htmlQuery(inventory, \".inventory-list header .item-controls\")?.prepend(btn);\n }\n }\n\n async #createImprovisedWeapon(actor: ActorPF2e) {\n const source: PreCreate = {\n name: this.localize(\"improvised.label\"),\n system: {\n category: \"simple\",\n damage: {\n die: \"d4\",\n damageType: \"bludgeoning\",\n },\n traits: {\n otherTags: [\"improvised\"],\n value: [\"thrown-10\"],\n rarity: \"common\",\n },\n usage: {\n value: \"held-in-one-plus-hands\",\n },\n },\n type: \"weapon\",\n };\n\n const [item] = await actor.createEmbeddedDocuments(\"Item\", [source]);\n\n if (item) {\n Hooks.once(\"renderWeaponSheetPF2e\", (sheet: WeaponSheetPF2e) => {\n sheet.activateTab(\"details\");\n });\n\n item.sheet.render(true);\n }\n }\n\n async #mergeItems(actor: ActorPF2e, btn?: HTMLButtonElement | HTMLAnchorElement): Promise {\n btn?.setAttribute(\"disabled\", \"true\");\n await waitTimeout();\n\n const identicalItems = R.pipe(\n actor.inventory.filter((item): item is Mergeable => {\n return (\n item.isOfType(\"ammo\", \"equipment\", \"consumable\", \"treasure\") &&\n item.isIdentified &&\n !!getItemSourceId(item)\n );\n }),\n R.groupBy((item) => getItemSourceId(item)),\n R.values(),\n R.filter((items) => items.length > 1),\n R.flatMap((items): NonEmptyArray[] => getIdenticalItems(items)),\n R.filter((items): items is NonEmptyArray => items.length > 1),\n );\n\n if (!identicalItems.length) {\n btn?.removeAttribute(\"disabled\");\n this.localize.warning(\"merge.none\");\n return;\n }\n\n const content = R.pipe(\n identicalItems,\n R.map((items) => {\n const source = items[0];\n return ``;\n }),\n );\n\n const result = await waitDialog>({\n classes: [\"toolbelt-merge-items\"],\n content: content.join(\"\"),\n i18n: this.path(\"merge\"),\n title: this.localize(\"merge.title\", actor),\n yes: {\n icon: \"fa-solid fa-merge\",\n },\n });\n\n btn?.removeAttribute(\"disabled\");\n if (!result) return;\n\n const selected = R.keys(R.pickBy(result, R.isTruthy));\n if (!selected.length) return;\n\n const deletes: string[] = [];\n const updates = R.pipe(\n identicalItems,\n R.filter((items) => selected.includes(items[0].id)),\n R.map((items) => {\n const biggest = items[0];\n\n const update: {\n _id: string;\n \"system.quantity\": number;\n \"system.uses.value\"?: number;\n } = {\n _id: biggest.id,\n \"system.quantity\": 0,\n };\n\n if (biggest.isOfType(\"consumable\")) {\n const max = biggest.uses.max;\n const uses = R.sumBy(\n items as ConsumablePF2e[],\n (item) => (item.quantity - 1) * max + item.uses.value,\n );\n const remains = uses % max;\n\n update[\"system.quantity\"] = Math.ceil(uses / max);\n update[\"system.uses.value\"] = remains || max;\n } else {\n update[\"system.quantity\"] = R.sumBy(items, (item) => item.quantity);\n }\n\n deletes.push(...items.slice(1).map((item) => item.id));\n\n return update;\n }),\n );\n\n await actor.deleteEmbeddedDocuments(\"Item\", deletes);\n await actor.updateEmbeddedDocuments(\"Item\", updates);\n }\n\n async #splitItem(item: Maybe) {\n const actor = item?.actor;\n if (!actor || actor.pack || !item.isOfType(\"physical\") || item.quantity <= 1) return;\n\n const fields = foundry.applications.fields;\n const result = await waitDialog<{ quantity: number }>({\n classes: [\"toolbelt-split-item\"],\n content: fields.createFormGroup({\n label: this.localize(\"split.quantity.label\"),\n input: fields.createNumberInput({\n name: \"quantity\",\n min: 0,\n max: item.quantity,\n step: 1,\n value: Math.floor(item.quantity / 2),\n }),\n }).outerHTML,\n i18n: this.path(\"split\"),\n title: item,\n yes: {\n icon: \"fa-solid fa-split\",\n },\n });\n\n if (!result) return;\n\n const quantity = Math.min(result.quantity, item.quantity);\n if (quantity < 1) return;\n\n await item.update({ \"system.quantity\": item.quantity - quantity });\n\n const source = item.toObject();\n source.system.quantity = quantity;\n\n if (\"uses\" in source.system) {\n source.system.uses.value = source.system.uses.max;\n }\n\n await actor.createEmbeddedDocuments(\"Item\", [source]);\n }\n}\n\nfunction getIdenticalItems(items: NonEmptyArray): NonEmptyArray[] {\n const sorted = R.sortBy(items, [R.prop(\"quantity\"), \"asc\"]);\n const [biggest] = sorted.splice(0, 1);\n const source = biggest.toObject();\n\n const [identical, others] = R.partition(sorted, (item) => {\n const diff = foundry.utils.diffObject(source, item.toObject()) as DeepPartial;\n\n delete diff.sort;\n delete diff.ownership;\n delete diff._id;\n delete diff._stats;\n delete diff.system?.equipped;\n delete diff.system?.identification;\n delete diff.system?.quantity;\n\n if (diff.system && \"uses\" in diff.system) {\n delete diff.system.uses?.value;\n\n if (foundry.utils.isEmpty(diff.system.uses)) {\n delete diff.system.uses;\n }\n }\n\n // due to a mistake in the system some items may end up with this dead property after a player trade\n if (diff.system && \"container\" in diff.system) {\n delete diff.system.container;\n }\n\n if (foundry.utils.isEmpty(diff.system)) {\n delete diff.system;\n }\n\n return foundry.utils.isEmpty(diff);\n });\n\n if (others.length > 1) {\n return [[biggest, ...identical], ...getIdenticalItems(others as NonEmptyArray)];\n } else {\n return [[biggest, ...identical]];\n }\n}\n\ntype ToolSettings = {\n improvised: boolean;\n coins: boolean;\n dropped: boolean;\n mergeItems: boolean;\n splitItem: boolean;\n};\n\ntype Mergeable = EquipmentPF2e | ConsumablePF2e | TreasurePF2e;\n\nexport { BetterInventoryTool };\n", "import { z, zDocumentId, zEquipmentFilter } from \"foundry-helpers\";\r\n\r\nfunction zDefaultFilter(defaultRatio: number = 1) {\r\n return z.object({\r\n enabled: z.boolean().default(true),\r\n ratio: z.number().min(0).max(10).multipleOf(0.01).default(defaultRatio),\r\n });\r\n}\r\n\r\nfunction zBaseFilter(defaultRatio: number = 1) {\r\n return zDefaultFilter(defaultRatio).extend({\r\n id: zDocumentId(),\r\n name: z.string().trim().default(\"\"),\r\n });\r\n}\r\n\r\nconst zServiceDefaultFilter = zDefaultFilter();\r\n\r\nconst zServiceFilter = zBaseFilter().extend({\r\n level: z.number().min(0).multipleOf(1).default(0),\r\n tag: z.string().trim().default(\"\"),\r\n});\r\n\r\nconst zBuyDefaultFilter = zDefaultFilter(0.5);\r\nconst zSellDefaultFilter = zDefaultFilter();\r\n\r\nconst zItemFilter = zBaseFilter().extend({\r\n filter: zEquipmentFilter().prefault({}),\r\n});\r\n\r\ntype DefaultFilterSource = z.input>;\r\ntype DefaultFilterData = z.output>;\r\n\r\ntype BaseFilterSource = z.input>;\r\ntype BaseFilterData = z.output>;\r\n\r\ntype ServiceFilterSource = z.input;\r\ntype ServiceFilterData = z.output;\r\n\r\ntype ItemFilterSource = z.input;\r\ntype ItemFilterData = z.output;\r\n\r\nexport { zBuyDefaultFilter, zDefaultFilter, zItemFilter, zSellDefaultFilter, zServiceDefaultFilter, zServiceFilter };\r\nexport type {\r\n BaseFilterData,\r\n BaseFilterSource,\r\n DefaultFilterData,\r\n DefaultFilterSource,\r\n ItemFilterData,\r\n ItemFilterSource,\r\n ServiceFilterData,\r\n ServiceFilterSource,\r\n};\r\n", "import { Coins, z, zDocumentId, zDocumentUUID, zFilePath } from \"foundry-helpers\";\n\nconst COINS = [\"pp\", \"gp\", \"sp\", \"cp\", \"credits\", \"upb\"] as const;\n\nconst DEFAULT_SERVICE_ICON = \"icons/commodities/currency/coins-plain-stack-gold.webp\";\n\nconst zRawCoins = z.partialRecord(z.enum(COINS), z.number().min(0).multipleOf(1).default(0)).catch({});\n\nconst zCoins = z.codec(\n zRawCoins,\n z.custom((value) => {\n return value instanceof game.pf2e.Coins;\n }),\n {\n decode: (raw) => {\n return new game.pf2e.Coins(raw);\n },\n encode: (coins) => {\n return coins.toObject() as any;\n },\n },\n);\n\nconst zService = z.object({\n description: z.string().trim().default(\"\"),\n enabled: z.boolean().default(true),\n id: zDocumentId(),\n img: zFilePath([\"IMAGE\"]).nullish().default(DEFAULT_SERVICE_ICON),\n level: z.number().min(0).multipleOf(1).default(0),\n macroUUID: zDocumentUUID(\"Macro\").nullish().default(null),\n name: z.string().trim().default(\"\"),\n price: zCoins.prefault({}),\n quantity: z.number().min(-1).multipleOf(1).default(-1),\n tags: z.array(z.string().nonempty()).default([]),\n});\n\nfunction exportService(service: ServiceData): Omit {\n const data = zService.encode(service);\n\n delete data.id;\n delete data.enabled;\n\n return data;\n}\n\ntype ServiceSource = z.input;\ntype ServiceData = z.output;\n\nexport { exportService, zService, DEFAULT_SERVICE_ICON };\nexport type { ServiceData, ServiceSource };\n", "import { Coins, z, ZodDocument } from \"foundry-helpers\";\r\nimport { DefaultFilterData } from \"..\";\r\n\r\nabstract class BaseFilter extends ZodDocument {\r\n abstract calculatePrice(...args: any[]): CalulatedFilterPrice;\r\n abstract getRatio(...args: any[]): number;\r\n abstract testFilter(...args: any[]): boolean;\r\n}\r\n\r\nabstract class DefaultFilter extends BaseFilter {\r\n get id(): string {\r\n return \"default\";\r\n }\r\n\r\n get name(): string {\r\n return game.i18n.localize(\"Default\");\r\n }\r\n\r\n testFilter() {\r\n return this.enabled;\r\n }\r\n\r\n getRatio(...args: any[]): number {\r\n return this.ratio;\r\n }\r\n\r\n abstract calculatePrice(...args: any[]): CalulatedFilterPrice;\r\n}\r\n\r\ninterface DefaultFilter extends DefaultFilterData {}\r\n\r\ntype CalulatedFilterPrice = {\r\n ratio: number;\r\n original: Coins;\r\n value: Coins;\r\n};\r\n\r\nexport { BaseFilter, DefaultFilter };\r\nexport type { CalulatedFilterPrice };\r\n", "import { ActorPF2e, filterTraits, PhysicalItemPF2e, R, SYSTEM } from \"foundry-helpers\";\nimport { BaseFilter, CalulatedFilterPrice, DefaultFilter } from \".\";\nimport { ItemFilterData, zBuyDefaultFilter, zItemFilter, zSellDefaultFilter } from \"..\";\n\nclass BuyDefaultFilter extends DefaultFilter {\n static schema = zBuyDefaultFilter;\n\n getRatio(item: PhysicalItemPF2e): number {\n const ratio = this.ratio;\n return item.isOfType(\"treasure\") ? Math.max(ratio, 1) : ratio;\n }\n\n calculatePrice(item: PhysicalItemPF2e, qty?: number): CalulatedFilterPrice {\n const ratio = this.getRatio(item);\n return calculateItemPrice(this, item, qty, ratio);\n }\n}\n\nclass SellDefaultFilter extends DefaultFilter {\n static schema = zSellDefaultFilter;\n\n calculatePrice(item: PhysicalItemPF2e, qty?: number): CalulatedFilterPrice {\n return calculateItemPrice(this, item, qty);\n }\n}\n\nclass ItemFilter extends BaseFilter {\n static #wordSegmenter?: Intl.Segmenter | { segment(term: string): { segment: string }[] };\n\n static schema = zItemFilter;\n\n /**\n * loose reimplementation of\n * https://github.com/foundryvtt/pf2e/blob/dfb9e2b53fc36a3525dec1706d24ec2bbafa6322/src/module/apps/compendium-browser/tabs/base.svelte.ts#L77\n */\n filterItemByText(item: PhysicalItemPF2e): boolean {\n const textFilter = this.filter.search?.text;\n if (!R.isString(textFilter)) return true;\n\n const itemName = item.name.toLocaleLowerCase(game.i18n.lang);\n const wordSegmenter = (ItemFilter.#wordSegmenter ??=\n \"Segmenter\" in Intl\n ? new Intl.Segmenter(game.i18n.lang, { granularity: \"word\" })\n : {\n segment(term: string): { segment: string }[] {\n return [{ segment: term }];\n },\n });\n const segments = Array.from(wordSegmenter.segment(textFilter))\n .map((t) => t.segment.toLocaleLowerCase(game.i18n.lang).replace(/['\"]/g, \"\"))\n .filter((t) => t.length > 1);\n\n return segments.some((segment) => itemName.includes(segment));\n }\n\n testItem(item: PhysicalItemPF2e): boolean {\n if (!this.filterItemByText(item)) return false;\n\n const tab = game.pf2e.compendiumBrowser.tabs.equipment;\n const { checkboxes, source, traits, ranges, level } = this.filter;\n\n // Level\n const itemLevel = item.level;\n if (R.isPlainObject(level) && (itemLevel < (level.from ?? 0) || itemLevel > (level.to ?? 30))) return false;\n\n // Price\n const filterPrice = ranges?.price?.values;\n const itemPrice = item.price.value.copperValue;\n if (\n R.isPlainObject(filterPrice) &&\n (itemPrice < (filterPrice.min ?? 0) || itemPrice > (filterPrice.max ?? Infinity))\n )\n return false;\n\n // Item type\n const filterItemTypes = checkboxes?.itemTypes?.selected;\n if (R.isArray(filterItemTypes) && filterItemTypes.length && !filterItemTypes.includes(item.type)) return false;\n\n const itemCategory = \"category\" in item ? (item.category as string) : \"\";\n const itemGroup = \"group\" in item ? (item.group as string) : \"\";\n\n // Armor\n const filterArmorTypes = checkboxes?.armorTypes?.selected;\n if (\n R.isArray(filterArmorTypes) &&\n filterArmorTypes.length &&\n !tab[\"arrayIncludes\"](filterArmorTypes, [itemCategory, itemGroup])\n )\n return false;\n\n // Weapon categories\n const filterWeaponTypes = checkboxes?.weaponTypes?.selected;\n if (\n R.isArray(filterWeaponTypes) &&\n filterWeaponTypes.length &&\n !tab[\"arrayIncludes\"](filterWeaponTypes, [itemCategory, itemGroup])\n )\n return false;\n\n // Traits\n if (\n R.isPlainObject(traits) &&\n filterTraits([...item.traits], traits.selected ?? [], traits.conjunction ?? \"and\")\n )\n return false;\n\n // Source\n const filterSource = source?.selected;\n const itemSource = SYSTEM.sluggify(item.system.publication?.title ?? \"\").trim();\n if (R.isArray(filterSource) && filterSource.length && !filterSource.includes(itemSource)) return false;\n\n // Rarity\n const filterRarity = checkboxes?.rarity?.selected;\n if (R.isArray(filterRarity) && filterRarity.length && !filterRarity.includes(item.rarity)) return false;\n\n return true;\n }\n\n testFilter(item: PhysicalItemPF2e): boolean {\n return this.enabled && this.testItem(item);\n }\n\n getRatio(): number {\n return this.ratio;\n }\n\n calculatePrice(item: PhysicalItemPF2e, qty?: number): CalulatedFilterPrice {\n return calculateItemPrice(this, item, qty);\n }\n}\n\ninterface ItemFilter extends ItemFilterData {}\n\nfunction calculateItemPrice(\n filter: BuyDefaultFilter | SellDefaultFilter | ItemFilter,\n item: PhysicalItemPF2e,\n qty: number | undefined,\n ratio = filter.getRatio(item),\n): CalulatedFilterPrice {\n let original = game.pf2e.Coins.fromPrice(item.price, qty ?? item.quantity);\n\n if (SYSTEM.isSF2e) {\n original = new game.pf2e.Coins({ credits: Math.ceil(original.copperValue / 10) });\n }\n\n return {\n original,\n ratio,\n value: original.scale(ratio),\n };\n}\n\nexport { BuyDefaultFilter, ItemFilter, SellDefaultFilter };\n", "import { Coins, enrichHTML, isScriptMacro, MacroPF2e } from \"foundry-helpers\";\nimport { BaseFilter, CalulatedFilterPrice, DefaultFilter } from \".\";\nimport {\n MerchantFilters,\n ServiceData,\n ServiceFilterData,\n ServiceSource,\n zServiceDefaultFilter,\n zServiceFilter,\n} from \"..\";\n\nclass ServiceDefaultFilter extends DefaultFilter {\n static schema = zServiceDefaultFilter;\n\n calculatePrice(service: ServiceData): CalulatedFilterPrice {\n return calculateServicePrice(this, service);\n }\n}\n\nclass ServiceFilter extends BaseFilter {\n static schema = zServiceFilter;\n\n testFilter(service: ServiceData): boolean {\n const { enabled, level, tag } = this;\n return enabled && service.level >= level && (!tag || service.tags.includes(tag));\n }\n\n getRatio(): number {\n return this.ratio;\n }\n\n calculatePrice(service: ServiceData): CalulatedFilterPrice {\n return calculateServicePrice(this, service);\n }\n}\n\ninterface ServiceFilter extends ServiceFilterData {}\n\nfunction calculateServicePrice(\n filter: ServiceDefaultFilter | ServiceFilter,\n service: ServiceData,\n): CalulatedFilterPrice {\n const original = service.price;\n const ratio = filter?.getRatio() ?? 1;\n\n return {\n original,\n ratio,\n value: ratio === 1 ? original : original.scale(ratio),\n };\n}\n\nasync function serviceToTemplate(service: ServiceData, filters: MerchantFilters<\"service\">): Promise {\n const filter = filters.find((filter) => filter.testFilter(service));\n const ratio = filter?.ratio ?? 1;\n const enrichedPrice = filter?.calculatePrice(service)?.value ?? service.price;\n\n return {\n ...service,\n enrichedDescription: await enrichHTML(service.description),\n enrichedPrice,\n isFree: enrichedPrice.copperValue === 0,\n isInfinite: service.quantity < 0,\n label: service.name || service.id,\n notForSell: !filter,\n originalPrice: ratio === 1 ? undefined : service.price,\n priceUpdate: ratio > 1 ? \"expensive\" : ratio < 1 ? \"cheap\" : \"\",\n };\n}\n\nasync function getServiceMacro({ macroUUID }: { macroUUID?: string | null }): Promise {\n const macro = macroUUID ? await fromUuid(macroUUID) : null;\n return isScriptMacro(macro) ? macro : null;\n}\n\ntype ServiceTemplate = ServiceSource & {\n enrichedDescription: string;\n enrichedPrice: Coins;\n isFree: boolean;\n isInfinite: boolean;\n label: string;\n notForSell: boolean;\n originalPrice: Coins | undefined;\n priceUpdate: \"expensive\" | \"cheap\" | \"\";\n};\n\nexport { getServiceMacro, ServiceDefaultFilter, ServiceFilter, serviceToTemplate };\n", "import {\n addEnterKeyListeners,\n addListenerAll,\n confirmDialog,\n EquipmentFilters,\n getInputValue,\n htmlClosest,\n LootPF2e,\n openBrowserTab,\n R,\n} from \"foundry-helpers\";\nimport { ModuleToolApplication } from \"module-tool-application\";\nimport {\n BetterMerchantTool,\n DefaultFilterTypes,\n FILTER_TYPES,\n FilterType,\n FilterTypes,\n ItemFilter,\n ServiceFilter,\n} from \"..\";\n\nclass FiltersMenu extends ModuleToolApplication {\n #actor: LootPF2e;\n\n static DEFAULT_OPTIONS: DeepPartial = {\n classes: [\"pf2e-toolbelt-better-merchant-filters\"],\n position: {\n width: 900,\n height: 700,\n },\n tag: \"form\",\n };\n\n constructor(tool: BetterMerchantTool, actor: LootPF2e, options?: DeepPartial) {\n super(tool, options);\n\n this.#actor = actor;\n }\n\n get title(): string {\n return this.localize(\"title\", this.actor);\n }\n\n get actor(): LootPF2e {\n return this.#actor;\n }\n\n get key(): string {\n return \"filtersMenu\";\n }\n\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\n const sections = R.pipe(\n [\"sell\", \"buy\", \"service\"] as const,\n R.map((type): FilterSection => {\n return {\n default: this.getDefaultFilter(type),\n filters: this.getFilters(type),\n type,\n } as FilterSection;\n }),\n );\n\n return {\n sections,\n };\n }\n\n protected _onClickAction(_event: PointerEvent, target: HTMLElement) {\n type EventAction = \"add-filter\" | \"move-filter\" | \"edit-filter\" | \"delete-filter\";\n\n const type = getSectionTypeFromElement(target);\n if (!type) return;\n\n const action = target.dataset.action as EventAction;\n\n if (action === \"add-filter\") {\n return this.#addFilter(type);\n }\n\n const filterId = getFilterIdFromElement(target);\n if (filterId === \"default\") return;\n\n if (action === \"delete-filter\") {\n this.#deleteFilter(type, filterId);\n } else if (action === \"edit-filter\") {\n this.#editFilter(type, filterId);\n } else if (action === \"move-filter\") {\n this.#moveFilter(type, filterId, target);\n }\n }\n\n getDefaultFilter(type: T): DefaultFilterTypes[T] | undefined {\n return this.tool.getDefaultFilter(this.actor, type);\n }\n\n getFilters(type: T): FilterTypes[T][] {\n return this.tool.getFilters(this.actor, type);\n }\n\n setFilters(type: T, filters: FilterTypes[T][]): Promise {\n return this.tool.setFilters(this.actor, type, filters);\n }\n\n protected _activateListeners(html: HTMLElement): void {\n addEnterKeyListeners(html);\n\n addListenerAll(html, \"input\", \"change\", async (target) => {\n const type = getSectionTypeFromElement(target);\n if (!type) return;\n\n const key = target.name;\n const value = getInputValue(target);\n const filterId = getFilterIdFromElement(target);\n\n if (filterId === \"default\") {\n const filter = this.getDefaultFilter(type);\n if (!filter) return;\n\n await this.tool.setFlag(this.actor, \"default\", type, key, value);\n } else {\n const filters = this.getFilters(type);\n const filter = filters.find((x) => x.id === filterId);\n if (!filter) return;\n\n foundry.utils.setProperty(filter, key, value);\n await this.setFilters(type, filters);\n }\n\n this.render();\n });\n }\n\n async #deleteFilter(type: FilterType, filterId: string) {\n const confirm = await confirmDialog(this.path(\"delete\"));\n if (!confirm) return;\n\n const filters = this.getFilters(type);\n\n if (filters.findSplice((filter) => filter.id === filterId)) {\n await this.setFilters(type, filters);\n this.render();\n }\n }\n\n async #moveFilter(type: FilterType, filterId: string, target: HTMLElement) {\n const direction = target.dataset.direction ?? \"\";\n if (![\"up\", \"down\"].includes(direction)) return;\n\n const filters = this.getFilters(type);\n const index = filters.findIndex((filter) => filter.id === filterId);\n if (index < 0) return;\n\n const newIndex = index + (direction === \"up\" ? -1 : 1);\n if (newIndex < 0 || newIndex >= filters.length) return;\n\n const filter = filters[index];\n\n filters[index] = filters[newIndex];\n filters[newIndex] = filter;\n\n await this.setFilters(type, filters);\n this.render();\n }\n\n async #editFilter(type: FilterType, filterId: string) {\n if (type === \"service\") return;\n\n const filters = this.getFilters(type);\n const filter = filters.find((x) => x.id === filterId);\n if (!filter) return;\n\n const label = this.tool.localize(\"browserFilter.edit\");\n const merchantFilter = filter.filter;\n const filterData = foundry.utils.mergeObject(\n await this.tool.browserTab(\"equipment\").getFilterData(),\n merchantFilter,\n );\n\n if (merchantFilter.ranges) {\n for (const range of Object.values(filterData.ranges)) {\n range.isExpanded = true;\n }\n }\n\n if (merchantFilter.level) {\n filterData.level.isExpanded = true;\n }\n\n if (merchantFilter.source) {\n filterData.source.isExpanded = true;\n }\n\n for (const key of Object.keys(merchantFilter.checkboxes ?? {})) {\n const checkbox = filterData.checkboxes[key as keyof typeof filterData.checkboxes];\n if (checkbox) {\n checkbox.isExpanded = true;\n }\n }\n\n const callback = async () => {\n filter.filter = await this.#getEquipmentFilter();\n await this.setFilters(type, filters);\n this.render();\n };\n\n openBrowserTab(\"equipment\", { label, callback }, filterData);\n }\n\n #addFilter(type: FilterType) {\n const addFilter = async (filter: FilterTypes[keyof FilterTypes]) => {\n const filters = this.getFilters(type);\n\n filters.push(filter);\n await this.setFilters(type, filters);\n\n this.render();\n };\n\n if (type === \"service\") {\n const data = ServiceFilter.schema.parse({});\n const filter = new ServiceFilter(data);\n return addFilter(filter);\n }\n\n const label = this.tool.localize(\"browserFilter.create\");\n const callback = async () => {\n const source = await this.#getEquipmentFilter();\n const data = ItemFilter.schema.safeDecode({ filter: source }).data;\n const filter = data ? new ItemFilter(data) : undefined;\n filter && addFilter(filter);\n };\n\n openBrowserTab(\"equipment\", { label, callback });\n }\n\n async #getEquipmentFilter(): Promise> {\n const tab = this.tool.browserTab(\"equipment\");\n const filterData: Partial = foundry.utils.diffObject(\n await tab.getFilterData(),\n tab.filterData,\n );\n\n delete filterData.order;\n return filterData;\n }\n}\n\nfunction getSectionTypeFromElement(target: HTMLElement): FilterType | undefined {\n const type = htmlClosest(target, \"[data-section-type]\")?.dataset.sectionType as FilterType;\n return type in FILTER_TYPES ? type : undefined;\n}\n\nfunction getFilterIdFromElement(target: HTMLElement): \"default\" | (string & {}) {\n return htmlClosest(target, \"[data-filter-id]\")?.dataset.filterId || \"default\";\n}\n\ntype FiltersMenuContext = fa.ApplicationRenderContext & {\n sections: FilterSection[];\n};\n\ntype FilterSection = {\n [k in FilterType]: {\n type: k;\n default: InstanceType<(typeof FILTER_TYPES)[k][\"default\"]> | undefined;\n filters: FilterTypes[k][];\n };\n}[FilterType];\n\nexport { FiltersMenu };\n", "import {\r\n addListenerAll,\r\n Coins,\r\n CompendiumIndexData,\r\n confirmDialog,\r\n htmlQuery,\r\n htmlQueryIn,\r\n ItemPF2e,\r\n ItemSourcePF2e,\r\n ItemUUID,\r\n LootPF2e,\r\n R,\r\n Rarity,\r\n SYSTEM,\r\n} from \"foundry-helpers\";\r\nimport { ModuleToolApplication } from \"module-tool-application\";\r\nimport { BetterMerchantTool } from \"..\";\r\nimport { createConsumableFromSpell, getSpellRankLabel } from \"foundry-helpers/dist\";\r\n\r\nclass BrowserPullMenu extends ModuleToolApplication {\r\n static PULL_LIMIT = 100;\r\n\r\n #actor: LootPF2e;\r\n #owned: string[];\r\n #results: CompendiumBrowserIndexData[];\r\n #selected: MenuSelection[] = [];\r\n\r\n static DEFAULT_OPTIONS: DeepPartial = {\r\n id: \"pf2e-toolbelt-better-merchant-browserPull\",\r\n position: {\r\n width: 700,\r\n },\r\n };\r\n\r\n constructor(\r\n tool: BetterMerchantTool,\r\n actor: LootPF2e,\r\n tab: \"equipment\" | \"spell\",\r\n options: DeepPartial = {},\r\n ) {\r\n super(tool, options);\r\n\r\n this.#actor = actor;\r\n this.#results = tool.browserTab(tab).results;\r\n\r\n this.#owned =\r\n tab === \"equipment\"\r\n ? R.pipe(\r\n actor.inventory.contents,\r\n R.map((item) => item.sourceId),\r\n R.filter(R.isTruthy),\r\n )\r\n : [];\r\n\r\n this.#selectToLimit();\r\n }\r\n\r\n get key(): string {\r\n return \"browserPull\";\r\n }\r\n\r\n get title(): string {\r\n return this.localize(\"title\", this.actor);\r\n }\r\n\r\n get actor(): LootPF2e {\r\n return this.#actor;\r\n }\r\n\r\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\r\n const entries = R.map(this.#results, (data): ItemEntry => {\r\n const ranks: { value: string; label: string }[] = R.isNumber(data.rank)\r\n ? R.range(data.rank, 11).map((rank) => {\r\n return { value: String(rank), label: getSpellRankLabel(rank) };\r\n })\r\n : [];\r\n\r\n return {\r\n img: data.img,\r\n level: data.level,\r\n name: data.name,\r\n owned: R.isIncludedIn(data.uuid, this.#owned),\r\n price: data.price,\r\n ranks,\r\n rarity: data.rarity === \"common\" ? undefined : data.rarity,\r\n uuid: data.uuid,\r\n };\r\n });\r\n\r\n return {\r\n entries,\r\n };\r\n }\r\n\r\n protected async _onFirstRender(_context: object, _options: fa.ApplicationRenderOptions) {\r\n this.#updateCheckboxes();\r\n }\r\n\r\n protected _onClickAction(_event: PointerEvent, target: HTMLElement): void {\r\n type EventAction = \"add-to-merchant\" | \"toggle-all\" | \"open-sheet\";\r\n\r\n const action = target.dataset.action as EventAction;\r\n\r\n if (action === \"add-to-merchant\") {\r\n this.#addToMerchant();\r\n this.close();\r\n } else if (action === \"open-sheet\") {\r\n } else if (action === \"toggle-all\") {\r\n if (this.#selected.length === 0) {\r\n this.#selectToLimit();\r\n } else {\r\n this.#selected.length = 0;\r\n }\r\n\r\n this.#updateCheckboxes();\r\n }\r\n }\r\n\r\n protected _activateListeners(html: HTMLElement): void {\r\n addListenerAll(html, `[name=\"selected-item\"]`, \"change\", (el: HTMLInputElement) => {\r\n const uuid = el.dataset.uuid;\r\n if (!uuid) return;\r\n\r\n if (el.checked) {\r\n const rank = htmlQueryIn(el, \".item\", \"select\")?.value;\r\n this.#selected.push({ uuid, rank: rank ? Number(rank) : undefined });\r\n } else {\r\n this.#selected.findSplice((entry) => entry.uuid === uuid);\r\n }\r\n\r\n this.#updateCheckboxes();\r\n });\r\n\r\n addListenerAll(html, `[name=\"rank\"]`, \"change\", (el: HTMLSelectElement) => {\r\n const uuid = el.dataset.uuid as ItemUUID;\r\n const selected = this.#selected.find((entry) => entry.uuid === uuid);\r\n\r\n if (selected) {\r\n selected.rank = Number(el.value);\r\n }\r\n });\r\n }\r\n\r\n async #addToMerchant() {\r\n const selection = this.#selected.slice();\r\n if (selection.length === 0) return;\r\n\r\n const actor = this.#actor;\r\n const confirm = await confirmDialog(this.path(), {\r\n content: this.localize(\"confirm\", { nb: selection.length }),\r\n title: this.localize(\"title\", actor),\r\n });\r\n if (!confirm) return;\r\n\r\n const groups: MenuSelection[][] = [];\r\n\r\n while (selection.length) {\r\n const entry = selection.splice(0, 10);\r\n groups.push(entry);\r\n }\r\n\r\n const getItemSource = async ({ uuid, rank }: MenuSelection): Promise => {\r\n const item = await fromUuid(uuid);\r\n if (!(item instanceof Item)) return;\r\n\r\n if (item.isOfType(\"physical\")) {\r\n return item.toObject();\r\n }\r\n\r\n if (item.isOfType(\"spell\") && !item.isCantrip && !item.isFocusSpell && !item.isRitual) {\r\n return createConsumableFromSpell(item, {\r\n heightenedLevel: Math.max(rank ?? 0, item.baseRank),\r\n type: SYSTEM.isSF2e ? \"spell-gem\" : \"scroll\",\r\n });\r\n }\r\n };\r\n\r\n for (const entries of groups) {\r\n const sources = R.pipe(await Promise.all(entries.map(getItemSource)), R.filter(R.isTruthy));\r\n\r\n await actor.createEmbeddedDocuments(\"Item\", sources);\r\n }\r\n\r\n this.localize.info(\"finished\");\r\n }\r\n\r\n #updateCheckboxes() {\r\n const itemsUl = htmlQuery(this.element, \"ul\");\r\n const countEl = htmlQuery(this.element, \".header .count\");\r\n if (!itemsUl || !countEl) return;\r\n\r\n const selected = this.#selected.length;\r\n const isAtLimit = selected >= BrowserPullMenu.PULL_LIMIT;\r\n\r\n // count\r\n\r\n countEl.textContent = String(selected);\r\n\r\n // select inputs\r\n\r\n let element: Element;\r\n const iterator = document.createNodeIterator(itemsUl, NodeFilter.SHOW_ELEMENT);\r\n\r\n while ((element = iterator.nextNode() as Element)) {\r\n if (!(element instanceof HTMLInputElement)) continue;\r\n\r\n const uuid = element.dataset.uuid ?? \"\";\r\n const checked = !!this.#selected.find((entry) => entry.uuid === uuid);\r\n\r\n element.checked = checked;\r\n element.disabled = !checked && isAtLimit;\r\n }\r\n }\r\n\r\n #selectToLimit() {\r\n this.#selected.length = 0;\r\n\r\n for (const { uuid } of this.#results) {\r\n if (this.#owned.includes(uuid)) continue;\r\n this.#selected.push({ uuid });\r\n if (this.#selected.length >= BrowserPullMenu.PULL_LIMIT) break;\r\n }\r\n }\r\n}\r\n\r\ntype BrowserPullContext = fa.ApplicationRenderContext & {\r\n entries: ItemEntry[];\r\n};\r\n\r\ntype MenuSelection = { uuid: string; rank?: number };\r\n\r\ntype ItemEntry = {\r\n img: string;\r\n level: number;\r\n name: string;\r\n owned: boolean;\r\n price: Coins;\r\n ranks: { value: string; label: string }[];\r\n rarity: Exclude | undefined;\r\n uuid: ItemUUID;\r\n};\r\n\r\ntype CompendiumBrowserIndexData = Omit;\r\n\r\nexport { BrowserPullMenu };\r\n", "import {\n ActorPF2e,\n Coins,\n CurrencySummary,\n htmlClosest,\n ImageFilePath,\n LootPF2e,\n PhysicalItemType,\n R,\n simulateDropItem,\n} from \"foundry-helpers\";\nimport { COIN_DENOMINATIONS } from \"foundry-helpers/dist\";\nimport { ModuleToolApplication } from \"module-tool-application\";\nimport { BetterMerchantTool } from \"..\";\n\nclass SellItemsMenu extends ModuleToolApplication {\n #merchant: LootPF2e;\n #seller: ActorPF2e;\n\n static DEFAULT_OPTIONS: DeepPartial = {\n id: \"pf2e-toolbelt-better-merchant-sellItems\",\n position: {\n width: 600,\n },\n };\n\n constructor(\n tool: BetterMerchantTool,\n merchant: LootPF2e,\n seller: ActorPF2e,\n options?: DeepPartial,\n ) {\n super(tool, options);\n\n this.#merchant = merchant;\n this.#seller = seller;\n\n seller.apps[this.id] = this;\n }\n\n get key(): string {\n return \"sellItems\";\n }\n\n get title(): string {\n return this.localize(\"title\", this.seller);\n }\n\n get merchant(): LootPF2e {\n return this.#merchant;\n }\n\n get seller(): ActorPF2e {\n return this.#seller;\n }\n\n protected _onClose(_options: fa.ApplicationClosingOptions): void {\n delete this.seller.apps[this.id];\n }\n\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\n const merchant = this.merchant;\n const seller = this.seller;\n const filters = this.tool.getAllFilters(merchant, \"buy\");\n const defaultFilter = this.tool.getDefaultFilter(merchant, \"buy\");\n const defaultRatio = defaultFilter?.enabled ? defaultFilter.ratio : 1;\n\n const groups = R.pipe(\n seller.inventory.contents,\n R.map((item): SellingItem | undefined => {\n if (!item.isIdentified || item.quantity <= 0 || item.system.stackGroup === \"coins\") return;\n\n const filter = filters.find((x) => x.testFilter(item));\n if (!filter) return;\n\n const ratio = filter.getRatio(item);\n const originalPrice = item.price.value;\n const price = ratio === 1 ? originalPrice : originalPrice.scale(ratio);\n const diffRatio = item.isOfType(\"treasure\") ? 1 : 0.5;\n const diff = ratio < diffRatio ? \"cheap\" : ratio > diffRatio ? \"expensive\" : \"\";\n\n return {\n diff,\n id: item.id,\n img: item.img,\n name: item.name,\n originalPrice,\n price,\n quantity: item.quantity,\n type: item.type as PhysicalItemType,\n };\n }),\n R.filter(R.isTruthy),\n R.groupBy((item) => item.type),\n R.entries(),\n R.map(([type, items]) => {\n return {\n items: R.sortBy(items, R.prop(\"name\")),\n label: game.i18n.localize(`TYPES.Item.${type}`),\n };\n }),\n R.sortBy(R.prop(\"label\")),\n );\n\n const info = this.localize(\"info\", {\n item: defaultRatio,\n treasure: Math.max(1, defaultRatio),\n });\n\n return {\n inventory: {\n currency: prepareCurrency(seller),\n info,\n },\n groups,\n };\n }\n\n async _renderHTML(context: SellItemsContext, options: fa.ApplicationRenderOptions): Promise {\n if (foundry.utils.isEmpty(context.groups)) {\n const hint = this.localize(\"empty\", this.merchant);\n return `
${hint}
`;\n }\n\n return super._renderHTML(context, options);\n }\n\n protected _onClickAction(_event: PointerEvent, target: HTMLElement) {\n const action = target.dataset.action as EventAction;\n\n const getItem = () => {\n const itemId = htmlClosest(target, \"[data-item-id]\")?.dataset.itemId;\n return this.seller.items.get(itemId ?? \"\");\n };\n\n if (action === \"open-sheet\") {\n getItem()?.sheet.render(true);\n } else if (action === \"sell-item\") {\n const item = getItem();\n\n if (item?.isOfType(\"physical\") && item.quantity > 0) {\n simulateDropItem(item, this.merchant, true);\n }\n }\n }\n}\n\n/**\n * truncated version of\n * https://github.com/foundryvtt/pf2e/blob/1465f7190b2b8454094c50fa6d06e9902e0a3c41/src/module/actor/sheet/base.ts#L313\n */\nfunction prepareCurrency(actor: ActorPF2e): CurrencySummary[\"units\"] {\n const SYSTEM_ID = game.system.id;\n\n const currency = actor.inventory.currency;\n const coins = new game.pf2e.Coins(R.pick(currency, COIN_DENOMINATIONS)); // just the pf2e values\n\n // Figure out what coins to show for what systems. If both, simplify pf2e values to gold\n const showPF2e = SYSTEM_ID === \"pf2e\" || COIN_DENOMINATIONS.some((d) => currency[d] > 0);\n const showSF2e = SYSTEM_ID === \"sf2e\" || currency.credits || currency.upb;\n const denominations =\n showPF2e && showSF2e\n ? ([\"gp\", \"credits\", \"upb\"] as const)\n : showPF2e\n ? COIN_DENOMINATIONS\n : ([\"credits\", \"upb\"] as const);\n if (showPF2e && showSF2e) {\n currency.gp = coins.goldValue;\n coins.sp = coins.pp = coins.cp = 0;\n }\n\n return denominations.reduce(\n (accumulated, d) => ({\n ...accumulated,\n [d]: { value: currency[d], label: CONFIG.PF2E.currencies[d] },\n }),\n {} as CurrencySummary[\"units\"],\n );\n}\n\ntype EventAction = \"open-sheet\" | \"sell-item\";\n\ntype SellingItem = {\n diff: \"cheap\" | \"expensive\" | \"\";\n id: string;\n img: ImageFilePath;\n name: string;\n originalPrice: Coins;\n price: Coins;\n quantity: number;\n type: PhysicalItemType;\n};\n\ntype ItemsGroup = {\n items: SellingItem[];\n label: string;\n};\n\ntype SellItemsContext = fa.ApplicationRenderContext & {\n inventory: {\n currency: CurrencySummary[\"units\"];\n info: string;\n };\n groups: ItemsGroup[];\n};\n\nexport { SellItemsMenu };\n", "import {\r\n addEnterKeyListeners,\r\n addListener,\r\n enrichHTML,\r\n htmlQuery,\r\n ImageFilePath,\r\n isScriptMacro,\r\n LootPF2e,\r\n MacroPF2e,\r\n MODULE,\r\n} from \"foundry-helpers\";\r\nimport { ModuleToolApplication } from \"module-tool-application\";\r\nimport { BetterMerchantTool, DEFAULT_SERVICE_ICON, exportService, getServiceMacro, ServiceData } from \"..\";\r\n\r\nclass ServiceMenu extends ModuleToolApplication {\r\n #actor: LootPF2e;\r\n #service: ServiceData;\r\n\r\n static DEFAULT_OPTIONS: DeepPartial = {\r\n classes: [\"pf2e-toolbelt-better-merchant-service\"],\r\n form: {\r\n closeOnSubmit: false,\r\n submitOnChange: true,\r\n handler: ServiceMenu.#onFormUpdate,\r\n },\r\n position: {\r\n width: 600,\r\n height: 600,\r\n },\r\n tag: \"form\",\r\n };\r\n\r\n constructor(\r\n actor: LootPF2e,\r\n serviceId: string,\r\n tool: BetterMerchantTool,\r\n options?: DeepPartial,\r\n ) {\r\n super(tool, options);\r\n\r\n this.#actor = actor;\r\n\r\n const service = this.services.find((x) => x.id === serviceId);\r\n if (!service) {\r\n throw MODULE.Error(`Service with id '${serviceId}' cannot be found.`);\r\n }\r\n\r\n this.#service = service;\r\n }\r\n\r\n get key(): string {\r\n return \"serviceMenu\";\r\n }\r\n\r\n get actor(): LootPF2e {\r\n return this.#actor;\r\n }\r\n\r\n get services(): ServiceData[] {\r\n return this.tool.getServices(this.actor);\r\n }\r\n\r\n get service(): ServiceData {\r\n return this.#service;\r\n }\r\n\r\n get title(): string {\r\n return this.localize(\"title\", this.service);\r\n }\r\n\r\n protected _onClose(_options: fa.ApplicationClosingOptions): void {\r\n const service = this.service;\r\n const services = this.services;\r\n\r\n if (!services.findSplice((x) => x.id === service.id, service)) {\r\n services.push(service);\r\n }\r\n\r\n this.tool.setServives(this.actor, services);\r\n }\r\n\r\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\r\n const service = this.service;\r\n\r\n return {\r\n enrichedDescription: await enrichHTML(service.description),\r\n macro: await getServiceMacro(service),\r\n service,\r\n };\r\n }\r\n\r\n get macroInput(): HTMLInputElement | null {\r\n return htmlQuery(this.element, \"input[name='macroUUID']\");\r\n }\r\n\r\n async _renderFrame(options: fa.ApplicationRenderOptions) {\r\n const frame = await super._renderFrame(options);\r\n\r\n const exportLabel = this.localize(\"export\");\r\n const exportBtn = ``;\r\n\r\n this.window.close.insertAdjacentHTML(\"beforebegin\", exportBtn);\r\n\r\n return frame;\r\n }\r\n\r\n async _onClickAction(_event: PointerEvent, target: HTMLElement) {\r\n const action = target.dataset.action as EventAction;\r\n\r\n if (action === \"delete-macro\") {\r\n const macroInput = this.macroInput;\r\n\r\n if (macroInput) {\r\n macroInput.value = \"\";\r\n this.#updateService();\r\n }\r\n } else if (action === \"edit-image\") {\r\n this.#editImage(target as HTMLImageElement);\r\n } else if (action === \"export\") {\r\n const service = this.service;\r\n const data = exportService(service);\r\n\r\n game.clipboard.copyPlainText(JSON.stringify(data));\r\n this.localize.info(\"copied\", service);\r\n } else if (action === \"open-macro-sheet\") {\r\n const macro = await getServiceMacro({ macroUUID: this.macroInput?.value });\r\n macro?.sheet.render(true);\r\n } else if (action === \"open-macros\") {\r\n ui.macros.renderPopout();\r\n }\r\n }\r\n\r\n protected _activateListeners(html: HTMLElement): void {\r\n addEnterKeyListeners(html);\r\n\r\n addListener(html, \".header\", \"drop\", async (_el, event) => {\r\n const macroInput = this.macroInput;\r\n if (!macroInput) return;\r\n\r\n try {\r\n const dataString = event.dataTransfer?.getData(\"text/plain\");\r\n const dropData = JSON.parse(dataString ?? \"\");\r\n\r\n if (typeof dropData !== \"object\" || dropData.type !== \"Macro\") {\r\n throw new Error(\"invalid data type.\");\r\n }\r\n\r\n const macro = await getDocumentClass(\"Macro\").fromDropData(dropData);\r\n const macroUUID = isScriptMacro(macro) ? macro.uuid : undefined;\r\n\r\n if (!macroUUID) {\r\n throw new Error(\"must be a script macro.\");\r\n }\r\n\r\n macroInput.value = macroUUID;\r\n this.#updateService();\r\n } catch (err: any) {\r\n throw MODULE.Error(err);\r\n }\r\n });\r\n }\r\n\r\n #updateService() {\r\n const event = new Event(\"change\");\r\n this.element.dispatchEvent(event);\r\n }\r\n\r\n #editImage(img: HTMLImageElement) {\r\n const filePicker = new foundry.applications.apps.FilePicker.implementation({\r\n current: img.dataset.src,\r\n type: \"image\",\r\n callback: (path) => {\r\n img.src = path;\r\n img.dataset.src = path;\r\n\r\n this.#updateService();\r\n },\r\n });\r\n\r\n filePicker.browse();\r\n }\r\n\r\n static async #onFormUpdate(\r\n this: ServiceMenu,\r\n _event: SubmitEvent | Event,\r\n form: HTMLFormElement,\r\n formData: foundry.applications.ux.FormDataExtended,\r\n ) {\r\n type FormData = Omit & {\r\n macroUUID: string;\r\n price: string;\r\n };\r\n\r\n const dataObj = formData.object as FormData;\r\n const img = htmlQuery(form, \".image\")?.dataset.src;\r\n\r\n const services = this.services;\r\n const service = (this.#service = {\r\n ...dataObj,\r\n img: (img ?? DEFAULT_SERVICE_ICON) as ImageFilePath,\r\n macroUUID: (await getServiceMacro(dataObj))?.uuid ?? null,\r\n price: game.pf2e.Coins.fromString(dataObj.price),\r\n });\r\n\r\n if (!services.findSplice((x) => x.id === service.id)) {\r\n services.push(service);\r\n }\r\n\r\n this.render();\r\n }\r\n}\r\n\r\ntype EventAction = \"edit-image\" | \"export\" | \"open-macro-sheet\" | \"delete-macro\" | \"open-macros\";\r\n\r\ntype ServiceMenuContext = fa.ApplicationRenderContext & {\r\n enrichedDescription: string;\r\n macro: MacroPF2e | null;\r\n service: ServiceData;\r\n};\r\n\r\nexport { ServiceMenu };\r\n", "import {\n ActorPF2e,\n ActorSheetPF2e,\n addListener,\n addListenerAll,\n BrowserTabs,\n CharacterPF2e,\n Coins,\n CompendiumBrowser,\n confirmDialog,\n createEmitable,\n createHTMLElement,\n createToggleWrapper,\n getPreferredName,\n getSelectedActor,\n htmlClosest,\n htmlQuery,\n htmlQueryIn,\n isMerchant,\n isScriptMacro,\n ItemPF2e,\n LootPF2e,\n LootSheetPF2e,\n MODULE,\n NPCPF2e,\n openBrowserTab,\n PhysicalItemPF2e,\n R,\n renderActorSheets,\n simulateDropItem,\n SpellFilters,\n TabName,\n toggleHooksAndWrappers,\n toggleSummary,\n waitDialog,\n} from \"foundry-helpers\";\nimport { LootSheetDataPF2e } from \"foundry-helpers/src\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { createTradeMessage, createTradeQuantityDialog, TradeMessageOptions, TradeQuantityDialogData } from \"tools\";\nimport {\n BrowserPullMenu,\n BuyDefaultFilter,\n DefaultFilterSource,\n FiltersMenu,\n ItemFilter,\n SellDefaultFilter,\n SellItemsMenu,\n ServiceData,\n ServiceDefaultFilter,\n ServiceFilter,\n ServiceMenu,\n ServiceSource,\n serviceToTemplate,\n zService,\n} from \".\";\n\nconst FILTER_TYPES = {\n buy: {\n default: BuyDefaultFilter,\n filter: ItemFilter,\n },\n sell: {\n default: SellDefaultFilter,\n filter: ItemFilter,\n },\n service: {\n default: ServiceDefaultFilter,\n filter: ServiceFilter,\n },\n};\n\nclass BetterMerchantTool extends ModuleTool {\n #useServiceEmitable = createEmitable(this.path(\"service\"), this.#useService.bind(this));\n #tradeItemEmitable = createEmitable(this.path(\"item\"), this.#tradeItem.bind(this));\n\n #wrappers = [\n createToggleWrapper(\n \"MIXED\",\n [\n \"CONFIG.Actor.sheetClasses.character['pf2e.CharacterSheetPF2e'].cls.prototype.moveItemBetweenActors\",\n \"CONFIG.Actor.sheetClasses.loot['pf2e.LootSheetPF2e'].cls.prototype.moveItemBetweenActors\",\n \"CONFIG.Actor.sheetClasses.npc['pf2e.NPCSheetPF2e'].cls.prototype.moveItemBetweenActors\",\n \"CONFIG.Actor.sheetClasses.party['pf2e.PartySheetPF2e'].cls.prototype.moveItemBetweenActors\",\n \"CONFIG.Actor.sheetClasses.vehicle['pf2e.VehicleSheetPF2e'].cls.prototype.moveItemBetweenActors\",\n ],\n this.#actorSheetPF2eMoveItemBetweenActors,\n { context: this },\n ),\n createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.Actor.sheetClasses.loot['pf2e.LootSheetPF2e'].cls.prototype._renderInner\",\n this.#lootSheetPF2eRenderInner,\n { context: this },\n ),\n createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.Actor.sheetClasses.loot['pf2e.LootSheetPF2e'].cls.prototype.activateListeners\",\n this.#lootSheetPF2eActivateListeners,\n { context: this },\n ),\n createToggleWrapper(\n \"MIXED\",\n \"CONFIG.Actor.documentClass.prototype.transferItemToActor\",\n this.#actorTransferItemToActor,\n { context: this },\n ),\n ];\n\n static INFINITY = \"\u221E\";\n static NONE = \"\u2013\";\n\n get key(): \"betterMerchant\" {\n return \"betterMerchant\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: Boolean,\n default: false,\n scope: \"world\",\n onChange: () => {\n this._configurate();\n renderActorSheets(\"LootSheetPF2e\");\n },\n },\n ];\n }\n\n get api(): Record {\n return {\n testItemsForMerchant: this.testItemsForMerchant.bind(this),\n };\n }\n\n get browser(): CompendiumBrowser {\n return game.pf2e.compendiumBrowser;\n }\n\n _configurate(): void {\n const enabled = this.settings.enabled;\n\n this.#useServiceEmitable.toggle(enabled);\n this.#tradeItemEmitable.toggle(enabled);\n toggleHooksAndWrappers(this.#wrappers, enabled);\n }\n\n ready(): void {\n this._configurate();\n }\n\n browserTab(tab: T): BrowserTabs[T] {\n return this.browser.tabs[tab];\n }\n\n getFilters(actor: LootPF2e, type: T): FilterTypes[T][] {\n const sources = this.getFlag(actor, \"filters\", type) ?? [];\n if (!sources.length) return [];\n\n const ModelCls = FILTER_TYPES[type].filter;\n const schema = ModelCls.schema;\n\n return R.pipe(\n sources,\n R.map((source) => {\n const data = schema.safeDecode(source).data;\n return data ? (new ModelCls(data as any) as FilterTypes[T]) : undefined;\n }),\n R.filter(R.isTruthy),\n );\n }\n\n setFilters(actor: LootPF2e, type: T, filters: FilterTypes[T][]): Promise {\n const encoder = FILTER_TYPES[type].filter.schema;\n const encoded = filters.map((filter) => encoder.encode(filter as any));\n return this.setFlag(actor, \"filters\", type, encoded);\n }\n\n getDefaultFilter(actor: LootPF2e, type: T): DefaultFilterTypes[T] {\n const source = this.getFlag(actor, \"default\", type);\n const ModelCls = FILTER_TYPES[type].default;\n const data = ModelCls.schema.safeDecode(source ?? {}).data ?? ModelCls.schema.parse({});\n\n return new ModelCls(data as any) as DefaultFilterTypes[T];\n }\n\n getAllFilters(actor: LootPF2e, type: T): MerchantFilters {\n return [...this.getFilters(actor, type), this.getDefaultFilter(actor, type)] as MerchantFilters;\n }\n\n getServices(actor: LootPF2e): ServiceData[] {\n return R.pipe(\n this.getFlag(actor, \"services\") ?? [],\n R.map((source) => zService.safeDecode(source).data),\n R.filter(R.isTruthy),\n );\n }\n\n setServives(actor: LootPF2e, services: ServiceData[]): Promise {\n const encoded = services.map((service) => zService.encode(service));\n return this.setFlag(actor, \"services\", encoded);\n }\n\n async createService(actor: LootPF2e): Promise {\n const service = zService.parse({});\n const services = this.getServices(actor);\n\n services.push(service);\n await this.setServives(actor, services);\n\n return service;\n }\n\n async deleteService(actor: LootPF2e, serviceId: string): Promise {\n const services = this.getServices(actor);\n const deleted = !!services.findSplice((service) => service.id === serviceId);\n\n await this.setServives(actor, services);\n return deleted;\n }\n\n async pullItemsFromBrowser(actor: LootPF2e, tab: \"equipment\" | \"spell\") {\n const label = this.localize(\"browserPull.add\");\n const callback = async () => {\n new BrowserPullMenu(this, actor, tab).render(true);\n };\n\n const filters =\n tab === \"spell\"\n ? foundry.utils.mergeObject>(\n await this.browserTab(\"spell\").getFilterData(),\n {\n checkboxes: {\n category: {\n selected: [\"spell\"],\n options: { spell: { selected: true } },\n },\n },\n },\n )\n : undefined;\n\n const onRender =\n tab === \"spell\"\n ? (html: HTMLElement) => {\n const invalids = html.querySelectorAll(\n `input[name=\"cantrip\"], input[name=\"focus\"], input[name=\"ritual\"]`,\n );\n\n for (const el of invalids) {\n el.disabled = true;\n }\n }\n : undefined;\n\n return openBrowserTab(tab, { label, callback, onRender }, filters);\n }\n\n testItemsForMerchant(merchant: ActorPF2e, items: ItemPF2e[]): TestItemData[] {\n if (!(merchant instanceof Actor) || !isMerchant(merchant) || !items?.[Symbol.iterator]) return [];\n\n const filters = this.getAllFilters(merchant, \"buy\");\n\n return R.pipe(\n items,\n R.filter((item): item is PhysicalItemPF2e => {\n return (\n item instanceof Item &&\n item.isOfType(\"physical\") &&\n item.isIdentified &&\n isOwnedCustomer(item.actor)\n );\n }),\n R.map((item): TestItemData | undefined => {\n const filter = filters.find((x) => x.testFilter(item));\n if (!filter) return;\n\n const buyPrice = filter.calculatePrice(item).value;\n return { buyPrice, item };\n }),\n R.filter(R.isTruthy),\n );\n }\n\n async #actorSheetPF2eMoveItemBetweenActors(\n _sheet: ActorSheetPF2e,\n wrapped: libWrapper.RegisterCallback,\n event: DragEvent,\n item: PhysicalItemPF2e,\n targetActor: ActorPF2e,\n ) {\n const sourceActor = item.actor;\n if (!sourceActor || !targetActor) {\n return wrapped(event, item, targetActor);\n }\n\n const isPurchase = isMerchant(sourceActor) && isOwnedCustomer(targetActor);\n const isSelling = !isPurchase && isMerchant(targetActor) && isOwnedCustomer(sourceActor);\n\n if (!isPurchase && !isSelling) {\n return wrapped(event, item, targetActor);\n }\n\n const result = await this.#initiateTrade(sourceActor, targetActor, item, isPurchase);\n\n if (result !== null) {\n const containerId = htmlClosest(event.target, \"[data-is-container]\")?.dataset.containerId?.trim();\n\n sourceActor.transferItemToActor(\n targetActor,\n item as PhysicalItemPF2e,\n result.quantity,\n containerId,\n result.newStack,\n isPurchase,\n );\n }\n }\n\n async #initiateTrade(\n sourceActor: ActorPF2e,\n targetActor: ActorPF2e,\n item: PhysicalItemPF2e,\n isPurchase: boolean,\n ): Promise {\n const stackable = !!targetActor.inventory.findStackableItem(item);\n const infinite = isPurchase && this.getFlag(sourceActor, \"infiniteAll\");\n\n if (!infinite && item.quantity <= 1) {\n return {\n quantity: item.quantity,\n newStack: true,\n };\n }\n\n const title = isPurchase\n ? game.i18n.format(\"PF2E.ItemTransferDialog.Title.purchase\", { item: item.name })\n : this.localize(\"item.sell.title\", { item: item.name });\n\n const prompt = isPurchase\n ? game.i18n.format(\"PF2E.ItemTransferDialog.Prompt.purchase\", {\n actor: targetActor.name,\n })\n : this.localize(\"item.sell.prompt\", { actor: sourceActor.name });\n\n const label = isPurchase\n ? game.i18n.localize(\"PF2E.ItemTransferDialog.Button.purchase\")\n : this.localize(\"item.sell.button\");\n\n return createTradeQuantityDialog({\n button: {\n action: isPurchase ? \"buy\" : \"sell\",\n icon: \"fa-solid fa-coins\",\n label,\n },\n item,\n lockStack: !stackable,\n maxQuantity: infinite ? 9999 : item.quantity,\n prompt,\n quantity: infinite ? Math.min(item.quantity, item.system.price.per) : item.quantity,\n targetActor,\n title,\n });\n }\n\n async #actorTransferItemToActor(\n source: ActorPF2e,\n wrapped: libWrapper.RegisterCallback,\n ...args: ActorTransferItemArgs\n ): Promise | null> {\n const [target, item, quantity, containerId, newStack, isPurchase] = args;\n\n const merchantSelling = isMerchant(source) && isOwnedCustomer(target);\n const merchantBuying = !merchantSelling && isMerchant(target) && isOwnedCustomer(source);\n if (!merchantSelling && !merchantBuying) return wrapped(...args);\n\n const error = (reason: string, data?: Record) => {\n if (data) {\n this.localize.warning(\"item\", reason, data);\n } else {\n this.localize.warning(\"item\", reason);\n }\n return null;\n };\n\n if (!item.isIdentified) {\n return error(\"unided\");\n }\n\n const [merchant, customer] = merchantSelling ? [source, target] : [target as LootPF2e, source];\n const infiniteAll = this.getFlag(merchant, \"infiniteAll\");\n const realQty = infiniteAll ? quantity : Math.min(quantity, item.quantity);\n\n if (realQty <= 0) {\n return error(\"noStock\", { actor: source.name, item: item.name });\n }\n\n const filter = merchantSelling\n ? this.getInMemory(item, \"filter\")\n : this.getAllFilters(merchant, \"buy\").find((x) => x.testFilter(item));\n\n if (!filter) {\n return error(merchantSelling ? \"unwilling\" : \"refuse\", { actor: merchant.name, item: item.name });\n }\n\n if (merchantSelling && isPurchase) {\n const price = filter.calculatePrice(item, realQty).value;\n\n if (customer.inventory.coins.copperValue < price.copperValue) {\n ui.notifications.warn(game.i18n.format(\"PF2E.loot.InsufficientFundsMessage\", { buyer: customer.name }));\n return null;\n }\n }\n\n this.#tradeItemEmitable.call({\n containerId,\n filterId: filter.id,\n free: !merchantBuying && !isPurchase,\n infinite: merchantSelling && !!infiniteAll,\n item,\n newStack,\n quantity: realQty,\n target,\n });\n\n return null;\n }\n\n async #tradeItem({ filterId, free, infinite, item, newStack, quantity, target }: TradeItemOptions, userId: string) {\n const error = (reason: string) => {\n this.localize.warning(\"item.error\", { reason });\n };\n\n if (!item?.isOfType(\"physical\") || !item.actor || !target) {\n return error(\"missing\");\n }\n\n const seller = item.actor;\n const buyer = target;\n const realQty = infinite ? quantity : Math.min(quantity, item.quantity);\n\n if (realQty <= 0) {\n return error(\"quantity\");\n }\n\n const merchantSelling = isMerchant(seller);\n const merchant = merchantSelling ? seller : (buyer as LootPF2e);\n const filter = this.getAllFilters(merchant, merchantSelling ? \"sell\" : \"buy\").find((x) => x.id === filterId);\n\n if (!filter) {\n return error(\"filter\");\n }\n\n const isContainer = item.isOfType(\"backpack\");\n const price = filter.calculatePrice(item, realQty).value;\n\n if (merchantSelling && !free) {\n if (!(await buyer.inventory.removeCurrency(price))) {\n return error(\"funds\");\n }\n } else if (!merchantSelling) {\n await seller.inventory.addCurrency(price);\n }\n\n const data: TradeMessageOptions = {\n message: \"PF2E.loot.SellMessage\",\n source: seller,\n subtitle: game.i18n.localize(\"PF2E.loot.SellSubtitle\"),\n target,\n userId,\n } as TradeMessageOptions satisfies Omit;\n\n if (!infinite) {\n const remainingQty = item.quantity - realQty;\n\n if (remainingQty < 1) {\n await item.delete();\n } else {\n await item.update({ \"system.quantity\": remainingQty });\n }\n }\n\n const existingItem = !newStack && !isContainer && target.inventory.findStackableItem(item);\n\n if (existingItem) {\n await existingItem.update({ \"system.quantity\": existingItem.quantity + realQty });\n\n data.quantity = realQty;\n data.item = existingItem;\n } else {\n const itemSource = item.toObject();\n\n itemSource.system.quantity = realQty;\n itemSource.system.equipped.carryType = \"worn\";\n\n const [newItem] = (await target.createEmbeddedDocuments(\"Item\", [itemSource])) as PhysicalItemPF2e[];\n\n if (!newItem) {\n return error(\"added\");\n }\n\n data.item = newItem;\n data.quantity = newItem.quantity;\n }\n\n createTradeMessage(data);\n }\n\n async #lootSheetPF2eRenderInner(\n sheet: LootSheetPF2e,\n wrapped: libWrapper.RegisterCallback,\n data: LootSheetDataPF2e,\n ): Promise {\n const $html = (await wrapped(data)) as JQuery;\n const actor = sheet.actor;\n if (!actor.isMerchant) return $html;\n\n const html = $html[0];\n const isGM = game.user.isGM;\n const inventoryList = htmlQuery(html, \".sheet-body .inventory-list\");\n const services = isGM\n ? this.getServices(actor)\n : this.getServices(actor).filter((service) => service.enabled && service.quantity !== 0);\n\n html.classList.add(\"better-merchant\");\n inventoryList?.classList.toggle(\"is-player\", !isGM);\n\n if (isGM || services.length) {\n const filters = this.getAllFilters(actor, \"service\");\n const content = await this.render(\"sheetServices\", {\n infinity: {\n label: BetterMerchantTool.INFINITY,\n tooltip: this.localize(\"sheet.infiniteAll.label\"),\n },\n isGM,\n none: {\n label: BetterMerchantTool.NONE,\n tooltip: this.localize(\"sheet.none\"),\n },\n services: await Promise.all(services.map((service) => serviceToTemplate(service, filters))),\n });\n\n const servicesElement = createHTMLElement(\"div\", { content });\n inventoryList?.prepend(...servicesElement.children);\n }\n\n const itemFilters = this.getAllFilters(actor, \"sell\");\n const infiniteAll = this.getFlag(actor, \"infiniteAll\");\n const items = inventoryList?.querySelectorAll(\".items > [data-item-id]\");\n const infiniteAllLabel = this.localize(\"sheet.infiniteAll.label\");\n const notForSellLabel = this.localize(\"sheet.none\");\n\n for (const el of items ?? []) {\n const itemId = el.dataset.itemId as string;\n const item = actor.items.get>(itemId);\n if (!item) continue;\n\n const filter = itemFilters.find((filter) => filter.testFilter(item));\n const ratio = filter?.getRatio(item) ?? 1;\n\n this.setInMemory(item, { filter });\n\n if (ratio !== 1) {\n const priceElement = htmlQuery(el, \".price span\");\n\n if (priceElement) {\n priceElement.dataset.tooltip = priceElement.innerText;\n priceElement.innerText = item.price.value.scale(ratio).toString();\n priceElement.classList.add(ratio < 1 ? \"cheap\" : \"expensive\");\n }\n }\n\n const quantityElement = htmlQuery(el, \".quantity\");\n if (quantityElement) {\n if (!filter) {\n quantityElement.dataset.tooltip = notForSellLabel;\n quantityElement.innerHTML = BetterMerchantTool.NONE;\n } else if (infiniteAll) {\n quantityElement.dataset.tooltip = infiniteAllLabel;\n quantityElement.innerHTML = BetterMerchantTool.INFINITY;\n }\n }\n\n if (item.quantity <= 0) continue;\n\n let controls = htmlQuery(el, \".item-controls\");\n\n if (!controls) {\n controls = createHTMLElement(\"div\", { classes: [\"item-controls\"] });\n htmlQuery(el, \".data\")?.appendChild(controls);\n }\n\n if (!filter && !isGM) continue;\n\n const buyBtn = createHTMLElement(\"a\", {\n content: ``,\n dataset: {\n betterAction: \"buy-item\",\n tooltip: \"PF2E.loot.BuySubtitle\",\n },\n });\n\n controls?.prepend(buyBtn);\n }\n\n const sheetElement = createHTMLElement(\"div\", {\n classes: [\"gm-settings\"],\n content: await this.render(\"sheet\", {\n infiniteAll,\n isGM,\n }),\n });\n\n htmlQuery(html, \".sheet-sidebar .image-container\")?.after(sheetElement);\n\n if (!isGM) return $html;\n\n if (infiniteAll) {\n const bulkElement = htmlQuery(html, \".total-bulk span\");\n const wealthElement = htmlQuery(html, \".coinage .wealth .item-name:last-child span\");\n\n if (bulkElement) {\n bulkElement.innerHTML = game.i18n.format(\"PF2E.Actor.Inventory.TotalBulk\", {\n bulk: BetterMerchantTool.INFINITY,\n });\n }\n\n if (wealthElement) {\n wealthElement.innerHTML = BetterMerchantTool.INFINITY;\n }\n }\n\n return $html;\n }\n\n #lootSheetPF2eActivateListeners(\n sheet: LootSheetPF2e,\n wrapped: libWrapper.RegisterCallback,\n $html: JQuery,\n ) {\n wrapped($html);\n\n const merchant = sheet.actor;\n if (!merchant.isMerchant) return;\n\n const html = $html[0];\n\n addListenerAll(html, \"[data-better-action]:not(.disabled)\", (el) => this.#onBetterAction(merchant, el));\n\n addListener(html, `input[name=\"infiniteAll\"]`, \"change\", (el: HTMLInputElement) => {\n this.setFlag(merchant, \"infiniteAll\", el.checked);\n });\n\n const sellBtn = htmlQuery(html, `[data-better-action=\"sell-items\"]`);\n // we remove the disabled attribute added by foundry because players can't technically edit the sheet\n sellBtn?.removeAttribute(\"disabled\");\n\n sellBtn?.addEventListener(\"click\", () => {\n const seller = getSelectedActor(isCustomer);\n\n if (!seller) {\n return this.localize.warning(\"sheet.sellItems.noSelection\");\n }\n\n new SellItemsMenu(this, merchant, seller).render(true);\n });\n }\n\n async #importServices(actor: LootPF2e) {\n const result = await waitDialog<{ code: string }>({\n content: ``,\n i18n: this.path(\"importServices\"),\n title: this.localize(\"importServices.title\", actor),\n });\n\n if (!result) return;\n\n try {\n const parsed = JSON.parse(result.code);\n const toAdd = R.pipe(\n Array.isArray(parsed) ? parsed : [parsed],\n R.map((source) => zService.safeDecode(source).data),\n R.filter(R.isTruthy),\n );\n\n if (!toAdd.length) return;\n\n const services = this.getServices(actor);\n\n services.push(...toAdd);\n await this.setServives(actor, services);\n } catch (error: any) {\n MODULE.error(this.localize(\"importServices.error\"), error);\n }\n }\n\n #buyService(actor: LootPF2e, serviceId: string) {\n const buyer = getSelectedActor(isServiceCustomer);\n\n if (!buyer) {\n return this.localize.warning(\"service.noBuyer\");\n }\n\n const service = this.getServices(actor).find((x) => x.id === serviceId);\n\n if (!service || service.quantity === 0) {\n return this.localize.warning(\"service.noStock\", { seller: actor.name });\n }\n\n const filters = this.getAllFilters(actor, \"service\");\n const filter = filters.find((filter) => filter.testFilter(service));\n\n if (!filter) {\n return this.localize.warning(\"service.unwilling\", { seller: actor.name });\n }\n\n const price = filter.calculatePrice(service).value;\n\n if (buyer.inventory.coins.copperValue < price.copperValue) {\n return this.localize.warning(\"service.noFunds\", {\n buyer: buyer.name,\n seller: actor.name,\n });\n }\n\n this.#useServiceEmitable.call({\n buyer,\n free: false,\n seller: actor,\n serviceId,\n });\n }\n\n async #buyItem(actor: LootPF2e, item: PhysicalItemPF2e) {\n const target = getSelectedActor();\n\n if (!target?.isOfType(\"character\", \"npc\", \"party\", \"vehicle\")) {\n return this.localize.warning(\"item.buy.noTarget\");\n }\n\n if (item.quantity === 1 && !this.getFlag(actor, \"infiniteAll\")) {\n const result = await confirmDialog(this.path(\"item.buy.confirm\"), {\n data: { buyer: target.name, item: item.name },\n });\n if (!result) return;\n }\n\n simulateDropItem(item, target, true);\n }\n\n async #onBetterAction(actor: LootPF2e, target: HTMLElement) {\n const action = target.dataset.betterAction as EventBetterAction;\n\n switch (action) {\n case \"buy-item\": {\n const itemId = htmlClosest(target, \"[data-item-id]\")?.dataset.itemId ?? \"\";\n const item = actor.items.get>(itemId);\n\n return item && this.#buyItem(actor, item);\n }\n\n case \"buy-service\": {\n const serviceId = getServiceIdFromElement(target);\n return this.#buyService(actor, serviceId);\n }\n\n case \"create-scrolls\": {\n return this.pullItemsFromBrowser(actor, \"spell\");\n }\n\n case \"create-service\": {\n const service = await this.createService(actor);\n return new ServiceMenu(actor, service.id, this).render(true);\n }\n\n case \"decrease-service\": {\n return this.#updateServiceFromElement(actor, target, (service) => {\n service.quantity = Math.max(service.quantity - 1, 0);\n });\n }\n\n case \"delete-service\": {\n const confirm = await confirmDialog(this.path(\"serviceMenu.delete\"));\n if (!confirm) return;\n\n const serviceId = getServiceIdFromElement(target);\n return this.deleteService(actor, serviceId);\n }\n\n case \"edit-service\": {\n const serviceId = getServiceIdFromElement(target);\n return new ServiceMenu(actor, serviceId, this).render(true);\n }\n\n case \"export-services\": {\n const services = this.getServices(actor);\n const data = services.map((service) => zService.encode(service));\n\n game.clipboard.copyPlainText(JSON.stringify(data));\n return this.localize.info(\"sheetServices.copied\", actor);\n }\n\n case \"from-browser\": {\n return this.pullItemsFromBrowser(actor, \"equipment\");\n }\n\n case \"give-service\": {\n if (!game.user.isGM) return;\n\n const buyer = getSelectedActor(isServiceCustomer);\n\n if (!buyer) {\n return this.localize.warning(\"service.noBuyer\");\n }\n\n return this.#useService({\n buyer,\n free: true,\n seller: actor,\n serviceId: getServiceIdFromElement(target),\n });\n }\n\n case \"import-services\": {\n return this.#importServices(actor);\n }\n\n case \"increase-service\": {\n return this.#updateServiceFromElement(actor, target, (service) => {\n service.quantity = service.quantity + 1;\n });\n }\n\n case \"service-to-chat\": {\n const { service } = this.#getServiceDataFromElement(actor, target);\n return service && this.#serviceMessage(actor, service, actor, null);\n }\n\n case \"setup-filters\": {\n return new FiltersMenu(this, actor).render(true);\n }\n\n case \"toggle-service-enabled\": {\n return this.#updateServiceFromElement(actor, target, (service) => {\n service.enabled = !service.enabled;\n });\n }\n\n case \"toggle-service-summary\": {\n const summary = htmlQueryIn(target, \"[data-service-id]\", \".item-summary\");\n return summary && toggleSummary(summary);\n }\n }\n }\n\n #updateServiceFromElement(actor: LootPF2e, target: HTMLElement, updateService: (service: ServiceData) => void) {\n const { service, services } = this.#getServiceDataFromElement(actor, target);\n if (!service) return;\n\n updateService(service);\n return this.setServives(actor, services);\n }\n\n async #useService({ buyer, free, seller, serviceId }: UseServiceOptions, userId?: string) {\n const services = this.getServices(seller);\n const service = services.find((x) => x.id === serviceId);\n\n const error = (reason: string) => {\n this.localize.warning(\"service.error\", { reason, service: serviceId });\n };\n\n if (!buyer || !seller || !service) {\n return error(\"missing\");\n }\n\n const macroServiceData: ServiceMacroData[\"service\"] = {\n seller: seller,\n usedPrice: null,\n serviceRatio: null,\n originalPrice: service.price,\n name: service.name || service.id,\n level: service.level,\n quantity: service.quantity,\n forceFree: free,\n };\n\n if (!free) {\n const quantity = service.quantity;\n\n if (quantity === 0) {\n return error(\"quantity\");\n }\n\n const filters = this.getAllFilters(seller, \"service\");\n const filter = filters.find((filter) => filter.testFilter(service));\n\n if (!filter) {\n return error(\"filter\");\n }\n\n const calculatedPrice = filter.calculatePrice(service);\n\n if (!(await buyer.inventory.removeCoins(calculatedPrice.value))) {\n return error(\"funds\");\n }\n\n if (quantity > 0) {\n service.quantity = quantity - 1;\n await this.setServives(seller, services);\n }\n\n macroServiceData.usedPrice = calculatedPrice.value;\n macroServiceData.serviceRatio = calculatedPrice.ratio;\n macroServiceData.quantity = service.quantity;\n }\n\n const macro = service.macroUUID ? await fromUuid(service.macroUUID) : null;\n if (isScriptMacro(macro)) {\n macro.execute({ actor: buyer, service: macroServiceData } satisfies ServiceMacroData);\n }\n\n this.#serviceMessage(buyer, service, seller, free ? \"give\" : \"buy\", userId);\n }\n\n async #serviceMessage(\n actor: ActorPF2e,\n service: ServiceData,\n seller: LootPF2e,\n trade: \"give\" | \"buy\" | null,\n userId = game.userId,\n ) {\n const token = actor.getActiveTokens(false, true).at(0);\n\n const tradeMsg =\n trade &&\n this.localize(\"service\", trade, {\n buyer: getPreferredName(actor),\n seller: getPreferredName(seller),\n });\n\n const filters = this.getAllFilters(seller, \"service\");\n const ChatMessagePF2e = getDocumentClass(\"ChatMessage\");\n const content = await this.render(\"serviceCard\", {\n actor,\n tokenId: token?.id,\n service: await serviceToTemplate(service, filters),\n tradeMsg,\n });\n\n return ChatMessagePF2e.create({\n author: userId,\n style: CONST.CHAT_MESSAGE_STYLES.OTHER,\n content,\n speaker: ChatMessagePF2e.getSpeaker({\n actor: actor,\n token,\n }),\n });\n }\n\n #getServiceDataFromElement(\n actor: LootPF2e,\n target: HTMLElement,\n ): {\n services: ServiceData[];\n service: ServiceData | undefined;\n } {\n const serviceId = getServiceIdFromElement(target);\n const services = this.getServices(actor);\n const service = services.find((service) => service.id === serviceId);\n\n return { services, service };\n }\n}\n\nfunction getServiceIdFromElement(target: HTMLElement): string {\n return htmlClosest(target, \"[data-service-id]\")?.dataset.serviceId ?? \"\";\n}\n\nfunction isCustomer(actor: Maybe): actor is ActorPF2e {\n return !!actor?.isOfType(\"character\", \"npc\", \"vehicle\", \"party\");\n}\n\nfunction isOwnedCustomer(actor: Maybe): actor is ActorPF2e {\n return isCustomer(actor) && actor.isOwner;\n}\n\nfunction isServiceCustomer(actor: Maybe) {\n return !!actor?.isOfType(\"npc\", \"character\", \"party\");\n}\n\nconst betterMerchantTool = new BetterMerchantTool();\n\ntype EventItemAction = \"buy-item\";\n\ntype EventSheetAction =\n | \"create-scrolls\"\n | \"create-service\"\n | \"export-services\"\n | \"from-browser\"\n | \"import-services\"\n | \"setup-filters\";\n\ntype EventSheetServiceAction =\n | \"buy-service\"\n | \"create-service\"\n | \"decrease-service\"\n | \"delete-service\"\n | \"edit-service\"\n | \"export-services\"\n | \"give-service\"\n | \"import-services\"\n | \"increase-service\"\n | \"service-to-chat\"\n | \"toggle-service-enabled\"\n | \"toggle-service-summary\";\n\ntype EventBetterAction = EventItemAction | EventSheetAction | EventSheetServiceAction;\n\ntype TradeItemOptions = {\n containerId: string | undefined;\n filterId: string;\n free: boolean;\n infinite: boolean;\n item: PhysicalItemPF2e;\n newStack: boolean | undefined;\n quantity: number;\n target: ActorPF2e;\n};\n\ntype BetterMerchantSettings = {\n enabled: boolean;\n};\n\ntype ActorTransferItemArgs = [\n targetActor: ActorPF2e,\n item: PhysicalItemPF2e,\n quantity: number,\n containerId?: string,\n newStack?: boolean,\n isPurchase?: boolean | null,\n];\n\ntype ServiceMacroData = {\n actor: ActorPF2e;\n service: {\n seller: LootPF2e;\n usedPrice: Coins | null;\n serviceRatio: number | null;\n originalPrice: Coins;\n name: string;\n level: number;\n quantity: number;\n forceFree: boolean;\n };\n};\n\ntype UseServiceOptions = {\n buyer: ActorPF2e;\n free: boolean;\n seller: LootPF2e;\n serviceId: string;\n};\n\ntype FilterType = keyof typeof FILTER_TYPES;\n\ntype DefaultFilterTypes = {\n [k in FilterType]: InstanceType<(typeof FILTER_TYPES)[k][\"default\"]>;\n};\n\ntype FilterTypes = {\n [k in FilterType]: InstanceType<(typeof FILTER_TYPES)[k][\"filter\"]>;\n};\n\ntype MerchantFilters = [...FilterTypes[T][], DefaultFilterTypes[T]];\n\ntype TestItemData = toolbelt.betterMerchant.TestItemData;\n\nexport { betterMerchantTool, FILTER_TYPES };\nexport type { BetterMerchantTool, DefaultFilterTypes, FilterType, FilterTypes, MerchantFilters };\n", "import {\r\n createToggleKeybind,\r\n createToggleWrapper,\r\n KeybindingActionConfig,\r\n MODULE,\r\n positionTokenFromCoords,\r\n R,\r\n selectTokens,\r\n TokenPF2e,\r\n} from \"foundry-helpers\";\r\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\r\n\r\nconst TELEPORT_SETTING = [\"disabled\", \"enabled\", \"select\"] as const;\r\n\r\nclass BetterMovementTool extends ModuleTool {\r\n #cancelTeleport: (() => void) | null = null;\r\n\r\n #shouldRecordMovementHistoryWrapper = createToggleWrapper(\r\n \"OVERRIDE\",\r\n \"CONFIG.Token.documentClass.prototype._shouldRecordMovementHistory\",\r\n this.#shouldRecordMovementHistory,\r\n { context: this },\r\n );\r\n\r\n #teleportKeybind = createToggleKeybind({\r\n name: \"teleport\",\r\n restricted: true,\r\n onDown: () => {\r\n this.#activeTeleport(false);\r\n },\r\n onUp: () => {\r\n this.#disableTeleport();\r\n },\r\n });\r\n\r\n #unselectKeybind = createToggleKeybind({\r\n name: \"unselect\",\r\n restricted: true,\r\n onDown: () => {\r\n this.#activeTeleport(true);\r\n },\r\n onUp: () => {\r\n this.#disableTeleport();\r\n },\r\n });\r\n\r\n static SPREADS: SpreadPoint[] = [\r\n [0, 0],\r\n [-1, -1],\r\n [0, -1],\r\n [1, -1],\r\n [1, 0],\r\n [1, 1],\r\n [0, 1],\r\n [-1, 1],\r\n [-1, 0],\r\n [-2, -2],\r\n [-1, -2],\r\n [0, -2],\r\n [1, -2],\r\n [2, -2],\r\n [2, -1],\r\n [2, 0],\r\n [2, 1],\r\n [2, 2],\r\n [1, 2],\r\n [0, 2],\r\n [-1, 2],\r\n [-2, 2],\r\n [-2, 1],\r\n [-2, 0],\r\n [-2, -1],\r\n ];\r\n\r\n static INNER_ORTHOS: SpreadPoint[] = [\r\n [0, -1],\r\n [0, 1],\r\n [-1, 0],\r\n [1, 0],\r\n ];\r\n\r\n static OUTER_ORTHOS: SpreadPoint[] = [\r\n [0, -2],\r\n [0, 2],\r\n [-2, 0],\r\n [2, 0],\r\n ];\r\n\r\n get key(): \"betterMovement\" {\r\n return \"betterMovement\";\r\n }\r\n\r\n get settingsSchema(): ToolSettingsList {\r\n return [\r\n {\r\n key: \"teleport\",\r\n type: String,\r\n default: \"disabled\",\r\n choices: TELEPORT_SETTING,\r\n scope: \"user\",\r\n gmOnly: true,\r\n onChange: (value: ToolSettings[\"teleport\"]) => {\r\n const enabled = value !== \"disabled\";\r\n this.#teleportKeybind.toggle(enabled);\r\n this.#unselectKeybind.toggle(enabled);\r\n },\r\n },\r\n {\r\n key: \"history\",\r\n type: Boolean,\r\n default: false,\r\n scope: \"user\",\r\n onChange: (value) => {\r\n this.#shouldRecordMovementHistoryWrapper.toggle(value);\r\n },\r\n },\r\n ];\r\n }\r\n\r\n get keybindsSchema(): KeybindingActionConfig[] {\r\n return [\r\n this.#teleportKeybind.configs, //\r\n this.#unselectKeybind.configs,\r\n ];\r\n }\r\n\r\n init(isGM: boolean): void {\r\n if (isGM && this.settings.teleport !== \"disabled\") {\r\n this.#teleportKeybind.activate();\r\n this.#unselectKeybind.activate();\r\n }\r\n\r\n if (this.settings.history) {\r\n this.#shouldRecordMovementHistoryWrapper.activate();\r\n }\r\n }\r\n\r\n #shouldRecordMovementHistory(_token: TokenPF2e) {\r\n return false;\r\n }\r\n\r\n #activeTeleport(unselect: boolean) {\r\n const tokens = canvas.tokens.controlled;\r\n\r\n if (unselect) {\r\n canvas.tokens.releaseAll();\r\n }\r\n\r\n if (tokens.length) {\r\n const listener = async (event: PIXI.FederatedPointerEvent) => {\r\n await this.#onCanvasStagePointerDown(event, tokens);\r\n this.#cancelTeleport?.();\r\n };\r\n\r\n canvas.stage.on(\"pointerdown\", listener);\r\n\r\n this.#cancelTeleport = () => {\r\n canvas.stage.off(\"pointerdown\", listener);\r\n };\r\n }\r\n }\r\n\r\n #disableTeleport() {\r\n this.#cancelTeleport?.();\r\n this.#cancelTeleport = null;\r\n }\r\n\r\n async #onCanvasStagePointerDown(event: PIXI.FederatedPointerEvent, tokens: TokenPF2e[]) {\r\n const operation: TokenOperation = {\r\n animate: false,\r\n history: false,\r\n diff: false,\r\n movement: {},\r\n };\r\n\r\n const updates = event.button !== 2 ? this.#spreadTokens(event, tokens) : this.#groupTokens(event, tokens);\r\n\r\n for (const { _id } of updates) {\r\n operation.movement[_id] = {\r\n autoRotate: false,\r\n constrainOptions: { ignoreWalls: true, ignoreCost: true },\r\n method: \"api\",\r\n showRuler: false,\r\n };\r\n }\r\n\r\n await canvas.scene?.updateEmbeddedDocuments(\"Token\", updates, operation);\r\n\r\n if (this.settings.teleport === \"select\") {\r\n selectTokens(tokens);\r\n } else if (event.button !== 0) {\r\n canvas.tokens.releaseAll();\r\n }\r\n }\r\n\r\n #spreadTokens(event: PIXI.FederatedPointerEvent, tokens: TokenPF2e[]): PositionUpdate[] {\r\n const updates: PositionUpdate[] = [];\r\n\r\n const [largeTokens, otherTokens] = R.partition(tokens, (token) => token.document.width > 1);\r\n const hasLargeToken = largeTokens.length > 0;\r\n\r\n const gridSize = canvas.grid.size;\r\n const localPosition = event.getLocalPosition(canvas.app.stage);\r\n const clickPosition = canvas.grid.getSnappedPoint(localPosition, {\r\n mode: CONST.GRID_SNAPPING_MODES.CENTER,\r\n });\r\n\r\n if (hasLargeToken) {\r\n const sortedLargeTokens = R.sortBy(largeTokens, [(token) => token.document.width, \"desc\"]);\r\n\r\n for (let i = 0; i < sortedLargeTokens.length; i++) {\r\n const token = sortedLargeTokens[i];\r\n const { x, y } = positionTokenFromCoords(clickPosition, token, false);\r\n\r\n updates.push({ _id: token.id, x, y, sort: i });\r\n }\r\n }\r\n\r\n const getOffsetPosition = (spread: SpreadPoint): Point => {\r\n return {\r\n x: clickPosition.x + spread[0] * gridSize,\r\n y: clickPosition.y + spread[1] * gridSize,\r\n };\r\n };\r\n\r\n const testCollision = (targetSpread: SpreadPoint, originSpread: SpreadPoint = [0, 0]): boolean => {\r\n const origin = getOffsetPosition(originSpread);\r\n const target = getOffsetPosition(targetSpread);\r\n\r\n const intersects = CONFIG.Canvas.polygonBackends.move.testCollision(origin, target, {\r\n type: \"move\",\r\n mode: \"any\",\r\n });\r\n\r\n if (!intersects && MODULE.isDebug) {\r\n canvas.controls.debug.lineStyle(4, 0x16a103).moveTo(origin.x, origin.y).lineTo(target.x, target.y);\r\n }\r\n\r\n return intersects;\r\n };\r\n\r\n const getSpreadKey = ([x, y]: SpreadPoint): SpreadKey => {\r\n return `${x}x${y}`;\r\n };\r\n\r\n const origins: SpreadPoint[] = [[0, 0]];\r\n const originKeys: SpreadKey[] = [\"0x0\"];\r\n\r\n if (MODULE.isDebug) {\r\n canvas.controls.debug.clear();\r\n }\r\n\r\n // we test for collision against ortho squares to later use them as origin too\r\n for (let i = 0; i < BetterMovementTool.OUTER_ORTHOS.length; i++) {\r\n const outerSpread = BetterMovementTool.OUTER_ORTHOS[i];\r\n const innerSpread = BetterMovementTool.INNER_ORTHOS[i];\r\n\r\n if (!testCollision(outerSpread)) {\r\n origins.push(outerSpread);\r\n origins.push(innerSpread);\r\n originKeys.push(getSpreadKey(outerSpread));\r\n originKeys.push(getSpreadKey(innerSpread));\r\n } else if (!testCollision(innerSpread)) {\r\n origins.push(innerSpread);\r\n originKeys.push(getSpreadKey(innerSpread));\r\n }\r\n }\r\n\r\n let spreadIndex = -1;\r\n\r\n const spreadMap: Record = {};\r\n\r\n const addUpdate = (token: TokenPF2e): boolean => {\r\n spreadIndex = spreadIndex + 1 >= BetterMovementTool.SPREADS.length ? 0 : spreadIndex + 1;\r\n\r\n const spread = BetterMovementTool.SPREADS[spreadIndex];\r\n const spreadKey = getSpreadKey(spread);\r\n\r\n test: if (spreadMap[spreadKey] === undefined) {\r\n if (originKeys.includes(spreadKey)) {\r\n spreadMap[spreadKey] = getOffsetPosition(spread);\r\n break test;\r\n }\r\n\r\n for (const origin of origins) {\r\n if (!testCollision(spread, origin)) {\r\n spreadMap[spreadKey] = getOffsetPosition(spread);\r\n break test;\r\n }\r\n }\r\n\r\n spreadMap[spreadKey] = false;\r\n }\r\n\r\n const coords = spreadMap[spreadKey];\r\n if (!coords) return false;\r\n\r\n const { x, y } = positionTokenFromCoords(coords, token);\r\n const update: PositionUpdate = { _id: token.id, x, y };\r\n\r\n if (hasLargeToken) {\r\n update.sort = largeTokens.length;\r\n }\r\n\r\n if (token.document.width < 1) {\r\n update.sort = (update.sort ?? 0) + 1;\r\n }\r\n\r\n updates.push(update);\r\n\r\n return true;\r\n };\r\n\r\n for (const token of otherTokens) {\r\n while (!addUpdate(token)) {}\r\n }\r\n\r\n return updates;\r\n }\r\n\r\n #groupTokens(event: PIXI.FederatedPointerEvent, tokens: TokenPF2e[]): PositionUpdate[] {\r\n const position = event.getLocalPosition(canvas.app.stage);\r\n\r\n return tokens.map((token): PositionUpdate => {\r\n const { x, y } = positionTokenFromCoords(position, token);\r\n return { _id: token.id, x, y };\r\n });\r\n }\r\n}\r\n\r\ntype SpreadPoint = [number, number];\r\ntype SpreadKey = `${number}x${number}`;\r\n\r\ntype PositionUpdate = {\r\n _id: string;\r\n x: number;\r\n y: number;\r\n sort?: number;\r\n};\r\n\r\ntype ToolSettings = {\r\n teleport: (typeof TELEPORT_SETTING)[number];\r\n history: boolean;\r\n};\r\n\r\ntype TokenOperation = {\r\n animate: boolean;\r\n history: boolean;\r\n diff: boolean;\r\n movement: Record<\r\n string,\r\n {\r\n autoRotate: boolean;\r\n constrainOptions: { ignoreWalls: true; ignoreCost: true };\r\n method: \"api\";\r\n showRuler: boolean;\r\n }\r\n >;\r\n};\r\n\r\nexport { BetterMovementTool };\r\n", "import {\n CharacterPF2e,\n ChoiceSetRuleElement,\n ChoiceSetSource,\n FeatFilters,\n FeatPF2e,\n FeatTrait,\n getDragEventData,\n getItemSourceId,\n openBrowserTab,\n R,\n RawPredicate,\n setStyleProperty,\n SYSTEM,\n} from \"foundry-helpers\";\nimport { ModuleToolApplication } from \"module-tool-application\";\nimport { BetterSheetTool } from \".\";\n\nclass FeatRetrainPopup extends ModuleToolApplication {\n #actor: CharacterPF2e;\n #category: string;\n #current: FeatPF2e;\n #featSlot: string | null;\n #filters: DeepPartial | undefined;\n #grantedBy: FeatPF2e | null;\n #retrainFeat: FeatPF2e | null = null;\n\n static DEFAULT_OPTIONS: DeepPartial = {\n classes: [\"pf2e-toolbelt-better-sheet-retrain\"],\n window: {\n contentClasses: [\"standard-form\"],\n },\n };\n\n constructor(\n tool: BetterSheetTool,\n\n currentFeat: FeatPF2e,\n category: string,\n options?: DeepPartial,\n ) {\n super(tool, options);\n\n this.#actor = currentFeat.actor;\n this.#category = category;\n this.#current = currentFeat;\n this.#grantedBy = currentFeat.grantedBy as FeatPF2e | null;\n\n const featSlot =\n !this.#grantedBy && this.#actor.feats.get(category)?.feats.find((slot) => slot.feat === currentFeat);\n\n this.#featSlot = featSlot && \"id\" in featSlot ? featSlot.id : null;\n }\n\n get key(): string {\n return \"retrain\";\n }\n\n async browse() {\n const browser = game.pf2e.compendiumBrowser;\n\n await browser.close();\n\n const filters = foundry.utils.mergeObject>(\n await browser.tabs.feat.getFilterData(),\n this.#getCustomFilters(),\n );\n\n openBrowserTab(\"feat\", null, filters);\n }\n\n #getCustomFilters(): DeepPartial {\n if (this.#filters) {\n return this.#filters;\n }\n\n const level = this.#current.system.level;\n const filters: DeepPartial = {\n level: {\n changed: true,\n isExpanded: true,\n from: 0,\n to: level.taken ?? level.value,\n },\n };\n\n if (this.#featSlot) {\n filters.checkboxes = {\n category: {\n selected: [this.#category],\n options: {\n [this.#category]: { selected: true },\n },\n isExpanded: true,\n },\n };\n } else if (this.#grantedBy) {\n const sourceId = getItemSourceId(this.#current);\n const rule = this.#grantedBy.rules.find((rule): rule is ChoiceSetRuleElement => {\n return rule.key === \"ChoiceSet\" && (rule as ChoiceSetRuleElement).selection === sourceId;\n });\n\n const choicesFilters =\n rule && R.isPlainObject(rule.choices) && \"filter\" in rule.choices && R.isArray(rule.choices.filter)\n ? (rule.choices.filter as RawPredicate)\n : [];\n\n const selectedTraits: { label: string; not?: boolean; value: FeatTrait }[] = [];\n\n const addTrait = (option: string, not?: boolean) => {\n const value = option.split(\":\")[2] as FeatTrait;\n const label = game.i18n.localize(CONFIG.PF2E.featTraits[value]);\n selectedTraits.push({ label, value, not });\n };\n\n const isTraitEntry = (entry: unknown): entry is string => {\n return R.isString(entry) && entry.startsWith(\"item:trait\");\n };\n\n for (const entry of choicesFilters) {\n if (isTraitEntry(entry)) {\n addTrait(entry);\n } else if (R.isPlainObject(entry) && \"not\" in entry && isTraitEntry(entry.not)) {\n addTrait(entry.not, true);\n }\n }\n\n if (selectedTraits.length) {\n filters.traits = {\n conjunction: \"and\",\n selected: selectedTraits,\n };\n }\n }\n\n return (this.#filters = filters);\n }\n\n protected _onClose(_options: foundry.applications.ApplicationClosingOptions): void {\n game.pf2e.compendiumBrowser.close();\n }\n\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\n return {\n retrain: this.#retrainFeat,\n };\n }\n\n async _onFirstRender(_context: object, _options: fa.ApplicationRenderOptions) {\n this.browse();\n }\n\n protected _onClickAction(_event: PointerEvent, target: HTMLElement) {\n const action = target.dataset.action as EventAction;\n\n switch (action) {\n case \"browse\": {\n return this.browse();\n }\n\n case \"cancel\": {\n return this.close();\n }\n\n case \"retrain\": {\n return this.#retrain();\n }\n }\n }\n\n protected _activateListeners(html: HTMLElement): void {\n html.addEventListener(\"drop\", async (event) => {\n const data = getDragEventData(event);\n\n if (data?.type !== \"Item\" || typeof data.uuid !== \"string\") {\n return this.localize.error(\"wrongDataType\");\n }\n\n const item = await fromUuid(data.uuid);\n if (!item?.isOfType(\"feat\")) {\n return this.localize.error(\"wrongItemType\");\n }\n\n this.#retrainFeat = item;\n this.render();\n });\n }\n\n setPosition(\n position?: Partial,\n ): foundry.applications.ApplicationPosition {\n const element = this.element;\n const newPosition = super.setPosition(position);\n\n newPosition.top = window.innerHeight - element.clientHeight;\n setStyleProperty(element, \"top\", newPosition.top);\n\n return newPosition;\n }\n\n async #retrain() {\n this.close();\n if (!this.#retrainFeat) return;\n\n const currentId = this.#current.id;\n const source = this.#retrainFeat.toObject();\n\n // we have to generate it for the granter\n source._id = foundry.utils.randomID();\n\n foundry.utils.setProperty(source, \"system.level.taken\", this.#current.system.level.taken);\n\n if (this.#featSlot) {\n foundry.utils.setProperty(source, \"system.location\", this.#featSlot);\n } else if (this.#grantedBy) {\n foundry.utils.setProperty(source, `flags.${SYSTEM.id}.grantedBy`, this.#current.flags[SYSTEM.id].grantedBy);\n\n const granterUpdates: EmbeddedDocumentUpdateData = {\n _id: this.#grantedBy.id,\n };\n\n const itemGrants = R.pipe(\n this.#grantedBy.flags[SYSTEM.id].itemGrants,\n R.entries(),\n R.find(([_flag, value]) => value.id === currentId),\n );\n\n if (itemGrants) {\n granterUpdates[`flags.${SYSTEM.id}.itemGrants.${itemGrants[0]}.id`] = source._id;\n }\n\n const currentSourceId = getItemSourceId(this.#current);\n const granterRules = foundry.utils.deepClone(this.#grantedBy._source.system.rules);\n const choiceRule = granterRules.find((rule): rule is ChoiceSetSource => {\n return rule.key === \"ChoiceSet\" && (rule as ChoiceSetSource).selection === currentSourceId;\n });\n\n if (choiceRule) {\n choiceRule.selection = getItemSourceId(this.#retrainFeat);\n granterUpdates[\"system.rules\"] = granterRules;\n }\n\n await this.#actor.updateEmbeddedDocuments(\"Item\", [granterUpdates], { render: false });\n }\n\n await this.#actor.deleteEmbeddedDocuments(\"Item\", [currentId], { render: false });\n await this.#actor.createEmbeddedDocuments(\"Item\", [source], { keepId: true });\n }\n}\n\ntype EventAction = \"browse\" | \"cancel\" | \"retrain\";\n\ntype PopupContext = fa.ApplicationRenderContext & {\n retrain: FeatPF2e | null;\n};\n\nexport { FeatRetrainPopup };\n", "import {\n ActorPF2e,\n ActorSheetOptions,\n ActorSheetPF2e,\n belongToPartyAlliance,\n CharacterPF2e,\n CharacterSheetPF2e,\n createHTMLElement,\n createToggleHook,\n createToggleWrapper,\n CreaturePF2e,\n CreatureSheetData,\n FamiliarPF2e,\n FamiliarSheetPF2e,\n FeatPF2e,\n htmlQuery,\n isInstanceOf,\n localeCompare,\n NPCSheetPF2e,\n PhysicalItemPF2e,\n PhysicalItemType,\n R,\n renderActorSheets,\n renderCharacterSheets,\n SpellcastingEntryPF2e,\n SpellCollection,\n SYSTEM,\n toggleHooksAndWrappers,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { betterMerchantTool } from \"tools\";\nimport { FeatRetrainPopup } from \".\";\n\nclass BetterSheetTool extends ModuleTool {\n #partyAsObservedHooks = [\n createToggleWrapper(\n \"OVERRIDE\",\n \"CONFIG.Actor.sheetClasses.character['pf2e.CharacterSheetPF2e'].cls.prototype.template\",\n this.#characterSheetPF2eTemplate,\n { context: this },\n ),\n createToggleWrapper(\n \"OVERRIDE\",\n \"CONFIG.Actor.sheetClasses.npc['pf2e.NPCSheetPF2e'].cls.prototype.template\",\n this.#npcSheetPF2eTemplate,\n { context: this },\n ),\n createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.Actor.sheetClasses.familiar['pf2e.FamiliarSheetPF2e'].cls.prototype.getData\",\n this.#familiarSheetPF2eGetData,\n { context: this },\n ),\n ];\n\n #retrainFeatsHook = createToggleHook(\"renderCharacterSheetPF2e\", this.#onRenderCharacterSheetPF2e.bind(this));\n\n #showPlayersHook = createToggleHook(\"renderActorSheetPF2e\", this.#showPlayersOnRender.bind(this));\n\n #sortListHooks = createToggleHook(\"renderActorSheetPF2e\", this.#sortListOnRender.bind(this));\n\n get key(): \"betterSheet\" {\n return \"betterSheet\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"partyAsObserved\",\n type: Boolean,\n default: false,\n scope: \"world\",\n onChange: (value: boolean) => {\n toggleHooksAndWrappers(this.#partyAsObservedHooks, !game.user.isGM && value);\n renderActorSheets();\n },\n },\n {\n key: \"showPlayers\",\n type: Boolean,\n default: false,\n scope: \"user\",\n gmOnly: true,\n onChange: (value: boolean) => {\n if (game.user.isGM) {\n this.#showPlayersHook.toggle(value);\n renderActorSheets();\n }\n },\n },\n {\n key: \"sortList\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: (value: boolean) => {\n this.#sortListHooks.toggle(value);\n renderActorSheets();\n },\n },\n {\n key: \"retrainFeats\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: (value: boolean) => {\n this.#retrainFeatsHook.toggle(value);\n renderCharacterSheets();\n },\n },\n ];\n }\n\n init(isGM: boolean): void {\n this.#retrainFeatsHook.toggle(this.settings.retrainFeats);\n this.#showPlayersHook.toggle(isGM && this.settings.showPlayers);\n this.#sortListHooks.toggle(this.settings.sortList);\n }\n\n ready(isGM: boolean): void {\n toggleHooksAndWrappers(this.#partyAsObservedHooks, !isGM && this.settings.partyAsObserved);\n }\n\n #onRenderCharacterSheetPF2e(sheet: CharacterSheetPF2e, $html: JQuery) {\n if (!sheet.isEditable) return;\n\n const html = $html[0];\n const tab = htmlQuery(html, `.tab[data-tab=\"feats\"]`);\n if (!tab) return;\n\n const actor = sheet.actor;\n const sections = tab.querySelectorAll(`.feat-section`);\n\n for (const section of sections) {\n const category = section.dataset.groupId as string;\n const selector = R.isIncludedIn(category, [\"ancestryfeature\", \"classfeature\"])\n ? \".nested-items [data-item-id]\"\n : \"[data-item-id]\";\n\n const featRows = section.querySelectorAll(selector);\n\n for (const featRow of featRows) {\n const controls = htmlQuery(featRow, \".item-controls\");\n const btn = createHTMLElement(\"a\", {\n classes: [\"pf2e-toobelt-retrain-feat\"],\n content: ``,\n dataset: {\n tooltip: this.localize.path(\"retrain.title\"),\n },\n });\n\n btn.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n\n const currentFeat = actor.items.get>(featRow.dataset.itemId ?? \"\");\n if (!currentFeat) return;\n\n new FeatRetrainPopup(this, currentFeat, category).render(true);\n });\n\n controls?.prepend(btn);\n }\n }\n }\n\n #npcSheetPF2eTemplate(sheet: NPCSheetPF2e): string {\n if (sheet.isLootSheet) {\n return SYSTEM.relativePath(\"templates/actors/npc/loot-sheet.hbs\");\n } else if (sheet.actor.limited && !belongToPartyAlliance(sheet.actor)) {\n return SYSTEM.relativePath(\"templates/actors/limited/npc-sheet.hbs\");\n }\n return SYSTEM.relativePath(\"templates/actors/npc/sheet.hbs\");\n }\n\n #characterSheetPF2eTemplate(sheet: CharacterSheetPF2e): string {\n const actor = sheet.actor;\n const template = actor.limited && !belongToPartyAlliance(actor) ? \"limited\" : \"sheet\";\n\n return SYSTEM.relativePath(`templates/actors/character/${template}.hbs`);\n }\n\n async #familiarSheetPF2eGetData(\n sheet: FamiliarSheetPF2e,\n wrapped: libWrapper.RegisterCallback,\n options?: ActorSheetOptions,\n ): Promise> {\n const data = (await wrapped(options)) as CreatureSheetData;\n\n if (belongToPartyAlliance(sheet.actor)) {\n data.limited = false;\n data.document = data.document.clone();\n\n Object.defineProperty(data.document, \"limited\", {\n get() {\n return false;\n },\n });\n }\n\n return data;\n }\n\n #showPlayersOnRender(sheet: ActorSheetPF2e, $html: JQuery) {\n const html = $html[0];\n const imgPanel = htmlQuery(html, \".image-container\");\n if (!imgPanel) return;\n\n const actor = sheet.actor;\n const btn = createHTMLElement(\"a\", {\n classes: [\"hover-icon\", \"show-players\"],\n content: ``,\n dataset: {\n tooltip: \"JOURNAL.ActionShow\",\n },\n });\n\n btn.addEventListener(\"click\", () => {\n game.socket.emit(\"shareImage\", {\n image: actor.img,\n title: actor.name,\n uuid: actor.uuid,\n });\n\n ui.notifications.info(\"JOURNAL.ActionShowSuccess\", {\n format: { mode: \"image\", title: actor.name, which: \"all\" },\n });\n });\n\n imgPanel.appendChild(btn);\n }\n\n #sortListOnRender(sheet: ActorSheetPF2e, $html: JQuery) {\n if (!sheet.isEditable) return;\n\n const html = $html[0];\n const actor = sheet.actor;\n\n this.#addActionsSortList(html, actor);\n this.#addCraftingSortList(html, actor);\n this.#addInventorySortList(html, actor);\n this.#addSpellcastingSortList(html, actor);\n }\n\n #createSortBtn(disabled: boolean, label = \"tooltip\") {\n const classes = [\"with-sort-btn\"];\n\n if (disabled) {\n classes.push(\"disabled\");\n }\n\n return createHTMLElement(\"a\", {\n classes,\n content: ``,\n dataset: {\n tooltip: this.localize.path(`sortList.sheet.${label}`),\n },\n });\n }\n\n async #sortCollectionSpells(collection: SpellCollection) {\n const updates = R.pipe(\n collection.contents,\n R.groupBy((spell) => (spell.isCantrip ? 0 : spell.rank)),\n R.values(),\n R.flatMap((group) => {\n group.sort((a, b) => a._source.name.localeCompare(b._source.name));\n return group;\n }),\n R.map((item, index) => {\n return { _id: item.id, sort: 50000 * index };\n }),\n );\n\n await collection.actor.updateEmbeddedDocuments(\"Item\", updates);\n }\n\n async #sortPrepCollection(entry: SpellcastingEntryPF2e) {\n const actor = entry.actor;\n\n const updates = R.mapValues(entry.system.slots, (slot) => {\n return {\n prepared: slot.prepared.sort((a, b) => {\n const spellA = a.id ? actor.items.get(a.id) : null;\n const spellB = b.id ? actor.items.get(b.id) : null;\n\n if (!spellA && !spellB) return 0;\n if (!spellA) return 1;\n if (!spellB) return -1;\n\n return spellA.name.localeCompare(spellB.name);\n }),\n };\n });\n\n await entry.update({ \"system.slots\": updates });\n }\n\n #addSpellcastingSortList(html: HTMLElement, actor: ActorPF2e) {\n if (!actor.isOfType(\"character\")) return;\n\n const spellcasting = htmlQuery(html, `.tab[data-tab=\"spellcasting\"] .known-spells`);\n const sections = spellcasting?.querySelectorAll(\".spellcasting-entry\");\n\n for (const section of sections ?? []) {\n const collectionId = section.dataset.itemId;\n const collection = actor.spellcasting.collections.get(collectionId ?? \"\");\n if (!collection) continue;\n\n const entry = collection.entry as unknown as SpellcastingEntryPF2e;\n if (!isInstanceOf(entry, \"SpellcastingEntryPF2e\")) continue;\n\n const name = htmlQuery(section, \".action-header .item-name\");\n\n const disabled = entry.isFlexible\n ? true\n : entry.isPrepared\n ? R.values(entry.system.slots).every(({ prepared }) => {\n return prepared.filter((slot) => slot.id).length < 2;\n })\n : collectionIsDisabled(collection);\n\n const btn = this.#createSortBtn(disabled);\n\n name?.classList.add(\"with-sort\");\n name?.prepend(btn);\n\n if (disabled) continue;\n\n btn.addEventListener(\"click\", async () => {\n if (entry.isPrepared) {\n await this.#sortPrepCollection(entry);\n } else {\n await this.#sortCollectionSpells(collection);\n }\n });\n }\n }\n\n #addActionsSortList(html: HTMLElement, actor: ActorPF2e) {\n if (!actor.isOfType(\"npc\")) return;\n\n const actionsTab = htmlQuery(html, `.tab[data-tab=\"main\"]`);\n\n for (const type of [\"action\", \"passive\"] as const) {\n const section = htmlQuery(actionsTab, `.section-container.${type}s`);\n const name = htmlQuery(section, \".section-header h4\");\n const disabled = (htmlQuery(section, \".item-list\")?.children.length ?? 0) < 2;\n const btn = this.#createSortBtn(disabled);\n\n name?.prepend(btn);\n\n if (disabled) continue;\n\n btn.addEventListener(\"click\", async () => {\n const updates = R.pipe(\n actor.itemTypes.action,\n R.filter((item) => (type === \"action\" ? !!item.actionCost : !item.actionCost)),\n R.sort((a, b) => a.name.localeCompare(b.name)),\n R.map((item, index) => {\n return { _id: item.id, sort: 50000 * index };\n }),\n );\n\n await actor.updateEmbeddedDocuments(\"Item\", updates);\n });\n }\n }\n\n #addCraftingSortList(html: HTMLElement, actor: ActorPF2e) {\n if (!actor.isOfType(\"character\")) return;\n\n const craftingTab = htmlQuery(html, `.tab[data-tab=\"crafting\"]`);\n if (!craftingTab) return;\n\n this.#addCraftingFormulasSort(craftingTab, actor);\n this.#addCraftingEntriesSort(craftingTab, actor);\n }\n\n #addCraftingEntriesSort(html: HTMLElement, actor: CharacterPF2e) {\n const entries = html.querySelectorAll(\".crafting-entry-list .crafting-entry[data-ability]\");\n\n for (const entry of entries) {\n const header = htmlQuery(entry, \".action-header .item-name\");\n if (!header) continue;\n\n const ability = actor.crafting.abilities.get(entry.dataset.ability ?? \"\");\n if (!ability) continue;\n\n const disabled = ability.preparedFormulaData.length === 0;\n const btn = this.#createSortBtn(disabled);\n\n header.prepend(btn);\n\n if (disabled) continue;\n\n btn.addEventListener(\"click\", async () => {\n const formulas = R.sortBy(\n ability.preparedFormulaData,\n ({ uuid }) => fromUuidSync(uuid, { strict: false })?.name ?? \"\",\n );\n ability.updateFormulas(formulas);\n });\n }\n }\n\n #addCraftingFormulasSort(html: HTMLElement, actor: CharacterPF2e) {\n const crafting = htmlQuery(html, `.known-formulas`);\n const header = htmlQuery(crafting, \":scope > header\");\n const disabled = actor.system.crafting.formulas.length === 0;\n const btn = this.#createSortBtn(disabled);\n\n header?.prepend(btn);\n\n if (disabled) return;\n\n btn.addEventListener(\"click\", async () => {\n const formulas = R.sortBy(\n actor.system.crafting.formulas,\n ({ uuid }) => fromUuidSync(uuid, { strict: false })?.name ?? \"\",\n );\n await actor.update({ \"system.crafting.formulas\": formulas });\n });\n }\n\n #addInventorySortList(html: HTMLElement, actor: ActorPF2e) {\n const isLoot = actor.isOfType(\"loot\");\n const inventorySelector = isLoot ? \".sheet-body.inventory\" : `.tab[data-tab=\"inventory\"]`;\n const inventory = htmlQuery(html, inventorySelector + \" .inventory-list\");\n if (!inventory) return;\n\n const headers = inventory.querySelectorAll(\":scope > header\");\n\n for (const header of headers) {\n const itemsList = header.nextElementSibling as HTMLElement | undefined;\n if (!itemsList || !itemsList.classList.contains(\"items\")) continue;\n\n const types = R.split(itemsList.dataset.itemTypes ?? \"\", \",\") as PhysicalItemType[];\n const hasContainer = !!types.findSplice((type) => type === \"backpack\");\n const name = htmlQuery(header, \".item-name\");\n const disabled = hasContainer\n ? actor.itemTypes.backpack.every((container) => container.contents.size < 2)\n : itemsList.children.length < 2;\n const btn = this.#createSortBtn(disabled, hasContainer ? \"container\" : undefined);\n\n name?.prepend(btn);\n\n if (disabled) continue;\n\n btn.addEventListener(\"click\", async () => {\n if (isLoot && header.classList.contains(\"services\")) {\n const services = betterMerchantTool.getServices(actor);\n services.sort((a, b) => localeCompare(a.name || a.id, b.name || a.id));\n return await betterMerchantTool.setServives(actor, services);\n }\n\n const sortItems = (a: PhysicalItemPF2e, b: PhysicalItemPF2e): number => {\n return a._source.name.localeCompare(b._source.name);\n };\n\n const mapItems = (item: PhysicalItemPF2e, index: number) => {\n return { _id: item.id, sort: 50000 * index };\n };\n\n const updates = R.pipe(\n types,\n R.map((type) => type in actor.itemTypes && actor.itemTypes[type]),\n R.filter(R.isTruthy),\n R.flat(),\n R.filter((item) => !item.isInContainer),\n R.sort(sortItems),\n R.map(mapItems),\n );\n\n if (hasContainer) {\n for (const container of actor.itemTypes.backpack) {\n updates.push(...R.pipe(container.contents.contents, R.sort(sortItems), R.map(mapItems)));\n }\n }\n\n await actor.updateEmbeddedDocuments(\"Item\", updates);\n });\n }\n }\n}\n\nfunction collectionIsDisabled(collection: SpellCollection): boolean {\n const groups = R.pipe(\n collection.contents,\n R.groupBy((spell) => (spell.isCantrip ? 0 : spell.rank)),\n R.values(),\n );\n\n return groups.every((spells) => spells.length < 2);\n}\n\ntype ToolSettings = {\n partyAsObserved: boolean;\n retrainFeats: boolean;\n scribble: boolean;\n showPlayers: boolean;\n sortList: boolean;\n};\n\nexport { BetterSheetTool };\n", "import { KeybindingActionConfig, R } from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\n\nclass BetterToolTool extends ModuleTool {\n get key(): \"betterTool\" {\n return \"betterTool\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [];\n }\n\n get keybindsSchema(): KeybindingActionConfig[] {\n return [\n {\n name: \"removeRegion\",\n onDown: this.#deleteRegionUnderCursor.bind(this),\n },\n ];\n }\n\n #deleteRegionUnderCursor() {\n const scene = canvas.scene;\n if (!game.ready || !scene) return;\n\n const mouse = canvas.mousePosition;\n const regions = R.reverse(canvas.scene.regions.contents);\n\n const region = regions.find((region) => {\n return (\n region.object?.isVisible &&\n !region.object.isPreview &&\n !region.locked &&\n region.isOwner &&\n region.polygonTree.testPoint(mouse)\n );\n });\n\n region?.delete();\n }\n}\n\ntype ToolSettings = {};\n\nexport { BetterToolTool };\n", "import { createCreatureSheetWrapper, CreaturePF2e, DropCanvasItemData, ItemPF2e } from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\n\nclass BetterTradeTool extends ModuleTool {\n #onDropItemWrapper = createCreatureSheetWrapper(\"WRAPPER\", \"_onDropItem\", this.#creatureSheetOnDropItem, {\n context: this,\n });\n\n get key(): \"betterTrade\" {\n return \"betterTrade\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"invertTrade\",\n type: Boolean,\n default: false,\n scope: \"user\",\n playerOnly: true,\n onChange: (value: boolean) => {\n if (!game.user.isGM) {\n this.#onDropItemWrapper.toggle(value);\n }\n },\n },\n ];\n }\n\n ready(isGM: boolean): void {\n if (!isGM && this.settings.invertTrade) {\n this.#onDropItemWrapper.activate();\n }\n }\n\n async #creatureSheetOnDropItem(\n actor: CreaturePF2e,\n wrapped: libWrapper.RegisterCallback,\n event: DragEvent,\n data: DropCanvasItemData & { fromInventory?: boolean },\n ): Promise {\n if (\n !data.fromInventory ||\n !data.uuid ||\n fromUuidSync(data.uuid, { strict: false })?.actor === actor\n ) {\n return wrapped(event, data);\n }\n\n const newEvent = new DragEvent(\"drop\", {\n altKey: event.altKey,\n shiftKey: !event.shiftKey,\n dataTransfer: event.dataTransfer,\n });\n\n return wrapped(newEvent, data);\n }\n}\n\ntype ToolSettings = toolbelt.Settings[\"betterTrade\"];\n\nexport { BetterTradeTool };\n", "import { ItemPF2e } from \"foundry-helpers\";\n\nfunction itemCanBeRefreshed(item: ItemPF2e): boolean {\n return !item.system.rules.some((r) => typeof r.key === \"string\" && [\"ChoiceSet\", \"GrantItem\"].includes(r.key));\n}\n\nexport { itemCanBeRefreshed };\n", "import { CharacterPF2e, FeatSlot, htmlClosest, MODULE, SpellPF2e } from \"foundry-helpers\";\nimport {\n CharacterImport,\n CharacterImporterTool,\n getCurrentItem,\n getEntrySelection,\n ImportDataContextActionType,\n ImportedContainerEntry,\n ImportedEntry,\n ImportedEquipmentEntry,\n ImportedFeatEntry,\n ImportedSpellEntry,\n ImportItemType,\n itemCanBeRefreshed,\n} from \"..\";\n\nconst ERROR_ACCESSING = \"an error occured while accessing import data.\";\n\nasync function onEntryAction(this: CharacterImporterTool, actor: CharacterPF2e, el: HTMLElement) {\n try {\n const data = await this.getImportData(actor);\n const dataset = htmlClosest(el, \"[data-item-type]\")?.dataset ?? {};\n const itemType = dataset.itemType as ImportItemType;\n const index = dataset.index ? Number(dataset.index) : NaN;\n\n if (!data || !itemType) {\n throw MODULE.Error(ERROR_ACCESSING);\n }\n\n const action = el.dataset.action as EntryEventAction;\n\n switch (action) {\n case \"entry-install\": {\n return onEntryInstall(actor, data, itemType, index, dataset);\n }\n\n case \"entry-refresh\": {\n const item = actor.items.get(dataset.itemId ?? \"\");\n return item && itemCanBeRefreshed(item) && item.refreshFromCompendium();\n }\n\n case \"entry-replace\": {\n return onEntryInstall(actor, data, itemType, index, dataset);\n }\n\n case \"entry-revert\": {\n return data.updateEntryOverride(itemType, null, index) && this.setImportData(actor, data);\n }\n }\n } catch (error: any) {\n MODULE.error(error);\n }\n}\n\nasync function onEntryInstall(\n actor: CharacterPF2e,\n data: CharacterImport,\n itemType: ImportItemType,\n index: number,\n dataset: { itemId?: string; parent?: string },\n) {\n const entry = data.getImportedEntry(itemType, index);\n\n if (!entry) {\n throw MODULE.Error(ERROR_ACCESSING);\n }\n\n const item = getEntrySelection(entry);\n if (!item) {\n throw MODULE.Error(\"couldn't retrieve matching item.\");\n }\n\n const source = item.toObject();\n source._id = foundry.utils.randomID();\n\n if (isSpellEntry(entry)) {\n const spellcasting = dataset.parent && actor.spellcasting.get(dataset.parent);\n if (!spellcasting) return;\n\n const current = getCurrentItem(actor, spellcasting?.spells, entry);\n\n if (current) {\n await actor.deleteEmbeddedDocuments(\"Item\", [current.id], { render: false });\n }\n\n foundry.utils.setProperty(source, \"system.location.value\", spellcasting.id);\n\n if (entry.rank > (item as SpellPF2e).rank) {\n foundry.utils.setProperty(source, \"system.location.heightenedLevel\", entry.rank);\n }\n } else if (isFeatEntry(entry)) {\n if (entry.parent) return;\n\n const featSlot = !entry.extra && getFeatSlot(actor, entry);\n\n if (featSlot) {\n if (featSlot.feat) {\n await actor.deleteEmbeddedDocuments(\"Item\", [featSlot.feat.id], { render: false });\n }\n\n foundry.utils.setProperty(source, \"system.location\", featSlot.id);\n }\n\n foundry.utils.setProperty(source, \"system.level.taken\", entry.level);\n } else if (isPhysicalEntry(entry)) {\n const current = dataset.itemId ? actor.items.get(dataset.itemId) : undefined;\n const currentContainerId = current?.isOfType(\"physical\") ? current.system.containerId : null;\n const currentContents = (current?.isOfType(\"backpack\") ? current.contents : []).map((item) => {\n return { _id: item.id, \"system.containerId\": source._id };\n });\n\n foundry.utils.setProperty(source, \"system.quantity\", entry.quantity);\n\n if (isContainerEntry(entry)) {\n source.name = entry.value;\n }\n\n if (currentContainerId) {\n foundry.utils.setProperty(source, \"system.containerId\", currentContainerId);\n }\n\n if (current) {\n await actor.deleteEmbeddedDocuments(\"Item\", [current.id], { render: false });\n } else if (isEquipmentEntry(entry) && entry.container) {\n const parent = dataset.parent ? actor.items.get(dataset.parent) : undefined;\n\n if (parent) {\n foundry.utils.setProperty(source, \"system.containerId\", parent.id);\n }\n }\n\n if (currentContents.length) {\n await actor.updateEmbeddedDocuments(\"Item\", currentContents, { render: false });\n }\n }\n\n await actor.createEmbeddedDocuments(\"Item\", [source], { keepId: true });\n}\n\nfunction isSpellEntry(entry: ImportedEntry): entry is ImportedSpellEntry {\n return \"rank\" in entry || (\"parent\" in entry && entry.parent === \"rituals\");\n}\n\nfunction isFeatEntry(entry: ImportedEntry): entry is ImportedFeatEntry {\n return \"category\" in entry;\n}\n\nfunction isEquipmentEntry(entry: ImportedEntry): entry is ImportedEquipmentEntry {\n return \"type\" in entry;\n}\n\nfunction isContainerEntry(entry: ImportedEntry): entry is ImportedContainerEntry {\n return \"identifier\" in entry;\n}\n\nfunction isPhysicalEntry(entry: ImportedEntry): entry is ImportedEquipmentEntry | ImportedContainerEntry {\n return isEquipmentEntry(entry) || isContainerEntry(entry);\n}\n\nfunction getFeatSlot(actor: CharacterPF2e, entry: ImportedFeatEntry): FeatSlot | undefined {\n if (entry.parent) return;\n\n const slotId = `${entry.category}-${entry.level}`;\n const category = actor.feats.get(entry.category);\n\n return category?.feats.find((slot) => \"id\" in slot && slot.id === slotId) as FeatSlot | undefined;\n}\n\ntype EntryEventAction = `entry-${ImportDataContextActionType}`;\n\nexport { getFeatSlot, isEquipmentEntry, isFeatEntry, onEntryAction };\nexport type { EntryEventAction };\n", "import {\n CharacterPF2e,\n FeatOrFeatureCategory,\n FeatPF2e,\n getItemSlug,\n getItemSourceId,\n ItemPF2e,\n ItemUUID,\n PhysicalItemPF2e,\n R,\n SpellPF2e,\n stringNumber,\n SYSTEM,\n} from \"foundry-helpers\";\nimport {\n CharacterCategory,\n CharacterImport,\n CharacterImporterTool,\n FeatEntryParent,\n getEntrySelection,\n getFeatSlot,\n ImportedContainerEntry,\n ImportedEntry,\n ImportedEquipmentEntry,\n ImportedFeatEntry,\n ImportedSpellEntry,\n ImportItemType,\n isFeatEntry,\n itemCanBeRefreshed,\n} from \"tools\";\n\nconst ACTION_ICONS = {\n install: \"fa-solid fa-plus-large\",\n locked: \"fa-solid fa-lock\",\n refresh: \"fa-solid fa-arrows-rotate\",\n replace: \"fa-solid fa-arrow-right-arrow-left\",\n revert: \"fa-solid fa-xmark-large\",\n} as const;\n\nfunction prepareEntry(\n this: CharacterImporterTool,\n itemType: ImportItemType,\n entry: ImportedEntry,\n current: ItemPF2e | null,\n depth: number,\n disabled?: boolean,\n): ImportDataEntry {\n const isOverride = !!entry.override;\n const selection = getEntrySelection(entry);\n const matchLabel = this.localize(\"sheet.data.entry\", isOverride ? \"override\" : \"match\");\n const label = game.i18n.localize(`TYPES.Item.${itemType}`);\n\n const actions = R.pipe(\n [\n isOverride ? \"revert\" : undefined,\n selection && current && !disabled ? (itemCanBeRefreshed(current) ? \"refresh\" : \"locked\") : undefined,\n selection && !depth && !disabled ? (current ? \"replace\" : \"install\") : undefined,\n ] as const,\n R.filter(R.isTruthy),\n R.map((type): ImportDataContextAction => {\n return {\n type,\n icon: ACTION_ICONS[type],\n label: this.localize(\"sheet.data.entry.action\", type, { match: matchLabel }),\n };\n }),\n );\n\n return {\n actions,\n children: [],\n current,\n depth,\n img: selection?.img || SYSTEM.relativePath(`icons/default-icons/${itemType}.svg`),\n isOverride,\n itemType,\n label,\n selection,\n source: {\n label: entry.value,\n uuid: entry.match?.uuid,\n },\n };\n}\n\nfunction prepareFeatEntry(\n this: CharacterImporterTool,\n actor: CharacterPF2e,\n data: CharacterImport,\n entry: ImportedFeatEntry,\n index: number,\n depth: number,\n): ImportDataFeatEntry {\n const current = getCurrentItem(actor, actor.itemTypes.feat, entry);\n const label =\n entry.category === \"archetype\"\n ? \"PF2E.Actor.Character.FeatSlot.ArchetypeHeader\"\n : CONFIG.PF2E.featCategories[entry.category];\n\n return {\n ...prepareEntry.call(this, \"feat\", entry, current, depth),\n category: entry.category,\n children: prepareFeatEntries.call(this, actor, data, index, depth + 1),\n index,\n isExtra: entry.extra,\n itemType: \"feat\",\n label: game.i18n.localize(label),\n level: !entry.parent || !R.isNumber(Number(entry.parent)) ? entry.level : 0,\n parent: entry.parent,\n };\n}\n\nfunction prepareFeatEntries(\n this: CharacterImporterTool,\n actor: CharacterPF2e,\n data: CharacterImport,\n parent: CharacterCategory | number | undefined,\n depth: number,\n): ImportDataFeatEntry[] {\n const level = actor.level;\n const matchParent = R.isNumber(parent) ? stringNumber(parent) : parent;\n\n return R.pipe(\n game.pf2e.settings.variants.fa ? data.feats : data.feats.filter(({ category }) => category !== \"archetype\"),\n R.map((feat, index) => {\n if (feat.level > level || feat.parent !== matchParent || feat.awarded) return;\n return prepareFeatEntry.call(this, actor, data, feat, index, depth);\n }),\n R.filter(R.isTruthy),\n );\n}\n\nfunction getCurrentItem(\n actor: CharacterPF2e,\n itemsList: Maybe,\n entry: ImportedContainerEntry | ImportedEquipmentEntry,\n): PhysicalItemPF2e | null;\nfunction getCurrentItem(actor: CharacterPF2e, itemsList: Maybe, entry: ImportedSpellEntry): SpellPF2e | null;\nfunction getCurrentItem(actor: CharacterPF2e, itemsList: Maybe, entry: ImportedFeatEntry): FeatPF2e | null;\nfunction getCurrentItem(\n actor: CharacterPF2e,\n itemsList: Maybe,\n entry: ImportedContainerEntry | ImportedEquipmentEntry | ImportedFeatEntry | ImportedSpellEntry,\n): ItemPF2e | null {\n if (!itemsList) return null;\n\n const selection = getEntrySelection(entry);\n if (!selection) return null;\n\n if (isFeatEntry(entry) && !entry.extra) {\n const featSlot = getFeatSlot(actor, entry);\n if (featSlot) {\n return featSlot.feat ?? null;\n }\n }\n\n const selectionUUID = selection.uuid;\n const selectionSlug = getItemSlug(selection);\n const sourceUUID = (selection !== entry.match && entry.match?.uuid) || null;\n const sourceSlug = sourceUUID ? SYSTEM.sluggify(entry.value) : null;\n\n const current = itemsList.find((item) => {\n // const current = actor.itemTypes[itemType].find((item) => {\n const itemSlug = getItemSlug(item);\n const itemSourceId = getItemSourceId(item);\n\n if (itemSourceId !== selectionUUID && itemSlug !== selectionSlug) {\n if (!sourceUUID) return false;\n if (itemSourceId !== sourceUUID && itemSlug !== sourceSlug) return false;\n }\n\n return true;\n });\n\n return current ?? null;\n}\n\n// function getItemLevel(item: FeatPF2e): number;\n// function getItemLevel(item: ItemPF2e | null): number | undefined;\n// function getItemLevel(item: ItemPF2e | null) {\n// if (!item) return;\n\n// const { system } = item as { system: { level?: { taken?: number | null; value: number } } };\n// return getItemLevel(item.grantedBy) ?? system.level?.taken ?? system.level?.value;\n// }\n\ntype ItemList = {\n find: (predicate: (value: ItemPF2e) => boolean) => ItemPF2e | undefined;\n};\n\ntype ImportDataEntry = {\n actions: ImportDataContextAction[];\n children: ImportDataEntry[];\n current: ItemPF2e | null | undefined;\n depth: number;\n img: string;\n isOverride: boolean;\n itemType: ImportItemType;\n label: string;\n selection: ItemPF2e | null;\n source: {\n label: string;\n uuid: Maybe;\n };\n};\n\ntype ImportDataFeatEntry = Omit & {\n category: FeatOrFeatureCategory | \"archetype\";\n index: number;\n isExtra: boolean;\n itemType: \"feat\";\n level: number;\n parent: FeatEntryParent | undefined;\n};\n\ntype ImportDataContextAction = {\n type: ImportDataContextActionType;\n icon: string;\n label: string;\n};\n\ntype ImportDataContextActionType = keyof typeof ACTION_ICONS;\n\nexport { getCurrentItem, prepareEntry, prepareFeatEntries, prepareFeatEntry };\nexport type { ImportDataContextActionType, ImportDataEntry, ImportDataFeatEntry };\n", "import { addListenerAll, AncestryPF2e, AttributeString, CharacterPF2e, ClassPF2e, R } from \"foundry-helpers\";\nimport {\n ATTRIBUTE_KEYS,\n AttributeLevel,\n CHARACTER_CATEGORIES,\n CharacterImport,\n CharacterImporterTool,\n ImportDataEntry,\n ImportedFeatEntry,\n isAttributeKey,\n isAttributeLevel,\n prepareEntry,\n prepareFeatEntries,\n prepareFeatEntry,\n} from \"tools\";\n\nasync function prepareCoreTab(\n this: CharacterImporterTool,\n actor: CharacterPF2e,\n data: CharacterImport,\n): Promise {\n const actorLevel = actor.level;\n const dataLevel = data.level;\n\n const awardedFeats: [number, ImportedFeatEntry][] = R.pipe(\n data.feats,\n R.map((feat, index): [number, ImportedFeatEntry] | undefined => {\n return feat.level <= actorLevel && feat.awarded ? [index, feat] : undefined;\n }),\n R.filter(R.isTruthy),\n );\n\n const entries: ImportDataEntry[] = CHARACTER_CATEGORIES.map((itemType) => {\n const entry = data[itemType];\n const preparedEntry = prepareEntry.call(this, itemType, entry, actor[itemType], 0);\n\n const parent = preparedEntry.current ?? preparedEntry.selection;\n const expected = R.pipe(\n R.values((parent as ClassPF2e | undefined)?.system.items ?? {}),\n R.filter((entry) => entry.level <= actorLevel),\n R.map((entry) => entry.uuid),\n );\n\n const awarded = R.pipe(\n expected,\n R.map((uuid) => {\n const match = awardedFeats.find(([_, featData]) => {\n return featData.override?.uuid === uuid || featData.match?.uuid === uuid;\n });\n if (!match) return;\n\n const [index, featData] = match;\n return prepareFeatEntry.call(this, actor, data, featData, index, 1);\n }),\n R.filter(R.isTruthy),\n );\n\n return {\n ...preparedEntry,\n children: [...awarded, ...prepareFeatEntries.call(this, actor, data, itemType, 1)],\n };\n });\n\n const attributesLevels = R.pipe(\n getLevelsAttributes(data, actor),\n R.map(({ level, boosts }): ImportDataBoostsEntry<\"Boost\" | \"Partial\"> => {\n return {\n label: game.i18n.format(\"PF2E.LevelN\", { level }),\n boosts: R.map(ATTRIBUTE_KEYS, (key): ImportDataBoost<\"Boost\" | \"Partial\"> => {\n const selected = R.isIncludedIn(key, boosts);\n const type = selected && boostIsPartial(actor, key, Number(level)) ? \"Partial\" : \"Boost\";\n\n return { locked: false, selected, type };\n }),\n };\n }),\n );\n\n const levelThreshold = Math.floor(actorLevel / 5);\n const warning =\n dataLevel >= actorLevel || Math.floor(dataLevel / 5) >= levelThreshold\n ? null\n : this.localize(\"sheet.data.core.attributes.warning\", { level: levelThreshold * 5 });\n\n const attributesTotals = R.pipe(\n ATTRIBUTE_KEYS,\n R.map((key) => data.attributes.values[key] ?? 0),\n );\n\n const ancestryUUID = entries.find((x) => x.itemType === \"ancestry\")?.selection?.uuid;\n const ancestryItem = ancestryUUID ? await fromUuid(ancestryUUID) : null;\n\n const allAncestryBoosts = [...data.attributes.ancestry.boosts, ...data.attributes.ancestry.locked];\n const ancestryBoosts: ImportDataBoostsEntry<\"Boost\"> = {\n boosts: R.map(ATTRIBUTE_KEYS, (key): ImportDataBoost<\"Boost\"> => {\n return {\n locked: R.isIncludedIn(key, data.attributes.ancestry.locked),\n selected: R.isIncludedIn(key, allAncestryBoosts),\n type: \"Boost\",\n };\n }),\n label: game.i18n.localize(\"TYPES.Item.ancestry\"),\n };\n\n if (ancestryItem && data.alternativeBoosts) {\n const tooltip = game.i18n.localize(\"PF2E.Actor.Character.AttributeBuilder.AlternateBoostsLabel\");\n ancestryBoosts.label += ` `;\n }\n\n const ancestryFlaws: ImportDataBoostsEntry<\"Flaw\"> | null = data.attributes.ancestry.flaws.length\n ? {\n label: \"\",\n boosts: R.map(ATTRIBUTE_KEYS, (key): ImportDataBoost<\"Flaw\"> | null => {\n if (!R.isIncludedIn(key, data.attributes.ancestry.flaws)) return null;\n\n return {\n locked: true,\n selected: true,\n type: \"Flaw\",\n };\n }),\n }\n : null;\n\n const backgroundBoosts: ImportDataBoostsEntry<\"Boost\"> = {\n boosts: R.map(ATTRIBUTE_KEYS, (key): ImportDataBoost<\"Boost\"> => {\n return {\n locked: false,\n selected: R.isIncludedIn(key, data.attributes.background),\n type: \"Boost\",\n };\n }),\n label: game.i18n.localize(\"TYPES.Item.background\"),\n };\n\n const classUUID = entries.find((x) => x.itemType === \"class\")?.selection?.uuid;\n const classItem = classUUID ? await fromUuid(classUUID) : null;\n const classKeys = classItem?.system.keyAbility.value ?? data.attributes.class;\n const classBoosts: ImportDataBoostsEntry<\"KeyIcon\"> = {\n boosts: R.map(ATTRIBUTE_KEYS, (key): ImportDataBoost<\"KeyIcon\"> | null => {\n if (!R.isIncludedIn(key, classKeys)) return null;\n\n return {\n locked: false,\n selected: R.isIncludedIn(key, data.attributes.class),\n type: \"KeyIcon\",\n };\n }),\n label: game.i18n.localize(\"TYPES.Item.class\"),\n };\n\n return {\n ancestryItem,\n attributes: {\n ancestry: {\n boosts: ancestryBoosts,\n flaws: ancestryFlaws,\n },\n background: backgroundBoosts,\n class: classBoosts,\n labels: ATTRIBUTE_KEYS,\n levels: attributesLevels,\n totals: attributesTotals,\n },\n classItem,\n entries,\n warning,\n };\n}\n\nfunction addCoreEventListeners(this: CharacterImporterTool, html: HTMLElement, actor: CharacterPF2e) {\n addListenerAll(html, \"[data-action]\", (el) => {\n const action = el.dataset.action as EventAction;\n\n switch (action) {\n case \"assign-attributes\": {\n return assignAttributes.call(this, actor);\n }\n\n case \"override-attributes\": {\n return setAttributes.call(this, actor);\n }\n }\n });\n}\n\nasync function setAttributes(this: CharacterImporterTool, actor: CharacterPF2e) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const values = data.attributes.values;\n const abilities = R.fromKeys(ATTRIBUTE_KEYS, (attr) => {\n return { value: 10, mod: values[attr] ?? 0 };\n });\n\n await actor.update({\n \"system.abilities\": abilities,\n \"system.details.keyability.value\": data.attributes.class[0],\n });\n\n this.localize.info(\"sheet.data.core.attributes.set.manual\");\n}\n\nasync function assignAttributes(this: CharacterImporterTool, actor: CharacterPF2e) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const levels = R.pullObject(getLevelsAttributes(data, actor), R.prop(\"level\"), R.prop(\"boosts\"));\n\n if (data.alternativeBoosts) {\n await actor.ancestry?.update({ \"system.alternateAncestryBoosts\": data.attributes.ancestry.boosts });\n } else {\n await assignBoosts(actor.ancestry, data.attributes.ancestry.boosts);\n }\n\n await assignBoosts(actor.background, data.attributes.background);\n\n if (actor.class) {\n const selected = data.attributes.class[0];\n const available = actor.class._source.system.keyAbility.value;\n\n if (available.length > 1 && R.isIncludedIn(selected, available)) {\n await actor.class.update({ \"system.keyAbility.selected\": selected });\n }\n }\n\n await actor.update({\n \"system.abilities\": null,\n \"system.build.attributes.boosts\": levels,\n });\n\n this.localize.info(\"sheet.data.core.attributes.set.boosts\");\n}\n\nasync function assignBoosts(item: ItemWithAssignableBoosts | null, data: AttributeString[]): Promise {\n if (!item) return;\n\n const boosts = validateBoosts(data);\n const recipiants = R.pipe(\n item._source.system.boosts,\n R.entries(),\n R.filter(([_index, { value }]) => value.length > 1),\n );\n if (!recipiants.length || !boosts.length) return;\n\n const assigned: AttributeString[][] = [];\n\n for (const key of boosts) {\n const assignables = R.pipe(\n recipiants,\n R.filter(([_index, { value }]) => R.isIncludedIn(key, value)),\n R.map(([index]) => Number(index)),\n );\n\n if (!assigned.length) {\n assigned.push(\n ...assignables.map((index) => {\n const arr: AttributeString[] = [];\n arr[index] = key;\n return arr;\n }),\n );\n continue;\n }\n\n for (const index of assignables) {\n for (const list of assigned) {\n if (list.at(index)) continue;\n list[index] = key;\n }\n }\n }\n\n const recipiantsSize = recipiants.length;\n const match = assigned.find((list) => {\n return list.filter(R.isTruthy).length === recipiantsSize;\n });\n\n if (!match) return;\n\n const update = R.pipe(\n match,\n R.map((key, index) => [index, { selected: key }] as const),\n R.fromEntries(),\n R.pickBy(({ selected }) => selected != null),\n );\n\n return item.update({ \"system.boosts\": update });\n}\n\ntype ItemWithAssignableBoosts = {\n _source: {\n system: {\n boosts: AssignableBoosts;\n };\n };\n update(data: Record): Promise;\n};\n\ntype AssignableBoosts = Record;\n\nfunction getLevelsAttributes(\n data: CharacterImport,\n actor: CharacterPF2e,\n): { level: AttributeLevel; boosts: AttributeString[] }[] {\n const actorLevel = actor.level;\n\n return R.pipe(\n data.attributes.levels,\n R.entries(),\n R.filter((entry): entry is [AttributeLevel, AttributeString[]] => {\n return isAttributeLevel(entry[0]) && Number(entry[0]) <= actorLevel;\n }),\n R.map(([level, boosts]): { level: AttributeLevel; boosts: AttributeString[] } => {\n return {\n level,\n boosts: validateBoosts(boosts),\n };\n }),\n );\n}\n\nfunction validateBoosts(boosts: unknown): AttributeString[] {\n if (!R.isArray(boosts)) return [];\n return R.filter(boosts, isAttributeKey);\n}\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/a4049bd76dab59cb992e77b8c5c447d793940a85/src/module/actor/character/apps/attribute-builder.ts#L221\n */\nfunction boostIsPartial(\n actor: CharacterPF2e,\n attribute: AttributeString,\n level: number,\n isApex: boolean = false,\n): boolean {\n const build = actor.system.build.attributes;\n\n if (level < 5 || build.manual || isApex) {\n return false;\n }\n const boosts = [\n build.boosts.ancestry.find((a) => a === attribute),\n build.boosts.background.find((a) => a === attribute),\n build.boosts.class === attribute ? attribute : null,\n build.boosts[1].find((a) => a === attribute),\n level === 20 ? build.boosts[20].find((a) => a === attribute) : null,\n level >= 15 ? build.boosts[15].find((a) => a === attribute) : null,\n level >= 10 ? build.boosts[10].find((a) => a === attribute) : null,\n level >= 5 ? build.boosts[5].find((a) => a === attribute) : null,\n ].filter(R.isTruthy).length;\n const flaws = Number(build.flaws.ancestry.some((a) => a === attribute));\n const netBoosts = boosts - flaws;\n\n const cssClasses: Record = { 0: false, 1: true };\n return netBoosts >= 5 ? cssClasses[netBoosts % 2] : false;\n}\n\ntype EventAction = \"assign-attributes\" | \"override-attributes\";\n\ntype ImportDataCoreContext = {\n ancestryItem: AncestryPF2e | null;\n attributes: ImportDataAttributesContext;\n classItem: ClassPF2e | null;\n entries: ImportDataEntry[];\n warning: string | null;\n};\n\ntype ImportDataAttributesContext = {\n ancestry: {\n boosts: ImportDataBoostsEntry<\"Boost\">;\n flaws: ImportDataBoostsEntry<\"Flaw\"> | null;\n };\n background: ImportDataBoostsEntry<\"Boost\">;\n class: ImportDataBoostsEntry<\"KeyIcon\">;\n labels: typeof ATTRIBUTE_KEYS;\n levels: ImportDataBoostsEntry<\"Boost\" | \"Partial\">[];\n totals: AttributesRow;\n};\n\ntype ImportDataBoostsEntry = {\n label: string;\n boosts: ImportDataBoosts;\n};\n\ntype ImportDataBoostType = \"Boost\" | \"Partial\" | \"Flaw\" | \"KeyIcon\";\n\ntype ImportDataBoost = {\n locked: boolean;\n selected: boolean;\n type: T;\n};\n\ntype ImportDataBoosts = AttributesRow | null>;\n\ntype AttributesRow = [T, T, T, T, T, T];\n\nexport { addCoreEventListeners, prepareCoreTab };\n", "import { addListenerAll, CharacterPF2e, R } from \"foundry-helpers\";\nimport { CharacterImport, CharacterImporterTool } from \"tools\";\n\nasync function prepareDetailsTab(\n this: CharacterImporterTool,\n actor: CharacterPF2e,\n data: CharacterImport,\n): Promise {\n const actorDetails = actor.system.details;\n\n return {\n details: [\n {\n current: actor.name,\n expected: data.name,\n label: \"name\",\n },\n {\n current: actorDetails.age.value,\n expected: data.age,\n label: \"age\",\n },\n {\n current: actorDetails.gender.value,\n expected: data.gender,\n label: \"gender\",\n },\n ],\n languages: {\n current: localizeAndSort(actorDetails.languages.value),\n expected: localizeAndSort(data.languages),\n },\n };\n}\n\nfunction addDetailsEventListeners(this: CharacterImporterTool, html: HTMLElement, actor: CharacterPF2e) {\n addListenerAll(html, \"[data-action]\", (el) => {\n const action = el.dataset.action as EventAction;\n\n switch (action) {\n case \"assign-details\": {\n return assignDetails.call(this, actor);\n }\n\n case \"assign-languages\": {\n return assignLanguages.call(this, actor);\n }\n }\n });\n}\n\nfunction localizeAndSort(languages: string[]) {\n return R.pipe(\n languages,\n R.map((slug) => game.i18n.localize(CONFIG.PF2E.languages[slug])),\n R.sortBy(R.identity()),\n );\n}\n\nasync function assignDetails(this: CharacterImporterTool, actor: CharacterPF2e) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n await actor.update({\n name: data.name,\n \"prototypeToken.name\": data.name,\n \"system.details.age.value\": data.age,\n \"system.details.gender.value\": data.gender,\n });\n}\n\nasync function assignLanguages(this: CharacterImporterTool, actor: CharacterPF2e) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const languages = R.difference(\n data.languages,\n actor.system.build.languages.granted.map((x) => x.slug),\n );\n\n await actor.update({ \"system.details.languages.value\": languages });\n}\n\ntype EventAction = \"assign-details\" | \"assign-languages\";\n\ntype ImportDataDetailsContext = {\n details: ImportDataEntry[];\n languages: {\n current: string[];\n expected: string[];\n };\n};\n\ntype ImportDataEntry = {\n current: string;\n expected: string;\n label: string;\n};\n\nexport { addDetailsEventListeners, prepareDetailsTab };\n", "import { CharacterPF2e, FeatOrFeatureCategory, R } from \"foundry-helpers\";\nimport { CharacterImport, CharacterImporterTool, ImportDataFeatEntry, prepareFeatEntries } from \"tools\";\n\nasync function prepareFeatsTab(\n this: CharacterImporterTool,\n actor: CharacterPF2e,\n data: CharacterImport,\n): Promise {\n const sections: FeatSection[] = R.pipe(\n prepareFeatEntries.call(this, actor, data, undefined, 0),\n R.groupByProp(\"category\"),\n R.mapValues((entrys): FeatSection => {\n return {\n category: entrys[0].category,\n feats: entrys,\n label: entrys[0].label,\n };\n }),\n R.values(),\n );\n\n return {\n sections,\n };\n}\n\nfunction addFeatsEventListeners(this: CharacterImporterTool, html: HTMLElement, actor: CharacterPF2e) {}\n\ntype FeatSection = {\n category: FeatOrFeatureCategory | \"archetype\";\n feats: ImportDataFeatEntry[];\n label: string;\n};\n\ntype ImportDataFeatsContext = {\n sections: FeatSection[];\n};\n\nexport { addFeatsEventListeners, prepareFeatsTab };\n", "import {\n addListenerAll,\n CharacterPF2e,\n CoinDenomination,\n Currency,\n localeCompare,\n PhysicalItemType,\n R,\n TreasurePF2e,\n TreasureSource,\n SYSTEM,\n} from \"foundry-helpers\";\nimport { COIN_COMPENDIUM_UUIDS, COIN_DENOMINATIONS } from \"foundry-helpers/dist\";\nimport { CharacterImport, CharacterImporterTool, getCurrentItem, ImportDataEntry, prepareEntry } from \"tools\";\n\nasync function prepareInventoryTab(\n this: CharacterImporterTool,\n actor: CharacterPF2e,\n data: CharacterImport,\n): Promise {\n const currency = actor.inventory.currency;\n\n const currencies = R.map(\n SYSTEM.isSF2e ? ([\"credits\"] as const) : COIN_DENOMINATIONS,\n (unit): ImportDataCurrency => {\n return {\n current: unit === \"credits\" ? currency.copperValue / 10 : currency[unit],\n expected: (unit === \"credits\" && data.currencies.sp) || data.currencies[unit],\n label: CONFIG.PF2E.currencies[unit],\n unit,\n };\n },\n );\n\n const items = R.map(data.equipments, (entry, index): ImportDataEquipmentEntry => {\n const current = getCurrentItem(actor, actor.itemTypes[entry.type], entry);\n\n return {\n ...prepareEntry.call(this, entry.type as PhysicalItemType, entry, current, 0),\n container: entry.container,\n index,\n quantity: {\n current: current?.quantity,\n selection: entry.quantity,\n },\n };\n });\n\n const containers = R.map(data.containers, (entry, index): ImportDataEquipmentEntry => {\n const current = getCurrentItem(actor, actor.itemTypes.backpack, entry);\n\n const children = R.pipe(\n items,\n R.filter((item) => item.container === entry.identifier),\n R.forEach((item) => {\n item.depth = 1;\n item.parent = current?.id;\n }),\n );\n\n return {\n ...prepareEntry.call(this, \"backpack\", entry, current, 0),\n children,\n index,\n itemType: \"container\",\n quantity: {\n current: current?.quantity,\n selection: entry.quantity,\n },\n };\n });\n\n const sections: ImportEquipmentSection[] = R.pipe(\n items,\n R.filter((item) => !item.container),\n R.groupBy(R.prop(\"itemType\")),\n R.mapValues((entries): ImportEquipmentSection => {\n return {\n items: entries,\n label: entries[0].label,\n type: entries[0].itemType as PhysicalItemType,\n };\n }),\n R.values(),\n );\n\n const backpacks = sections.findSplice((section) => section.type === \"backpack\") ?? {\n items: [],\n label: game.i18n.localize(\"TYPES.Item.backpack\"),\n type: \"backpack\",\n };\n\n if (containers.length) {\n backpacks.items.push(...containers);\n }\n\n sections.sort((a, b) => localeCompare(a.label, b.label));\n\n if (backpacks.items.length) {\n sections.push(backpacks);\n }\n\n return {\n currencies,\n sections,\n };\n}\n\nfunction addInventoryEventListeners(this: CharacterImporterTool, html: HTMLElement, actor: CharacterPF2e) {\n addListenerAll(html, \"[data-action]\", (el) => {\n const action = el.dataset.action as EventAction;\n\n switch (action) {\n case \"assign-credits\":\n return assignCredits.call(this, actor);\n case \"assign-currencies\":\n return assignCurrencies.call(this, actor);\n }\n });\n}\n\nasync function assignCredits(this: CharacterImporterTool, actor: CharacterPF2e) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const currency = actor.inventory.currency;\n const currentValue = currency.credits;\n const diff = data.currencies.sp - currentValue;\n\n if (currency.upb > 0) {\n const updates: Partial> = { upb: currency.upb };\n\n if (diff < 0) {\n updates[\"credits\"] = Math.abs(diff);\n }\n\n await actor.inventory.removeCurrency(updates);\n } else if (diff < 0) {\n await actor.inventory.removeCurrency({ credits: Math.abs(diff) });\n }\n\n if (diff > 0) {\n await actor.inventory.addCurrency({ credits: diff });\n }\n}\n\nasync function assignCurrencies(this: CharacterImporterTool, actor: CharacterPF2e) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const denominations = COIN_DENOMINATIONS;\n const currentCurrencies = actor.itemTypes.treasure.filter(\n (item): item is TreasurePF2e & { unit: CoinDenomination } => {\n return item.isCurrency && R.isIncludedIn(item.unit, denominations);\n },\n );\n\n const toAdd: TreasureSource[] = [];\n const toDelete: string[] = [];\n const toUpdate: { _id: string; \"system.quantity\": number }[] = [];\n\n for (const current of currentCurrencies) {\n const unit = current.unit;\n const expected = data.currencies[unit];\n\n if (expected <= 0) {\n toDelete.push(current.id);\n } else if (expected !== current.quantity) {\n toUpdate.push({ _id: current.id, \"system.quantity\": expected });\n }\n }\n\n const missing = R.difference(\n denominations,\n currentCurrencies.map((item) => item.unit),\n );\n\n await Promise.all(\n missing.map(async (unit) => {\n const expected = data.currencies[unit];\n if (expected <= 0) return;\n\n const uuid = COIN_COMPENDIUM_UUIDS[unit]();\n const source = (await fromUuid(uuid))?.toObject(true);\n if (source?.type !== \"treasure\") return;\n\n source.system.quantity = expected;\n toAdd.push(source);\n }),\n );\n\n if (toDelete.length) {\n await actor.deleteEmbeddedDocuments(\"Item\", toDelete);\n }\n\n if (toUpdate.length) {\n await actor.updateEmbeddedDocuments(\"Item\", toUpdate);\n }\n\n if (toAdd.length) {\n await actor.createEmbeddedDocuments(\"Item\", toAdd);\n }\n}\n\ntype EventAction = \"assign-credits\" | \"assign-currencies\";\n\ntype ImportDataEquipmentEntry = ImportDataEntry & {\n container?: string;\n index: number;\n parent?: string;\n quantity: {\n current: number | undefined;\n selection: number;\n };\n};\n\ntype ImportDataInventoryContext = {\n currencies: ImportDataCurrency[];\n sections: ImportEquipmentSection[];\n};\n\ntype ImportEquipmentSection = {\n items: ImportDataEquipmentEntry[];\n label: string;\n type: PhysicalItemType;\n};\n\ntype ImportDataCurrency = {\n current: number;\n expected: number;\n label: string;\n unit: Currency;\n};\n\nexport { addInventoryEventListeners, prepareInventoryTab };\n", "import { addListenerAll, CharacterPF2e, LoreSource, R, SkillSlug, SYSTEM, ZeroToFour } from \"foundry-helpers\";\nimport { CharacterImport, CharacterImporterTool } from \"tools\";\n\nasync function prepareSkillsTab(\n this: CharacterImporterTool,\n actor: CharacterPF2e,\n data: CharacterImport,\n): Promise {\n const skills = R.map(R.keys(CONFIG.PF2E.skills), (slug): ImportSkill => {\n return {\n current: getSkillEntry(actor.getStatistic(slug).rank ?? 0),\n expected: getSkillEntry(data.skills[slug]),\n label: game.i18n.localize(CONFIG.PF2E.skills[slug].label),\n };\n });\n\n const lores = R.map(data.lores, ({ label, rank }): ImportSkill => {\n const slug = getLoreSlug(label);\n\n return {\n current: getSkillEntry(actor.getStatistic(slug)?.rank ?? 0),\n expected: getSkillEntry(rank),\n label,\n };\n });\n\n return {\n skills: R.sortBy([...skills, ...lores], R.prop(\"label\")),\n };\n}\n\nfunction addSkillsEventListeners(this: CharacterImporterTool, html: HTMLElement, actor: CharacterPF2e) {\n addListenerAll(html, \"[data-action]\", (el) => {\n const action = el.dataset.action as EventAction;\n\n switch (action) {\n case \"assign-skills\": {\n return assignSkills.call(this, actor);\n }\n }\n });\n}\n\nasync function assignSkills(this: CharacterImporterTool, actor: CharacterPF2e) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const skills: Partial> = {};\n const lores: PreCreate[] = [];\n\n for (const [slug, rank] of R.entries(data.skills)) {\n const current = actor.getStatistic(slug).rank ?? 0;\n\n if (current < rank) {\n skills[slug] = { rank };\n }\n }\n\n for (const { label, rank } of data.lores) {\n const slug = getLoreSlug(label);\n const current = actor.getStatistic(slug)?.rank ?? 0;\n\n if (current < rank) {\n lores.push({\n name: label,\n system: {\n proficient: { value: rank },\n },\n type: \"lore\",\n });\n }\n }\n\n const hasLores = lores.length > 0;\n\n if (!foundry.utils.isEmpty(skills)) {\n await actor.update({ \"system.skills\": skills }, { render: !hasLores });\n }\n\n if (hasLores) {\n await actor.createEmbeddedDocuments(\"Item\", lores);\n }\n}\n\nfunction getSkillEntry(rank: ZeroToFour): ImportSkillEntry {\n return { label: CONFIG.PF2E.proficiencyLevels[rank], rank };\n}\n\nfunction getLoreSlug(label: string) {\n return `${SYSTEM.sluggify(label)}-lore`;\n}\n\ntype EventAction = \"assign-skills\";\n\ntype ImportDataSkillsContext = {\n skills: ImportSkill[];\n};\n\ntype ImportSkill = {\n current: ImportSkillEntry;\n expected: ImportSkillEntry;\n label: string;\n};\n\ntype ImportSkillEntry = {\n label: string;\n rank: number;\n};\n\nexport { addSkillsEventListeners, prepareSkillsTab };\n", "import {\n addListenerAll,\n BaseSpellcastingEntry,\n CharacterPF2e,\n confirmDialog,\n createSpellcastingSource,\n getActorMaxRank,\n htmlClosest,\n isInstanceOf,\n R,\n SlotKey,\n SpellcastingEntrySlots,\n SpellSource,\n} from \"foundry-helpers\";\nimport {\n CharacterImport,\n CharacterImporterTool,\n getCurrentItem,\n getEntrySelection,\n ImportDataEntry,\n ImportedSpellcastingEntry,\n ImportedSpellEntry,\n prepareEntry,\n} from \"tools\";\n\nasync function prepareSpellsTab(\n this: CharacterImporterTool,\n actor: CharacterPF2e,\n data: CharacterImport,\n): Promise {\n const level = actor.level;\n\n const spellcasting = R.pipe(\n data.spellcasting,\n R.map((spellcastingEntry, entryIndex): ImportDataSpellcastingSection | undefined => {\n const entries = actor.spellcasting.filter((entry) => isMatchingSpellcasting(entry, spellcastingEntry));\n\n const selected = spellcastingEntry.selected\n ? entries.find((entry) => entry.id === spellcastingEntry.selected)\n : entries.at(0);\n\n const selectedId = selected?.id;\n\n const spells: ImportDataSpell[] = R.pipe(\n data.spells,\n R.map((spellEntry, spellIndex): ImportDataSpell | undefined => {\n if (spellEntry.rank > level || spellEntry.parent !== spellcastingEntry.identifier) return;\n\n const current = getCurrentItem(actor, selected?.spells, spellEntry);\n\n return {\n ...prepareEntry.call(this, \"spell\", spellEntry, current ?? null, 0, !selected),\n index: spellIndex,\n level: spellEntry.rank,\n parent: selectedId,\n };\n }),\n R.filter(R.isTruthy),\n );\n\n if (spells.length === 0) return;\n\n return {\n hasMissingSpells: !!selected && spells.some((spell) => !spell.current),\n hasSlotsToRefresh: !!selected && R.isIncludedIn(selected.category, [\"prepared\", \"spontaneous\"]),\n index: entryIndex,\n label: spellcastingEntry.name,\n selected: selectedId,\n selections: R.map(entries, (entry) => {\n return { label: entry.name, value: entry.id };\n }),\n spells: R.sortBy(spells, R.prop(\"level\")),\n };\n }),\n R.filter(R.isTruthy),\n );\n\n const actorRituals = actor.spellcasting.ritual;\n const rituals = R.pipe(\n data.spells,\n R.map((entry, index): ImportDataSpell | undefined => {\n if (entry.parent !== \"rituals\") return;\n\n const selection = getEntrySelection(entry);\n if (selection && selection.rank > level) return;\n\n const current = getCurrentItem(actor, actorRituals?.spells, entry as ImportedSpellEntry);\n\n return {\n ...prepareEntry.call(this, \"spell\", entry, current ?? null, 0, !actorRituals),\n index: index,\n level: selection?.rank ?? 0,\n parent: entry.parent,\n };\n }),\n R.filter(R.isTruthy),\n );\n\n return {\n rituals: rituals.length\n ? { hasMissingSpells: rituals.some((spell) => !spell.current), spells: rituals }\n : undefined,\n spellcasting,\n };\n}\n\nfunction addSpellsEventListeners(this: CharacterImporterTool, html: HTMLElement, actor: CharacterPF2e) {\n const getSpellcastingIndex = (el: HTMLElement): number => {\n return Number(htmlClosest(el, \"[data-index]\")?.dataset.index);\n };\n\n addListenerAll(html, \"[data-action]\", (el) => {\n const action = el.dataset.action as EventAction;\n const index = getSpellcastingIndex(el);\n\n switch (action) {\n case \"add-spellcasting\": {\n return addSpellcasting.call(this, actor, index);\n }\n\n case \"fill-rituals\": {\n return fillRituals.call(this, actor);\n }\n\n case \"fill-spellcasting\": {\n return fillSpellcasting.call(this, actor, index);\n }\n\n case \"refresh-spellcasting\": {\n return refreshSpellcasting.call(this, actor, index);\n }\n }\n });\n\n addListenerAll(html, `[name=\"spellcasting-selection\"]`, \"change\", async (el: HTMLSelectElement) => {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const index = getSpellcastingIndex(el);\n const spellcasting = data.spellcasting.at(index);\n if (!spellcasting) return;\n\n spellcasting.selected = el.value;\n await this.setImportData(actor, data);\n });\n}\n\nasync function refreshSpellcasting(this: CharacterImporterTool, actor: CharacterPF2e, index: number) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const spellcastingEntry = data.spellcasting.at(index);\n const spellcasting = getSelectedSpellcasting(actor, spellcastingEntry);\n if (\n !spellcastingEntry ||\n !isInstanceOf(spellcasting, \"SpellcastingEntryPF2e\") ||\n !R.isIncludedIn(spellcasting.category, [\"prepared\", \"spontaneous\"])\n )\n return;\n\n const spellcastingSlots = spellcasting.system?.slots;\n if (!spellcastingSlots) return;\n\n const maxRank = getActorMaxRank(actor);\n const isPrepared = spellcastingEntry.type === \"prepared\";\n const updates = {} as SpellcastingEntrySlots;\n\n for (let slot = 0; slot < 11; slot++) {\n const slotKey = `slot${slot}` as SlotKey;\n\n if (slot > maxRank) {\n updates[slotKey] = { max: 0, prepared: [], value: 0 };\n continue;\n }\n\n const value = spellcastingEntry.slots.at(slot) ?? 0;\n const spellcastingSlot = spellcastingSlots[slotKey];\n\n updates[slotKey] = {\n max: value,\n prepared: isPrepared ? spellcastingSlot.prepared.slice(0, value) : [],\n value: isPrepared ? 0 : Math.min(spellcastingSlot.value, value),\n };\n }\n\n await spellcasting.update({ \"system.slots\": updates });\n this.localize.info(\"sheet.data.spellcasting.refresh.set\");\n}\n\nasync function fillRituals(this: CharacterImporterTool, actor: CharacterPF2e) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const spellcasting = actor.spellcasting.ritual;\n if (!spellcasting) return;\n\n const level = actor.level;\n const sources: SpellSource[] = R.pipe(\n data.spells,\n R.map((entry): SpellSource | undefined => {\n if (entry.parent !== \"rituals\" || getCurrentItem(actor, spellcasting.spells, entry)) return;\n\n const selection = getEntrySelection(entry);\n if (!selection || selection.rank > level) return;\n\n const source = selection.toObject();\n\n foundry.utils.setProperty(source, \"system.location.value\", spellcasting.id);\n\n return source;\n }),\n R.filter(R.isTruthy),\n );\n\n if (!sources.length) return;\n\n const confirm = await confirmDialog(this.path(\"sheet.data.spellcasting.fill\"));\n\n if (confirm) {\n await actor.createEmbeddedDocuments(\"Item\", sources);\n }\n}\n\nasync function fillSpellcasting(this: CharacterImporterTool, actor: CharacterPF2e, index: number) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const spellcastingEntry = data.spellcasting.at(index);\n const spellcasting = getSelectedSpellcasting(actor, spellcastingEntry);\n if (!spellcastingEntry || !spellcasting) return;\n\n const level = actor.level;\n const sources: SpellSource[] = R.pipe(\n data.spells,\n R.map((entry): SpellSource | undefined => {\n if (entry.rank > level || entry.parent !== spellcastingEntry.identifier) return;\n if (getCurrentItem(actor, spellcasting.spells, entry)) return;\n\n const selection = getEntrySelection(entry);\n if (!selection) return;\n\n const source = selection.toObject();\n\n foundry.utils.setProperty(source, \"system.location.value\", spellcasting.id);\n\n if (entry.rank > selection.rank) {\n foundry.utils.setProperty(source, \"system.location.heightenedLevel\", entry.rank);\n }\n\n return source;\n }),\n R.filter(R.isTruthy),\n );\n\n if (!sources.length) return;\n\n const confirm = await confirmDialog(this.path(\"sheet.data.spellcasting.fill\"));\n\n if (confirm) {\n await actor.createEmbeddedDocuments(\"Item\", sources);\n }\n}\n\nasync function addSpellcasting(this: CharacterImporterTool, actor: CharacterPF2e, index: number) {\n const data = await this.getImportData(actor);\n if (!data) return;\n\n const spellcasting = data.spellcasting.at(index);\n if (!spellcasting) return;\n\n const confirm = await confirmDialog(this.path(\"sheet.data.spellcasting.add\"));\n\n if (!confirm) return;\n\n const isPreparedOrSpontaneous = R.isIncludedIn(spellcasting.type, [\"prepared\", \"spontaneous\"]);\n\n const source = createSpellcastingSource({\n name: spellcasting.name,\n attribute: spellcasting.attribute,\n category: spellcasting.type,\n tradition: spellcasting.tradition,\n showSlotlessRanks: isPreparedOrSpontaneous,\n });\n\n if (isPreparedOrSpontaneous) {\n const maxRank = getActorMaxRank(actor);\n const slots = R.take(spellcasting.slots, Math.max(maxRank + 1, 2));\n\n source.system.slots ??= {};\n\n for (let i = 0; i < slots.length; i++) {\n const slotKey = `slot${i}` as SlotKey;\n source.system.slots[slotKey] = { max: slots[i] };\n }\n }\n\n const [entry] = await actor.createEmbeddedDocuments(\"Item\", [source], { render: false });\n spellcasting.selected = entry.id;\n await this.setImportData(actor, data);\n}\n\nfunction getSelectedSpellcasting(\n actor: CharacterPF2e,\n spellcastingEntry: Maybe,\n): Maybe {\n if (!spellcastingEntry) return;\n return (\n (spellcastingEntry.selected && actor.spellcasting.get(spellcastingEntry.selected)) ||\n actor.spellcasting.find((entry) => isMatchingSpellcasting(entry, spellcastingEntry))\n );\n}\n\nfunction isMatchingSpellcasting(entry: BaseSpellcastingEntry, spellcastingEntry: ImportedSpellcastingEntry): boolean {\n return (\n entry.tradition === spellcastingEntry.tradition &&\n entry.attribute === spellcastingEntry.attribute &&\n entry.category === spellcastingEntry.type\n );\n}\n\ntype EventAction = \"add-spellcasting\" | \"fill-rituals\" | \"fill-spellcasting\" | \"refresh-spellcasting\";\n\ntype ImportDataSpell = ImportDataEntry & {\n index: number;\n level: number;\n parent: string | undefined;\n};\n\ntype ImportDataSpellcastingSection = {\n hasMissingSpells: boolean;\n hasSlotsToRefresh: boolean;\n index: number;\n label: string;\n selected: string | undefined;\n selections: { label: string; value: string }[];\n spells: ImportDataSpell[];\n};\n\ntype ImportDataRitualsSection = {\n hasMissingSpells: boolean;\n spells: ImportDataSpell[];\n};\n\ntype ImportDataSpellsContext = {\n rituals: ImportDataRitualsSection | undefined;\n spellcasting: ImportDataSpellcastingSection[];\n};\n\nexport { addSpellsEventListeners, prepareSpellsTab };\n", "import { CharacterPF2e, R, waitDialog } from \"foundry-helpers\";\nimport {\n CharacterImport,\n CharacterImporterTool,\n fromPathbuilder,\n ImportedFeatSource,\n ImportedSpellcastingSource,\n isCharacterCategory,\n} from \"..\";\n\nasync function importData(this: CharacterImporterTool, html: HTMLElement, actor: CharacterPF2e, fromFile: boolean) {\n const codeOrFile = fromFile ? await importFromFilePopup.call(this) : await importFromUrlPopup.call(this, actor);\n if (!codeOrFile) return;\n\n this.addLoader(html);\n\n try {\n const code = codeOrFile instanceof File ? await importFromFile(codeOrFile) : await importFromUrl(codeOrFile);\n const parsed = R.isString(code) ? JSON.parse(code) : code;\n const currentSource = await this.getImportData(actor, true);\n const importedSource = await fromPathbuilder(parsed);\n\n if (importedSource.feats?.length && currentSource?.feats?.length) {\n const currentFeats = currentSource.feats;\n\n const featEntriesEqual = (a: ImportedFeatSource, b: ImportedFeatSource): boolean => {\n return (\n a.category === b.category &&\n a.level === b.level &&\n a.match === b.match &&\n a.value === b.value &&\n // make sure that both have a parent or neither\n !!a.parent === !!b.parent\n );\n };\n\n for (const feat of importedSource.feats) {\n const current = currentFeats.find((current) => {\n if (!featEntriesEqual(feat, current)) return false;\n // they both don't have parent\n if (!current.parent) return true;\n\n if (isCharacterCategory(current.parent) || isCharacterCategory(feat.parent)) {\n return current.parent === feat.parent;\n }\n\n const currentParent = currentFeats[Number(current.parent)];\n const importedParent = importedSource.feats![Number(feat.parent)];\n\n return featEntriesEqual(currentParent, importedParent);\n });\n\n if (current?.override) {\n feat.override = current.override;\n }\n }\n }\n\n if (importedSource.containers?.length && currentSource?.containers?.length) {\n for (const container of importedSource.containers) {\n const current = currentSource.containers.find((current) => {\n return current.identifier === container.identifier;\n });\n\n if (current?.override) {\n container.override = current.override;\n }\n }\n }\n\n if (importedSource.equipments?.length && currentSource?.equipments?.length) {\n for (const equipment of importedSource.equipments) {\n const current = currentSource.equipments.find((current) => {\n return (\n current.container === equipment.container &&\n current.match === equipment.match &&\n current.type === equipment.type &&\n current.value === equipment.value\n );\n });\n\n if (current?.override) {\n equipment.override = current.override;\n }\n }\n }\n\n const spellcastingEntriesEqual = (a: ImportedSpellcastingSource, b: ImportedSpellcastingSource): boolean => {\n return a.attribute === b.attribute && a.name === b.name && a.tradition === b.tradition && a.type === b.type;\n };\n\n if (importedSource.spellcasting?.length && currentSource?.spellcasting?.length) {\n for (const entry of importedSource.spellcasting) {\n const current = currentSource.spellcasting.find((current) => {\n return spellcastingEntriesEqual(current, entry);\n });\n\n if (current?.selected) {\n entry.selected = current.selected;\n }\n }\n }\n\n if (importedSource.spells?.length && currentSource?.spells?.length) {\n for (const spell of importedSource.spells) {\n const current = currentSource.spells.find((current) => {\n if (current.match !== spell.match || current.rank !== spell.rank || current.value !== spell.value)\n return false;\n\n const currentParent = currentSource.spellcasting?.find((entry) => {\n return entry.identifier === current.parent;\n });\n\n const parent = importedSource.spellcasting?.find((entry) => {\n return entry.identifier === spell.parent;\n });\n\n return currentParent && parent && spellcastingEntriesEqual(currentParent, parent);\n });\n\n if (current?.override) {\n spell.override = current.override;\n }\n }\n }\n\n const mergedSource = foundry.utils.mergeObject(currentSource ?? {}, importedSource);\n const merged = await CharacterImport.fromSource(mergedSource, true);\n\n await this.setImportDataAndCode(actor, merged, R.isNumber(codeOrFile) ? codeOrFile : undefined);\n this.localize.info(\"import.success\");\n } catch (error) {\n console.error(error);\n }\n}\n\nfunction importFromFile(file: File): Promise {\n return foundry.utils.readTextFromFile(file);\n}\n\nasync function importFromFilePopup(this: CharacterImporterTool): Promise {\n const result = await waitDialog<{ file: File }>({\n i18n: this.path(\"import.file\"),\n content: ``,\n });\n\n return result ? result.file : null;\n}\n\nfunction importFromUrl(code: number): Promise {\n return foundry.utils.fetchJsonWithTimeout(`https://pathbuilder2e.com/json.php?id=${code}`);\n}\n\nasync function importFromUrlPopup(this: CharacterImporterTool, actor: CharacterPF2e): Promise {\n const code = this.getFlag(actor, \"code\");\n\n const result = await waitDialog<{ code: number }>({\n i18n: this.path(\"import.url\"),\n content: ``,\n });\n\n return result ? result.code : null;\n}\n\nexport { importData };\n", "import {\n AttributeString,\n getPhysicalItemTypes,\n ItemType,\n R,\n SPELLCASTING_CATEGORIES,\n z,\n zAttribute,\n zDocumentId,\n ZeroToFour,\n ZeroToTen,\n zForeignItem,\n zRange,\n} from \"foundry-helpers\";\n\nconst ANCESTRY_KEYS = [\"boosts\", \"flaws\", \"locked\"] as const;\nconst ATTRIBUTE_KEYS = [\"str\", \"dex\", \"con\", \"int\", \"wis\", \"cha\"] as const;\nconst ATTRIBUTE_LEVELS = [\"1\", \"5\", \"10\", \"15\", \"20\"] as const;\nconst CHARACTER_CATEGORIES = [\"ancestry\", \"heritage\", \"background\", \"class\"] as const;\n\nconst zBoosts = z.array(z.enum(ATTRIBUTE_KEYS)).default([]);\n\nfunction zBoostsRecord(keys: ReadonlyArray) {\n return z.record(z.enum(keys), zBoosts).default(R.fromKeys(keys, () => []));\n}\n\nfunction zImportedEntry(type: T) {\n return z.object({\n match: zForeignItem(type, false),\n override: zForeignItem(type, false).optional(),\n value: z.string().trim(),\n });\n}\n\nconst zAttributes = z\n .object({\n ancestry: zBoostsRecord(ANCESTRY_KEYS),\n background: zBoosts,\n class: zBoosts,\n levels: zBoostsRecord(ATTRIBUTE_LEVELS),\n values: z.record(z.enum(ATTRIBUTE_KEYS), z.number().multipleOf(1)).default(R.fromKeys(ATTRIBUTE_KEYS, () => 0)),\n })\n .default({\n ancestry: R.fromKeys(ANCESTRY_KEYS, () => []),\n background: [],\n class: [],\n levels: R.fromKeys(ATTRIBUTE_LEVELS, () => []),\n values: R.fromKeys(ATTRIBUTE_KEYS, () => 0),\n });\n\nfunction zFeat() {\n const categories = [...R.keys(CONFIG.PF2E.featCategories), \"archetype\"] as const;\n\n return zImportedEntry(\"feat\").extend({\n awarded: z.boolean().default(false),\n extra: z.boolean().default(false),\n level: z.number().min(1).multipleOf(1).default(1),\n category: z.enum(categories),\n parent: z\n .custom((value) => {\n if (!R.isString(value) || !value.trim()) return false;\n return isCharacterCategory(value) || !isNaN(Number(value));\n })\n .optional(),\n });\n}\n\nconst zContainer = zImportedEntry(\"backpack\").extend({\n identifier: z.string(),\n quantity: z.number().min(1).multipleOf(1).default(1),\n});\n\nfunction zEquipment() {\n const types = getPhysicalItemTypes();\n\n return zImportedEntry(\"physical\").extend({\n container: z.string().nonempty().optional(),\n quantity: z.number().min(1).multipleOf(1).default(1),\n type: z.enum(types).default(\"equipment\"),\n });\n}\n\nconst zProficiencyRank = zRange(0, 4);\nconst zSpellRank = zRange(0, 10);\n\nfunction zSkills() {\n return z\n .record(z.enum(R.keys(CONFIG.PF2E.skills)), zProficiencyRank)\n .default(R.mapValues(CONFIG.PF2E.skills, () => 0 as ZeroToFour));\n}\n\nconst zLore = z.object({\n label: z.string().nonempty(),\n rank: zProficiencyRank,\n});\n\nfunction zCurrencies() {\n return z\n .record(z.enum(R.keys(CONFIG.PF2E.currencies)), z.number().min(0).multipleOf(1))\n .default(R.mapValues(CONFIG.PF2E.currencies, () => 0));\n}\n\nconst zSpell = zImportedEntry(\"spell\").extend({\n parent: z.string(),\n rank: zSpellRank,\n});\n\nfunction zSpellcastingEntry() {\n return z.object({\n attribute: zAttribute(),\n identifier: z.string(),\n name: z.string().nonempty(),\n selected: zDocumentId().nullable().default(null),\n slots: z.tuple(R.times(11, () => z.number().min(0).multipleOf(1).default(0))),\n tradition: z.enum(R.keys(CONFIG.PF2E.magicTraditions)),\n type: z.enum(SPELLCASTING_CATEGORIES),\n });\n}\n\nfunction zCharacterImport() {\n return z.object({\n age: z.string().default(\"\"),\n alternativeBoosts: z.boolean().default(false),\n attributes: zAttributes,\n containers: z.array(zContainer).prefault([]),\n currencies: zCurrencies(),\n equipments: z.array(zEquipment()).prefault([]),\n feats: z.array(zFeat()).prefault([]),\n gender: z.string().default(\"\"),\n languages: z.array(z.enum(R.keys(CONFIG.PF2E.languages))).prefault([]),\n level: z.number().min(1).multipleOf(1).default(1),\n lores: z.array(zLore).prefault([]),\n name: z.string().default(\"\"),\n skills: zSkills(),\n spellcasting: z.array(zSpellcastingEntry()).prefault([]),\n spells: z.array(zSpell).prefault([]),\n ...R.fromKeys(CHARACTER_CATEGORIES, (category) => zImportedEntry(category).prefault({} as any)),\n });\n}\n\nfunction getEntrySelection(entry: T): Exclude | null {\n return (entry.override ?? entry.match ?? null) as Exclude | null;\n}\n\nfunction isCharacterCategory(value: unknown): value is CharacterCategory {\n return R.isIncludedIn(value, CHARACTER_CATEGORIES);\n}\n\nfunction isAttributeKey(value: unknown): value is AttributeString {\n return R.isIncludedIn(value, ATTRIBUTE_KEYS);\n}\n\nfunction isAttributeLevel(value: unknown): value is AttributeLevel {\n return R.isIncludedIn(value, ATTRIBUTE_LEVELS);\n}\n\ntype AttributeLevel = (typeof ATTRIBUTE_LEVELS)[number];\n\ntype FeatEntryParent = CharacterCategory | `${number}`;\n\ntype CharacterCategory = (typeof CHARACTER_CATEGORIES)[number];\n\ntype CharacterImportSource = z.input>;\ntype CharacterImportData = z.output>;\n\ntype ImportedEntrySource = z.input>;\ntype ImportedEntry = z.output>;\n\ntype ImportedFeatSource = z.input>;\ntype ImportedFeatEntry = z.output>;\n\ntype ImportedContainerSource = z.input;\ntype ImportedContainerEntry = z.output;\n\ntype ImportedEquipmentSource = z.input>;\ntype ImportedEquipmentEntry = z.output>;\n\ntype ImportedSpellcastingSource = z.input>;\ntype ImportedSpellcastingEntry = z.output>;\n\ntype ImportedSpellSource = z.input;\ntype ImportedSpellEntry = z.output;\n\nexport {\n ATTRIBUTE_KEYS,\n CHARACTER_CATEGORIES,\n getEntrySelection,\n isAttributeKey,\n isAttributeLevel,\n isCharacterCategory,\n zCharacterImport,\n};\nexport type {\n AttributeLevel,\n CharacterCategory,\n CharacterImportData,\n CharacterImportSource,\n FeatEntryParent,\n ImportedContainerEntry,\n ImportedContainerSource,\n ImportedEntry,\n ImportedEntrySource,\n ImportedEquipmentEntry,\n ImportedEquipmentSource,\n ImportedFeatEntry,\n ImportedFeatSource,\n ImportedSpellcastingEntry,\n ImportedSpellcastingSource,\n ImportedSpellEntry,\n ImportedSpellSource,\n};\n", "import { getPhysicalItemTypes, ItemPF2e, PhysicalItemType, R, ZodDocument } from \"foundry-helpers\";\nimport {\n CharacterCategory,\n CharacterImportData,\n CharacterImportSource,\n ImportedEntry,\n isCharacterCategory,\n isEquipmentEntry,\n zCharacterImport,\n} from \".\";\n\nclass CharacterImport extends ZodDocument> {\n static async fromSource(source: CharacterImportSource, strict: true): Promise;\n static async fromSource(source: CharacterImportSource, strict?: boolean): Promise;\n static async fromSource(source: CharacterImportSource, strict = false) {\n const data = strict\n ? await zCharacterImport().decodeAsync(source)\n : (await zCharacterImport().safeDecodeAsync(source)).data;\n return data ? new CharacterImport(data) : undefined;\n }\n\n getImportedEntry(itemType: ImportItemType, index: number): ImportedEntry | undefined {\n return isCharacterCategory(itemType) ? this[itemType] : this.#getEntries(itemType).at(index);\n }\n\n updateEntryOverride(itemType: string, value: ItemPF2e | null, index: number): boolean {\n if (isCharacterCategory(itemType)) {\n return this.#updateCoreOverride(itemType, value);\n } else if (R.isIncludedIn(itemType, [\"feat\", \"spell\"] as const) || isPhysicalCategory(itemType)) {\n return this.#updateIndexedEntryOverride(itemType, index, value);\n }\n return false;\n }\n\n encode() {\n return super.encode(zCharacterImport());\n }\n\n #updateCoreOverride(key: CharacterCategory, value: ItemPF2e | null): boolean {\n if (value === null || this[key].match === value) {\n delete this[key].override;\n } else {\n this[key].override = value as any;\n }\n return true;\n }\n\n #updateIndexedEntryOverride(\n itemType: Exclude,\n index: number,\n value: ItemPF2e | null,\n ): boolean {\n const entries = this.#getEntries(itemType);\n const entry = entries.at(index);\n if (!entry) return false;\n\n if (value === null || entry.match?.uuid === value.uuid) {\n delete entry.override;\n } else {\n entry.override = value as any;\n\n // we want to allow swapping types if necessary, mostly because \"equipment\" is used as default for unmatched\n if (isEquipmentEntry(entry)) {\n entry.type = value.type as PhysicalItemType;\n }\n }\n\n return true;\n }\n\n #getEntries(itemType: Exclude): ImportedEntry[] {\n switch (itemType) {\n case \"container\":\n return this.containers;\n case \"feat\":\n return this.feats;\n case \"spell\":\n return this.spells;\n default:\n return isPhysicalCategory(itemType) ? this.equipments : [];\n }\n }\n}\n\ninterface CharacterImport extends CharacterImportData {}\n\nfunction isPhysicalCategory(value: unknown): value is PhysicalItemType | \"container\" {\n const physicalTypes = getPhysicalItemTypes();\n return R.isIncludedIn(value, [\"container\", ...physicalTypes]);\n}\n\ntype ImportItemType = CharacterCategory | PhysicalItemType | \"container\" | \"feat\" | \"spell\";\n\nexport { CharacterImport, isPhysicalCategory };\nexport type { ImportItemType };\n", "import {\n AttributeString,\n CompendiumIndexData,\n FeatOrFeatureCategory,\n ItemUUID,\n MagicTradition,\n PhysicalItemType,\n R,\n SPELLCASTING_CATEGORIES,\n SpellcastingCategory,\n SYSTEM,\n valueBetween,\n ZeroToTen,\n} from \"foundry-helpers\";\nimport { CharacterCategory } from \"..\";\n\nconst CORE_PACKS: Record = {\n ancestry: [\"ancestries\", \"ancestries\"],\n background: [\"backgrounds\", \"backgrounds\"],\n class: [\"classes\", \"classes\"],\n heritage: [\"heritages\", \"heritages\"],\n};\n\nconst FEAT_PACKS: PartialRecord = {\n ancestryfeature: [\"ancestryfeatures\", \"ancestry-features\"],\n classfeature: [\"classfeatures\", \"class-features\"],\n} as const;\n\nconst EQUIPMENT_PACK = [\"equipment-srd\", \"equipment\"] as const;\nconst FEATS_PACK = [\"feats-srd\", \"feats\"] as const;\nconst SPELLS_PACK = [\"spells-srd\", \"spells\"] as const;\n\nasync function getIndexFromPack(\n value: string,\n packNames: readonly [string, string],\n): Promise {\n if (!R.isTruthy(value)) return null;\n\n // both anachronism modules use the sf2e naming for packs\n const [systemName, moduleName] = SYSTEM.id === \"pf2e\" ? packNames : [packNames[1], packNames[1]];\n const packs = R.filter([SYSTEM.getSystemPack(systemName), SYSTEM.getAnachronismPack(moduleName)], R.isTruthy);\n\n for (const pack of packs) {\n const slug = SYSTEM.sluggify(value);\n const collection = await pack.getIndex({ fields: [\"system.slug\"] });\n const entry = collection.find((entry) => entry.system?.slug === slug);\n\n if (entry) {\n return entry;\n }\n }\n\n return null;\n}\n\nasync function getCoreUuidFromPack(value: string, category: CharacterCategory): Promise {\n const entry = await getIndexFromPack(value, CORE_PACKS[category]);\n return (entry?.uuid ?? null) as ItemUUID | null;\n}\n\nasync function getFeatUuidFromPack(\n value: string,\n category: FeatOrFeatureCategory | \"archetype\",\n): Promise {\n const pack = FEAT_PACKS[category] ?? FEATS_PACK;\n const entry = await getIndexFromPack(value, pack);\n return (entry?.uuid ?? null) as ItemUUID | null;\n}\n\nasync function getEquipmentDataFromPack(value: string): Promise<{ type: PhysicalItemType; uuid: ItemUUID | null }> {\n const entry = await getIndexFromPack(value, EQUIPMENT_PACK);\n return {\n type: (entry?.type ?? \"equipment\") as PhysicalItemType,\n uuid: (entry?.uuid ?? null) as ItemUUID | null,\n };\n}\n\nasync function getSpellUuidFromPack(value: string): Promise {\n const entry = await getIndexFromPack(value, SPELLS_PACK);\n return (entry?.uuid ?? null) as ItemUUID | null;\n}\n\nfunction isAttribute(value: unknown): value is AttributeString {\n return R.isString(value) && value in CONFIG.PF2E.abilities;\n}\n\nfunction isMagicTradition(value: unknown): value is MagicTradition {\n return R.isString(value) && value in CONFIG.PF2E.magicTraditions;\n}\n\nfunction isSpellcastingCategory(value: unknown): value is SpellcastingCategory {\n return R.isString(value) && R.isIncludedIn(value, SPELLCASTING_CATEGORIES);\n}\n\nfunction isSpellRank(value: unknown): value is ZeroToTen {\n return R.isNumber(value) && valueBetween(value, 0, 10);\n}\n\nexport {\n getCoreUuidFromPack,\n getEquipmentDataFromPack,\n getFeatUuidFromPack,\n getSpellUuidFromPack,\n isAttribute,\n isMagicTradition,\n isSpellcastingCategory,\n isSpellRank,\n};\n", "import {\n AncestryPF2e,\n AttributeString,\n FeatOrFeatureCategory,\n OneToTen,\n R,\n SYSTEM,\n valueBetween,\n ZeroToFour,\n ZeroToTen,\n} from \"foundry-helpers\";\nimport {\n ATTRIBUTE_KEYS,\n AttributeLevel,\n CharacterCategory,\n CharacterImportSource,\n ImportedContainerSource,\n ImportedEntrySource,\n ImportedEquipmentSource,\n ImportedFeatSource,\n ImportedSpellcastingSource,\n ImportedSpellSource,\n isAttributeKey,\n isCharacterCategory,\n} from \"..\";\n\nimport {\n getCoreUuidFromPack,\n getEquipmentDataFromPack,\n getFeatUuidFromPack,\n getSpellUuidFromPack,\n isAttribute,\n isMagicTradition,\n isSpellcastingCategory,\n isSpellRank,\n} from \".\";\n\nconst EXTRA_FEAT_REGEX = /(?:[a-z0-9]+-){4}[a-z0-9]+/i;\n\nconst BACKPACK_UUID = \"Compendium.pf2e.equipment-srd.Item.3lgwjrFEsQVKzhh7\";\nconst SPACIOUS_POUCH_UUID = \"Compendium.pf2e.equipment-srd.Item.jaEEvuQ32GjAa8jy\";\n\nconst FEAT_CATEGORIES: Record = {\n \"ancestry-feat\": \"ancestry\",\n ancestry: \"ancestryfeature\",\n \"awarded-feat\": \"bonus\",\n \"archetype-feat\": \"archetype\",\n // \"\": \"calling\",\n \"class-feat\": \"class\",\n class: \"classfeature\",\n // \"\": \"curse\",\n // \"\": \"deityboon\",\n \"general-feat\": \"general\",\n // \"\": \"pfsboon\",\n \"skill-feat\": \"skill\",\n};\n\nasync function fromPathbuilder(raw: unknown): Promise {\n const data = raw && R.isPlainObject(raw) && R.isPlainObject(raw.build) ? raw.build : {};\n const classe = await parseCoreEntry(data, \"class\");\n const classParentKey = classe ? `${SYSTEM.sluggify(classe.value)}-feat` : null;\n\n type FeatSourcePromise = Promise<(ImportedFeatSource & { childEntry?: string; parentEntry?: string }) | undefined>;\n\n const featsPromises = R.map(R.isArray(data.feats) ? data.feats : [], async (entry, i, feats): FeatSourcePromise => {\n if (!R.isArray(entry)) return;\n\n const [value, _, categoryValue, level, child, choice, parent] = entry;\n if (!R.isString(value) || !R.isString(categoryValue) || !R.isNumber(level)) return;\n\n const sluggifiedCategory = SYSTEM.sluggify(categoryValue);\n const categoryK = sluggifiedCategory === classParentKey ? \"class\" : sluggifiedCategory;\n const category = FEAT_CATEGORIES[categoryK];\n if (!category) return;\n\n const awarded = categoryK === \"awarded-feat\";\n const hasParent = choice === \"childChoice\" && R.isString(parent);\n const foundParent = hasParent\n ? R.findLast(feats.slice(0, i), (feat): feat is RawFeatEntry => {\n return R.isArray(feat) && feat[5] === \"parentChoice\" && feat[4] === parent;\n })\n : undefined;\n\n const parentCategory = foundParent ? SYSTEM.sluggify(foundParent[2]) : \"\";\n const parentIsCore = isCharacterCategory(parentCategory);\n\n const featureMatch = awarded ? await getFeatUuidFromPack(value, \"classfeature\") : null;\n const match = featureMatch ?? (await getFeatUuidFromPack(value, category));\n\n return {\n awarded,\n extra: !awarded && !hasParent && R.isString(child) && EXTRA_FEAT_REGEX.test(child),\n level: Math.clamp(level, 1, 20) as OneToTen,\n match,\n category: featureMatch ? \"classfeature\" : category,\n value,\n parent: parentIsCore ? parentCategory : undefined,\n childEntry: choice === \"parentChoice\" && R.isString(child) ? child : undefined,\n parentEntry: hasParent && !parentIsCore ? parent : undefined,\n };\n });\n\n // we need to process feats in 2 steps because we want to use index as parent and we need to filter out first\n const feats = R.pipe(\n await Promise.all(featsPromises),\n R.filter(R.isTruthy),\n R.forEach((feat, i, feats) => {\n if (!feat.parentEntry) return;\n\n const index = feats.slice(0, i).findLastIndex((x) => {\n return x.level === feat.level && x.childEntry === feat.parentEntry;\n });\n\n if (R.isNumber(index)) {\n feat.parent = String(index) as `${number}`;\n }\n }),\n );\n\n const getBoosts = (boosts: unknown): AttributeString[] => {\n if (!R.isArray(boosts)) return [];\n\n return R.pipe(\n boosts,\n R.filter((v) => R.isString(v)),\n R.map((v) => v.toLowerCase()),\n R.filter(isAttributeKey),\n );\n };\n\n const rawBoosts = foundry.utils.getProperty(data, \"abilities.breakdown.mapLevelledBoosts\");\n const levelsBoosts = R.pipe(\n R.isPlainObject(rawBoosts) ? rawBoosts : {},\n R.entries(),\n R.map(([key, boosts]): [AttributeLevel, AttributeString[]] | undefined => {\n const actualLevel = Number(key);\n if (!R.isNumber(actualLevel) || !valueBetween(actualLevel, 1, 20)) return;\n\n const level = actualLevel === 1 ? 1 : Math.ceil(actualLevel / 5) * 5;\n const attributeLevel = String(level) as AttributeLevel;\n\n return [attributeLevel, getBoosts(boosts)];\n }),\n R.filter(R.isTruthy),\n R.reduce(\n (acc, [level, boosts]) => {\n acc[level] ??= [];\n acc[level].push(...boosts);\n return acc;\n },\n {} as Record,\n ),\n );\n\n const getBoostsAtPath = (path: BoostsPath): AttributeString[] => {\n const boosts = foundry.utils.getProperty(data, `abilities.breakdown.${path}`);\n return getBoosts(boosts);\n };\n\n const attributes = R.pipe(\n ATTRIBUTE_KEYS,\n R.map((attr) => {\n const raw = foundry.utils.getProperty(data, `abilities.${attr}`);\n const value = R.isNumber(raw) ? raw : 10;\n const mod = Math.floor((value - 10) / 2);\n\n return [attr, mod] as const;\n }),\n R.fromEntries(),\n );\n\n const skills = R.mapValues(CONFIG.PF2E.skills, (_, slug) => {\n const rank = foundry.utils.getProperty(data, `proficiencies.${slug}`);\n return parseSkillRank(rank);\n });\n\n const lores = R.pipe(\n R.isArray(data.lores) ? data.lores : [],\n R.map((entry) => {\n if (!R.isArray(entry)) return;\n\n const [label, rank] = entry;\n return R.isString(label) ? { label, rank: parseSkillRank(rank) } : undefined;\n }),\n R.filter(R.isTruthy),\n );\n\n const currencies = R.mapValues(CONFIG.PF2E.currencies, (_, slug) => {\n const value = foundry.utils.getProperty(data, `money.${slug}`);\n return R.isNumber(value) ? value : 0;\n });\n\n const containersPromises = R.map(\n R.entries(R.isPlainObject(data.equipmentContainers) ? data.equipmentContainers : {}),\n async ([identifier, entry]): Promise => {\n if (!R.isPlainObject(entry) || !(\"containerName\" in entry) || !R.isString(entry.containerName)) return;\n\n return {\n identifier,\n match: entry.bagOfHolding ? SPACIOUS_POUCH_UUID : BACKPACK_UUID,\n value: entry.containerName,\n };\n },\n );\n\n const containers = R.filter(await Promise.all(containersPromises), R.isTruthy);\n const containersIdentifiers = R.map(containers, R.prop(\"identifier\"));\n const containersNames = R.map(containers, R.prop(\"value\"));\n\n const equipmentsPromises = R.map(\n R.isArray(data.equipment) ? data.equipment : [],\n async (entry): Promise => {\n if (!R.isArray(entry)) return;\n\n const [name, quantity, identifier] = entry;\n if (!R.isString(name) || !R.isNumber(quantity) || !R.isString(identifier)) return;\n if (R.isIncludedIn(name, containersNames)) return;\n\n const match = await getEquipmentDataFromPack(name);\n\n return {\n container: R.isIncludedIn(identifier, containersIdentifiers) ? identifier : undefined,\n match: match.uuid,\n quantity: Math.max(quantity, 1),\n type: match.type,\n value: name,\n };\n },\n );\n\n const weaponsAndArmorsPromises = R.map(\n [...(R.isArray(data.weapons) ? data.weapons : []), ...(R.isArray(data.armor) ? data.armor : [])],\n async (entry): Promise => {\n if (!R.isPlainObject(entry)) return;\n\n const { name, qty } = entry;\n if (!R.isString(name) || !R.isNumber(qty)) return;\n\n const match = await getEquipmentDataFromPack(name);\n\n return {\n match: match.uuid,\n quantity: Math.max(qty, 1),\n type: match.type,\n value: name,\n };\n },\n );\n\n const allSpells: ImportedSpellSource[] = [];\n\n const spellcastingPromises = R.map(\n R.isArray(data.spellCasters) ? data.spellCasters : [],\n async (entry): Promise => {\n if (\n !R.isPlainObject(entry) ||\n !R.isString(entry.name) ||\n !isAttribute(entry.ability) ||\n !isMagicTradition(entry.magicTradition) ||\n !isSpellcastingCategory(entry.spellcastingType)\n )\n return;\n\n const identifier = foundry.utils.randomID();\n\n const spellsSlotsPromises = R.map(\n R.isArray(entry.spells) ? entry.spells : [],\n async (spellsEntry): Promise => {\n if (!R.isPlainObject(spellsEntry) || !isSpellRank(spellsEntry.spellLevel)) return;\n return parseSpells(spellsEntry.list, identifier, spellsEntry.spellLevel);\n },\n );\n\n const spells = R.filter(await Promise.all(spellsSlotsPromises), R.isTruthy).flat();\n\n if (spells.length) {\n allSpells.push(...spells);\n } else {\n return;\n }\n\n const perDay = R.isArray(entry.perDay) ? entry.perDay : [];\n const slots = R.times(11, (slot) => {\n const value = perDay.at(slot);\n return R.isNumber(value) && value >= 0 ? value : 0;\n });\n\n return {\n attribute: entry.ability as AttributeString,\n identifier,\n name: entry.name,\n slots,\n tradition: entry.magicTradition,\n type: entry.innate === true ? \"innate\" : entry.spellcastingType,\n };\n },\n );\n\n const focusPromises = R.pipe(\n R.isPlainObject(data.focus) ? data.focus : {},\n R.entries(),\n R.map(async ([tradition, entry]) => {\n if (!isMagicTradition(tradition) || !R.isPlainObject(entry)) return;\n\n const entries = R.pipe(\n R.entries(entry),\n R.map(async ([attribute, spellcastingEntry]): Promise => {\n if (!isAttribute(attribute) || !R.isPlainObject(spellcastingEntry)) return;\n\n const identifier = foundry.utils.randomID();\n const spells = [\n ...(await parseSpells(spellcastingEntry.focusCantrips, identifier, 1)),\n ...(await parseSpells(spellcastingEntry.focusSpells, identifier, 1)),\n ];\n\n if (spells.length) {\n allSpells.push(...spells);\n } else {\n return;\n }\n\n return {\n attribute,\n identifier,\n name: game.i18n.localize(\"PF2E.Focus.Spells\"),\n slots: [],\n tradition,\n type: \"focus\",\n };\n }),\n );\n\n return R.filter(await Promise.all(entries), R.isTruthy);\n }),\n );\n\n const ritualsPromises = R.pipe(\n R.isArray(data.rituals) ? data.rituals : [],\n R.map(async (entry): Promise => {\n if (!R.isString(entry)) return;\n\n return {\n match: await getSpellUuidFromPack(entry),\n parent: \"rituals\",\n value: entry,\n };\n }),\n );\n\n allSpells.push(...R.filter(await Promise.all(ritualsPromises), R.isTruthy));\n\n const languageKeys = R.keys(CONFIG.PF2E.languages);\n const languages = R.pipe(\n R.isArray(data.languages) ? data.languages : [],\n R.map((entry) => R.isString(entry) && SYSTEM.sluggify(entry)),\n R.filter((entry): entry is string => R.isIncludedIn(entry, languageKeys)),\n );\n\n const ancestry = await parseCoreEntry(data, \"ancestry\");\n const ancestryFlaws = getBoostsAtPath(\"ancestryFlaws\");\n const ancestryLockedBoosts = getBoostsAtPath(\"ancestryBoosts\");\n\n return {\n age: R.isString(data.age) ? data.age : undefined,\n alternativeBoosts: await alternativeBoosts(ancestry, ancestryFlaws, ancestryLockedBoosts),\n ancestry,\n attributes: {\n ancestry: {\n boosts: getBoostsAtPath(\"ancestryFree\"),\n flaws: ancestryFlaws,\n locked: ancestryLockedBoosts,\n },\n background: getBoostsAtPath(\"backgroundBoosts\"),\n class: getBoostsAtPath(\"classBoosts\"),\n levels: levelsBoosts,\n values: attributes,\n },\n background: await parseCoreEntry(data, \"background\"),\n class: classe,\n containers,\n currencies,\n equipments: R.filter(await Promise.all([...weaponsAndArmorsPromises, ...equipmentsPromises]), R.isTruthy),\n feats: feats,\n gender: R.isString(data.gender) ? data.gender : undefined,\n heritage: await parseCoreEntry(data, \"heritage\"),\n languages,\n level: R.isNumber(data.level) ? data.level : undefined,\n lores,\n name: R.isString(data.name) ? data.name : \"\",\n skills,\n spellcasting: [\n ...R.filter(await Promise.all(spellcastingPromises), R.isTruthy),\n ...R.filter(await Promise.all(focusPromises), R.isTruthy).flat(),\n ],\n spells: allSpells,\n };\n}\n\nasync function alternativeBoosts(\n ancestry: ParsedCoreEntry,\n ancestryFlaws: AttributeString[],\n ancestryLockedBoosts: AttributeString[],\n): Promise {\n const ancestryItem = ancestry.match ? await fromUuid(ancestry.match) : null;\n if (!ancestryItem) return false;\n\n return (\n (!!ancestryItem.lockedFlaws.length && !ancestryFlaws.length) ||\n (!!ancestryItem.lockedBoosts.length && !ancestryLockedBoosts.length)\n );\n}\n\nasync function parseSpells(list: unknown, parent: string, rank: ZeroToTen): Promise {\n const spellsPromises = R.map(\n R.isArray(list) ? list : [],\n async (spellName): Promise => {\n if (!R.isString(spellName)) return;\n return {\n match: await getSpellUuidFromPack(spellName),\n parent,\n rank,\n value: spellName,\n };\n },\n );\n return R.filter(await Promise.all(spellsPromises), R.isTruthy);\n}\n\nfunction parseSkillRank(value: unknown): ZeroToFour {\n const rank = R.isNumber(value) ? value / 2 : 0;\n return (valueBetween(rank, 0, 4) ? rank : 0) as ZeroToFour;\n}\n\nasync function parseCoreEntry(data: Record, key: CharacterCategory): Promise {\n const value = R.isString(data[key]) ? data[key] : \"\";\n return {\n value,\n match: await getCoreUuidFromPack(value, key),\n };\n}\n\ntype ParsedCoreEntry = WithRequired;\n\ntype RawFeatEntry = [\n string,\n null,\n string,\n number,\n string | undefined,\n \"childChoice\" | \"parentChoice\" | \"standardChoice\" | undefined,\n string | undefined | null,\n];\n\ntype BoostsPath = \"ancestryBoosts\" | \"ancestryFree\" | \"ancestryFlaws\" | \"backgroundBoosts\" | \"classBoosts\";\n\nexport { fromPathbuilder };\n", "import {\n addListenerAll,\n CharacterPF2e,\n CharacterSheetPF2e,\n CompendiumIndexData,\n confirmDialog,\n createHTMLElement,\n createToggleHook,\n htmlClosest,\n htmlQuery,\n ItemPF2e,\n ItemUUID,\n MODULE,\n R,\n renderCharacterSheets,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport {\n addCoreEventListeners,\n addDetailsEventListeners,\n addFeatsEventListeners,\n addInventoryEventListeners,\n addSkillsEventListeners,\n addSpellsEventListeners,\n CharacterImport,\n CharacterImportSource,\n EntryEventAction,\n importData,\n isPhysicalCategory,\n onEntryAction,\n prepareCoreTab,\n prepareDetailsTab,\n prepareFeatsTab,\n prepareInventoryTab,\n prepareSkillsTab,\n prepareSpellsTab,\n} from \".\";\n\nconst MENU = [\n { type: \"core\", icon: \"fa-solid fa-address-card\" },\n { type: \"skills\", icon: \"fa-solid fa-hand\" },\n { type: \"feats\", icon: \"fa-solid fa-medal\" },\n { type: \"spells\", icon: \"fa-solid fa-wand-magic-sparkles\" },\n { type: \"inventory\", icon: \"fa-solid fa-box-open\" },\n { type: \"details\", icon: \"fa-solid fa-book-reader\" },\n] as const;\n\nconst MENU_TYPES = R.map(MENU, ({ type }) => type);\n\nconst ENABLED_SETTING = [\"disabled\", \"gm\", \"all\"] as const;\n\nconst SHEET_MENU_CLASS = \"pf2e-toolbelt-character-importer\";\nconst SHEET_MENU_LOADER_CLASS = \"pf2e-toolbelt-character-importer-loader\";\n\nclass CharacterImporterTool extends ModuleTool {\n #loaded = false;\n #sheetRenderHook = createToggleHook(\"renderCharacterSheetPF2e\", this.#onRenderCharacterSheetPF2e.bind(this));\n\n get key(): \"characterImporter\" {\n return \"characterImporter\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: String,\n default: \"disabled\",\n choices: ENABLED_SETTING,\n scope: \"world\",\n onChange: async (value: ToolSettings[\"enabled\"]) => {\n const activate = value === \"all\" || (value === \"gm\" && game.user.isGM);\n\n this.#sheetRenderHook.toggle(activate);\n\n if (activate) {\n await this.#loadTemplates();\n }\n\n renderCharacterSheets();\n },\n },\n ];\n }\n\n init(isGM: boolean): void {\n const enabled = this.settings.enabled;\n const activate = enabled === \"all\" || (enabled === \"gm\" && isGM);\n\n if (activate) {\n this.#loadTemplates();\n }\n\n this.#sheetRenderHook.toggle(activate);\n }\n\n async getImportData(actor: CharacterPF2e, sourceOnly: true): Promise;\n async getImportData(actor: CharacterPF2e, sourceOnly?: boolean): Promise;\n async getImportData(actor: CharacterPF2e, sourceOnly?: boolean) {\n const source = this.getFlag(actor, \"data\");\n const model = await CharacterImport.fromSource(source ?? {});\n return sourceOnly ? model?.encode() : model;\n }\n\n setImportData(actor: CharacterPF2e, data: CharacterImport): Promise | undefined {\n const encoded = data.encode();\n return encoded ? this.setFlag(actor, \"data\", _replace(encoded)) : undefined;\n }\n\n setImportDataAndCode(\n actor: CharacterPF2e,\n data: CharacterImport,\n code: number | undefined,\n ): Promise | undefined {\n const encoded = data.encode();\n return encoded ? this.setFlag(actor, { code: code || _del, data: _replace(encoded) }) : undefined;\n }\n\n fullTemplatePath(...path: string[]): string {\n return MODULE.templatePath(this.templatePath(...path));\n }\n\n addLoader(html: HTMLElement) {\n this.removeSheetContent(html);\n\n if (htmlQuery(html, `.${SHEET_MENU_LOADER_CLASS}`)) return;\n\n const loader = createHTMLElement(\"div\", {\n classes: [SHEET_MENU_LOADER_CLASS],\n content: `
`,\n });\n\n htmlQuery(html, \".sheet-body\")?.appendChild(loader);\n }\n\n removeLoader(html: HTMLElement) {\n htmlQuery(html, `.${SHEET_MENU_LOADER_CLASS}`)?.remove();\n }\n\n async addSheetContent(html: HTMLElement, actor: CharacterPF2e) {\n this.addLoader(html);\n\n const data = await this.getImportData(actor);\n const context = await this.#prepareContext(actor, data);\n if (!this.getInMemory(actor, \"importing\")) return;\n\n const content = createHTMLElement(\"div\", {\n classes: [SHEET_MENU_CLASS],\n content: await this.render(\"sheet\", context),\n dataset: {\n tooltipDirection: \"UP\",\n },\n });\n\n this.removeLoader(html);\n this.#addEventListeners(html, content, actor);\n\n htmlQuery(html, \".sheet-body\")?.appendChild(content);\n }\n\n removeSheetContent(html: HTMLElement) {\n htmlQuery(html, `.${SHEET_MENU_CLASS}`)?.remove();\n }\n\n async #prepareContext(\n this: CharacterImporterTool,\n actor: CharacterPF2e,\n data: CharacterImport | undefined,\n ): Promise> {\n if (!data) {\n return {\n partial: (key: string) => this.fullTemplatePath(key),\n };\n }\n\n const tabs: ImportDataContext[\"tabs\"] = {\n core: await prepareCoreTab.call(this, actor, data),\n details: await prepareDetailsTab.call(this, actor, data),\n feats: await prepareFeatsTab.call(this, actor, data),\n inventory: await prepareInventoryTab.call(this, actor, data),\n skills: await prepareSkillsTab.call(this, actor, data),\n spells: await prepareSpellsTab.call(this, actor, data),\n };\n\n return {\n hasData: true,\n menu: MENU,\n partial: (key: string) => this.fullTemplatePath(key),\n tabs,\n };\n }\n\n async #loadTemplates(): Promise {\n if (this.#loaded) return;\n\n this.#loaded = true;\n\n const templates = MENU_TYPES.map((path) => this.fullTemplatePath(path));\n return foundry.applications.handlebars.loadTemplates(templates.flat());\n }\n\n #onRenderCharacterSheetPF2e(sheet: CharacterSheetPF2e, $html: JQuery) {\n if (!sheet.isEditable) return;\n\n const html = $html[0];\n const actor = sheet.actor;\n const levelEl = htmlQuery(html, \".char-header .char-level\");\n const cancelTooltip = this.localize(\"sheet.level.cancel\");\n const importTooltip = this.localize(\"sheet.level.import\");\n\n const btn = createHTMLElement(\"a\", {\n classes: [\"character-importer\"],\n content: `\n `,\n });\n\n if (this.getInMemory(actor, \"importing\")) {\n sheet.form.classList.add(\"importing-character\");\n this.addSheetContent(html, actor);\n }\n\n levelEl?.appendChild(btn);\n\n btn.addEventListener(\"click\", async () => {\n const importing = sheet.form.classList.toggle(\"importing-character\");\n\n if (importing) {\n this.setInMemory(actor, \"importing\", true);\n this.addSheetContent(html, actor);\n } else {\n this.deleteInMemory(actor, \"importing\");\n this.removeLoader(html);\n this.removeSheetContent(html);\n }\n });\n }\n\n #addEventListeners(html: HTMLElement, content: HTMLElement, actor: CharacterPF2e) {\n {\n const { key, scroll } = this.getInMemory(actor, \"tab\") ?? {};\n const isTabKey = R.isIncludedIn(key, MENU_TYPES);\n const tabKey = isTabKey ? key : MENU_TYPES[0];\n\n const nav = htmlQuery(content, `.menu .entry[data-tab=\"${tabKey}\"]`);\n const tab = htmlQuery(content, `.data[data-tab=\"${tabKey}\"]`);\n\n nav?.classList.add(\"selected\");\n tab?.classList.add(\"selected\");\n\n if (isTabKey && tab && R.isNumber(scroll) && scroll) {\n requestAnimationFrame(() => {\n tab.scrollTop = scroll;\n });\n }\n\n if (!isTabKey && tabKey) {\n this.setInMemory(actor, \"tab\", { key: tabKey });\n }\n }\n\n addListenerAll(content, \"[data-action]\", async (el) => {\n const action = el.dataset.action as EventAction;\n\n if (action.startsWith(\"entry-\")) {\n return onEntryAction.call(this, actor, el);\n }\n\n switch (action) {\n case \"delete-data\": {\n const confirm = await confirmDialog(this.path(\"deleteData\"));\n return confirm && this.unsetFlag(actor, \"data\");\n }\n\n case \"import-url\": {\n return importData.call(this, html, actor, false);\n }\n\n case \"import-file\": {\n return importData.call(this, html, actor, true);\n }\n\n case \"open-sheet\": {\n const item = await fromUuid(el.dataset.itemUuid ?? \"\");\n return item?.sheet.render(true);\n }\n\n case \"select-tab\": {\n const key = el.dataset.tab as ImportMenuType;\n const tabs = content.querySelectorAll(\"[data-tab]\");\n\n for (const tab of tabs) {\n tab.scrollTop = 0;\n tab.classList.toggle(\"selected\", tab.dataset.tab === key);\n }\n\n return this.setInMemory(actor, \"tab\", { key });\n }\n }\n });\n\n const onScroll = (el: HTMLElement) => {\n const key = el.dataset.tab as ImportMenuType;\n\n if (this.getInMemory(actor, \"tab.key\") === key) {\n this.setInMemory(actor, \"tab.scroll\", el.scrollTop);\n }\n };\n\n addListenerAll(content, \".data[data-tab]\", \"scroll\", foundry.utils.debounce(onScroll, 200));\n\n const onDrop = async (_: HTMLElement, event: DragEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n const entry = htmlClosest(event.target, \"[data-droppable][data-item-type]\");\n if (!entry) return;\n\n try {\n const dataString = event.dataTransfer?.getData(\"text/plain\");\n const dropData = JSON.parse(dataString ?? \"\");\n\n if (!R.isPlainObject(dropData) || dropData.type !== \"Item\" || !R.isString(dropData.uuid)) {\n throw MODULE.Error(\"invalid data type.\");\n }\n\n let itemType = R.isString(dropData.itemType)\n ? dropData.itemType\n : fromUuidSync(dropData.uuid, { strict: false })?.type;\n\n if (entry.dataset.itemType === \"container\" && itemType === \"backpack\") {\n itemType = \"container\";\n }\n\n if (\n isPhysicalCategory(entry.dataset.itemType) &&\n isPhysicalCategory(itemType) &&\n itemType !== \"backpack\"\n ) {\n itemType = entry.dataset.itemType;\n }\n\n if (!itemType || itemType !== entry.dataset.itemType) {\n throw MODULE.Error(\"invalid item type.\");\n }\n\n const data = await this.getImportData(actor);\n const item = await fromUuid(dropData.uuid as ItemUUID);\n\n if (!data || !item) {\n throw MODULE.Error(\"an error occured while processing import data.\");\n }\n\n if (data.updateEntryOverride(itemType, item, Number(entry.dataset.index))) {\n await this.setImportData(actor, data);\n }\n } catch (error) {\n console.error(error);\n }\n };\n\n addListenerAll(content, \".data\", \"drop\", onDrop, true);\n\n addCoreEventListeners.call(this, content, actor);\n addDetailsEventListeners.call(this, content, actor);\n addFeatsEventListeners.call(this, content, actor);\n addInventoryEventListeners.call(this, content, actor);\n addSkillsEventListeners.call(this, content, actor);\n addSpellsEventListeners.call(this, content, actor);\n }\n}\n\ntype EventAction = EntryEventAction | \"delete-data\" | \"import-url\" | \"import-file\" | \"open-sheet\" | \"select-tab\";\n\ntype InMemoryTab = {\n key: ImportMenuType;\n scroll?: number;\n};\n\ntype ImportDataContext = {\n hasData: true;\n menu: typeof MENU;\n partial: (key: string) => string;\n tabs: Record>;\n};\n\ntype ImportMenuType = (typeof MENU)[number][\"type\"];\n\ntype ToolSettings = {\n enabled: (typeof ENABLED_SETTING)[number];\n};\n\nexport { CharacterImporterTool };\n", "import {\n ActorPF2e,\n addListenerAll,\n CombatantPF2e,\n ConditionPF2e,\n createCustomCondition,\n DurationData,\n EncounterPF2e,\n R,\n} from \"foundry-helpers\";\nimport { ModuleToolApplication } from \"module-tool-application\";\nimport { ConditionManagerTool } from \".\";\n\nclass ConditionManager extends ModuleToolApplication {\n #label: string;\n #actor: ActorPF2e;\n #combat: EncounterPF2e | null;\n #combatant: CombatantPF2e | null;\n #origin: CombatantPF2e | null;\n #condition: ConditionPF2e;\n #counter: { value: number; default: number };\n #duration: DurationData;\n #unidentified: boolean;\n\n static DEFAULT_OPTIONS: DeepPartial = {\n id: \"pf2e-toolbelt-condition-manager\",\n };\n\n constructor(\n tool: ConditionManagerTool,\n condition: ConditionPF2e,\n options: DeepPartial = {},\n ) {\n super(tool, options);\n\n this.#label = \"\";\n this.#actor = condition.actor;\n this.#condition = condition;\n this.#combatant = this.#actor.combatant;\n this.#combat = this.#combatant?.encounter ?? null;\n this.#origin = this.#combat?.combatant ?? this.#combatant;\n this.#unidentified = false;\n\n this.#duration = {\n expiry: \"turn-start\",\n unit: \"rounds\",\n value: 1,\n };\n\n this.#counter = {\n value: condition.system.value.value ?? 1,\n default: condition.system.value.value ?? 1,\n };\n }\n\n get key(): string {\n return \"manager\";\n }\n\n get title(): string {\n return this.localize(\"title\", this.#condition._source);\n }\n\n get hasCounter(): boolean {\n return this.#condition.system.value.isValued;\n }\n\n get hasValue(): boolean {\n return ![\"unlimited\", \"encounter\"].includes(this.#duration.unit);\n }\n\n get effectLabel(): string {\n const base = game.i18n.localize(\"TYPES.Item.effect\");\n const label = `${base}: ${this.#condition.name}`;\n\n return this.#origin && this.#origin !== this.#combatant ? `${label} (${this.#origin.name})` : label;\n }\n\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\n const isGM = game.user.isGM;\n const anonLabel = `<${this.tool.localize(\"anonymous\")}>`;\n\n const labelPlaceholder = this.effectLabel;\n const label = {\n placeholder: labelPlaceholder,\n value: this.#label || labelPlaceholder,\n };\n\n const combatants = R.pipe(\n this.#combat?.combatants.contents ?? [],\n R.filter((combatant) => !!combatant.actor),\n R.map((combatant) => {\n return {\n value: combatant.id,\n label: isGM || combatant.playersCanSeeName ? combatant.name : anonLabel,\n };\n }),\n );\n\n const origin = combatants.length ? { combatants, selected: this.#origin!.id } : null;\n\n return {\n isGM,\n label,\n origin,\n hasValue: this.hasValue,\n duration: this.#duration,\n unidentified: this.#unidentified,\n timeUnits: CONFIG.PF2E.timeUnits,\n counter: this.hasCounter ? this.#counter : undefined,\n expiryOptions: [\n { value: \"turn-start\", label: \"PF2E.Item.Effect.Expiry.StartOfTurn\" },\n { value: \"turn-end\", label: \"PF2E.Item.Effect.Expiry.EndOfTurn\" },\n { value: \"round-end\", label: \"PF2E.Item.Effect.Expiry.EndOfRound\" },\n ],\n };\n }\n\n async _onClickAction(_event: PointerEvent, target: HTMLElement) {\n const action = target.dataset.action as \"add\" | \"cancel\";\n\n if (action === \"add\") {\n this.#createEffect();\n }\n\n this.close();\n }\n\n #createEffect() {\n const origin =\n this.#origin?.actor && this.#origin !== this.#combatant\n ? { actor: this.#origin.actor, token: this.#origin.token }\n : undefined;\n\n const effect = createCustomCondition({\n slug: this.#condition.slug,\n counter: this.#counter.value,\n duration: {\n unit: this.#duration.unit,\n expiry: this.#duration.expiry,\n value: this.#duration.value,\n origin,\n },\n name: this.#label || this.effectLabel,\n unidentified: this.#unidentified,\n });\n\n if (effect) {\n this.#actor.createEmbeddedDocuments(\"Item\", [effect]);\n }\n }\n\n protected _activateListeners(html: HTMLElement) {\n addListenerAll(html, \"[name]\", \"change\", (el: HTMLInputElement) => {\n const input = el.name as EventChangeName;\n\n if (input === \"label\") {\n this.#label = el.value.trim();\n } else if (input === \"origin\") {\n this.#origin = this.#combat?.combatants.get(el.value) ?? null;\n } else if (input === \"system.badge.value\") {\n const value = el.valueAsNumber;\n\n this.#counter.value = isNaN(value) ? this.#counter.default : Math.max(el.valueAsNumber, 1);\n } else if (input === \"system.duration.expiry\") {\n this.#duration.expiry = el.value as DurationData[\"expiry\"];\n } else if (input === \"system.duration.unit\") {\n const value = el.value as DurationData[\"unit\"];\n const isUnit = ![\"unlimited\", \"encounter\"].includes(value);\n\n this.#duration.unit = value;\n this.#duration.value = isUnit ? 1 : -1;\n this.#duration.expiry = isUnit ? \"turn-start\" : null;\n } else if (input === \"system.duration.value\") {\n this.#duration.value = Math.max(el.valueAsNumber || 0, 0);\n } else if (input === \"system.unidentified\") {\n this.#unidentified = el.checked;\n }\n\n this.render();\n });\n }\n}\n\ntype EventChangeName =\n | \"label\"\n | \"origin\"\n | \"system.badge.value\"\n | \"system.duration.unit\"\n | \"system.duration.expiry\"\n | \"system.duration.value\"\n | \"system.unidentified\";\n\ntype RenderContext = fa.ApplicationRenderContext & {\n isGM: boolean;\n duration: DurationData;\n unidentified: boolean;\n hasValue: boolean;\n origin: { combatants: { value: string; label: string }[]; selected: string } | null;\n timeUnits: typeof CONFIG.PF2E.timeUnits;\n counter: { value: number; default: number } | undefined;\n label: { value: string; placeholder: string };\n expiryOptions: {\n value: string;\n label: string;\n }[];\n};\n\nexport { ConditionManager };\n", "import { ActorPF2e, createToggleHook, createToggleKeybind, ItemPF2e, KeybindingActionConfig } from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { ConditionManager } from \".\";\n\nclass ConditionManagerTool extends ModuleTool {\n #preCreateItemHook = createToggleHook(\"preCreateItem\", this.#onPreCreateItem.bind(this));\n\n #manageKeybind = createToggleKeybind({\n name: \"manage\",\n onDown: () => {\n this.#preCreateItemHook.activate();\n },\n onUp: () => {\n this.#preCreateItemHook.disable();\n },\n });\n\n get key(): \"conditionManager\" {\n return \"conditionManager\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: (value) => {\n this.#manageKeybind.toggle(value);\n },\n },\n ];\n }\n\n get keybindsSchema(): KeybindingActionConfig[] {\n return [this.#manageKeybind.configs];\n }\n\n init(): void {\n if (this.settings.enabled) {\n this.#manageKeybind.activate();\n }\n }\n\n #onPreCreateItem(item: ItemPF2e) {\n if (item.isOfType(\"condition\") && item.actor) {\n new ConditionManager(this, item).render(true);\n return false;\n }\n }\n}\n\ntype ToolSettings = {\n enabled: boolean;\n};\n\nexport { ConditionManagerTool };\n", "import {\n ActorPF2e,\n CanvasPF2e,\n createEmitable,\n createToggleHook,\n createToggleKeybind,\n createToggleWrapper,\n DropCanvasData,\n ImageFilePath,\n isPrimaryUpdater,\n itemIsOfType,\n ItemPF2e,\n ItemUUID,\n KeybindingActionConfig,\n LootPF2e,\n LootSource,\n PhysicalItemPF2e,\n PhysicalItemType,\n positionTokenFromCoords,\n R,\n SYSTEM,\n TokenDocumentPF2e,\n TokenLightRuleElement,\n userIsGM,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { createTradeMessage, createTradeQuantityDialog, TradeQuantityDialogData } from \".\";\n\nclass DroppethTool extends ModuleTool {\n #deleteTokenHook = createToggleHook(\"deleteToken\", this.#onDeleteToken.bind(this));\n #dropCanvasDataHook = createToggleHook(\"dropCanvasData\", this.#onDropCanvasData.bind(this));\n\n #droppethItemEmitable = createEmitable(this.key, this.#droppethItem.bind(this));\n\n #onEmbeddedDocumentChangeWrapper = createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.Actor.documentClass.prototype._onEmbeddedDocumentChange\",\n this.#actorOnEmbeddedDocumentChange,\n { context: this },\n );\n\n #droppethKeybind = createToggleKeybind({\n name: \"droppeth\",\n editable: [{ key: \"ControlLeft\", modifiers: [] }],\n onDown: () => {\n this.#dropCanvasDataHook.activate();\n },\n onUp: () => {\n this.#dropCanvasDataHook.disable();\n },\n });\n\n static get DEFAULT_DATA(): { img: ImageFilePath; name: string } {\n return {\n img: SYSTEM.relativePath(\"icons/default-icons/backpack.svg\"),\n name: game.i18n.localize(\"TYPES.Actor.loot\"),\n };\n }\n\n get key(): \"droppeth\" {\n return \"droppeth\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: Boolean,\n default: false,\n scope: \"world\",\n onChange: () => {\n this._configurate();\n },\n },\n {\n key: \"light\",\n type: Boolean,\n default: true,\n scope: \"world\",\n },\n ];\n }\n\n get keybindsSchema(): KeybindingActionConfig[] {\n return [this.#droppethKeybind.configs];\n }\n\n get api(): Record {\n return {\n droppethRequest: (options: DroppethOptions) => {\n this.#droppethItemEmitable.call(options);\n },\n };\n }\n\n _configurate(): void {\n const enabled = this.settings.enabled;\n\n this.#droppethKeybind.toggle(enabled);\n\n if (userIsGM()) {\n this.#deleteTokenHook.toggle(enabled);\n this.#droppethItemEmitable.toggle(enabled);\n this.#onEmbeddedDocumentChangeWrapper.toggle(enabled);\n }\n }\n\n ready(): void {\n this._configurate();\n }\n\n isDroppethActor(actor: Maybe): actor is LootPF2e {\n return !!actor?.isOfType(\"loot\") && !!this.getFlag(actor, \"temporary\");\n }\n\n getDroppethActor(token: TokenDocumentPF2e): LootPF2e | null {\n const actor = token.actor;\n return this.isDroppethActor(actor) ? actor : null;\n }\n\n getDroppethToken(actor: LootPF2e): TokenDocumentPF2e | null {\n const uuid = this.getFlag(actor, \"tokenUuid\");\n return uuid ? (fromUuidSync(uuid, { strict: false }) as TokenDocumentPF2e) : null;\n }\n\n getDroppethFolder() {\n return (\n game.folders.getName(\"__Droppeth\") ??\n getDocumentClass(\"Folder\").create({ name: \"__Droppeth\", type: \"Actor\" })\n );\n }\n\n getLightSource(item?: PhysicalItemPF2e) {\n const itemRules = this.settings.light && item && item.quantity > 0 ? item.system.rules : undefined;\n const lightRule = itemRules?.find((rule): rule is TokenLightRuleElement => rule.key === \"TokenLight\");\n return new foundry.data.LightData(lightRule?.value as foundry.data.LightSource).toObject();\n }\n\n #actorOnEmbeddedDocumentChange(actor: ActorPF2e, wrapped: libWrapper.RegisterCallback) {\n wrapped();\n\n if (!this.isDroppethActor(actor) || !isPrimaryUpdater(actor)) return;\n\n (async () => {\n const token = this.getDroppethToken(actor);\n\n if (actor.inventory.size === 0) {\n token?.delete();\n return;\n }\n\n const onlyItem = R.pipe(\n actor.inventory.contents,\n R.filter((item) => !item.isInContainer),\n R.only(),\n );\n\n const { img, name } = onlyItem ?? DroppethTool.DEFAULT_DATA;\n\n const tokenUpdate: DeepPartial = {\n name,\n texture: {\n src: img,\n },\n light: this.getLightSource(onlyItem),\n };\n\n await actor.update({ img, name });\n await token?.update(tokenUpdate);\n })();\n }\n\n #onDeleteToken(token: TokenDocumentPF2e) {\n const actor = this.getDroppethActor(token);\n actor?.delete();\n }\n\n #onDropCanvasData(_canvas: CanvasPF2e, data: DropCanvasData): boolean {\n if (data.type !== \"Item\" || !R.isString(data.uuid)) {\n return true;\n }\n\n const item = fromUuidSync(data.uuid, { strict: false });\n if (!item || !itemIsOfType(item, \"physical\")) {\n return true;\n }\n\n (async () => {\n const options: DroppethOptions = {\n item,\n x: data.x,\n y: data.y,\n };\n\n if (!(item instanceof Item) || item.pack) {\n this.#droppethItemEmitable.call(options);\n return;\n }\n\n const tradeData = await this.#initiateTrade(item);\n\n if (tradeData) {\n options.quantity = tradeData.quantity;\n this.#droppethItemEmitable.call(options);\n }\n })();\n\n return false;\n }\n\n async #droppethItem(options: DroppethOptions, userId: string) {\n const error = (err: string) => {\n this.localize.error(`error.${err}`);\n };\n\n const scene = canvas.scene;\n\n if (!scene) {\n return error(\"no-scene\");\n }\n\n const item = options.item instanceof Item ? options.item : await fromUuid(options.item.uuid);\n\n if (!item) {\n return error(\"unknown\");\n }\n\n const allowedQuantity = item.quantity;\n\n if (allowedQuantity < 1) {\n return error(\"quantity\");\n }\n\n const owner = item.actor;\n const folder = await this.getDroppethFolder();\n const tokenId = foundry.utils.randomID();\n const tokenUuid = `${scene.uuid}.Token.${tokenId}`;\n const { name, img } = item;\n\n const actorSource: PreCreate = {\n type: \"loot\",\n name,\n folder: folder?.id,\n img,\n // item has no owner or is from the compendium so we add the source directly\n items: !owner || item.pack ? [item.toObject()] : undefined,\n ownership: {\n default: 3,\n [userId]: 3,\n },\n };\n\n this.setFlagProperties(actorSource, { temporary: true, tokenUuid });\n\n const actor = (await getDocumentClass(\"Actor\").create(actorSource)) as LootPF2e | undefined;\n\n if (!actor) {\n return error(\"actor\");\n }\n\n // we transfer the item from its owner to the newly created droppeth actor\n if (owner) {\n await item.actor?.transferItemToActor(actor, item as PhysicalItemPF2e, options.quantity ?? 1);\n }\n\n // we recover the main item (which is added first if container and its content)\n const mainItem = actor.inventory.contents[0];\n\n if (!mainItem) {\n await actor.delete();\n return error(\"unknown\");\n }\n\n const tokenSource: DeepPartial = {\n _id: tokenId,\n name,\n sort: Math.max(canvas.tokens.getMaxSort() + 1, 0),\n width: 0.5,\n height: 0.5,\n level: canvas.level?.id,\n texture: { src: img },\n ring: { enabled: false },\n light: this.getLightSource(item),\n };\n\n const tokenDocument = await actor.getTokenDocument(tokenSource, { parent: scene });\n const token = canvas.tokens.createObject(tokenDocument as any);\n const position = positionTokenFromCoords({ x: options.x, y: options.y }, token);\n\n token.destroy({ children: true });\n tokenDocument.updateSource(position);\n\n if (!canvas.dimensions.rect.contains(tokenDocument.x, tokenDocument.y)) {\n this.localize.error(\"error.out-of-bounds\");\n await actor.delete();\n return;\n }\n\n canvas.tokens.activate();\n await getDocumentClass(\"Token\").create(tokenDocument as any, { parent: canvas.scene, keepId: true });\n\n // no source actor so no exchange message needed\n if (!owner) return;\n\n createTradeMessage({\n item: mainItem,\n message: this.localize.path(\"message.content\", actor.inventory.size > 1 ? \"container\" : \"item\"),\n source: owner,\n subtitle: this.localize(\"message.subtitle\"),\n quantity: mainItem.quantity,\n userId,\n });\n }\n\n async #initiateTrade(item: PhysicalItemPF2e): Promise {\n if (item.quantity <= 0) {\n return null;\n }\n\n if (item.isOfType(\"backpack\") || item.quantity === 1) {\n return { quantity: 1, newStack: false };\n }\n\n return createTradeQuantityDialog({\n button: {\n action: \"droppeth\",\n icon: \"fa-solid fa-arrow-down-to-bracket\",\n label: this.localize(\"dialog.button\"),\n },\n item,\n prompt: this.localize(\"dialog.prompt\"),\n title: this.localize(\"dialog.title\", { item: item.name }),\n });\n }\n}\n\ntype DroppethOptions = {\n item: PhysicalItemPF2e | { type: PhysicalItemType; uuid: ItemUUID };\n x: number;\n y: number;\n quantity?: number;\n};\n\ntype ToolSettings = {\n enabled: boolean;\n light: boolean;\n};\n\nexport { DroppethTool };\n", "import {\n ActorPF2e,\n ChoiceSetRuleElement,\n ConditionPF2e,\n ConditionSource,\n createCreatureSheetWrapper,\n createEmitable,\n CreaturePF2e,\n CreatureSheetPF2e,\n DropCanvasItemData,\n EffectPF2e,\n EffectSource,\n EffectTrait,\n isAllyActor,\n isInstanceOf,\n ItemPF2e,\n userIsGM,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\n\nconst EFFECT_SETTING = [\"disabled\", \"ally\", \"all\"] as const;\n\nclass GivethTool extends ModuleTool {\n #givethEmitable = createEmitable(this.key, this.#givethEffect.bind(this));\n\n #handleDroppedItemWrapper = createCreatureSheetWrapper(\n \"MIXED\",\n \"_handleDroppedItem\",\n this.#creatureSheetHandleDroppedItem,\n { context: this },\n );\n\n get key(): \"giveth\" {\n return \"giveth\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"effect\",\n type: String,\n choices: EFFECT_SETTING,\n default: \"disabled\",\n scope: \"world\",\n onChange: () => {\n this.configurate();\n },\n },\n ];\n }\n\n get api(): Record {\n return {\n givethEffect: this.#handleGiveth.bind(this),\n canDropEffectOnActor: this.#shouldHandleEffectDrop.bind(this),\n };\n }\n\n ready(): void {\n this._configurate();\n }\n\n _configurate(): void {\n const effects = this.settings.effect !== \"disabled\";\n\n if (userIsGM()) {\n this.#givethEmitable.toggle(effects);\n } else {\n this.#handleDroppedItemWrapper.toggle(effects);\n }\n }\n\n #givethEffect({ actor, data, source }: GiveEffectOptions, _userId: string): any {\n /**\n * https://github.com/foundryvtt/pf2e/blob/1465f7190b2b8454094c50fa6d06e9902e0a3c41/src/module/actor/sheet/base.ts#L1224\n */\n if (source.type === \"condition\") {\n const value = data.value;\n if (typeof value === \"number\" && source.system.value.isValued) {\n source.system.value.value = value;\n }\n\n return actor.increaseCondition(source.system.slug, { value });\n }\n\n /**\n * https://github.com/foundryvtt/pf2e/blob/1465f7190b2b8454094c50fa6d06e9902e0a3c41/src/module/actor/sheet/base.ts#L1238\n */\n const { level, value, context } = data;\n if (typeof level === \"number\" && level >= 0) {\n source.system.level.value = Math.floor(level);\n }\n if (source.type === \"effect\" && source.system.badge?.type === \"counter\" && typeof value === \"number\") {\n source.system.badge.value = value;\n }\n source.system.context = context ?? null;\n const originItem = fromUuidSync(context?.origin.item ?? \"\", { strict: false });\n if (source.system.traits?.value.length === 0 && isInstanceOf(originItem, \"SpellPF2e\")) {\n const spellTraits: string[] = originItem.system.traits.value;\n const effectTraits = spellTraits.filter((t): t is EffectTrait => t in CONFIG.PF2E.effectTraits);\n source.system.traits.value.push(...effectTraits);\n }\n\n actor.sheet[\"_onDropItemCreate\"](new Item.implementation(source).clone().toObject());\n }\n\n #shouldHandleEffectDrop(item: ItemPF2e, actor: ActorPF2e): item is EffectPF2e | ConditionPF2e {\n return (\n item.isOfType(\"condition\", \"effect\") &&\n !actor.isOwner &&\n (this.settings.effect === \"all\" || isAllyActor(actor))\n );\n }\n\n async #handleGiveth(targetActor: CreaturePF2e, originalItem: EffectPF2e | ConditionPF2e, data: DropCanvasItemData) {\n if (originalItem.isOfType(\"condition\") || !originalItem.system.rules.some((rule) => rule.key === \"ChoiceSet\")) {\n return this.#givethEmitable.call({\n actor: targetActor,\n data,\n source: originalItem.toObject(),\n });\n }\n\n const RuleCls = game.pf2e.RuleElements.builtin.ChoiceSet as typeof ChoiceSetRuleElement;\n if (!RuleCls) return;\n\n const ItemCls = getDocumentClass(\"Item\");\n const item = new ItemCls(originalItem.toObject(), { parent: targetActor }) as ItemPF2e;\n const itemSource = item._source as EffectSource | ConditionSource;\n const itemUpdates: EmbeddedDocumentUpdateData[] = [];\n\n for (const [sourceIndex, source] of item.system.rules.entries()) {\n if (source.key !== \"ChoiceSet\") continue;\n\n try {\n const rule = new RuleCls(source, { parent: item, sourceIndex });\n const ruleSource = itemSource.system.rules[sourceIndex];\n\n await rule.preCreate({\n ruleSource,\n itemSource,\n tempItems: [],\n itemUpdates,\n operation: {},\n pendingItems: [],\n });\n } catch (error) {}\n }\n\n return this.#givethEmitable.call({\n actor: targetActor,\n data,\n source: itemSource,\n });\n }\n\n async #creatureSheetHandleDroppedItem(\n actorSheet: CreatureSheetPF2e,\n wrapped: libWrapper.RegisterCallback,\n event: DragEvent,\n originalItem: ItemPF2e,\n data: DropCanvasItemData,\n ): Promise {\n const targetActor = actorSheet.actor;\n\n if (!this.#shouldHandleEffectDrop(originalItem, targetActor)) {\n return wrapped(event, originalItem, data);\n }\n\n await this.#handleGiveth(targetActor, originalItem, data);\n\n return [originalItem];\n }\n}\n\ntype GiveEffectOptions = {\n actor: CreaturePF2e;\n data: DropCanvasItemData;\n source: EffectSource | ConditionSource;\n};\n\ntype ToolSettings = {\n effect: (typeof EFFECT_SETTING)[number];\n};\n\nexport { GivethTool };\n", "import { z, zDocumentUUID } from \"foundry-helpers\";\n\nconst zHeroAction = z.object({\n name: z.string().nonempty(),\n uuid: zDocumentUUID(),\n});\n\ntype HeroAction = z.output;\n\nexport { zHeroAction };\nexport type { HeroAction };\n", "import { ModuleToolApplication } from \"module-tool-application\";\nimport { HeroAction, HeroActionsTool, openDescriptionFromElement, TradeActor } from \".\";\nimport { addListener, DocumentUUID } from \"foundry-helpers\";\n\nclass TradeHeroAction extends ModuleToolApplication {\n #actions: HeroAction[];\n #others: TradeActor[];\n #resolve: TradeHeroResolve;\n #selected: string;\n\n static DEFAULT_OPTIONS: DeepPartial = {\n classes: [\"pf2e-toolbelt-heroActions-trade\"],\n position: {\n width: 600,\n },\n tag: \"form\",\n window: {\n contentClasses: [\"standard-form\"],\n },\n };\n\n static wait(\n actions: HeroAction[],\n others: TradeActor[],\n tool: HeroActionsTool,\n ): Promise[0]> {\n return new Promise((resolve: TradeHeroResolve) => {\n new TradeHeroAction(actions, others, resolve, tool).render(true);\n });\n }\n\n constructor(\n actions: HeroAction[],\n others: TradeActor[],\n resolve: TradeHeroResolve,\n tool: HeroActionsTool,\n options?: DeepPartial,\n ) {\n super(tool, options);\n\n this.#actions = actions;\n this.#others = others;\n this.#resolve = resolve;\n this.#selected = others[0].id;\n }\n\n get key(): string {\n return \"trade\";\n }\n\n _onClose(_options: fa.ApplicationClosingOptions): void {\n this.#resolve(null);\n }\n\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\n return {\n actions: this.#actions,\n others: this.#others,\n selected: this.#selected,\n };\n }\n\n async _onClickAction(_event: PointerEvent, target: HTMLElement) {\n const action = target.dataset.action as EventAction;\n\n if (action === \"cancel\") {\n this.close();\n } else if (action === \"description\") {\n openDescriptionFromElement(target);\n } else if (action === \"trade\") {\n this.#trade();\n }\n }\n\n protected _activateListeners(html: HTMLElement): void {\n addListener(html, `[name=\"target\"]`, \"change\", (el: HTMLSelectElement) => {\n this.#selected = el.value;\n this.render();\n });\n }\n\n #trade() {\n const form = this.form;\n if (!form) return;\n\n const ExtendedData = new foundry.applications.ux.FormDataExtended(form, { disabled: true });\n const data = ExtendedData.object as {\n target: string;\n action: DocumentUUID;\n [k: `action-${string}`]: DocumentUUID;\n };\n\n this.#resolve({\n action: data.action,\n target: data.target,\n targetAction: data[`action-${data.target}`],\n });\n\n this.close();\n }\n}\n\ntype EventAction = \"cancel\" | \"description\" | \"trade\";\n\ntype TradeHeroResolve = (value: { target: string; action: DocumentUUID; targetAction?: DocumentUUID } | null) => void;\n\ntype TradeHeroActionContext = fa.ApplicationRenderContext & {\n actions: HeroAction[];\n others: TradeActor[];\n selected: string;\n};\n\nexport { TradeHeroAction };\n", "import {\n ActorPF2e,\n addListenerAll,\n CharacterPF2e,\n CharacterSheetData,\n CharacterSheetPF2e,\n ChatMessageSourcePF2e,\n createEmitable,\n createHTMLElement,\n createToggleWrapper,\n displayEmiting,\n DocumentUUID,\n enrichHTML,\n getMythicOrHeroPoints,\n htmlClosest,\n htmlQuery,\n htmlQueryAll,\n localize,\n primaryPlayerOwner,\n R,\n renderCharacterSheets,\n socketEmit,\n socketOff,\n socketOn,\n toggleHooksAndWrappers,\n toggleSummary,\n waitDialog,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { HeroAction, TradeHeroAction, zHeroAction } from \".\";\nimport { sharedCharacterSheetActivateListeners } from \"tools\";\n\nclass HeroActionsTool extends ModuleTool {\n static TABLE_UUID = \"Compendium.pf2e.rollable-tables.RollTable.zgZoI7h0XjjJrrNK\";\n static JOURNAL_UUID = \"Compendium.pf2e.journals.JournalEntry.BSp4LUSaOmUyjBko\";\n\n #drawHeroActionsEmitable = createEmitable(this.path(\"draw\"), this.#drawHeroActions.bind(this));\n\n #onSocket = (options: SocketOptions) => {\n if (options.type === \"heroActions.request\") {\n game.userId === options.target.user && this.#tradeRequest(options);\n } else if (options.type === \"heroActions.reject\") {\n game.userId === options.user && this.#tradeReject(options);\n } else if (options.type === \"heroActions.exchange\") {\n game.user === game.users.activeGM && this.#exchangeActions(options);\n }\n };\n\n #hooks = [\n createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.Actor.sheetClasses.character['pf2e.CharacterSheetPF2e'].cls.prototype._renderInner\",\n this.#characterSheetRenderInner,\n { context: this },\n ),\n sharedCharacterSheetActivateListeners.register(this.#characterSheetActivateListeners, { context: this }),\n ];\n\n get key(): \"heroActions\" {\n return \"heroActions\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: Boolean,\n default: false,\n scope: \"world\",\n onChange: () => {\n this._configurate();\n renderCharacterSheets();\n },\n },\n {\n key: \"table\",\n type: String,\n default: \"\",\n scope: \"world\",\n },\n {\n key: \"count\",\n type: Number,\n default: 0,\n scope: \"world\",\n range: {\n min: 0,\n max: 10,\n step: 1,\n },\n onChange: () => {\n renderCharacterSheets();\n },\n },\n {\n key: \"trade\",\n type: Boolean,\n default: true,\n scope: \"world\",\n onChange: () => {\n renderCharacterSheets();\n },\n },\n {\n key: \"private\",\n type: Boolean,\n default: false,\n scope: \"world\",\n },\n ];\n }\n\n get api(): toolbelt.Api[\"heroActions\"] {\n return {\n canTrade: this.canTrade.bind(this),\n discardHeroActions: this.discardHeroActions.bind(this),\n drawHeroActions: this.drawHeroActions.bind(this),\n getDeckTable: this.getDeckTable.bind(this),\n getHeroActionDetails: this.getHeroActionDetails.bind(this),\n getHeroActions: this.getHeroActions.bind(this),\n getHeroActionsTemplateData: this.getHeroActionsTemplateData.bind(this),\n giveHeroActions: this.giveHeroActions.bind(this),\n removeHeroActions: this.removeHeroActions.bind(this),\n sendActionToChat: this.sendActionToChat.bind(this),\n tradeHeroAction: this.tradeHeroAction.bind(this),\n useHeroAction: this.useHeroAction.bind(this),\n usesCountVariant: this.usesCountVariant.bind(this),\n };\n }\n\n _configurate(): void {\n const enabled = this.settings.enabled;\n\n toggleHooksAndWrappers(this.#hooks, enabled);\n this.#drawHeroActionsEmitable.toggle(enabled);\n\n if (enabled) {\n socketOn(this.#onSocket);\n } else {\n socketOff(this.#onSocket);\n }\n }\n\n ready(): void {\n this._configurate();\n }\n\n getHeroActions(actor: CharacterPF2e): HeroAction[] {\n return R.pipe(\n this.getFlag(actor, \"actions\") ?? [],\n R.map((data) => zHeroAction.safeParse(data).data),\n R.filter(R.isTruthy),\n );\n }\n\n canTrade(): boolean {\n return this.settings.trade;\n }\n\n usesCountVariant(): boolean {\n return this.settings.count > 0;\n }\n\n isValidActor(actor: unknown): actor is CharacterPF2e {\n if (actor instanceof Actor && (actor as ActorPF2e).isOfType(\"character\")) return true;\n this.localize.warning(\"error.onlyCharacter\");\n return false;\n }\n\n getDefaultWorldTable(): RollTable | undefined {\n return game.tables.find((x) => x._stats.compendiumSource === HeroActionsTool.TABLE_UUID);\n }\n\n async getTableFromUuid(uuid: string): Promise {\n if (!uuid) return undefined;\n const table = await fromUuid(uuid);\n return table instanceof RollTable ? table : undefined;\n }\n\n async getDeckTable(): Promise {\n return (\n (await this.getTableFromUuid(this.settings.table)) ??\n this.getDefaultWorldTable() ??\n (await this.getTableFromUuid(HeroActionsTool.TABLE_UUID))\n );\n }\n\n async getHeroActionDetails(uuid: string) {\n const entry = await fromUuid>(uuid);\n\n if (!entry) {\n this.localize.error(\"error.noDetails\");\n return;\n }\n\n const parent = entry instanceof JournalEntry ? entry : entry.parent;\n const page = entry instanceof JournalEntry ? entry.pages.contents[0] : entry;\n\n let description = page?.text.content;\n\n if (!description) {\n this.localize.error(\"error.noDetails\");\n return;\n }\n\n if (parent.uuid === HeroActionsTool.JOURNAL_UUID) {\n const triggerLabel = this.localize(\"trigger\");\n description = description.replace(/^

/, `

${triggerLabel} `);\n }\n\n return { name: page.name, description };\n }\n\n getHeroActionsTemplateData(actor: CharacterPF2e): toolbelt.heroActions.HeroActionsTemplateData | undefined {\n if (!this.isValidActor(actor)) return;\n\n const actions = this.getHeroActions(actor);\n const usesCount = this.usesCountVariant();\n const heroPoints = getMythicOrHeroPoints(actor).value;\n const diff = heroPoints - actions.length;\n const mustDiscard = !usesCount && diff < 0;\n const mustDraw = !usesCount && diff > 0;\n\n return {\n actions,\n usesCount,\n mustDiscard,\n mustDraw,\n canUse: (usesCount && heroPoints > 0) || diff >= 0,\n canTrade: actions.length && !mustDiscard && !mustDraw && this.canTrade(),\n diff: Math.abs(diff),\n };\n }\n\n async removeHeroActions(): Promise {\n if (!game.user.isGM) {\n this.localize.warning(\"error.notGM\");\n return;\n }\n\n const onRender: fa.api.DialogV2RenderCallback = (_event, dialog) => {\n const html = dialog.element;\n const allInput = htmlQuery(html, \"[name='all']\")!;\n const actorInputs = htmlQueryAll(html, \"[name='actor']\");\n\n allInput.addEventListener(\"change\", () => {\n const allChecked = allInput.checked;\n\n for (const actorInput of actorInputs) {\n actorInput.checked = allChecked;\n }\n });\n\n for (const actorInput of actorInputs) {\n actorInput.addEventListener(\"change\", () => {\n const actorsChecked = actorInputs.filter((x) => x.checked);\n\n if (actorInputs.length === actorsChecked.length) {\n allInput.indeterminate = false;\n allInput.checked = true;\n } else if (!actorsChecked.length) {\n allInput.indeterminate = false;\n allInput.checked = false;\n } else {\n allInput.indeterminate = true;\n allInput.checked = actorsChecked.length > actorInputs.length / 2;\n }\n });\n }\n };\n\n const result = await waitDialog<{ actor: (string | null)[] }>({\n classes: [\"pf2e-toolbelt-heroActions-remove\"],\n content: this.templatePath(\"removeActions\"),\n data: {\n actors: game.actors.filter((actor) => actor.isOfType(\"character\")),\n },\n i18n: this.path(\"removeActions\"),\n onRender,\n yes: {\n icon: \"fa-solid fa-trash\",\n },\n });\n\n if (!result) return;\n\n const updates = R.pipe(\n result.actor,\n R.map((id) => {\n if (!id) return;\n return this.setFlagProperty({ _id: id }, { actions: [] });\n }),\n R.filter(R.isTruthy),\n );\n\n if (!updates.length) return;\n\n getDocumentClass(\"Actor\").updateDocuments(updates);\n this.localize.info(\"removeActions.removed\");\n }\n\n async giveHeroActions(actor: CharacterPF2e): Promise {\n if (!game.user.isGM) {\n this.localize.warning(\"error.notGM\");\n return;\n }\n\n if (!this.isValidActor(actor)) return;\n\n const table = await this.getDeckTable();\n if (!table) {\n this.localize.error(\"table.notFound\", true);\n return;\n }\n\n const isUnique = table.replacement === false;\n const actions = this.getHeroActions(actor);\n\n const actionsList = table.results.map((result) => {\n const uuid = documentUuidFromTableResult(result);\n if (!uuid || actions.find((x) => x.uuid === uuid)) return;\n\n const name = labelfromTableResult(result, uuid) ?? \"\";\n\n return {\n name,\n drawn: isUnique && result.drawn,\n uuid,\n value: JSON.stringify({ uuid, name, key: result.id }),\n };\n });\n\n const result = await waitDialog<{\n drawn: boolean;\n message: boolean;\n action: ({ key: string; uuid: DocumentUUID; name: string } | null)[];\n }>({\n classes: [\"pf2e-toolbelt-heroActions-give\"],\n content: this.templatePath(\"giveActions\"),\n data: {\n actions: R.sortBy(R.filter(actionsList, R.isTruthy), R.prop(\"name\")),\n isUnique,\n },\n i18n: this.path(\"giveActions\"),\n onRender: (_event, dialog) => {\n addListenerAll(dialog.element, \"[data-action='expand']\", (el) => {\n const target = htmlClosest(el, \"[data-uuid]\");\n const uuid = target?.dataset.uuid;\n if (!uuid) return;\n\n this.#expandActionDescription(actor, uuid, target);\n });\n },\n position: {\n width: 600,\n },\n yes: {\n icon: \"fa-solid fa-gift\",\n },\n });\n\n if (!result) return;\n\n const selected = R.filter(result.action, R.isTruthy);\n if (!selected) return;\n\n const tableUpdates = [];\n\n for (const { uuid, name, key } of selected) {\n actions.push({ name, uuid });\n if (!result.drawn) continue;\n\n const entry = table.results.get(key);\n if (entry && !entry.drawn) {\n tableUpdates.push(key);\n }\n }\n\n if (tableUpdates.length) {\n table.updateEmbeddedDocuments(\n \"TableResult\",\n tableUpdates.map((key) => ({ _id: key, drawn: true })),\n );\n }\n\n await this.setFlag(actor, \"actions\", actions);\n\n if (result.message) {\n this.#createActionsMessage(actor, selected, \"given\");\n }\n }\n\n async drawHeroActions(actor: CharacterPF2e): Promise {\n if (!this.isValidActor(actor)) return;\n\n const count = this.settings.count;\n const actions = this.getHeroActions(actor);\n const nb = count || getMythicOrHeroPoints(actor).value - actions.length;\n\n if (nb <= 0) {\n this.localize.warning(\"error.notEnoughPoint\");\n return;\n }\n\n const table = await this.getDeckTable();\n\n if (!table) {\n this.localize.error(\"table.notFound\", true);\n return;\n }\n\n if ((!table.formula || table.replacement === false) && !table.isOwner) {\n this.#drawHeroActionsEmitable.emit({ actor, table });\n } else {\n this.#drawHeroActions({ actor, table }, game.userId);\n }\n }\n\n async discardHeroActions(actor: CharacterPF2e, uuids: string[] | string) {\n if (!this.isValidActor(actor)) return;\n\n const actions = this.getHeroActions(actor);\n const removed: HeroAction[] = [];\n\n uuids = Array.isArray(uuids) ? uuids : [uuids];\n\n for (const uuid of uuids) {\n const action = actions.findSplice((x) => x.uuid === uuid);\n\n if (action) {\n removed.push(action);\n }\n }\n\n if (removed.length === 0) return;\n\n await this.setFlag(actor, \"actions\", actions);\n this.#createActionsMessage(actor, removed, \"discarded\");\n }\n\n async useHeroAction(actor: CharacterPF2e, uuid: string) {\n if (!this.isValidActor(actor)) return;\n\n const resource = getMythicOrHeroPoints(actor);\n const points = resource.value;\n if (points < 1) {\n this.localize.warning(\"error.notEnoughPoint\");\n return;\n }\n\n const actions = this.getHeroActions(actor);\n const index = actions.findIndex((x) => x.uuid === uuid);\n if (index === -1) return;\n\n actions.splice(index, 1);\n\n const details = await this.getHeroActionDetails(uuid);\n if (!details) return;\n\n const updates = this.setFlagProperty(\n { [`system.resources.${resource.name}.value`]: points - 1 },\n \"actions\",\n actions,\n );\n\n await actor.update(updates);\n\n const type = this.localize(\"message.used\", resource.name);\n const flavorText = this.localize(\"message.used.message\", { type });\n\n getDocumentClass(\"ChatMessage\").create({\n flavor: `

${flavorText}

`,\n content: `${details.name}${details.description}`,\n speaker: ChatMessage.getSpeaker({ actor }),\n });\n }\n\n async tradeHeroAction(actor: CharacterPF2e): Promise {\n if (!this.isValidActor(actor)) return;\n\n const actions = this.getHeroActions(actor);\n\n if (!actions.length) {\n this.localize.warning(\"error.noAction\");\n return;\n }\n\n const heroPoints = getMythicOrHeroPoints(actor).value;\n const usesCount = this.usesCountVariant();\n\n if (!usesCount && heroPoints < actions.length) {\n this.localize.warning(\"error.mustDiscard\", { nb: actions.length - heroPoints });\n return;\n }\n\n const isPrivate = this.settings.private;\n const others: TradeActor[] = game.actors\n .map((other): TradeActor | undefined => {\n if (!other.isOfType(\"character\") || other === actor || !other.hasPlayerOwner) return;\n\n const otherActions = this.getHeroActions(other);\n if (!otherActions.length) return;\n\n return {\n actions: otherActions,\n id: other.id,\n isPrivate: isPrivate && !other.isOwner,\n name: other.name,\n };\n })\n .filter(R.isTruthy);\n\n if (others.length === 0) {\n this.localize.warning(\"error.noOther\");\n return;\n }\n\n const result = await TradeHeroAction.wait(actions, others, this);\n if (!result) return;\n\n const target = game.actors.get(result.target);\n if (!target?.isOfType(\"character\")) return;\n\n const targetUser = primaryPlayerOwner(target) ?? game.users.activeGM;\n if (!targetUser) {\n ui.notifications.error(localize.shared(\"emiting.noGm\"));\n return;\n }\n\n const data: TradeRequestOptions = {\n origin: {\n action: result.action,\n actor: actor.id,\n user: game.userId,\n },\n target: {\n action: result.targetAction,\n actor: target.id,\n user: targetUser.id,\n },\n };\n\n if (target.isOwner && data.target.action) {\n this.#exchangeActions(data as TradeExchangeOptions);\n } else {\n displayEmiting();\n socketEmit({\n type: \"heroActions.request\",\n ...data,\n });\n }\n }\n\n async sendActionToChat(actor: CharacterPF2e, uuid: string) {\n if (!this.isValidActor(actor)) return;\n\n const details = await this.getHeroActionDetails(uuid);\n if (!details) return;\n\n getDocumentClass(\"ChatMessage\").create({\n content: `${details.name}${details.description}`,\n speaker: ChatMessage.getSpeaker({ actor }),\n });\n }\n\n async #characterSheetRenderInner(\n sheet: CharacterSheetPF2e,\n wrapped: libWrapper.RegisterCallback,\n data: CharacterSheetData,\n ) {\n const $html = await wrapped(data);\n const html = $html[0];\n const actor = sheet.actor;\n\n const template = await this.render(\"sheet\", {\n ...this.getHeroActionsTemplateData(actor),\n isOwner: actor.isOwner,\n isGM: game.user.isGM,\n });\n\n const tab = htmlQuery(html, \".tab[data-tab=actions] .tab-content .tab[data-tab=encounter]\");\n const attacks = htmlQuery(tab, \":scope > .strikes-list:not(.skill-action-list)\");\n\n const sheetElement = createHTMLElement(\"div\", { content: template });\n attacks?.after(...sheetElement.children);\n\n return $html;\n }\n\n #characterSheetActivateListeners(sheet: CharacterSheetPF2e, html: HTMLElement) {\n const tab = htmlQuery(html, \".tab[data-tab=actions] .tab-content .tab[data-tab=encounter]\");\n const list = htmlQuery(tab, \".heroActions-list\");\n if (!list || !tab) return;\n\n const actor = sheet.actor;\n\n addListenerAll(tab, \"[data-hero-action]\", (el) => {\n const action = el.dataset.heroAction as EventAction;\n const target = htmlClosest(el, \"[data-uuid]\");\n const uuid = target?.dataset.uuid ?? \"\";\n\n if (action === \"give-actions\") {\n this.giveHeroActions(actor);\n } else if (action === \"action-chat\") {\n this.sendActionToChat(actor, uuid);\n } else if (action === \"action-discard\") {\n this.#onDiscardAction(actor, uuid, target);\n } else if (action === \"action-expand\") {\n this.#expandActionDescription(actor, uuid, target);\n } else if (action === \"action-use\") {\n this.useHeroAction(actor, uuid);\n } else if (action === \"actions-draw\") {\n this.drawHeroActions(actor);\n } else if (action === \"actions-trade\") {\n this.tradeHeroAction(actor);\n }\n });\n }\n\n async #exchangeActions({ origin, target }: TradeExchangeOptions) {\n const originActor = game.actors.get(origin.actor);\n const targetActor = game.actors.get(target.actor);\n if (!originActor?.isOfType(\"character\") || !targetActor?.isOfType(\"character\")) return;\n\n const originActions = this.getHeroActions(originActor);\n const targetActions = this.getHeroActions(targetActor);\n const originAction = originActions.findSplice((action) => action.uuid === origin.action);\n const targetAction = targetActions.findSplice((action) => action.uuid === target.action);\n if (!originAction || !targetAction) return;\n\n originActions.push(targetAction);\n targetActions.push(originAction);\n\n await this.setFlag(originActor, \"actions\", originActions);\n await this.setFlag(targetActor, \"actions\", targetActions);\n\n this.#createActionsMessage(originActor, [originAction, targetAction], \"exchanged\", {\n senderId: origin.user,\n otherId: target.user,\n other: targetActor.name,\n });\n }\n\n async #expandActionDescription(_actor: CharacterPF2e, uuid: string, target: Maybe) {\n const summary = htmlQuery(target, \".item-summary\");\n if (!summary) return;\n\n if (!summary.classList.contains(\"loaded\")) {\n const details = await this.getHeroActionDetails(uuid);\n if (!details) return;\n\n const textElement = createHTMLElement(\"div\", {\n content: await enrichHTML(details.description),\n });\n\n htmlQuery(summary, \".item-description\")?.append(textElement);\n summary.classList.add(\"loaded\");\n }\n\n toggleSummary(summary);\n }\n\n async #drawHeroActions({ actor, table }: DrawHeroActionsOptions, _userId: string) {\n if (!(actor instanceof Actor) || !actor.isOfType(\"character\") || !(table instanceof RollTable)) return;\n\n const drawn: HeroAction[] = [];\n const count = this.settings.count;\n const actions = this.getHeroActions(actor);\n const nb = count || getMythicOrHeroPoints(actor).value - actions.length;\n\n if (count > 0) {\n actions.length = 0;\n }\n\n if (!table.formula) {\n if (table.inCompendium) {\n this.localize.error(\"table.noFormulaCompendium\", true);\n return;\n }\n await table.normalize();\n }\n\n for (let i = 0; i < nb; i++) {\n if (table.replacement === false) {\n const notDrawn = table.results.some((result) => !result.drawn);\n\n if (!notDrawn) {\n await table.resetResults();\n }\n }\n\n const draw = (await table.draw({ displayChat: false })).results[0];\n\n if (!draw) {\n this.localize.warning(\"table.noDraw\", { name: actor.name });\n return;\n }\n\n const uuid = documentUuidFromTableResult(draw);\n\n if (!uuid) {\n this.localize.warning(\"table.drawError\");\n return;\n }\n\n const name = labelfromTableResult(draw, uuid) ?? \"\";\n const action = zHeroAction.safeParse({ name, uuid }).data;\n if (!action) continue;\n\n actions.push(action);\n drawn.push(action);\n }\n\n if (!drawn.length) return;\n\n await this.setFlag(actor, \"actions\", actions);\n this.#createActionsMessage(actor, drawn, \"drawn\");\n }\n\n #onDiscardAction(actor: CharacterPF2e, uuid: string, target: Maybe) {\n const parent = htmlClosest(target, \".actions-list\");\n if (!target || !parent) return;\n\n const toDiscard = Number(parent.dataset.discard);\n const discarded = R.pipe(\n htmlQueryAll(parent, \".item.discarded\"),\n R.map((x) => x.dataset.uuid),\n R.filter(R.isTruthy),\n );\n\n if (discarded.includes(uuid)) {\n target.classList.remove(\"discarded\");\n } else if (discarded.length + 1 >= toDiscard) {\n discarded.push(uuid);\n this.discardHeroActions(actor, discarded);\n } else {\n target.classList.add(\"discarded\");\n }\n }\n\n #createActionsMessage(\n actor: CharacterPF2e,\n actions: { uuid: DocumentUUID }[],\n type: \"drawn\" | \"discarded\" | \"exchanged\" | \"given\",\n { senderId = game.user.id, other, otherId }: { senderId?: string; other?: string; otherId?: string } = {},\n ) {\n const links = actions.map(({ uuid }) => `@UUID[${uuid}]`);\n const flavor = this.localize(\"message\", type, { nb: actions.length, name: other });\n\n const content =\n type === \"exchanged\"\n ? [\"offer\", \"receive\"].map((x, i) => {\n return this.localize(\"message\", x, { link: links[i] });\n })\n : links;\n\n const data: DeepPartial = {\n flavor: `

${flavor}

`,\n content: content.map((x) => `
${x}
`).join(\"\"),\n speaker: ChatMessage.getSpeaker({ actor }),\n author: senderId,\n };\n\n if (this.settings.private) {\n data.whisper = game.users\n .filter((user) => user.isGM)\n .map((user) => user.id)\n .concat(senderId);\n\n if (otherId) {\n data.whisper.push(otherId);\n }\n }\n\n getDocumentClass(\"ChatMessage\").create(data);\n }\n\n async #tradeReject(options: TradeRejectOptions) {\n this.localize.warning(\n \"trade.rejected\",\n {\n sender: game.actors.get(options.origin)?.name ?? options.origin,\n receiver: game.actors.get(options.target)?.name ?? options.target,\n },\n true,\n );\n }\n\n async #tradeRequest(options: TradeRequestOptions) {\n const origin = game.actors.get(options.origin.actor);\n const target = game.actors.get(options.target.actor);\n if (!origin?.isOfType(\"character\") || !target?.isOfType(\"character\")) return;\n\n const targetActions = this.getHeroActions(target);\n const flavor = this.localize(\"trade.request.flavor\", {\n sender: origin.name,\n receiver: target.name,\n });\n\n let content = `
${flavor}
`;\n\n if (!options.target.action) {\n const rows = targetActions.map(({ uuid, name }, i) => {\n const checked = i === 0 ? \"checked\" : \"\";\n return `
\n \n ${name}\n
`;\n });\n\n content += rows.join(\"\");\n } else {\n const give = this.localize(\"trade.request.give\", {\n give: `@UUID[${options.origin.action}]`,\n });\n const want = this.localize(\"trade.request.want\", {\n want: `@UUID[${options.target.action}]`,\n });\n\n content += `
${give}
${want}
`;\n }\n\n const result = await waitDialog<{ action?: DocumentUUID }>({\n content: await enrichHTML(content),\n i18n: this.path(\"trade.request\"),\n onRender: (_event, dialog) => {\n addListenerAll(dialog.element, \"[data-action='description']\", async (el) => {\n openDescriptionFromElement(el);\n });\n },\n yes: {\n icon: \"fa-solid fa-handshake\",\n },\n });\n\n const targetAction = options.target.action ?? (R.isPlainObject(result) && result.action);\n if (!result || !targetAction) {\n displayEmiting();\n return socketEmit({\n type: \"heroActions.reject\",\n origin: options.origin.actor,\n target: options.target.actor,\n user: options.origin.user,\n });\n }\n\n const data: TradeExchangeOptions = {\n origin: options.origin,\n target: {\n ...options.target,\n action: targetAction,\n },\n };\n\n if (origin.isOwner && target.isOwner) {\n this.#exchangeActions(data);\n } else {\n displayEmiting();\n socketEmit({\n type: \"heroActions.exchange\",\n ...data,\n });\n }\n }\n}\n\nfunction labelfromTableResult(result: TableResult, uuid: string): string | null | undefined {\n if (result.type === CONST.TABLE_RESULT_TYPES.DOCUMENT && result.documentUuid) {\n return result.description;\n }\n\n const label = /@UUID\\[[\\w\\.]+\\]{([\\w -]+)}/.exec(result.description)?.[1];\n return label ?? (uuid && fromUuidSync(uuid)?.name);\n}\n\nfunction documentUuidFromTableResult(result: TableResult): DocumentUUID | null | undefined {\n if (result.type === CONST.TABLE_RESULT_TYPES.TEXT) {\n return documentUuidFromTableResultDescription(result);\n }\n if (result.type === CONST.TABLE_RESULT_TYPES.DOCUMENT) {\n return result.documentUuid ?? documentUuidFromTableResultDescription(result);\n }\n}\n\nfunction documentUuidFromTableResultDescription(result: TableResult): DocumentUUID | null | undefined {\n return /@UUID\\[([\\w\\.-]+)\\]/.exec(result.description)?.[1] as DocumentUUID | null | undefined;\n}\n\nasync function openDescriptionFromElement(el: HTMLElement) {\n const uuid = htmlClosest(el, \".action\")?.dataset.uuid;\n if (!uuid) return;\n\n const entry = await fromUuid>(uuid);\n\n if (entry instanceof JournalEntryPage) {\n entry.parent.sheet?.render(true, { pageId: entry.id } as any);\n } else {\n entry?.sheet?.render(true);\n }\n}\n\ntype EventAction =\n | \"give-actions\"\n | \"action-chat\"\n | \"action-discard\"\n | \"action-expand\"\n | \"action-use\"\n | \"actions-draw\"\n | \"actions-trade\";\n\ntype DrawHeroActionsOptions = {\n actor: CharacterPF2e;\n table: RollTable;\n};\n\ntype SocketOptions =\n | BaseSocketOption<\"heroActions.request\", TradeRequestOptions>\n | BaseSocketOption<\"heroActions.reject\", TradeRejectOptions>\n | BaseSocketOption<\"heroActions.exchange\", TradeExchangeOptions>;\n\ntype BaseSocketOption = Record> = D & {\n type: T;\n};\n\ntype TradeExchangeOptions = {\n origin: { action: DocumentUUID; actor: string; user: string };\n target: { action: DocumentUUID; actor: string; user: string };\n};\n\ntype TradeRejectOptions = {\n origin: string;\n target: string;\n user: string;\n};\n\ntype TradeRequestOptions = {\n origin: { action: DocumentUUID; actor: string; user: string };\n target: { action?: DocumentUUID; actor: string; user: string };\n};\n\ntype HeroActionsSettings = {\n count: number;\n enabled: boolean;\n private: boolean;\n table: string;\n trade: boolean;\n};\n\ntype TradeActor = {\n actions: HeroAction[];\n id: string;\n isPrivate: boolean;\n name: string;\n};\n\nexport { HeroActionsTool, openDescriptionFromElement };\nexport type { TradeActor };\n", "import { z } from \"foundry-helpers\";\n\nexport const zIdentifiedItem = z.object({\n itemName: z.string().nonempty().nullish(),\n itemSlug: z.string().nonempty(),\n partialSlug: z.string().nonempty().nullish(),\n});\n\nexport type IdentifiedItemSource = z.input;\nexport type IdentifiedItem = z.output;\n", "import {\n ActorPF2e,\n ActorType,\n advanceTime,\n CharacterPF2e,\n confirmDialog,\n DateTime,\n getShortDateTime,\n htmlClosest,\n htmlQueryAll,\n isCastConsumable,\n ItemPF2e,\n ItemUUID,\n MagicTradition,\n MapOfArrays,\n PhysicalItemPF2e,\n PhysicalItemType,\n R,\n SkillSlug,\n SYSTEM,\n} from \"foundry-helpers\";\nimport { getItemIdentificationDCs, IdentifyItemPopup } from \"foundry-helpers/dist\";\nimport { ModuleToolApplication } from \"module-tool-application\";\nimport { IdentifiedItemSource, IdentifyTool, zIdentifiedItem } from \".\";\n\nconst PARTIAL_SLUGH_REGEX = / ?\\(.+\\) ?/g;\n\nconst EIDOLON_ICON = \"fa-solid fa-alien\";\nconst COMPANION_ICON = \"fa-solid fa-dog\";\n\nconst ACTOR_TYPE_ICONS: Record = {\n familiar: \"fa-solid fa-bat\",\n loot: \"fa-solid fa-treasure-chest\",\n vehicle: \"fa-solid fa-wagon-covered\",\n npc: \"fa-solid fa-ghost\",\n character: \"fa-solid fa-user\",\n party: \"fa-solid fa-users\",\n army: \"\",\n hazard: \"\",\n};\n\nclass IdentifyTracker extends ModuleToolApplication {\n #hooks: [event: string, id: number][] = [];\n #itemsUUIDs: ItemUUID[] = [];\n #knownItems: { uuid: ItemUUID; partial: boolean }[] = [];\n #loading = false;\n #removedFaillures: Record> = {};\n #unlockedUUIDs: ItemUUID[] = [];\n #updates: Record> = {};\n\n static ID = \"pf2e-toolbelt-identify-tracker\";\n\n static DEFAULT_OPTIONS: DeepPartial = {\n id: IdentifyTracker.ID,\n };\n\n constructor(item: Maybe, tool: IdentifyTool, options?: DeepPartial) {\n super(tool, options);\n\n if (this.isValidItem(item)) {\n this.#unlockedUUIDs.push(item.uuid);\n }\n }\n\n get key(): string {\n return \"tracker\";\n }\n\n async render(options?: boolean | IdentifyRenderOptions, _options?: IdentifyRenderOptions) {\n if (this.#loading) return this;\n\n const useOptions = R.isPlainObject(options) ? (options as IdentifyRenderOptions) : _options;\n\n if (useOptions && useOptions.reset) {\n this.#itemsUUIDs = [];\n this.#reset();\n }\n\n return super.render(options);\n }\n\n isValidItem(item: Maybe): item is PhysicalItemPF2e {\n return this.tool.isValidItem(item);\n }\n\n unlockItem(itemOrUUID: Maybe) {\n const itemUUID = R.isString(itemOrUUID)\n ? itemOrUUID\n : this.isValidItem(itemOrUUID)\n ? itemOrUUID.uuid\n : undefined;\n\n if (!itemUUID || this.#unlockedUUIDs.includes(itemUUID)) return;\n\n const hadLockedItems = this.#unlockedUUIDs.length > 0;\n this.#unlockedUUIDs.push(itemUUID);\n\n if (!hadLockedItems || !this.#itemsUUIDs.includes(itemUUID)) {\n return this.render();\n }\n\n const elements = this.element.querySelectorAll(`[data-item-uuid=\"${itemUUID}\"]`);\n for (const element of elements) {\n element.classList.remove(\"locked\");\n element.removeEventListener(\"click\", this.#onClickLocked);\n }\n }\n\n protected _onClose(_options: fa.ApplicationClosingOptions): void {\n this.#reset();\n this.#itemsUUIDs = [];\n this.#unlockedUUIDs = [];\n\n for (const [event, id] of this.#hooks) {\n Hooks.off(event, id);\n }\n }\n\n async _prepareContext(_options: IdentifyRenderOptions): Promise {\n const party = game.actors.party;\n const members = party?.members ?? [];\n const characters = members.filter((actor): actor is CharacterPF2e => actor.isOfType(\"character\"));\n\n const spellLists: Record = {};\n const itemGroups = new MapOfArrays();\n\n const useDelay = this.settings.delay;\n const { worldTime, date, time } = getShortDateTime();\n\n const items: PhysicalItemPF2e[] = R.pipe(\n members,\n R.flatMap((actor) => actor.inventory.contents),\n R.filter((item) => !item.isIdentified),\n );\n\n if (party) {\n items.push(...party.inventory.contents.filter((item) => !item.isIdentified));\n }\n\n const ghostItems = R.pipe(\n await Promise.all(\n R.pipe(\n [...this.#itemsUUIDs, ...this.#unlockedUUIDs],\n R.unique(),\n R.difference(items.map((item) => item.uuid)),\n R.map((uuid) => fromUuid>(uuid)),\n ),\n ),\n R.filter(R.isTruthy),\n R.filter((item) => this.isValidItem(item)),\n );\n\n const allItems = [...items, ...ghostItems];\n const hasLockedItems = this.#unlockedUUIDs.length > 0;\n\n this.#knownItems = [];\n this.#removedFaillures = {};\n this.#itemsUUIDs = allItems.map((item) => item.uuid);\n\n await Promise.all(\n allItems.map(async (item) => {\n const itemUUID = item.uuid;\n const actor = item.actor;\n const isIdentified = item.isIdentified;\n const itemType = item.type as PhysicalItemType;\n const data = item.system.identification.identified;\n const isConsumable = item.isOfType(\"consumable\");\n const scrollWandSpell = isConsumable && isCastConsumable(item) && item.embeddedSpell;\n const tradition =\n scrollWandSpell && scrollWandSpell.rarity === \"common\" ? scrollWandSpell.traditions : undefined;\n const itemSlug = scrollWandSpell\n ? (scrollWandSpell.slug ?? SYSTEM.sluggify(scrollWandSpell.name))\n : (item.slug ?? SYSTEM.sluggify(data.name));\n const partialSlug =\n isConsumable && !scrollWandSpell\n ? SYSTEM.sluggify(data.name.replace(PARTIAL_SLUGH_REGEX, \"\"))\n : undefined;\n const locked = !isIdentified && hasLockedItems && !this.#unlockedUUIDs.includes(itemUUID);\n\n const itemClasses: (string | boolean)[] = [isIdentified && \"identified\", locked && \"locked\"];\n\n const owner = {\n name: actor.name,\n id: actor.id,\n icon: getOwnerIcon(actor),\n };\n\n const actors: IdentifyGroupItem[\"actors\"] = characters.map((actor): ItemActor | { id: string } => {\n const actorId = actor.id;\n\n if (isIdentified) {\n return { id: actorId };\n }\n\n const failed = ((): number => {\n const fail = this.tool.getFlag(item, \"failed\", actorId);\n if (!R.isString(fail)) return 0;\n\n const failTime = DateTime.fromISO(fail);\n const diffTime = worldTime.diff(failTime, useDelay ? \"hours\" : \"days\");\n const removeFail = useDelay ? diffTime.hours >= 24 : diffTime.days >= 1;\n\n if (removeFail) {\n const toRemove = (this.#removedFaillures[itemUUID] ??= new Set());\n toRemove.add(actorId);\n }\n\n return removeFail ? 0 : useDelay ? 24 - diffTime.hours : 1;\n })();\n\n const known = (() => {\n if (failed) {\n return false;\n }\n\n const flag = this.tool.getFlag(actor, \"identified\", itemType);\n const identification = R.pipe(\n R.isArray(flag) ? flag : [],\n R.map((entry) => zIdentifiedItem.safeParse(entry).data),\n R.filter((entry) => R.isTruthy(entry)),\n );\n\n const full = identification.find((x) => x.itemSlug === itemSlug);\n\n if (full) {\n return true;\n }\n\n if (partialSlug) {\n const partial = identification.find((x) => x.partialSlug === partialSlug);\n\n if (partial?.itemName) {\n return partial.itemName;\n }\n }\n\n return false;\n })();\n\n if (known !== false) {\n this.#knownItems.push({\n uuid: itemUUID,\n partial: R.isString(known),\n });\n }\n\n const canRecallKnowledge = (() => {\n if (failed || known !== false || !scrollWandSpell) {\n return false;\n }\n\n const list = (spellLists[actorId] ??= getSpellList(actor));\n const isTradition = !!tradition && list.traditions.some((x) => tradition.has(x));\n\n return isTradition || list.known.includes(itemSlug);\n })();\n\n const tooltip = failed\n ? useDelay\n ? this.localize(\"failed.delay\", { hours: failed })\n : this.localize(\"failed.daily\")\n : typeof known === \"string\"\n ? this.localize(\"known.partial\", { item: known })\n : known === true\n ? this.localize(\"known.full\")\n : canRecallKnowledge\n ? this.localize(\"known.recall\")\n : \"\";\n\n const update = !failed && known !== true ? this.#updates[itemUUID]?.[actorId] : undefined;\n\n const canToggle = !isIdentified && !failed && known !== true;\n\n const actorClasses: (string | false)[] = [failed !== 0 && \"failed\", canToggle && \"toggleable\"];\n\n return {\n id: actorId,\n known,\n update,\n tooltip,\n canToggle,\n canRecallKnowledge,\n failed: failed !== 0,\n css: actorClasses.filter(R.isString).join(\" \"),\n };\n });\n\n const groupItem: IdentifyGroupItem = {\n actors,\n css: itemClasses.filter(R.isString).join(\" \"),\n identifyTooltip: isIdentified ? undefined : await createIdenticationTooltip(item),\n img: data.img,\n isIdentified,\n isLocked: locked,\n itemSlug: itemSlug,\n name: data.name,\n owner,\n partialSlug,\n uuid: itemUUID,\n };\n\n itemGroups.add(itemType, groupItem);\n }),\n );\n\n return {\n time,\n date,\n actors: characters,\n itemGroups: R.sortBy(\n itemGroups.map((items, type): IdentifyContextItemGroup => {\n return {\n type,\n label: game.i18n.localize(`TYPES.Item.${type}`),\n items: R.sortBy(items, R.prop(\"name\")),\n };\n }),\n R.prop(\"label\"),\n ),\n };\n }\n\n protected async _onFirstRender(_context: object, _options: fa.ApplicationRenderOptions) {\n this.#hooks = (\n [\n [\"updateWorldTime\", () => (this.render(), undefined)],\n [\"updateActor\", this.#onUpdateActor.bind(this)],\n [\"updateItem\", this.#onUpdateItem.bind(this)],\n [\"deleteItem\", this.#onUpdateItem.bind(this)],\n [\"createItem\", this.#onUpdateItem.bind(this)],\n ] as const\n ).map(([event, listener]) => {\n return [event, Hooks.on(event, listener)];\n });\n }\n\n async _onClickAction(event: PointerEvent, target: HTMLElement) {\n const action = target.dataset.action as EventAction;\n\n const getItem = async () => {\n const itemUuid = htmlClosest(target, \"[data-item-uuid]\")?.dataset.itemUuid;\n return itemUuid ? await fromUuid>(itemUuid) : null;\n };\n\n switch (action) {\n case \"auto\": {\n return this.#identifyAll();\n }\n\n case \"change-time\": {\n const direction = target.dataset.direction as \"+\" | \"-\";\n return advanceTime(\"600\", direction);\n }\n\n case \"identify-item\": {\n const item = await getItem();\n return item?.setIdentificationStatus(\"identified\");\n }\n\n case \"mystify-item\": {\n const item = await getItem();\n return item?.setIdentificationStatus(\"unidentified\");\n }\n\n case \"open-actor-sheet\": {\n const item = await getItem();\n return item?.actor.sheet.render(true, { tab: \"inventory\" });\n }\n\n case \"open-clock\": {\n return game.pf2e.worldClock.render(true);\n }\n\n case \"open-item-sheet\": {\n const item = await getItem();\n return item?.sheet.render(true);\n }\n\n case \"post-skill-checks\": {\n const item = await getItem();\n if (!item) return;\n\n const app = new IdentifyItemPopup(item);\n return app.postSkillChecks();\n }\n\n case \"reset\": {\n return this.#reset();\n }\n\n case \"save\": {\n return this.#saveUpdates();\n }\n\n case \"select-update\": {\n return this.#selectUpdate(event, target);\n }\n\n case \"send-to-chat\": {\n const item = await getItem();\n return item?.toMessage();\n }\n }\n }\n\n #onClickLocked = ((event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n const target = event.currentTarget as HTMLElement;\n this.unlockItem(target.dataset.itemUuid as ItemUUID);\n }).bind(this);\n\n protected _activateListeners(html: HTMLElement): void {\n const highlightElements = html.querySelectorAll(\".highlight\");\n\n for (const el of highlightElements) {\n if (el.classList.contains(\"locked\")) {\n el.addEventListener(\"click\", this.#onClickLocked);\n }\n\n el.addEventListener(\"mouseenter\", () => {\n if (el.classList.contains(\"locked\")) return;\n\n const { itemUuid, actorId } = el.dataset;\n\n const cells: Element[] = [];\n\n if (actorId) {\n const actorCells = html.querySelectorAll(`.highlight[data-actor-id=\"${actorId}\"]`);\n cells.push(...actorCells);\n }\n\n if (itemUuid) {\n const itemCells = html.querySelectorAll(`.highlight[data-item-uuid=\"${itemUuid}\"]`);\n cells.push(...itemCells);\n }\n\n for (const cell of cells) {\n cell.classList.add(\"highlighted\");\n }\n });\n\n el.addEventListener(\"mouseleave\", () => {\n const cells = html.querySelectorAll(\".highlighted\");\n\n for (const cell of cells) {\n cell.classList.remove(\"highlighted\");\n }\n });\n }\n }\n\n #selectUpdate(event: PointerEvent, el: HTMLElement) {\n if (![0, 2].includes(event.button)) return;\n\n const { itemUuid, actorId } = el.dataset;\n if (!itemUuid || !actorId) return;\n\n if (el.classList.contains(\"locked\")) {\n this.unlockItem(itemUuid as ItemUUID);\n return;\n }\n\n if (!el.classList.contains(\"toggleable\")) return;\n\n const direction = event.button === 0 ? +1 : -1;\n const itemUpdate = (this.#updates[itemUuid] ??= {});\n const currentUpdate = itemUpdate[actorId];\n const currentValue = currentUpdate === \"success\" ? 2 : currentUpdate === \"fail\" ? 0 : 1;\n const newValue = Math.clamp(currentValue + direction, 0, 2);\n const newUpdate = newValue === 0 ? \"fail\" : newValue === 2 ? \"success\" : undefined;\n\n if (newUpdate) {\n el.dataset.update = newUpdate;\n itemUpdate[actorId] = newUpdate;\n } else {\n delete el.dataset.update;\n delete this.#updates[itemUuid]?.[actorId];\n }\n }\n\n async #identifyAll() {\n const knownItems = this.settings.identifyPartials\n ? this.#knownItems\n : this.#knownItems.filter(({ partial }) => !partial);\n\n const knownUUIDS = knownItems.map(({ uuid }) => uuid);\n\n const selectedList =\n this.#unlockedUUIDs.length > 0 ? R.intersection(knownUUIDS, this.#unlockedUUIDs) : knownUUIDS;\n\n const items = R.pipe(\n await Promise.all(selectedList.map((itemUuid) => fromUuid>(itemUuid))),\n R.filter((item): item is PhysicalItemPF2e => !!item && !item.isIdentified),\n );\n\n if (!items.length) {\n return foundry.applications.api.DialogV2.prompt({\n content: this.localize(\"auto.none\"),\n ok: {},\n window: {\n title: this.localize(\"auto.title\"),\n },\n });\n }\n\n const confirm = await confirmDialog(this.path(\"auto\"), {\n data: { items: createDialogItemList(items) },\n });\n\n if (!confirm) return;\n\n this.#setLoading(true);\n\n await this.#identifyList(items);\n\n this.#setLoading(false);\n this.render();\n }\n\n async #saveUpdates() {\n const items: Record | null> = {};\n const toIdentify: PhysicalItemPF2e[] = [];\n const updateElements = htmlQueryAll(this.element, \"[data-update]\");\n const worldTime = game.pf2e.worldClock.worldTime.toString();\n\n const identifyUpdates: Record> = {};\n\n const failUpdates: Record>> = {};\n\n const getItem = async (itemUuid: string) => {\n return (items[itemUuid] ??= await fromUuid(itemUuid));\n };\n\n const addFailedUpdate = (item: PhysicalItemPF2e, actorId: string, remove: boolean) => {\n const itemActorUpdates = (failUpdates[item.actor.id] ??= {});\n const itemUpdates = (itemActorUpdates[item.id] ??= {});\n\n if (remove) {\n itemUpdates[`-=${actorId}`] = null;\n } else {\n itemUpdates[actorId] = worldTime;\n }\n };\n\n const elementsUpdatesPromises = updateElements.map(async (updateElement) => {\n const { actorId, itemUuid, update, type, itemSlug, itemName, partialSlug } = updateElement.dataset;\n\n if (!itemUuid || !actorId || !type || !itemSlug) return;\n\n const item = await getItem(itemUuid);\n const actor = game.actors.get(actorId);\n if (!actor || !item) return;\n\n this.#removedFaillures[itemUuid]?.delete(actorId);\n\n if (update === \"success\") {\n const actorUpdates = (identifyUpdates[actor.id] ??= {});\n const updates = (actorUpdates[type as PhysicalItemType] ??=\n this.tool.getFlag(actor, \"identified\", type)?.slice() ?? []);\n\n if (!item.isIdentified) {\n toIdentify.push(item);\n }\n\n updates.push({ itemSlug, itemName, partialSlug });\n } else {\n addFailedUpdate(item, actorId, false);\n }\n });\n\n await Promise.all(elementsUpdatesPromises);\n\n if (toIdentify.length) {\n const confirm = await confirmDialog(this.path(\"save\"), {\n data: { items: createDialogItemList(toIdentify) },\n });\n if (!confirm) return;\n }\n\n this.#setLoading(true);\n\n if (!R.isEmpty(identifyUpdates)) {\n const updates = R.pipe(\n R.entries(identifyUpdates),\n R.map(([actorId, update]) => {\n return this.tool.setFlagProperty({ _id: actorId }, \"identified\", update);\n }),\n );\n\n await Actor.updateDocuments(updates);\n }\n\n for (const [itemUuid, actors] of R.entries(this.#removedFaillures)) {\n const item = await getItem(itemUuid);\n if (!item) continue;\n\n for (const actorId of actors) {\n addFailedUpdate(item, actorId, true);\n }\n }\n\n await Promise.all(\n Object.entries(failUpdates).map(([actorId, actorUpdates]) => {\n const actor = game.actors.get(actorId);\n if (!actor) return;\n\n const updates: EmbeddedDocumentUpdateData[] = [];\n\n for (const [itemId, failUpdate] of R.entries(actorUpdates)) {\n const update: EmbeddedDocumentUpdateData = {\n _id: itemId,\n };\n\n const toId = toIdentify.findSplice((item) => item.actor === actor && item.id === itemId);\n\n if (toId) {\n foundry.utils.setProperty(update, \"system.identification\", {\n status: \"identified\",\n unidentified: toId.getMystifiedData(\"unidentified\"),\n });\n this.tool.unsetFlagProperty(update, \"failed\");\n } else {\n this.tool.setFlagProperty(update, \"failed\", failUpdate);\n }\n\n updates.push(update);\n }\n\n return actor.updateEmbeddedDocuments(\"Item\", updates);\n }),\n );\n\n if (toIdentify.length) {\n await this.#identifyList(toIdentify);\n }\n\n this.#setLoading(false);\n this.#reset();\n }\n\n async #identifyList(items: PhysicalItemPF2e[]) {\n type ActorsUpdate = { actor: ActorPF2e; items: PhysicalItemPF2e[] };\n\n const actorsUpdates: Record = {};\n\n for (const item of items) {\n const actorUpdates = (actorsUpdates[item.actor.id] ??= {\n actor: item.actor,\n items: [],\n });\n\n actorUpdates.items.push(item);\n }\n\n return Promise.all(\n Object.values(actorsUpdates).map(({ actor, items }) => {\n const updates = items.map((item) => {\n const data = item.getMystifiedData(\"unidentified\");\n\n return this.tool.unsetFlagProperty(\n {\n _id: item.id,\n [\"system.identification.status\"]: \"identified\",\n [\"system.identification.unidentified\"]: data,\n },\n \"failed\",\n );\n });\n\n return actor.updateEmbeddedDocuments(\"Item\", updates);\n }),\n );\n }\n\n #setLoading(enabled: boolean) {\n this.#loading = enabled;\n this.element.classList.toggle(\"loading\", enabled);\n }\n\n #reset() {\n this.#updates = {};\n this.render();\n }\n\n #onUpdateActor(actor: ActorPF2e) {\n if (actor === game.actors.party) {\n this.render();\n }\n }\n\n #onUpdateItem(item: ItemPF2e) {\n if (this.isValidItem(item)) {\n this.render();\n }\n }\n}\n\nfunction createDialogItemList(items: PhysicalItemPF2e[]) {\n return R.pipe(\n items,\n R.sortBy((item) => item.system.identification.identified.name),\n R.map((item) => `
  • ${item.system.identification.identified.name}
  • `),\n R.join(\"\"),\n );\n}\n\nasync function createIdenticationTooltip(item: PhysicalItemPF2e) {\n const dcs = getItemIdentificationDCs(item) as Record;\n\n let tooltip = `

    ${game.i18n.localize(\"PF2E.identification.Identify\")}

    `;\n tooltip += `
    `;\n\n for (const [skill, dc] of R.entries(dcs)) {\n const name = game.i18n.localize(CONFIG.PF2E.skills[skill].label);\n tooltip += `
    ${name}
    ${dc}
    `;\n }\n\n tooltip += \"
    \";\n\n return tooltip;\n}\n\nfunction getOwnerIcon(actor: ActorPF2e) {\n const actorType = actor.type as ActorType;\n\n if (actorType !== \"character\") {\n return ACTOR_TYPE_ICONS[actorType];\n }\n\n const traits = actor.traits;\n\n return traits.has(\"eidolon\") ? EIDOLON_ICON : traits.has(\"minion\") ? COMPANION_ICON : ACTOR_TYPE_ICONS.character;\n}\n\nfunction getSpellList(actor: CharacterPF2e): IdentifySpellList {\n const traditions: Set = new Set();\n const known: Set = new Set();\n\n for (const entry of actor.spellcasting.spellcastingFeatures) {\n const tradition = entry.tradition;\n\n if (tradition) {\n traditions.add(tradition);\n }\n\n for (const spell of entry.spells ?? []) {\n if (spell.rarity !== \"common\" || !tradition) {\n known.add(spell.slug ?? SYSTEM.sluggify(spell.name));\n }\n }\n }\n\n return {\n traditions: [...traditions],\n known: [...known],\n };\n}\n\ntype EventAction =\n | \"auto\"\n | \"change-time\"\n | \"identify-item\"\n | \"mystify-item\"\n | \"open-actor-sheet\"\n | \"open-clock\"\n | \"open-item-sheet\"\n | \"post-skill-checks\"\n | \"reset\"\n | \"save\"\n | \"select-update\"\n | \"send-to-chat\";\n\ntype IdentifiedItems = IdentifiedItemSource[];\n\ntype IdentifySpellList = {\n traditions: MagicTradition[];\n known: string[];\n};\n\ntype IdentifyContext = fa.ApplicationRenderContext & {\n actors: CharacterPF2e[];\n date: string;\n time: string;\n itemGroups: IdentifyContextItemGroup[];\n};\n\ntype IdentifyContextItemGroup = {\n type: PhysicalItemType;\n label: string;\n items: IdentifyGroupItem[];\n};\n\ntype IdentifyRenderOptions = {\n force?: boolean;\n reset?: boolean;\n};\n\ntype ItemActor = {\n canRecallKnowledge: boolean;\n canToggle: boolean;\n css: string;\n failed: boolean;\n id: string;\n known: boolean | string;\n tooltip: string;\n update: \"success\" | \"fail\" | undefined;\n};\n\ntype IdentifyGroupItem = {\n actors: (ItemActor | { id: string })[];\n css: string;\n identifyTooltip: string | undefined;\n img: string;\n isIdentified: boolean;\n isLocked: boolean;\n itemSlug: string;\n name: string;\n owner: { name: string; id: string; icon: string };\n partialSlug: string | undefined;\n uuid: string;\n};\n\nexport { IdentifyTracker };\n", "import {\r\n ActorPF2e,\r\n ActorSheetPF2e,\r\n confirmDialog,\r\n createEmitable,\r\n createHTMLElement,\r\n createToggleHook,\r\n htmlClosest,\r\n htmlQuery,\r\n isMerchant,\r\n ItemPF2e,\r\n PhysicalItemPF2e,\r\n renderActorSheets,\r\n userIsGM,\r\n} from \"foundry-helpers\";\r\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\r\nimport { IdentifyTracker } from \".\";\r\n\r\nclass IdentifyTool extends ModuleTool {\r\n #actorSheetHook = createToggleHook(\"renderActorSheetPF2e\", this.#onRenderActorSheetPF2e.bind(this));\r\n #requestEmitable = createEmitable(this.key, this.#onRequestIdentify.bind(this));\r\n\r\n get key(): \"identify\" {\r\n return \"identify\";\r\n }\r\n\r\n get settingsSchema(): ToolSettingsList {\r\n return [\r\n {\r\n key: \"enabled\",\r\n type: Boolean,\r\n default: false,\r\n scope: \"world\",\r\n onChange: (value: boolean) => {\r\n this.configurate();\r\n\r\n if (value) {\r\n this.application?.render();\r\n } else {\r\n this.application?.close();\r\n }\r\n },\r\n },\r\n {\r\n key: \"delay\",\r\n type: Boolean,\r\n default: false,\r\n scope: \"world\",\r\n onChange: () => {\r\n this.application?.render();\r\n },\r\n },\r\n {\r\n key: \"identifyPartials\",\r\n type: Boolean,\r\n default: true,\r\n scope: \"world\",\r\n },\r\n {\r\n key: \"playerRequest\",\r\n type: Boolean,\r\n default: true,\r\n scope: \"world\",\r\n onChange: () => {\r\n this.configurate();\r\n },\r\n },\r\n ];\r\n }\r\n\r\n get api(): toolbelt.Api[\"identify\"] {\r\n return {\r\n openTracker: this.openTracker.bind(this),\r\n requestIdentify: this.requestIdentify.bind(this),\r\n };\r\n }\r\n\r\n get application(): IdentifyTracker | undefined {\r\n return foundry.applications.instances.get(IdentifyTracker.ID) as IdentifyTracker | undefined;\r\n }\r\n\r\n async openTracker(item?: ItemPF2e) {\r\n if (!game.user.isGM || (item && !item.isOfType(\"physical\"))) return;\r\n\r\n const application = this.application;\r\n\r\n if (application) {\r\n application.unlockItem(item);\r\n } else {\r\n new IdentifyTracker(item, this).render({ force: true });\r\n }\r\n }\r\n\r\n isValidItem(item: Maybe): item is PhysicalItemPF2e {\r\n return item instanceof Item && item.isOfType(\"physical\") && !!item.actor;\r\n }\r\n\r\n _configurate(): void {\r\n const enabled = this.settings.enabled;\r\n const playerRequest = this.settings.playerRequest;\r\n\r\n this.#actorSheetHook.toggle(enabled && (playerRequest || userIsGM()));\r\n this.#requestEmitable.toggle(enabled && playerRequest);\r\n\r\n renderActorSheets();\r\n }\r\n\r\n init(): void {\r\n this._configurate();\r\n }\r\n\r\n requestIdentify(item: Maybe, skipNotify?: boolean) {\r\n if (!this.isValidItem(item)) return;\r\n\r\n if (!skipNotify) {\r\n this.localize.info(\"request.sent\");\r\n }\r\n\r\n this.#requestEmitable.emit({ item });\r\n }\r\n\r\n #onRenderActorSheetPF2e(sheet: ActorSheetPF2e) {\r\n const user = game.user;\r\n const isGM = user.isGM;\r\n const actor = sheet.actor;\r\n\r\n if (!isGM && isMerchant(actor)) return;\r\n if (!(actor as Actor).canUserModify(user, \"update\")) return;\r\n\r\n const listElement = htmlQuery(sheet.element[0], \".inventory-list\");\r\n if (!listElement) return;\r\n\r\n const itemsElements = listElement.querySelectorAll(\"li[data-item-id],li[data-subitem-id]\");\r\n\r\n for (const itemElement of itemsElements) {\r\n const { itemId, subitemId } = itemElement.dataset;\r\n const realItemId = subitemId ? htmlClosest(itemElement, \"[data-item-id]\")?.dataset.itemId : itemId;\r\n const realItem = (actor as ActorPF2e).inventory.get(realItemId, { strict: true });\r\n const item = subitemId ? realItem.subitems.get(subitemId, { strict: true }) : realItem;\r\n\r\n if (item.isIdentified) continue;\r\n\r\n if (isGM) {\r\n const systemToggle = htmlQuery(itemElement, \"[data-action='toggle-identified']\");\r\n systemToggle?.remove();\r\n }\r\n\r\n const toggleElement = createHTMLElement(\"a\", {\r\n dataset: {\r\n action: \"pf2e-toobelt-identify\",\r\n tooltip: \"PF2E.identification.Identify\",\r\n },\r\n content: \"\",\r\n });\r\n\r\n const dataElement = htmlQuery(itemElement, \".data\");\r\n if (!dataElement) return;\r\n\r\n const controlsElement = htmlQuery(dataElement, \".item-controls\");\r\n const siblingElement = htmlQuery(controlsElement, `[data-action=\"${isGM ? \"edit-item\" : \"delete-item\"}\"]`);\r\n\r\n if (siblingElement) {\r\n siblingElement.before(toggleElement);\r\n } else if (controlsElement) {\r\n controlsElement.appendChild(toggleElement);\r\n } else {\r\n const imgElement = htmlQuery(dataElement, \".item-image\");\r\n imgElement?.after(toggleElement);\r\n }\r\n\r\n toggleElement.addEventListener(\"click\", () => {\r\n if (game.user.isGM) {\r\n this.openTracker(item);\r\n } else {\r\n this.requestIdentify(item);\r\n }\r\n });\r\n }\r\n }\r\n\r\n async #onRequestIdentify({ item }: RequestOptions, userId: string) {\r\n const user = game.users.get(userId);\r\n if (!user || !item?.isOfType(\"physical\")) return;\r\n\r\n const confirm = await confirmDialog(this.templatePath(\"request\"), {\r\n classes: [\"pf2e-toolbelt-identify-request\"],\r\n data: { item: item.system.identification.identified },\r\n title: user.name,\r\n });\r\n\r\n if (confirm) {\r\n this.openTracker(item);\r\n }\r\n }\r\n}\r\n\r\ntype RequestOptions = {\r\n item: PhysicalItemPF2e;\r\n};\r\n\r\ntype IdentifySettings = {\r\n delay: boolean;\r\n enabled: boolean;\r\n identifyPartials: boolean;\r\n playerRequest: boolean;\r\n};\r\n\r\nexport { IdentifyTool };\r\n", "import { getWorldTime, z, zDocumentId } from \"foundry-helpers\";\r\n\r\nconst zTrackedResource = z\r\n .object({\r\n id: zDocumentId(),\r\n max: z.number().default(100),\r\n min: z.number().default(0),\r\n name: z.string().trim().default(\"\"),\r\n shared: z.boolean().default(false),\r\n step1: z.number().min(1).default(1),\r\n step2: z.number().min(1).default(1),\r\n step3: z.number().min(1).default(1),\r\n time: z.number().default(getWorldTime),\r\n timeout: z.number().min(0).default(0),\r\n value: z.number().default(100),\r\n })\r\n .transform((resource) => {\r\n resource.max = Math.max(resource.max, resource.min + 2);\r\n resource.value = Math.clamp(resource.value, resource.min, resource.max);\r\n return resource;\r\n });\r\n\r\ntype TrackedResourceSource = z.input;\r\ntype TrackedResource = z.output;\r\n\r\nexport { zTrackedResource };\r\nexport type { TrackedResource, TrackedResourceSource };\r\n", "import {\n createHTMLElement,\n createToggleHook,\n getUserSetting,\n getWorldTime,\n htmlClosest,\n htmlQuery,\n localize,\n R,\n waitDialog,\n} from \"foundry-helpers\";\nimport { ModuleToolApplication } from \"module-tool-application\";\nimport { ResourcesCollection, ResourceTrackerTool, TrackedResource, TrackedResourceSource, zTrackedResource } from \".\";\n\nclass ResourceTracker extends ModuleToolApplication {\n #userConnectedHook = createToggleHook(\"userConnected\", () => this.render());\n\n #setPosition = R.funnel(\n () => {\n const { left, top } = this.position;\n this.settings.position = { x: left, y: top };\n },\n { minQuietPeriodMs: 1000 },\n );\n\n static DEFAULT_OPTIONS: DeepPartial = {\n id: \"pf2e-toolbelt-resource-tracker\",\n window: {\n positioned: true,\n frame: true,\n },\n position: {\n width: \"auto\",\n height: \"auto\",\n },\n };\n\n get key(): string {\n return \"tracker\";\n }\n\n get resources(): ResourcesCollection {\n return this.tool.resources;\n }\n\n close(options: fa.ApplicationClosingOptions = {}): Promise {\n options.animate = false;\n return super.close(options);\n }\n\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\n const worldResources = { user: \"world\", value: this.settings.worldResources };\n const allUsersResources = getUserSetting(this.tool.getSettingKey(\"userResources\"));\n const usersResources = this.settings.offline\n ? allUsersResources\n : allUsersResources.filter(({ user }) => game.users.get(user)?.active);\n\n const userId = game.user.isGM ? \"world\" : game.userId;\n const [ownResources, otherResources] = R.pipe(\n [worldResources, ...usersResources],\n R.map(({ user, value }) => {\n const resources = R.pipe(\n value,\n R.map((data) => zTrackedResource.safeParse(data).data),\n R.filter((resource): resource is TrackedResource => {\n return R.isTruthy(resource) && (resource.shared || user === userId);\n }),\n R.map((resource): TemplateResource => {\n return {\n ...resource,\n decrease: generateTooltip(resource, \"decrease\"),\n increase: generateTooltip(resource, \"increase\"),\n label: resource.name || resource.id,\n ratio: (resource.value - resource.min) / (resource.max - resource.min),\n };\n }),\n );\n\n if (!resources.length) return;\n\n return {\n user,\n resources,\n };\n }),\n R.filter(R.isTruthy),\n R.partition(({ user }) => user === userId),\n );\n\n return {\n otherResources,\n ownResources,\n };\n }\n\n async _renderFrame(options: fa.ApplicationRenderOptions) {\n const frame = await super._renderFrame(options);\n const windowHeader = htmlQuery(frame, \".window-header\");\n\n const header = createHTMLElement(\"div\", {\n content: await this.tool.render(\"header\", {}),\n });\n\n windowHeader?.replaceChildren(...header.children);\n\n return frame;\n }\n\n async _onFirstRender(_context: RenderContext, options: fa.ApplicationRenderOptions) {\n const { x, y } = this.settings.position;\n foundry.utils.setProperty(options, \"position\", { left: x, top: y });\n\n this.#userConnectedHook.activate();\n }\n\n _onClose(_options: fa.ApplicationClosingOptions): void {\n this.#userConnectedHook.disable();\n }\n\n _onPosition(_position: fa.ApplicationPosition) {\n this.#setPosition.call();\n }\n\n async _onClickAction(event: PointerEvent, target: HTMLElement) {\n type Action = \"create-resource\" | \"decrease-resource\" | \"increase-resource\";\n\n const action = target.dataset.action as Action;\n const resourceId = htmlClosest(target, `[data-resource-id]`)?.dataset.resourceId ?? \"\";\n\n if (event.button === 2 && action !== \"create-resource\") {\n return this.#editResource(resourceId);\n }\n\n if (event.button !== 0) return;\n\n if (action === \"create-resource\") {\n this.#createResource();\n } else if (action === \"decrease-resource\") {\n this.#updateValue(event, resourceId, -1);\n } else if (action === \"increase-resource\") {\n this.#updateValue(event, resourceId, 1);\n }\n }\n\n #updateValue(event: PointerEvent, resourceId: string, direction: 1 | -1) {\n const resources = this.resources;\n const resource = resources.get(resourceId);\n if (!resource) return;\n\n const step = event.ctrlKey ? 3 : event.shiftKey ? 2 : 1;\n const newValue = resource.value + resource[`step${step}`] * direction;\n\n if (newValue !== resource.value) {\n resource.value = newValue;\n resource.time = getWorldTime();\n this.tool.saveResources();\n }\n }\n\n async #resourceMenu(resource: TrackedResource, isCreate: true): Promise;\n async #resourceMenu(\n resource: TrackedResource,\n isCreate?: boolean,\n ): Promise<(TrackedResource & { delete: boolean }) | null>;\n async #resourceMenu(resource: TrackedResource, isCreate?: boolean) {\n return await waitDialog({\n content: `${this.toolKey}/menu`,\n i18n: `${this.toolKey}.resource`,\n data: {\n resource,\n isCreate,\n },\n title: this.tool.localize(\"resource.title\", isCreate ? \"create\" : \"edit\"),\n yes: {\n label: this.tool.localize(\"resource.yes\", isCreate ? \"create\" : \"edit\"),\n },\n classes: [\"resource-menu\"],\n });\n }\n\n async #updateResource(resource: TrackedResource, changes: TrackedResourceSource) {\n const min = R.isNumber(changes.min) ? changes.min : resource.min;\n\n if (R.isNumber(changes.max)) {\n changes.max = Math.max(changes.max, min + 2);\n }\n\n if (R.isNumber(changes.value)) {\n const max = R.isNumber(changes.max) ? changes.max : resource.max;\n changes.value = Math.clamp(changes.value, min, max);\n }\n\n const diff = foundry.utils.diffObject(resource, changes);\n\n if (\"timeout\" in diff || (\"value\" in diff && !(\"time\" in diff))) {\n changes.time = getWorldTime();\n }\n\n foundry.utils.mergeObject(resource, changes);\n }\n\n async #editResource(resourceId: string) {\n const resources = this.resources;\n const resource = resources.get(resourceId);\n if (!resource) return;\n\n const result = await this.#resourceMenu(resource);\n if (!result) return;\n\n if (result.delete) {\n resources.delete(resourceId);\n } else {\n this.#updateResource(resource, result);\n }\n\n this.tool.saveResources();\n }\n\n async #createResource() {\n const blank = zTrackedResource.parse({});\n const resource = await this.#resourceMenu(blank, true);\n if (!resource) return;\n\n this.resources.set(resource.id, resource);\n this.tool.saveResources();\n }\n}\n\nfunction generateTooltip(resource: TrackedResource, direction: \"increase\" | \"decrease\"): string {\n const steps = R.pipe(\n [\"step1\", ...([\"step2\", \"step3\"] as const).filter((step) => resource[step] !== resource.step1)] as const,\n R.map((step) => {\n const value = resource[step];\n const click = localize(\"resourceTracker.resource.steps\", step);\n return localize(\"resourceTracker.resource\", direction, { click, value });\n }),\n );\n\n steps.unshift(localize(\"resourceTracker.resource.edit\"));\n\n return steps.join(\"
    \");\n}\n\ntype RenderContext = fa.ApplicationRenderContext & {\n otherResources: TemplateResourcesGroup[];\n ownResources: TemplateResourcesGroup[];\n};\n\ntype TemplateResourcesGroup = {\n user: string;\n resources: TemplateResource[];\n};\n\ntype TemplateResource = TrackedResource & {\n decrease: string;\n increase: string;\n label: string;\n ratio: number;\n};\n\nexport { ResourceTracker };\n", "import { createToggleHook, getWorldTime, SceneControl, settingPath, userIsGM } from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { ResourceTracker, TrackedResource, TrackedResourceSource, zTrackedResource } from \".\";\n\nclass ResourceTrackerTool extends ModuleTool {\n #updateWorldTimeHook = createToggleHook(\"updateWorldTime\", this.#onUpdateWorldTime.bind(this));\n #application: ResourceTracker | null = null;\n #resources: ResourcesCollection = new Collection();\n\n get key(): \"resourceTracker\" {\n return \"resourceTracker\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"offline\",\n type: Boolean,\n default: true,\n scope: \"world\",\n config: false,\n requiresReload: true,\n },\n {\n key: \"show\",\n type: Boolean,\n default: false,\n scope: \"user\",\n config: false,\n onChange: (value) => {\n if (!this.settings.enabled) return;\n this.#showApplication(value);\n },\n },\n {\n key: \"position\",\n type: Object as any,\n default: { x: 150, y: 100 },\n scope: \"user\",\n config: false,\n },\n {\n key: \"userResources\",\n type: Array,\n default: [],\n scope: \"user\",\n config: false,\n broadcast: true,\n onChange: (value, _, userId) => {\n this.#onResourceUpdate(value, userId);\n },\n },\n {\n key: \"worldResources\",\n type: Array,\n default: [],\n scope: \"world\",\n config: false,\n onChange: (value) => {\n this.#onResourceUpdate(value, \"world\");\n },\n },\n ];\n }\n\n get resources(): ResourcesCollection {\n return this.#resources;\n }\n\n get resourcesKey(): \"worldResources\" | \"userResources\" {\n return userIsGM() ? \"worldResources\" : \"userResources\";\n }\n\n init(): void {\n if (!this.settings.enabled) return;\n Hooks.on(\"getSceneControlButtons\", this.#onGetSceneControlButtons.bind(this));\n }\n\n setup(): void {\n if (!this.settings.enabled) return;\n this.#setResources(this.settings[this.resourcesKey]);\n this.#onUpdateWorldTime(getWorldTime());\n }\n\n ready(): void {\n if (!this.settings.enabled) return;\n this.#showApplication();\n }\n\n saveResources() {\n const entries = this.resources.map((entry) => entry);\n this.settings[this.resourcesKey] = entries;\n }\n\n #onResourceUpdate(value: TrackedResourceSource[], userId: string) {\n if (userId === game.userId || (userId === \"world\" && game.user.isGM)) {\n this.#setResources(value);\n }\n this.#application?.render();\n }\n\n #setResources(resources: TrackedResourceSource[]) {\n this.resources.clear();\n\n for (const data of resources) {\n const resource = zTrackedResource.safeParse(data).data;\n if (!resource) continue;\n this.resources.set(resource.id, resource);\n }\n\n const hasTimeout = this.resources.some(isTimeout);\n this.#updateWorldTimeHook.toggle(hasTimeout);\n }\n\n #onUpdateWorldTime(worldTime: number) {\n if (!game.ready || (game.user.isGM && !game.user.isActiveGM)) return;\n\n let updated = false;\n\n for (const resource of this.resources) {\n if (!isTimeout(resource)) continue;\n\n const decrements = Math.floor((worldTime - resource.time) / resource.timeout);\n if (decrements < 1) continue;\n\n updated = true;\n\n resource.value -= decrements;\n resource.time += resource.timeout * decrements;\n }\n\n if (updated) {\n this.saveResources();\n }\n }\n\n #showApplication(show = this.settings.show) {\n if (show) {\n if (this.#application) {\n this.#application.bringToFront();\n } else {\n this.#application = new ResourceTracker(this);\n this.#application.render(true);\n }\n } else {\n this.#application?.close();\n this.#application = null;\n }\n }\n\n #onGetSceneControlButtons(controls: Record) {\n const tokenTools = controls.tokens?.tools;\n if (!tokenTools) return;\n\n tokenTools.resourceTracker = {\n active: this.settings.show,\n name: \"resourceTracker\",\n title: settingPath(\"resourceTracker.title\"),\n icon: \"fa-sharp fa-solid fa-bars-progress\",\n order: Object.keys(tokenTools).length,\n toggle: true,\n visible: true,\n onChange: (_event, active) => {\n this.settings.show = !!active;\n },\n };\n }\n}\n\nfunction isTimeout(resource: TrackedResource) {\n return resource.timeout > 0 && resource.value > resource.min;\n}\n\ntype ResourceTrackerSettings = {\n enabled: boolean;\n offline: boolean;\n position: Point;\n show: boolean;\n userResources: TrackedResourceSource[];\n worldResources: TrackedResourceSource[];\n};\n\ntype ResourcesCollection = Collection;\n\nexport { ResourceTrackerTool };\nexport type { ResourcesCollection };\n", "import { CheckType, z } from \"foundry-helpers\";\nimport { DEGREE_OF_SUCCESS_STRINGS } from \"foundry-helpers/dist\";\n\nconst ROLL_TYPES: (CheckType | \"roll\")[] = [\n \"attack-roll\",\n \"check\",\n \"counteract-check\",\n \"flat-check\",\n \"initiative\",\n \"perception-check\",\n \"roll\",\n \"saving-throw\",\n \"skill-check\",\n] as const;\n\nconst zUserRoll = z.object({\n actor: z.string().trim().refine(foundry.data.validators.isValidId).nullish(),\n encounter: z.string().nullish(),\n isPrivate: z.boolean().default(false),\n isReroll: z.boolean().default(false),\n modifier: z.string().nonempty().nullish(),\n outcome: z.enum(DEGREE_OF_SUCCESS_STRINGS).nullish(),\n session: z.string().nonempty().nullish(),\n time: z.number(),\n type: z.enum(ROLL_TYPES),\n value: z.number(),\n});\n\nconst zTimedEvents = z.record(z.string(), z.number());\n\ntype RollType = (typeof ROLL_TYPES)[number];\n\ntype UserRollSource = z.input;\ntype UserRoll = z.output;\n\nexport { zTimedEvents, zUserRoll };\nexport type { RollType, UserRoll, UserRollSource };\n", "import { ModuleToolApplication } from \"module-tool-application\";\r\nimport { RollTrackerTool, RollType, UserRoll } from \".\";\r\nimport {\r\n ActorPF2e,\r\n addListenerAll,\r\n htmlQuery,\r\n localize,\r\n R,\r\n timestampToLocalTime,\r\n UserPF2e,\r\n degreeOfSuccessString,\r\n ZeroToThree,\r\n} from \"foundry-helpers\";\r\nimport { DEGREE_OF_SUCCESS_STRINGS } from \"foundry-helpers/dist\";\r\n\r\nconst FILTERS = [\"all\", \"time\", \"session\", \"encounter\"] as const;\r\n\r\nclass RollTracker extends ModuleToolApplication {\r\n #combat: string;\r\n #filter: FilterType;\r\n #filters?: RollFilter[];\r\n #list: HTMLElement | null = null;\r\n #mode: ModeType;\r\n #modes?: RollsMode[];\r\n #selections: string[];\r\n #session: string;\r\n #time!: ModeTime;\r\n\r\n static DEFAULT_OPTIONS: DeepPartial = {\r\n id: \"pf2e-toolbelt-roll-tracker\",\r\n position: {\r\n width: 1200,\r\n height: 750,\r\n },\r\n };\r\n\r\n constructor(tool: RollTrackerTool, options: DeepPartial = {}) {\r\n super(tool, options);\r\n\r\n const { encounters, sessions } = this.#getTimedEventArrays();\r\n\r\n this.#combat = encounters[0]?.id;\r\n this.#filter = \"all\";\r\n this.#mode = \"all\";\r\n this.#session = sessions[0]?.id;\r\n this.#selections = [`user-${game.userId}`];\r\n\r\n this.#resetTime();\r\n }\r\n\r\n get key(): string {\r\n return \"tracker\";\r\n }\r\n\r\n get title(): string {\r\n return localize(`settings.${this.toolKey}.title`);\r\n }\r\n\r\n get filters(): RollFilter[] {\r\n return (this.#filters ??= FILTERS.map((value) => ({\r\n value,\r\n label: this.localize(\"filter\", value),\r\n })));\r\n }\r\n\r\n get modes(): RollsMode[] {\r\n if (this.#modes) {\r\n return this.#modes;\r\n }\r\n\r\n const modes: RawRollMode[] = [];\r\n const checkOutcomes = DEGREE_OF_SUCCESS_STRINGS.map((x) =>\r\n game.i18n.localize(`PF2E.Check.Result.Degree.Check.${x}`),\r\n );\r\n\r\n modes.push(\r\n createRollMode(\"all\"),\r\n createRollMode(\"attack-roll\"),\r\n {\r\n type: \"attack-roll-outcome\",\r\n entries: DEGREE_OF_SUCCESS_STRINGS.map((x) => {\r\n return game.i18n.localize(`PF2E.Check.Result.Degree.Attack.${x}`);\r\n }),\r\n rolls: (rolls) => {\r\n return rolls.filter((roll) => roll.type === \"attack-roll\" && !!roll.outcome);\r\n },\r\n values: (rolls) => {\r\n return R.pipe(\r\n R.range(0, 4) as ZeroToThree[],\r\n R.map((i) => {\r\n const outcome = degreeOfSuccessString(i);\r\n return rolls.filter((roll) => roll.outcome === outcome).length;\r\n }),\r\n );\r\n },\r\n },\r\n createRollMode(\"saving-throw\"),\r\n {\r\n type: \"saving-throw-outcome\",\r\n entries: R.times(3, () => checkOutcomes).flat(),\r\n rolls: (rolls) => {\r\n return rolls.filter((roll) => roll.type === \"saving-throw\" && !!roll.modifier && !!roll.outcome);\r\n },\r\n values: (rolls) => {\r\n return R.pipe(\r\n [\"fortitude\", \"reflex\", \"will\"] as const,\r\n R.flatMap((save) => {\r\n return R.pipe(\r\n R.range(0, 4),\r\n R.map((i) => {\r\n const outcome = DEGREE_OF_SUCCESS_STRINGS[i];\r\n return rolls.filter((roll) => {\r\n return roll.modifier === save && roll.outcome === outcome;\r\n }).length;\r\n }),\r\n );\r\n }),\r\n );\r\n },\r\n },\r\n createRollMode(\"skill-check\"),\r\n ...([\"1\", \"2\"] as const).map((index): RawRollMode => {\r\n const skills = (() => {\r\n const skills = R.entries(CONFIG.PF2E.skills);\r\n const half = Math.ceil(skills.length / 2);\r\n return index === \"1\" ? R.take(skills, half) : R.takeLast(skills, skills.length - half);\r\n })();\r\n\r\n const slugs = skills.map(([slug]) => slug) as string[];\r\n\r\n return {\r\n type: `skill-check-${index}`,\r\n entries: skills.map(([_, { label }]) => game.i18n.localize(label)),\r\n rolls: (rolls) => {\r\n return rolls.filter((roll) => {\r\n return roll.type === \"skill-check\" && roll.modifier && slugs.includes(roll.modifier);\r\n });\r\n },\r\n values: (rolls) => {\r\n return R.pipe(\r\n slugs,\r\n R.flatMap((slug) => {\r\n return rolls.filter((roll) => roll.modifier === slug).length;\r\n }),\r\n );\r\n },\r\n };\r\n }),\r\n createRollMode(\"perception-check\"),\r\n createRollMode(\"initiative\"),\r\n createRollMode(\"flat-check\"),\r\n );\r\n\r\n return (this.#modes = modes.map(({ entries, rolls, type, values }) => {\r\n const labels = (this.localize.ifExist(\"mode\", type, \"bottom\") ?? this.localize(\"bottom\")).split(\"|\");\r\n\r\n return {\r\n type,\r\n entries: entries.map((value, index, entries) => {\r\n return {\r\n value,\r\n marker: !!index && index % (entries.length / labels.length) === 0,\r\n };\r\n }),\r\n label: this.localize(\"mode\", type, \"label\"),\r\n labels,\r\n rolls,\r\n values,\r\n };\r\n }));\r\n }\r\n\r\n getUserRolls(userid: string): UserRoll[] {\r\n const rolls = this.tool.getUserRolls(userid);\r\n\r\n if (this.#filter === \"encounter\") {\r\n return this.#combat ? rolls.filter((roll) => roll.encounter === this.#combat) : [];\r\n }\r\n\r\n if (this.#filter === \"session\") {\r\n return this.#session ? rolls.filter((roll) => roll.session === this.#session) : [];\r\n }\r\n\r\n if (this.#filter === \"time\") {\r\n return rolls.filter((roll) => roll.time >= this.#time.from && roll.time <= this.#time.to);\r\n }\r\n\r\n return rolls;\r\n }\r\n\r\n async _prepareContext(_options: fa.ApplicationRenderOptions): Promise {\r\n const { encounters, sessions } = this.#getTimedEventArrays();\r\n const mode = this.modes.find((mode) => mode.type === this.#mode) ?? this.modes[0];\r\n\r\n if (this.#filter !== \"encounter\") {\r\n this.#combat = encounters[0]?.id;\r\n }\r\n\r\n if (this.#filter !== \"session\") {\r\n this.#session = sessions[0]?.id;\r\n }\r\n\r\n const list: ListUser[] = [];\r\n const selected: RollsSelected[] = [];\r\n\r\n const excludes = R.pipe(\r\n game.users.contents,\r\n R.filter((user) => user.isGM),\r\n R.map((user) => user.id),\r\n R.concat([\"default\"]),\r\n );\r\n\r\n const actors = game.actors.filter((actor) => {\r\n return (\r\n !!actor?.prototypeToken.actorLink &&\r\n actor.isOfType(\"creature\") &&\r\n (actor.ownership.default ?? 3) < 3 &&\r\n R.pipe(\r\n actor.ownership,\r\n R.entries(),\r\n R.filter(([id, permission]) => (permission ?? 0) >= 3 && !excludes.includes(id)),\r\n ).length < 2\r\n );\r\n });\r\n\r\n for (const user of game.users) {\r\n const userIndex = `user-${user.id}`;\r\n const selectIndex = this.#selections.indexOf(userIndex);\r\n const rolls = this.getUserRolls(user.id);\r\n\r\n if (selectIndex >= 0) {\r\n selected[selectIndex] = {\r\n user,\r\n rolls: mode.rolls(rolls),\r\n };\r\n }\r\n\r\n const userActors: ListSelection[] = [];\r\n\r\n for (const actor of user.isGM ? [] : actors) {\r\n if (!actor.testUserPermission(user, \"OWNER\")) continue;\r\n\r\n const actorId = actor.id;\r\n const actorIndex = `${userIndex}-actor-${actorId}`;\r\n const selectIndex = this.#selections.indexOf(actorIndex);\r\n\r\n userActors.push({\r\n id: actorId,\r\n name: actor.name,\r\n select: selectIndex >= 0 ? ` selected select-${selectIndex}` : \"\",\r\n });\r\n\r\n if (selectIndex >= 0) {\r\n selected[selectIndex] = {\r\n user,\r\n actor,\r\n rolls: mode.rolls(rolls.filter((roll) => roll.actor === actorId)),\r\n };\r\n }\r\n }\r\n\r\n list.push({\r\n id: user.id,\r\n name: user.name,\r\n select: selectIndex >= 0 ? ` selected select-${selectIndex}` : \"\",\r\n actors: userActors,\r\n });\r\n }\r\n\r\n const stats: RollStats[] = selected.map(({ rolls, actor, user }): RollStats => {\r\n const values = rolls.map(({ value }) => value);\r\n\r\n const modeEntries = R.pipe(\r\n values,\r\n R.countBy(R.identity()),\r\n R.entries(),\r\n R.sortBy([([_, count]) => count, \"desc\"]),\r\n );\r\n\r\n const maxCount = modeEntries[0]?.[1] ?? 0;\r\n const modes = R.pipe(\r\n modeEntries,\r\n R.takeWhile(([_, count]) => count === maxCount),\r\n R.map(([value]) => value),\r\n );\r\n\r\n return {\r\n name: actor?.name ?? user.name,\r\n total: rolls.length,\r\n mean: R.round(R.mean(values) ?? 0, 2),\r\n median: R.median(values) ?? 0,\r\n mode: modes.join(\", \") || \"\u2014\",\r\n };\r\n });\r\n\r\n const values = selected.map(({ rolls }) => mode.values(rolls));\r\n const valuesMax = R.firstBy(values.flat(), [R.identity(), \"desc\"]) ?? 0;\r\n const maxValue = Math.max(6 * Math.ceil(valuesMax / 6), 6);\r\n\r\n const groups: ContextGroupEntry[][] = mode.entries.map((_, i) => {\r\n return values.map((__, j): ContextGroupEntry => {\r\n const value = values[j][i];\r\n\r\n return {\r\n value,\r\n ratio: (value / maxValue) * 100,\r\n };\r\n });\r\n });\r\n\r\n return {\r\n encounter: this.#combat,\r\n encounters: encounters.map(formatTimedEventOption),\r\n inSession: !!this.settings.session,\r\n isGM: game.user.isGM,\r\n isPaused: this.settings.paused,\r\n filter: this.#filter,\r\n filters: this.filters,\r\n groups,\r\n left: R.times(6, (x) => ((x + 1) * maxValue) / 6).reverse(),\r\n list,\r\n mode,\r\n modes: this.modes,\r\n selected: selected.length,\r\n session: this.#session,\r\n sessions: sessions.map(formatTimedEventOption),\r\n stats,\r\n time: {\r\n from: new Date(this.#time.from).toDateInputString(),\r\n to: new Date(this.#time.to).toDateInputString(),\r\n },\r\n };\r\n }\r\n\r\n protected _replaceHTML(result: string, content: HTMLElement, _options: fa.ApplicationRenderOptions): void {\r\n const scrollPosition = this.#list?.scrollTop;\r\n\r\n content.innerHTML = result;\r\n\r\n this.#list = htmlQuery(content, \".sidebar .list\");\r\n\r\n if (scrollPosition && this.#list) {\r\n this.#list.scrollTop = scrollPosition;\r\n }\r\n\r\n this._activateListeners(content);\r\n }\r\n\r\n protected _onClickAction(event: PointerEvent, target: HTMLElement): void {\r\n type EventAction = \"play\" | \"delete\" | \"end\" | \"pause\" | \"select\" | \"start\";\r\n\r\n const action = target.dataset.action as EventAction;\r\n\r\n if (action === \"delete\") {\r\n this.tool.deleteRecords();\r\n } else if (action === \"end\") {\r\n this.tool.endSession();\r\n } else if (action === \"pause\") {\r\n this.tool.togglePause(true);\r\n } else if (action === \"play\") {\r\n this.tool.togglePause(false);\r\n } else if (action === \"select\") {\r\n this.#select(event, target);\r\n } else if (action === \"start\") {\r\n this.tool.startSession();\r\n }\r\n }\r\n\r\n #select(event: PointerEvent, target: HTMLElement) {\r\n const id = target.dataset.id as string;\r\n\r\n if (event.shiftKey) {\r\n const exist = this.#selections.findSplice((x) => x === id);\r\n\r\n if (exist) {\r\n if (this.#selections.length === 0) {\r\n this.#selections = [id];\r\n } else {\r\n this.render();\r\n }\r\n } else if (this.#selections.length < 5) {\r\n this.#selections.push(id);\r\n this.render();\r\n }\r\n } else if (this.#selections.length !== 1 || this.#selections[0] !== id) {\r\n this.#selections = [id];\r\n this.render();\r\n }\r\n }\r\n\r\n #getTimedEventArrays(): { encounters: TimedEventEntry[]; sessions: TimedEventEntry[] } {\r\n const [encounters, sessions] = R.pipe(\r\n [this.tool.encounters, this.tool.sessions],\r\n R.map((entries) => {\r\n return R.pipe(\r\n entries,\r\n R.entries(),\r\n R.map(([id, time]): TimedEventEntry => ({ id, time })),\r\n R.sortBy([R.prop(\"time\"), \"desc\"]),\r\n );\r\n }),\r\n );\r\n\r\n return { encounters, sessions };\r\n }\r\n\r\n #resetTime() {\r\n const date = new Date().toDateInputString();\r\n this.#time = {\r\n from: new Date(`${date}T00:00:00`).getTime(),\r\n to: new Date(`${date}T23:59:59`).getTime(),\r\n };\r\n }\r\n\r\n protected _activateListeners(html: HTMLElement) {\r\n addListenerAll(html, \".sidebar .options select\", \"change\", (el: HTMLSelectElement) => {\r\n type SelectName = \"mode\" | \"encounter\" | \"filter\" | \"session\";\r\n\r\n const select = el.name as SelectName;\r\n\r\n if (select === \"encounter\") {\r\n this.#combat = el.value;\r\n } else if (select === \"filter\") {\r\n if (this.#filter === \"time\") {\r\n this.#resetTime();\r\n }\r\n this.#filter = el.value as FilterType;\r\n } else if (select === \"mode\") {\r\n this.#mode = el.value as ModeType;\r\n } else if (select === \"session\") {\r\n this.#session = el.value;\r\n }\r\n\r\n this.render();\r\n });\r\n\r\n addListenerAll(html, \".sidebar .options input[type='date']\", \"change\", (el: HTMLInputElement) => {\r\n const input = el.name as \"time-from\" | \"time-to\";\r\n\r\n if (input === \"time-from\") {\r\n this.#time.from = new Date(`${el.value}T00:00:00`).getTime();\r\n } else if (input === \"time-to\") {\r\n this.#time.to = new Date(`${el.value}T23:59:59`).getTime();\r\n }\r\n\r\n this.render();\r\n });\r\n }\r\n}\r\n\r\nfunction formatTimedEventOption({ id, time }: TimedEventEntry): { value: string; label: string } {\r\n return { value: id, label: timestampToLocalTime(time) };\r\n}\r\n\r\nfunction createRollMode(type: T): RawRollMode {\r\n return {\r\n type,\r\n entries: R.times(20, (x) => String(x + 1)),\r\n rolls: (rolls) => {\r\n return type === \"all\" ? rolls : rolls.filter((roll) => roll.type === type);\r\n },\r\n values: (rolls) => {\r\n return R.pipe(\r\n R.range(0, 20),\r\n R.map((face) => {\r\n return rolls.filter((roll) => roll.value === face + 1).length;\r\n }),\r\n );\r\n },\r\n };\r\n}\r\n\r\ntype RollTrackerContext = fa.ApplicationRenderContext & {\r\n encounter: string;\r\n encounters: { value: string; label: string }[];\r\n inSession: boolean;\r\n isGM: boolean;\r\n isPaused: boolean;\r\n filter: FilterType;\r\n filters: RollFilter[];\r\n groups: ContextGroupEntry[][];\r\n left: number[];\r\n list: ListUser[];\r\n mode: RollsMode;\r\n modes: RollsMode[];\r\n selected: number;\r\n session: string;\r\n sessions: { value: string; label: string }[];\r\n stats: RollStats[];\r\n time: {\r\n from: string;\r\n to: string;\r\n };\r\n};\r\n\r\ntype RollFilter = {\r\n value: FilterType;\r\n label: string;\r\n};\r\n\r\ntype ContextGroupEntry = {\r\n value: number;\r\n ratio: number;\r\n};\r\n\r\ntype ModeType = RollType | \"all\" | \"attack-roll-outcome\" | \"saving-throw-outcome\" | `skill-check-${1 | 2}`;\r\n\r\ntype FilterType = (typeof FILTERS)[number];\r\n\r\ntype RawRollMode = {\r\n type: ModeType;\r\n entries: string[];\r\n rolls: (rolls: UserRoll[]) => UserRoll[];\r\n values: (rolls: UserRoll[]) => number[];\r\n};\r\n\r\ntype RollsMode = Omit & {\r\n entries: {\r\n value: string;\r\n marker: boolean;\r\n }[];\r\n label: string;\r\n labels: string[];\r\n};\r\n\r\ntype ListUser = ListSelection & {\r\n actors: ListSelection[];\r\n};\r\n\r\ntype ListSelection = {\r\n id: string;\r\n name: string;\r\n select: string;\r\n};\r\n\r\ntype RollsSelected = {\r\n user: UserPF2e;\r\n actor?: ActorPF2e;\r\n rolls: UserRoll[];\r\n};\r\n\r\ntype TimedEventEntry = {\r\n id: string;\r\n time: number;\r\n};\r\n\r\ntype ModeTime = {\r\n from: number;\r\n to: number;\r\n};\r\n\r\ntype RollStats = {\r\n name: string;\r\n total: number;\r\n mean: number;\r\n median: number;\r\n mode: string;\r\n};\r\n\r\nexport { RollTracker };\r\n", "import {\n ActorUUID,\n ChatContextFlag,\n ChatMessagePF2e,\n CheckContextChatFlag,\n createToggleHook,\n degreeOfSuccessString,\n EncounterPF2e,\n getUserSetting,\n MODULE,\n R,\n SceneControl,\n settingPath,\n setUserSetting,\n SYSTEM,\n timestampToLocalTime,\n toggleHooksAndWrappers,\n tupleHasValue,\n waitDialog,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { RollTracker, UserRoll, UserRollSource, zTimedEvents, zUserRoll } from \".\";\n\nclass RollTrackerTool extends ModuleTool {\n #application?: RollTracker;\n\n #hooks = [\n createToggleHook(\"createChatMessage\", this.#onCreateChatMessage.bind(this)),\n createToggleHook(\"pf2e-toolbelt.rollSave\", ({ rollMessage }: toolbelt.targetHelper.RollSaveHook) => {\n this.#onCreateChatMessage(rollMessage, {}, game.userId);\n }),\n createToggleHook(\"pf2e-toolbelt.rerollSave\", this.#onRerollSave.bind(this)),\n ];\n\n get key(): \"rollTracker\" {\n return \"rollTracker\";\n }\n\n get application(): RollTracker {\n return (this.#application ??= new RollTracker(this));\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"encounters\",\n type: Object as any,\n default: {},\n scope: \"world\",\n config: false,\n },\n {\n key: \"paused\",\n type: Boolean,\n default: false,\n scope: \"world\",\n config: false,\n onChange: (value) => {\n const enabled = this.settings.enabled;\n\n toggleHooksAndWrappers(this.#hooks, enabled && !value);\n\n if (enabled) {\n this.application.render();\n }\n },\n },\n {\n key: \"session\",\n type: String,\n default: undefined,\n scope: \"world\",\n config: false,\n onChange: () => {\n if (this.settings.enabled) {\n this.application.render();\n }\n },\n },\n {\n key: \"sessions\",\n type: Object as any,\n default: {},\n scope: \"world\",\n config: false,\n },\n {\n key: \"userRolls\",\n type: Array,\n default: [],\n scope: \"user\",\n config: false,\n broadcast: true,\n onChange: () => {\n if (this.settings.enabled) {\n this.application.render();\n }\n },\n },\n ];\n }\n\n get api(): Record {\n return {\n deleteRecords: this.deleteRecords.bind(this),\n endSession: this.endSession.bind(this),\n openTracker: () => this.application.render(true),\n startSession: this.startSession.bind(this),\n togglePause: this.togglePause.bind(this),\n };\n }\n\n get encounters(): TimedEvents {\n return zTimedEvents.safeParse(this.settings.encounters).data ?? {};\n }\n\n get sessions(): TimedEvents {\n return zTimedEvents.safeParse(this.settings.sessions).data ?? {};\n }\n\n get canRecord(): boolean {\n if (MODULE.isDebug) return true;\n\n let nbUsers = 0;\n\n for (const user of game.users) {\n if (user.active) nbUsers++;\n if (nbUsers > 1) return true;\n }\n\n return false;\n }\n\n init(isGM: boolean): void {\n if (!this.settings.enabled) return;\n\n if (isGM) {\n Hooks.on(\"combatStart\", this.#onCombatStart.bind(this));\n }\n\n toggleHooksAndWrappers(this.#hooks, !this.settings.paused);\n\n Hooks.on(\"getSceneControlButtons\", this.#onGetSceneControlButtons.bind(this));\n }\n\n addRoll(roll: UserRoll) {\n const rolls = this.settings.userRolls.slice();\n rolls.push(roll);\n this.settings.userRolls = rolls;\n }\n\n addRollsWithValues(values: number[], roll: Omit) {\n const rolls = this.settings.userRolls.slice();\n\n for (const value of values) {\n rolls.push({ ...roll, value });\n }\n\n this.settings.userRolls = rolls;\n }\n\n getUserRolls(userid: string): UserRoll[] {\n return R.pipe(\n getUserSetting(this.getSettingKey(\"userRolls\"), userid)?.value ?? [],\n R.map((data) => zUserRoll.safeParse(data).data),\n R.filter(R.isTruthy),\n );\n }\n\n async togglePause(paused: boolean = !this.settings.paused) {\n if (!game.user.isGM) return;\n await this.setSetting(\"paused\", paused);\n this.localize.info(\"confirm\", paused ? \"pause\" : \"play\");\n }\n\n async startSession() {\n if (!game.user.isGM) return;\n\n const id = foundry.utils.randomID();\n const sessions = this.sessions;\n\n sessions[id] = Date.now();\n\n await this.setSetting(\"sessions\", sessions);\n await this.setSetting(\"session\", id);\n\n this.localize.info(\"confirm.start\", { time: timestampToLocalTime(sessions[id]) });\n }\n\n async endSession() {\n if (!game.user.isGM) return;\n\n const id = this.settings.session;\n\n await this.setSetting(\"session\", undefined);\n\n if (id) {\n const time = this.sessions[id];\n this.localize.info(\"confirm.end\", { time: timestampToLocalTime(time) });\n }\n }\n\n async deleteRecords(days?: number) {\n if (!game.user.isGM) return;\n\n let time: number = 0;\n\n if (R.isNumber(days)) {\n const date = createEndOfDayDate();\n date.setDate(date.getDate() - days);\n time = date.getTime();\n } else {\n const date = new Date().toDateInputString();\n const hint = this.localize(\"clear.hint\");\n\n const result = await waitDialog({\n content: `
    ${hint}
    `,\n i18n: `${this.key}.clear`,\n yes: {\n icon: \"fa-solid fa-trash\",\n },\n });\n\n if (!result) return;\n\n time = new Date(result.date + \"T23:59:59\").getTime();\n }\n\n if (createEndOfDayDate().getTime() === time) {\n await this.endSession();\n await this.setSetting(\"sessions\", {});\n await this.setSetting(\"encounters\", {});\n\n await Promise.all(\n game.users.map((user) => {\n return setUserSetting(user, `${this.key}.userRolls`, []);\n }),\n );\n\n return this.localize.info(\"confirm.delete.all\");\n }\n\n const [encounters, sessions] = R.pipe(\n [this.encounters, this.sessions],\n R.map((entries) => R.omitBy(entries, (entryTime) => entryTime < time)),\n );\n\n await this.endSession();\n await this.setSetting(\"sessions\", sessions);\n await this.setSetting(\"encounters\", encounters);\n\n await Promise.all(\n game.users.map((user) => {\n const currentRolls = this.getUserRolls(user.id);\n if (currentRolls.length === 0) return;\n\n const rolls = currentRolls.filter((roll) => roll.time >= time);\n return setUserSetting(user, this.getSettingKey(\"userRolls\"), rolls);\n }),\n );\n\n this.localize.info(\"confirm.delete.before\", { time: timestampToLocalTime(time) });\n }\n\n #onCombatStart(combat: EncounterPF2e) {\n const encounters = this.encounters;\n encounters[combat.id] = Date.now();\n this.settings.encounters = encounters;\n }\n\n #onGetSceneControlButtons(controls: Record) {\n const tokenTools = controls.tokens?.tools;\n if (!tokenTools) return;\n\n tokenTools.rollTracker = {\n button: true,\n icon: \"fa-sharp fa-solid fa-dice-d20\",\n name: \"rollTracker\",\n order: Object.keys(tokenTools).length,\n title: settingPath(\"rollTracker.title\"),\n visible: true,\n onChange: () => {\n if (this.application.rendered) {\n this.application.close();\n } else {\n this.application.render(true);\n }\n },\n };\n }\n\n #onCreateChatMessage(message: ChatMessagePF2e, _data: object, userId: string) {\n if (userId !== game.userId || !this.canRecord) return;\n\n const die = message.rolls.at(0)?.dice[0];\n const values = die?.values.filter(R.isNumber);\n if (!die || die.faces !== 20 || !values?.length) return;\n\n const user = game.user;\n const context = message.flags[SYSTEM.id].context;\n\n if (context && isCheckContextFlag(context)) {\n if (!user.isGM && context.rollMode === \"selfroll\") return;\n\n this.addRollsWithValues(values, {\n time: Date.now(),\n type: context.type,\n isPrivate: !tupleHasValue([\"publicroll\", \"roll\"], context.rollMode),\n encounter: game.combat?.id,\n actor: (context.actor ?? null) as Maybe,\n outcome: context.outcome,\n session: this.settings.session,\n isReroll: context.isReroll,\n modifier: message.flags[SYSTEM.id].modifierName as string | undefined,\n });\n } else if (context?.type === \"damage-roll\") {\n } else if (message.rolls.length === 1 && message.rolls[0].dice.length === 1) {\n if (!user.isGM && !message.blind && message.whisper.length === 1 && message.whisper[0] === user.id) return;\n\n this.addRollsWithValues(values, {\n time: Date.now(),\n type: \"roll\",\n isPrivate: message.blind || message.whisper.length > 0,\n encounter: game.combat?.id,\n actor: (message.actor?.id ?? null) as Maybe,\n session: this.settings.session,\n isReroll: false,\n });\n }\n }\n\n #onRerollSave({ newRoll, data, target }: toolbelt.targetHelper.RerollSaveHook) {\n if (!this.canRecord) return;\n\n const value = newRoll.dice[0]?.total;\n if (!R.isNumber(value)) return;\n\n const success = newRoll.degreeOfSuccess;\n\n this.addRoll({\n value,\n time: Date.now(),\n type: newRoll.type,\n isPrivate: data.private,\n encounter: game.combat?.id,\n actor: (target.actor?.id ?? null) as Maybe,\n outcome: R.isNumber(success) ? degreeOfSuccessString(success) : undefined,\n session: this.settings.session,\n isReroll: true,\n modifier: data.statistic,\n });\n }\n}\n\nfunction isCheckContextFlag(context?: ChatContextFlag): context is CheckContextChatFlag {\n return !!context && !tupleHasValue([\"damage-roll\", \"spell-cast\", \"self-effect\", \"damage-taken\"], context.type);\n}\n\nfunction createEndOfDayDate() {\n const date = new Date();\n\n date.setHours(23);\n date.setMinutes(59);\n date.setSeconds(59);\n date.setMilliseconds(0);\n\n return date;\n}\n\ntype RollTrackerSettings = {\n enabled: boolean;\n encounters: TimedEvents;\n paused: boolean;\n session: string | undefined;\n sessions: TimedEvents;\n userRolls: UserRoll[];\n};\n\ntype TimedEvents = Record;\n\nexport { RollTrackerTool };\n", "import {\n ActorPF2e,\n ActorSourcePF2e,\n ActorUUID,\n ApplicationV1HeaderButton,\n AppliedDamageFlag,\n CharacterPF2e,\n CharacterSkill,\n CharacterSkillData,\n CharacterSource,\n CombatantPF2e,\n createEmitable,\n CreaturePF2e,\n CreatureSheetPF2e,\n DatabaseDeleteOperation,\n DatabaseUpdateOperation,\n DeferredValueParams,\n EffectPF2e,\n EncounterPF2e,\n EquipmentPF2e,\n executeWhenReady,\n getFirstActiveToken,\n getStatisticClass,\n includesAny,\n isPrimaryOwner,\n isPrimaryUpdater,\n isSF2eItem,\n Modifier,\n ModifierType,\n MODULE,\n PerceptionStatistic,\n R,\n registerWrapper,\n Statistic,\n SYSTEM,\n WeaponPF2e,\n ZeroToFour,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { sharedCharacterPrepareData, sharedNpcPrepareData, sharedWeaponPrepareBaseData } from \"tools\";\nimport { ShareData, ShareDataConfig, ShareDataSource, ShareDataType, zShareData } from \".\";\n\n/**\n * https://github.com/foundryvtt/pf2e/blob/f26bfcc353ebd58efd6d1140cdb8e20688acaea8/src/module/item/abstract-effect/values.ts#L2-L7\n */\nconst DURATION_UNITS: Readonly> = {\n rounds: 6,\n minutes: 60,\n hours: 3600,\n days: 86400,\n};\n\nconst GRADES = {\n null: { potency: 0, resilient: 0 },\n undefined: { potency: 0, resilient: 0 },\n commercial: { potency: 0, resilient: 0 },\n tactical: { potency: 1, resilient: 0 },\n advanced: { potency: 1, resilient: 1 },\n superior: { potency: 2, resilient: 1 },\n elite: { potency: 2, resilient: 2 },\n ultimate: { potency: 3, resilient: 2 },\n paragon: { potency: 3, resilient: 0 },\n};\n\n// they are ordered by armor bonus\nconst BANDS_OF_FORCE_SLUGS = [\"bands-of-force\", \"bands-of-force-greater\", \"bands-of-force-major\"];\n\nclass ShareDataTool extends ModuleTool {\n #updateMasterEmitable = createEmitable(this.path(\"master\"), this.#updateMaster.bind(this));\n #slaveTurnEmitable = createEmitable(this.path(\"slave-turn\"), this.#slaveTurn.bind(this));\n #slaveInitiativeEmitable = createEmitable(this.path(\"slave-initiative\"), this.#slaveInitiative.bind(this));\n\n get key(): \"shareData\" {\n return \"shareData\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n ];\n }\n\n get api(): toolbelt.Api[\"shareData\"] {\n return {\n getMasterInMemory: this.getMasterInMemory.bind(this),\n getSlavesInMemory: this.getSlavesInMemory.bind(this),\n };\n }\n\n init(isGM: boolean): void {\n if (!this.settings.enabled) return;\n\n const registerToolWrapper = (path: string | string[], callback: libWrapper.RegisterCallback) => {\n registerWrapper(\"WRAPPER\", path, callback, this);\n };\n\n const registerToolOverride = (path: string | string[], callback: libWrapper.RegisterCallback) => {\n registerWrapper(\"OVERRIDE\", path, callback, this);\n };\n\n const registerCreatureWrapper = (path: string, callback: libWrapper.RegisterCallback) => {\n registerToolWrapper(\n [\"character\", \"npc\"].map((type) => `CONFIG.PF2E.Actor.documentClasses.${type}.prototype.${path}`),\n callback,\n );\n };\n\n sharedCharacterPrepareData.register(this.#actorPrepareData, { context: this }).activate();\n sharedNpcPrepareData.register(this.#actorPrepareData, { context: this }).activate();\n\n registerCreatureWrapper(\"undoDamage\", this.#actorUndoDamage);\n\n registerCreatureWrapper(\"prepareBaseData\", this.#actorPrepareBaseData);\n\n registerCreatureWrapper(\"prepareDerivedData\", this.#actorPrepareDerivedData);\n\n registerCreatureWrapper(\"_preUpdate\", this.#actorPreUpdate);\n\n registerCreatureWrapper(\"_onUpdate\", this.#actorOnUpdate);\n\n registerCreatureWrapper(\"_onDelete\", this.#actorOnDelete);\n\n registerToolWrapper(\"CONFIG.Combatant.documentClass.prototype.onStartTurn\", this.#combatantStartTurn);\n\n registerToolWrapper(\"CONFIG.Combatant.documentClass.prototype.onEndTurn\", this.#combatantEndTurn);\n\n registerToolWrapper(\"CONFIG.Combatant.documentClass.prototype._onUpdate\", this.#combatantOnUpdate);\n\n registerToolOverride(\"CONFIG.Combat.documentClass.prototype.resetActors\", this.#combatResetActors);\n\n // we only have effect here despite the accessor being on AbstractEffectPF2e\n // because the system only ever use it for effects\n registerToolOverride(\n \"CONFIG.PF2E.Item.documentClasses.effect.prototype.remainingDuration\",\n this.#effectRemainingDuration,\n );\n\n // we do not activate this wrapper because afflictions aren't offcially in the system yet\n // registerToolOverride(\n // \"CONFIG.PF2E.Item.documentClasses.affliction.prototype.remainingStageDuration\",\n // this.#afflictionRemainingStageDuration\n // );\n\n sharedWeaponPrepareBaseData.register(this.#weaponPrepareBaseData, { context: this, priority: 100 }).activate();\n\n if (!isGM) return;\n\n this.#updateMasterEmitable.activate();\n this.#slaveTurnEmitable.activate();\n\n Hooks.on(\"getCreatureSheetPF2eHeaderButtons\", this.#onGetCreatureSheetPF2eHeaderButtons.bind(this));\n }\n\n getShareDataInMemory(actor: CreaturePF2e): ShareData | undefined {\n return this.getInMemory(actor, \"data\");\n }\n\n getShareData(actor: CreaturePF2e): ShareData {\n const rawFlag = this.getFlag(actor, \"data\");\n const flag = R.isObjectType(rawFlag) ? foundry.utils.deepClone(rawFlag) : {};\n return zShareData.parse(flag);\n }\n\n getMasterId(actor: CreaturePF2e): string | undefined {\n return this.getFlag(actor, \"data.master\");\n }\n\n isValidActor(actor: unknown): actor is CreaturePF2e {\n return (\n !!actor &&\n actor instanceof Actor &&\n !actor.pack &&\n game.actors.has(actor.id) &&\n (actor as ActorPF2e).isOfType(\"character\", \"npc\")\n );\n }\n\n isValidMaster(actor: unknown, id?: string): actor is CreaturePF2e {\n if (!this.isValidActor(actor) || (id && actor.id === id) || this.getMasterInMemory(actor)) return false;\n\n const masterId = this.getMasterId(actor);\n return !masterId || !game.actors.get(masterId);\n }\n\n isValidSlave(actor: unknown): actor is CreaturePF2e {\n return this.isValidActor(actor) && !this.getInMemory(actor, \"slaves\");\n }\n\n getMasterInMemory(actor: CreaturePF2e): CreaturePF2e | undefined {\n return this.getInMemory(actor, \"data.master\");\n }\n\n getSlavesInMemory(actor: CreaturePF2e, idOnly: false): CreaturePF2e[];\n getSlavesInMemory(actor: CreaturePF2e, idOnly?: true): Set | undefined;\n getSlavesInMemory(actor: CreaturePF2e, idOnly: boolean = true) {\n const uuids = this.getInMemory>(actor, \"slaves\");\n if (idOnly) return uuids;\n\n const slaves: CreaturePF2e[] = [];\n\n for (const uuid of uuids ?? []) {\n const slave = fromUuidSync(uuid, { strict: false });\n\n if (this.isValidSlave(slave)) {\n slaves.push(slave);\n }\n }\n\n return slaves;\n }\n\n // afflictions aren't offcially in the system yet\n // #afflictionRemainingStageDuration(item: AfflictionPF2e): {\n // expired: boolean;\n // remaining: number;\n // } {\n // const stageData = item.system.stages.at(item.stage - 1);\n // const stageDuration: DurationData = {\n // ...(stageData?.duration ?? { unit: \"unlimited\", value: -1 }),\n // expiry: \"turn-end\",\n // };\n // return calculateRemainingDuration(item, stageDuration);\n // }\n\n /**\n * add master as fightyActor for slaves too\n * https://github.com/foundryvtt/pf2e/blob/f26bfcc353ebd58efd6d1140cdb8e20688acaea8/src/module/item/abstract-effect/helpers.ts#L5\n */\n #effectRemainingDuration(effect: EffectPF2e): { expired: boolean; remaining: number } {\n const durationData = effect.system.duration;\n\n if (durationData.unit === \"encounter\") {\n const isExpired = effect.system.expired;\n return { expired: !!isExpired, remaining: isExpired ? 0 : Infinity };\n } else if (durationData.unit === \"unlimited\" || !effect.system.start) {\n return { expired: false, remaining: Infinity };\n }\n\n const start = effect.system.start.value;\n const { combatant } = game.combat ?? {};\n const { unit, expiry } = durationData;\n\n const duration = durationData.value * (DURATION_UNITS[durationData.unit] ?? 0);\n\n // Prevent effects that expire at end of current turn or round from expiring immediately outside of encounters\n const addend =\n !combatant && duration === 0 && unit === \"rounds\" && [\"turn-end\", \"round-end\"].includes(expiry ?? \"\")\n ? 1\n : 0;\n const remaining = start + duration + addend - game.time.worldTime;\n const result = { remaining, expired: remaining <= 0 };\n\n if (remaining === 0 && combatant?.actor) {\n const startInitiative = effect.system.start.initiative ?? 0;\n const currentInitiative = combatant.initiative ?? 0;\n\n // A familiar won't be represented in the encounter tracker: use the master in its place\n const fightyActor = effect.actor?.isOfType(\"familiar\")\n ? (effect.actor.master ?? effect.actor)\n : effect.actor;\n\n // this part is heavily modified\n const atTurnStart = () => {\n if (startInitiative !== currentInitiative) return false;\n\n const master = effect.actor?.combatant ? null : this.getMasterInMemory(fightyActor as CreaturePF2e);\n\n const origin = (effect.origin === effect.actor && master) || effect.origin;\n\n return combatant.actor === (origin ?? master ?? fightyActor);\n };\n\n result.expired =\n expiry === \"turn-start\"\n ? atTurnStart()\n : expiry === \"turn-end\"\n ? currentInitiative < startInitiative\n : expiry === \"round-end\"\n ? remaining <= 0 && game.time.worldTime > start\n : false;\n }\n\n return result;\n }\n\n // this is a shared wrapper listener\n #weaponPrepareBaseData(weapon: WeaponPF2e) {\n const actor = weapon.actor;\n if (!actor?.isOfType(\"character\")) return;\n\n const master = this.#getMasterIfOption(actor, \"weaponRunes\");\n if (!master?.isOfType(\"character\")) return;\n\n const masterWeapon = R.pipe(\n master.itemTypes.weapon,\n R.filter((item) => !!item.isInvested && !!item.system.runes.potency),\n R.sortBy(\n [(item) => item.system.runes.potency, \"desc\"],\n [(item) => item.system.runes.striking, \"desc\"],\n [(item) => item.system.runes.property.length, \"desc\"],\n ),\n R.first(),\n );\n\n if (masterWeapon) {\n weapon.system.runes.potency = masterWeapon.system.runes.potency;\n weapon.system.runes.striking = masterWeapon.system.runes.striking;\n weapon.system.runes.property = masterWeapon.system.runes.property.slice();\n }\n }\n\n /**\n * upgraded version of\n * https://github.com/foundryvtt/pf2e/blob/f26bfcc353ebd58efd6d1140cdb8e20688acaea8/src/module/encounter/document.ts#L230\n */\n #combatResetActors(encounter: EncounterPF2e) {\n const actors: ActorPF2e[] = R.unique(\n encounter.combatants.contents\n .flatMap((combatant) => {\n const actor = combatant.actor;\n\n if (!actor?.isOfType(\"character\")) {\n return [actor];\n }\n\n // we add slaves and their familiars\n const extras = R.pipe(\n this.getSlavesInMemory(actor, false),\n R.flatMap((slave) => {\n if (this.#isInvalidNonCombatantSlave(slave)) return null;\n return [slave, slave.isOfType(\"character\") ? slave.familiar : null];\n }),\n );\n\n return [actor, actor.familiar, ...extras];\n })\n .filter(R.isNonNull),\n );\n this.#resetActors(actors, { sheets: false, tokens: true });\n }\n\n /**\n * https://github.com/foundryvtt/pf2e/blob/f26bfcc353ebd58efd6d1140cdb8e20688acaea8/src/module/actor/helpers.ts#L45\n */\n async #resetActors(actors?: Iterable, options: ResetActorsRenderOptions = {}): Promise {\n actors ??= [\n game.actors.contents,\n game.scenes.contents.flatMap((s) => s.tokens.contents).flatMap((t) => t.actor ?? []),\n ].flat();\n actors = R.unique(Array.from(actors));\n options.sheets ??= true;\n\n for (const actor of actors) {\n actor.reset();\n if (options.sheets) actor.render();\n }\n game.pf2e.effectPanel.refresh();\n\n if (options.tokens) {\n for (const token of R.unique(Array.from(actors).flatMap((a) => a.getActiveTokens(true, true)))) {\n token.simulateUpdate();\n }\n }\n }\n\n #combatantOnUpdate(\n combatant: CombatantPF2e,\n wrapped: libWrapper.RegisterCallback,\n changed: DeepPartial,\n operation: DatabaseUpdateOperation,\n userId: string,\n ) {\n wrapped(changed, operation, userId);\n\n if (typeof changed.initiative !== \"number\" || userId !== game.user.id) return;\n\n const actor = combatant.actor;\n if (!actor?.isOfType(\"character\", \"npc\")) return;\n\n const slaves = this.getSlavesInMemory(actor, false);\n if (!slaves.length) return;\n\n Promise.resolve().then(async () => {\n for (const slave of slaves) {\n if (isPrimaryOwner(slave)) {\n this.#slaveInitiative({ slave });\n } else {\n this.#slaveInitiativeEmitable.emit({ slave });\n }\n }\n });\n }\n\n /**\n * repurposed version of\n * https://github.com/foundryvtt/pf2e/blob/f26bfcc353ebd58efd6d1140cdb8e20688acaea8/src/module/encounter/combatant.ts#L265\n */\n #slaveInitiative({ slave }: SlaveIntiativeOptions) {\n if (this.#isInvalidNonCombatantSlave(slave)) return;\n\n const eventType = \"initiative-roll\";\n this.#performActorUpdates(slave, eventType).then(() => {\n for (const effect of slave.itemTypes.effect ?? []) {\n effect.onEncounterEvent(eventType);\n }\n });\n }\n\n async #combatantEndTurn(\n combatant: CombatantPF2e,\n wrapped: libWrapper.RegisterCallback,\n options: { round: number },\n ) {\n await wrapped(options);\n await this.#combatantTurn(\"turn-end\", combatant);\n }\n\n async #combatantStartTurn(combatant: CombatantPF2e, wrapped: libWrapper.RegisterCallback) {\n await wrapped();\n await this.#combatantTurn(\"turn-start\", combatant);\n }\n\n async #combatantTurn(eventType: \"turn-end\" | \"turn-start\", combatant: CombatantPF2e) {\n const { actor, encounter } = combatant;\n if (!encounter || !actor?.isOfType(\"character\", \"npc\")) return;\n\n const slaves = this.getSlavesInMemory(actor, false);\n for (const slave of slaves) {\n if (isPrimaryOwner(slave)) {\n await this.#slaveTurn({ encounter, eventType, slave });\n } else {\n this.#slaveTurnEmitable.emit({ encounter, eventType, slave });\n }\n }\n }\n\n /**\n * repurposed version of combined\n * https://github.com/reonZ/pf2e-toolbelt/blob/83e091bdd46cc87c8b872cf11028a95a77bd3ad8/src/tools/share.ts#L228\n * https://github.com/reonZ/pf2e-toolbelt/blob/83e091bdd46cc87c8b872cf11028a95a77bd3ad8/src/tools/share.ts#L267\n */\n async #slaveTurn({ encounter, eventType, slave }: SlaveTurnOptions) {\n if (this.#isInvalidNonCombatantSlave(slave)) return;\n\n const slaveCombatant = this.#createCombatant(slave, encounter);\n\n if (eventType === \"turn-end\") {\n // Run condition end of turn effects, unless the actor is dead\n if (!slave.isDead) {\n const activeConditions = slave.conditions.active;\n for (const condition of activeConditions) {\n await condition.onEndTurn({ token: slaveCombatant.token });\n }\n }\n } else if (eventType === \"turn-start\") {\n // Run any turn start events before the effect tracker updates\n await this.#performActorUpdates(slave, eventType);\n }\n\n // Effect changes on turn start/end\n for (const effect of slave.itemTypes.effect) {\n await effect.onEncounterEvent(eventType);\n }\n if (slave.isOfType(\"character\") && slave.familiar) {\n for (const effect of slave.familiar.itemTypes.effect) {\n await effect.onEncounterEvent(eventType);\n }\n }\n\n const hookEvent = eventType === \"turn-end\" ? \"pf2e.endTurn\" : \"pf2e.startTurn\";\n Hooks.callAll(hookEvent, slaveCombatant, encounter, game.user.id);\n }\n\n /**\n * https://github.com/foundryvtt/pf2e/blob/f26bfcc353ebd58efd6d1140cdb8e20688acaea8/src/module/encounter/combatant.ts#L233\n */\n async #performActorUpdates(actor: CreaturePF2e, event: \"initiative-roll\" | \"turn-start\"): Promise {\n const actorUpdates: Record = {};\n for (const rule of actor.rules ?? []) {\n await rule.onUpdateEncounter?.({ event, actorUpdates });\n }\n await actor.update(actorUpdates);\n\n // Refresh usages of any abilities with round durations\n if (event === \"turn-start\") {\n await actor.recharge({ duration: \"round\" });\n }\n }\n\n #updateMaster({ master, ...updates }: UpdateMasterOptions) {\n if (!this.isValidMaster(master)) return;\n master.update(updates);\n }\n\n // we can't actually revert damage from a slave because of the diff, so we just cancel the hp update and warn the user\n async #actorUndoDamage(\n actor: CreaturePF2e,\n wrapped: libWrapper.RegisterCallback,\n appliedDamage: AppliedDamageFlag,\n ): Promise {\n const master = this.#getMasterIfOption(actor, \"health\");\n\n if (master) {\n const hpUpdate = appliedDamage.updates.findSplice((update) => update.path === \"system.attributes.hp.value\");\n\n const spUpdates = appliedDamage.updates.findSplice(\n (update) => update.path === \"system.attributes.hp.sp.value\",\n );\n\n if (hpUpdate || spUpdates) {\n await wrapped(appliedDamage);\n\n const ChatMessageCls = getDocumentClass(\"ChatMessage\");\n\n const icon = ``;\n const msg = this.localize(\"undo.msg\");\n\n ChatMessageCls.create({\n content: `${icon} ${msg}`,\n speaker: ChatMessageCls.getSpeaker({ actor }),\n });\n\n return;\n }\n }\n\n return wrapped(appliedDamage);\n }\n\n async #actorPreUpdate(\n actor: CreaturePF2e,\n wrapped: libWrapper.RegisterCallback,\n changes: DeepPartial,\n operation: CreatureDatabaseUpdateOperation,\n userId: string,\n ): Promise {\n const flag = changes.flags?.[MODULE.id]?.[this.key] as Maybe<{\n \"==data\"?: ShareDataSource;\n data?: ShareDataSource;\n }>;\n\n const newData = flag ? (flag[\"==data\"] ?? flag[\"data\"]) : undefined;\n const newMasterId = newData?.master;\n\n if (newMasterId !== undefined) {\n const previousMaster = this.getMasterInMemory(actor);\n\n if (previousMaster && previousMaster.id !== newMasterId) {\n operation.previousShareMasterId = previousMaster.id;\n }\n }\n\n const masterId = newMasterId ?? this.getMasterId(actor);\n const master = masterId ? game.actors.get(masterId) : undefined;\n if (this.isValidMaster(master)) {\n const updateKeys: UpdateMasterPath[] = [];\n\n if (newData?.health ?? this.#getShareOptionInMemory(actor, \"health\")) {\n updateKeys.push(\n \"system.attributes.hp.value\",\n \"system.attributes.hp.sp.value\",\n \"system.attributes.hp.temp\",\n );\n }\n\n if (newData?.heroPoints ?? this.#getShareOptionInMemory(actor, \"heroPoints\")) {\n updateKeys.push(\"system.resources.heroPoints.value\");\n }\n\n if (newData?.spellcasting ?? this.#getShareOptionInMemory(actor, \"spellcasting\")) {\n updateKeys.push(\"system.resources.focus.value\");\n }\n\n const masterUpdates: [UpdateMasterPath, any][] = R.pipe(\n updateKeys,\n R.map((path): [UpdateMasterPath, any] | undefined => {\n const value = foundry.utils.getProperty(changes, path);\n if (value === undefined) return;\n\n foundry.utils.deleteProperty(changes, path);\n return [path, value];\n }),\n R.filter(R.isDefined),\n );\n\n if (masterUpdates.length) {\n const updates = R.fromEntries(masterUpdates) as Record;\n\n if (master.isOwner) {\n master.update(updates);\n } else {\n this.#updateMasterEmitable.emit({ master: master, ...updates });\n }\n }\n }\n\n return wrapped(changes, operation, userId);\n }\n\n #actorOnDelete(\n actor: CreaturePF2e,\n wrapped: libWrapper.RegisterCallback,\n operation: DatabaseDeleteOperation,\n userId: string,\n ) {\n const master = this.getMasterInMemory(actor);\n const slaves = this.getSlavesInMemory(actor, false);\n const actorId = actor.id;\n const toRemove: string[] = [];\n\n if (master) {\n this.#removeSlaveFromMemory(master, actor);\n }\n\n for (const slave of slaves) {\n // this user should unset the flag of all the slaves they are primary updater of\n if (this.getMasterId(slave) === actorId && isPrimaryUpdater(slave)) {\n toRemove.push(slave.id);\n }\n\n this.deleteInMemory(slave, \"data\");\n }\n\n if (toRemove.length) {\n const updates = toRemove.map((slaveId) => {\n return this.unsetFlagProperty({ _id: slaveId }, \"data\");\n });\n\n getDocumentClass(\"Actor\").updateDocuments(updates);\n }\n\n wrapped(operation, userId);\n }\n\n async #actorOnUpdate(\n actor: CreaturePF2e,\n wrapped: libWrapper.RegisterCallback,\n changes: DeepPartial,\n operation: CreatureDatabaseUpdateOperation,\n userId: string,\n ): Promise {\n if (operation.previousShareMasterId) {\n const previousMaster = game.actors.get>(operation.previousShareMasterId);\n\n if (previousMaster) {\n this.#removeSlaveFromMemory(previousMaster, actor);\n }\n }\n\n return wrapped(changes, operation, userId);\n }\n\n #actorPrepareData(actor: CreaturePF2e) {\n // this one is to avoid race condition with masters created later in the world\n executeWhenReady(() => {\n // a master forces all slaves to refresh\n const slaves = this.getSlavesInMemory(actor, false);\n if (slaves.length) {\n for (const slave of slaves) {\n slave.reset();\n slave.sheet.render();\n\n for (const token of slave.getActiveTokens()) {\n token.renderFlags.set({ refreshBars: true });\n }\n }\n\n return;\n }\n\n // a slave copies its master's stats\n const data = this.getShareDataInMemory(actor);\n const master = data?.master;\n if (!master) return;\n\n if (data.health) {\n actor.system.attributes.hp = foundry.utils.mergeObject(\n new game.pf2e.StatisticModifier(\"hp\"),\n master.system.attributes.hp,\n );\n }\n\n if (data.languages) {\n actor.system.details.languages.value = R.pipe(\n actor.system.details.languages.value,\n R.concat(master.system.details.languages.value),\n R.unique(),\n );\n // we can't do that because the system fills the details field with the prepared data instead of the source\n // actor.system.details.languages.details = [\n // actor.system.details.languages.details,\n // master.system.details.languages.details,\n // ].join(\"; \");\n }\n\n // the following is only for characters\n if (!master.isOfType(\"character\") || !actor.isOfType(\"character\")) return;\n\n if (data.heroPoints) {\n actor.system.resources.heroPoints = foundry.utils.deepClone(master.system.resources.heroPoints);\n }\n\n if (data.spellcasting) {\n actor.system.resources.focus = foundry.utils.deepClone(master.system.resources.focus);\n }\n\n if (data.skills) {\n const masterPerception = master.perception;\n const slavePerception = actor.perception;\n\n // we add the master's item modifiers to perception\n if (masterPerception && slavePerception) {\n const PerceptionCls = slavePerception.constructor as typeof PerceptionStatistic;\n const modifiers = R.pipe(\n masterPerception.check.modifiers,\n R.filter((modifier) => modifier.type === \"item\"),\n R.map((modifier) => modifier.clone()),\n );\n\n const perception = new PerceptionCls(actor, {\n slug: \"perception\",\n label: \"PF2E.PerceptionLabel\",\n attribute: \"wis\",\n rank: actor.system.perception.rank,\n domains: [\"perception\", \"all\"],\n check: { type: \"perception-check\", modifiers },\n senses: actor.system.perception.senses,\n });\n\n actor.perception = perception;\n actor.system.perception = foundry.utils.mergeObject(perception.getTraceData(), {\n attribute: perception.attribute ?? \"wis\",\n rank: actor.system.perception.rank,\n });\n }\n\n const StatisticCls = getStatisticClass(actor);\n\n for (const [slug, skill] of R.entries(CONFIG.PF2E.skills)) {\n const { check, domains, rank } = master.skills[slug];\n const currentRank = actor.skills[slug].rank;\n const attribute = skill.attribute;\n const actualRank = Math.max(rank, currentRank) as ZeroToFour;\n\n // we add item modifiers from master\n const modifiers = R.pipe(\n check.modifiers,\n R.filter((modifier) => modifier.type === \"item\"),\n R.map((modifier) => modifier.clone()),\n );\n\n const statistic = new StatisticCls(actor, {\n slug,\n label: skill.label,\n attribute,\n domains,\n modifiers: [],\n lore: false,\n rank: actualRank,\n check: { type: check.type, modifiers },\n });\n\n actor.skills[slug] = statistic as CharacterSkill;\n actor.system.skills[slug] = foundry.utils.mergeObject(\n statistic.getTraceData() as CharacterSkillData,\n { attribute, rank: actualRank },\n );\n }\n }\n });\n }\n\n #actorPrepareBaseData(actor: CreaturePF2e, wrapped: libWrapper.RegisterCallback) {\n wrapped();\n\n // we are a master, we skip\n if (this.getSlavesInMemory(actor)?.size) return;\n\n const data = this.getShareData(actor);\n const master = data.master;\n\n if (!master) {\n this.deleteInMemory(actor, \"data\");\n return;\n }\n\n this.setInMemory(actor, \"data\", data);\n\n if (data.timeEvents) {\n actor.flags[SYSTEM.id].rollOptions.all = foundry.utils.mergeObject(\n actor.flags[SYSTEM.id].rollOptions.all,\n this.#createEncounterRollOptions(master),\n );\n }\n\n const slaves = this.getSlavesInMemory(master);\n\n if (!slaves) {\n this.setInMemory(master, \"slaves\", new Set([actor.uuid]));\n } else {\n slaves.add(actor.uuid);\n }\n }\n\n /**\n * https://github.com/foundryvtt/pf2e/blob/b5cd5c73ee0c956fbb0c1385dd9d89c5026ec682/src/module/actor/helpers.ts#L199\n */\n #createEncounterRollOptions(actor: ActorPF2e): Record {\n const encounter = game.ready ? game.combat : null;\n if (!encounter?.started) return {};\n\n const participants = encounter.combatants.contents\n .filter((c) => typeof c.initiative === \"number\")\n .sort((a, b) => b.initiative! - a.initiative!); // Sort descending by initiative roll result\n const participant = actor.combatant;\n if (typeof participant?.initiative !== \"number\" || !participants.includes(participant)) {\n return {};\n }\n\n const initiativeRoll = Math.trunc(participant.initiative);\n const initiativeRank = participants.indexOf(participant) + 1;\n const { initiativeStatistic } = participant.flags[SYSTEM.id];\n const threat = encounter.metrics?.threat;\n const numericThreat = { trivial: 0, low: 1, moderate: 2, severe: 3, extreme: 4 }[threat ?? \"trivial\"];\n\n const entries = (\n [\n [\"encounter\", true],\n [`encounter:threat:${numericThreat}`, !!threat],\n [`encounter:threat:${threat}`, !!threat],\n [`encounter:round:${encounter.round}`, true],\n [`encounter:turn:${Number(encounter.turn) + 1}`, true],\n [\"self:participant:own-turn\", encounter.combatant === participant],\n [`self:participant:initiative:roll:${initiativeRoll}`, true],\n [`self:participant:initiative:rank:${initiativeRank}`, true],\n [`self:participant:initiative:stat:${initiativeStatistic}`, !!initiativeStatistic],\n ] as const\n ).filter(([, value]) => !!value);\n\n return Object.fromEntries(entries);\n }\n\n #actorPrepareDerivedData(actor: CreaturePF2e, wrapped: libWrapper.RegisterCallback) {\n if (!game.ready) {\n return wrapped();\n }\n\n const data = this.getShareDataInMemory(actor);\n const master = data?.master;\n\n if (!data || !master?.isOfType(\"character\")) {\n return wrapped();\n }\n\n if (data.armorRunes) {\n const wornArmor = master.wornArmor;\n const wornArmorIsSF2e = !!wornArmor && isSF2eItem(wornArmor);\n const armor = (wornArmorIsSF2e ? wornArmor.isEquipped : wornArmor?.isInvested) ? wornArmor : undefined;\n const bracers = R.pipe(\n master.itemTypes.equipment,\n R.filter((item): item is EquipmentPF2e & { slug: string } => {\n return BANDS_OF_FORCE_SLUGS.includes(item.slug as any) && !!item.isInvested;\n }),\n R.sortBy([(item) => item.slug, \"desc\"]),\n R.first(),\n );\n\n const bracerBonus = (bracers ? BANDS_OF_FORCE_SLUGS.indexOf(bracers.slug) : -1) + 1;\n\n if (armor || bracerBonus) {\n for (const selector of [\"ac\", \"saving-throw\"] as const) {\n const runeType = selector === \"ac\" ? \"potency\" : \"resilient\";\n const armorBonus = wornArmorIsSF2e\n ? GRADES[armor?.system.grade as keyof typeof GRADES]?.[runeType]\n : armor?.system.runes[runeType];\n\n const armorValue = armorBonus ?? 0;\n if (!armorValue && !bracerBonus) continue;\n\n const construct = (options: DeferredValueParams = {}): Modifier | null => {\n const label = armorValue > bracerBonus ? armor!.name : bracers!.name;\n const slug = SYSTEM.sluggify(label);\n\n const modifierType: ModifierType =\n selector === \"saving-throw\"\n ? \"item\"\n : includesAny(actor.system.traits.value, [\"eidolon\", \"eldamon\"])\n ? \"potency\"\n : \"item\";\n\n const modifier = new game.pf2e.Modifier({\n slug,\n label,\n modifier: Math.max(armorValue, bracerBonus),\n type: modifierType,\n });\n\n if (options.test) {\n modifier.test(options.test);\n }\n\n return modifier;\n };\n\n const modifiers = (actor.synthetics.modifiers[selector] ??= []);\n modifiers.push(construct);\n }\n }\n }\n\n wrapped();\n\n if (data.spellcasting) {\n Object.defineProperty(actor.spellcasting, \"base\", {\n get(): Statistic {\n return master.spellcasting.base;\n },\n enumerable: true,\n });\n }\n }\n\n #onGetCreatureSheetPF2eHeaderButtons(sheet: CreatureSheetPF2e, buttons: ApplicationV1HeaderButton[]) {\n const actor = sheet.actor;\n if (!this.isValidSlave(actor)) return;\n\n buttons.unshift({\n class: \"share-data\",\n icon: \"fa-solid fa-share-all\",\n label: this.localize.path(\"share\"),\n onclick: () => {\n new ShareDataConfig(actor, this).render(true);\n },\n });\n }\n\n #getShareOptionInMemory(actor: CreaturePF2e, option: ShareDataType): boolean {\n return !!this.getShareDataInMemory(actor)?.[option];\n }\n\n #getMasterIfOption(actor: CreaturePF2e, option: ShareDataType): CreaturePF2e | null {\n const data = this.getShareDataInMemory(actor);\n return data?.[option] ? data.master : null;\n }\n\n #createCombatant(actor: CreaturePF2e, encounter: EncounterPF2e) {\n const scene = encounter.scene;\n const token = getFirstActiveToken(actor, { scene });\n const CombatantPF2e = getDocumentClass(\"Combatant\");\n\n return new CombatantPF2e(\n { tokenId: token?.id, actorId: actor.id, hidden: false, sceneId: scene?.id },\n { parent: encounter },\n );\n }\n\n #isInvalidNonCombatantSlave(slave: CreaturePF2e): boolean {\n return slave.inCombat || !this.#getShareOptionInMemory(slave, \"timeEvents\");\n }\n\n #removeSlaveFromMemory(master: CreaturePF2e, slave: CreaturePF2e) {\n const slaves = this.getSlavesInMemory(master);\n slaves?.delete(slave.uuid);\n }\n}\n\nconst shareDataTool = new ShareDataTool();\n\ntype ShareDataSettings = {\n enabled: boolean;\n};\n\ntype CreatureDatabaseUpdateOperation = DatabaseUpdateOperation & {\n previousShareMasterId?: string;\n masterUpdate?: {\n health?: number;\n heroPoints?: number;\n };\n};\n\ntype SlaveTurnOptions = {\n eventType: \"turn-end\" | \"turn-start\";\n encounter: EncounterPF2e;\n slave: CreaturePF2e;\n};\n\ntype SlaveIntiativeOptions = {\n slave: CreaturePF2e;\n};\n\ntype UpdateMasterOptions = {\n master: CreaturePF2e;\n \"system.attributes.hp.value\"?: number;\n \"system.attributes.hp.sp.value\"?: number;\n \"system.attributes.hp.temp\"?: number;\n \"system.resources.heroPoints.value\"?: number;\n \"system.resources.focus.value\"?: number;\n};\n\ntype UpdateMasterPath = Exclude;\n\ninterface ResetActorsRenderOptions {\n sheets?: boolean;\n tokens?: boolean;\n}\n\nexport { shareDataTool };\nexport type { ShareDataTool };\n", "import { CreaturePF2e, z, zForeignDocument } from \"foundry-helpers\";\r\nimport { shareDataTool } from \".\";\r\n\r\nconst BASE_SHARE_DATA = [\"health\", \"languages\", \"timeEvents\"] as const;\r\nconst CHARACTER_MASTER_SHARE_DATA = [\"armorRunes\"] as const;\r\nconst CHARACTER_SHARE_DATA = [\"heroPoints\", \"skills\", \"spellcasting\", \"weaponRunes\"] as const;\r\nconst ALL_SHARE_DATA = [...BASE_SHARE_DATA, ...CHARACTER_MASTER_SHARE_DATA, ...CHARACTER_SHARE_DATA] as const;\r\n\r\nconst isValidMaster = shareDataTool.isValidMaster.bind(shareDataTool);\r\n\r\nconst zShareMaster = zForeignDocument<\"Actor\", CreaturePF2e>(\"Actor\", isValidMaster).catch(null);\r\n\r\nconst zShareData = z\r\n .object({\r\n armorRunes: z.boolean().catch(false),\r\n health: z.boolean().catch(false),\r\n heroPoints: z.boolean().catch(false),\r\n languages: z.boolean().catch(false),\r\n master: zShareMaster,\r\n skills: z.boolean().catch(false),\r\n spellcasting: z.boolean().catch(false),\r\n timeEvents: z.boolean().catch(false),\r\n weaponRunes: z.boolean().catch(false),\r\n })\r\n .transform((data) => {\r\n const disableOptions = (options: ReadonlyArray) => {\r\n for (const option of options) {\r\n data[option] = false;\r\n }\r\n };\r\n\r\n if (!data.master) {\r\n disableOptions(ALL_SHARE_DATA);\r\n } else if (data.master.isOfType(\"npc\")) {\r\n disableOptions([...CHARACTER_SHARE_DATA, ...CHARACTER_MASTER_SHARE_DATA]);\r\n }\r\n\r\n return data;\r\n });\r\n\r\ntype ShareDataType = (typeof ALL_SHARE_DATA)[number];\r\n\r\ntype ShareDataSource = Partial>;\r\ntype ShareData = z.output;\r\n\r\nexport { ALL_SHARE_DATA, BASE_SHARE_DATA, CHARACTER_MASTER_SHARE_DATA, CHARACTER_SHARE_DATA, zShareData, zShareMaster };\r\nexport type { ShareData, ShareDataSource, ShareDataType };\r\n", "import { addListener, createFormData, CreaturePF2e, MODULE, R } from \"foundry-helpers\";\nimport { ModuleToolApplication } from \"module-tool-application\";\nimport {\n BASE_SHARE_DATA,\n CHARACTER_MASTER_SHARE_DATA,\n CHARACTER_SHARE_DATA,\n ShareData,\n ShareDataSource,\n ShareDataTool,\n shareDataTool,\n ShareDataType,\n zShareMaster,\n} from \".\";\n\nclass ShareDataConfig extends ModuleToolApplication {\n #actor: CreaturePF2e;\n #data: ShareData | null;\n\n static DEFAULT_OPTIONS: DeepPartial = {\n classes: [\"pf2e-toolbelt-shareData-config\"],\n tag: \"form\",\n };\n\n constructor(actor: CreaturePF2e, tool: ShareDataTool, options?: DeepPartial) {\n super(tool, options);\n\n const slaves = shareDataTool.getSlavesInMemory(actor)?.size || 0;\n const data = slaves ? null : tool.getShareData(actor);\n\n if (!slaves && !data) {\n throw MODULE.Error(\"an error occured when trying to instantiate 'ShareDataConfig'\");\n }\n\n this.#actor = actor;\n this.#data = data;\n }\n\n get key(): string {\n return \"config\";\n }\n\n get actor(): CreaturePF2e {\n return this.#actor;\n }\n\n get title(): string {\n return this.localize(\"title\", this.actor);\n }\n\n async _prepareContext(): Promise {\n if (this.#data === null) {\n return {};\n }\n\n const actor = this.actor;\n const actorId = actor.id;\n const master = this.#data?.master;\n const masterIsCharacter = !!master?.isOfType(\"character\");\n const bothCharacters = masterIsCharacter && actor.isOfType(\"character\");\n const masters = game.actors.filter((actor): actor is CreaturePF2e =>\n this.tool.isValidMaster(actor, actorId),\n );\n\n type RawOption = {\n name: ShareDataType;\n character: false | \"both\" | \"master\";\n };\n\n const rawOptions: RawOption[] = [\n ...BASE_SHARE_DATA.map((name): RawOption => {\n return { name, character: false };\n }),\n ...CHARACTER_MASTER_SHARE_DATA.map((name): RawOption => {\n return { name, character: \"master\" };\n }),\n ...CHARACTER_SHARE_DATA.map((name): RawOption => {\n return { name, character: \"both\" };\n }),\n ];\n\n const options = R.pipe(\n rawOptions,\n R.map(({ name, character }): ShareDataOption => {\n const disabled =\n !master ||\n (character === \"both\" && !bothCharacters) ||\n (character === \"master\" && !masterIsCharacter);\n\n return {\n checked: !disabled && this.#data![name],\n disabled,\n name,\n };\n }),\n R.sortBy(R.prop(\"disabled\"), R.prop(\"name\")),\n );\n\n return {\n masterId: master?.id,\n masters: R.sortBy(masters, R.prop(\"name\")),\n options,\n } satisfies ShareDataContext;\n }\n\n protected _onClickAction(_event: PointerEvent, target: HTMLElement): void {\n const action = target.dataset.action as EventAction;\n\n if (action === \"cancel\") {\n this.close();\n } else if (action === \"save\") {\n this.#save();\n }\n }\n\n protected _activateListeners(html: HTMLElement): void {\n if (!this.#data) return;\n\n addListener(html, `[name=\"master\"]`, \"change\", (el: HTMLInputElement) => {\n if (!this.#data) return;\n\n this.#data.master = zShareMaster.decode(el.value.trim() || null);\n this.render();\n });\n }\n\n #save() {\n const form = this.form;\n if (!form || !this.#data) return;\n\n const data = createFormData(form);\n this.tool.setFlag(this.#actor, \"data\", data);\n this.close();\n }\n}\n\ntype EventAction = \"save\" | \"cancel\";\n\ntype ShareDataContext = fa.ApplicationRenderContext & {\n masterId: string | undefined;\n masters: CreaturePF2e[];\n options: ShareDataOption[];\n};\n\ntype ShareDataOption = {\n checked: boolean;\n disabled: boolean;\n name: ShareDataType;\n};\n\nexport { ShareDataConfig };\n", "import { SAVE_TYPES, z } from \"foundry-helpers\";\nimport { DEGREE_ADJUSTMENT_AMOUNTS, DEGREE_OF_SUCCESS_STRINGS } from \"foundry-helpers/dist\";\n\nconst ADJUSTMENT_TYPES = [\"all\", ...DEGREE_OF_SUCCESS_STRINGS] as const;\nconst REROLL_TYPES = [\"hero\", \"mythic\", \"new\", \"lower\", \"higher\"] as const;\nconst VISIBILITY_TYPES = [\"all\", \"none\", \"gm\", \"owner\"] as const;\n\nconst zAdjustement = z.object({\n label: z.string(),\n amount: z.enum(DEGREE_ADJUSTMENT_AMOUNTS),\n});\n\nconst zModifier = z.object({\n excluded: z.boolean().default(false),\n label: z.string().nonempty(),\n modifier: z.number(),\n slug: z.string().nonempty(),\n});\n\nconst zNote = z.object({\n selector: z.string(),\n title: z.string().nonempty().nullish(),\n text: z.string().nonempty(),\n predicate: z.any().optional(),\n outcome: z.array(z.enum(DEGREE_OF_SUCCESS_STRINGS)).default([]),\n visibility: z.enum(VISIBILITY_TYPES).nullish(),\n});\n\nconst zSignificantModifier = z.object({\n appliedTo: z.enum([\"roll\", \"dc\"]),\n name: z.string(),\n significance: z.enum([\"ESSENTIAL\", \"HELPFUL\", \"NONE\", \"HARMFUL\", \"DETRIMENTAL\"]),\n sourceUuid: z.string().nullish(),\n value: z.number(),\n});\n\nconst zTargetSaveInstance = z.object({\n die: z.number().min(1).max(20),\n dosAdjustments: z.partialRecord(z.enum(ADJUSTMENT_TYPES), zAdjustement).default({}),\n modifiers: z.array(zModifier).default([]),\n notes: z.array(zNote).default([]),\n private: z.boolean().default(false),\n rerolled: z.enum(REROLL_TYPES).optional(),\n roll: z.string().nonempty(),\n significantModifiers: z.array(zSignificantModifier).default([]),\n statistic: z.enum(SAVE_TYPES),\n success: z.enum(DEGREE_OF_SUCCESS_STRINGS),\n unadjustedOutcome: z.enum(DEGREE_OF_SUCCESS_STRINGS).nullish().default(null),\n value: z.number(),\n});\n\ntype TargetSaveInstanceSource = z.input;\ntype TargetSaveInstance = z.output;\n\ntype SaveInstanceModifierSource = z.input;\ntype SaveInstanceModifier = z.output;\n\ntype RerollType = (typeof REROLL_TYPES)[number];\n\nexport { zTargetSaveInstance };\nexport type {\n RerollType,\n SaveInstanceModifier,\n SaveInstanceModifierSource,\n TargetSaveInstance,\n TargetSaveInstanceSource,\n};\n", "import { R, SYSTEM, TokenDocumentPF2e, z, zClientDocument, zDocumentUUID, zSafeArray } from \"foundry-helpers\";\nimport { SAVE_TYPES } from \"foundry-helpers/dist\";\nimport { zTargetSaveInstance } from \".\";\n\nconst AREA_TYPE = [\"area-fire\", \"auto-fire\"] as const;\nconst TARGET_MESSAGE_TYPE = [\"area\", \"damage\", \"spell\", \"action\", \"check\"] as const;\n\nconst zSaveVariant = z.object({\n basic: z.boolean().default(false),\n dc: z.number().min(0),\n saves: z.record(z.string(), zTargetSaveInstance).default({}),\n statistic: z.enum(SAVE_TYPES),\n});\n\nconst zSaveVariants = z.record(z.string(), zSaveVariant).default({});\n\nconst zAppliedDamages = z.record(z.union([z.string(), z.number()]), z.boolean()).default({});\nconst zTargetsAppliedDamages = z.record(z.string(), zAppliedDamages).default({});\n\nconst zTokenDocumentArrayDecode = zSafeArray(zDocumentUUID(\"Token\"), true).transform((uuids) => {\n return R.pipe(\n R.isArray(uuids) ? uuids : [],\n R.map((uuid): TokenDocumentPF2e | null => fromUuidSync(uuid, { strict: false })),\n R.filter(R.isTruthy),\n R.uniqueBy((token) => token.flags[SYSTEM.id].troop?.id ?? token.actor?.uuid ?? token.uuid),\n );\n});\n\nconst zTokenDocumentArrayEncode = z\n .array(zClientDocument(\"Token\"))\n .transform((tokens) => tokens.map((token) => token.uuid));\n\nconst zBaseTargetsData = z.object({\n applied: zTargetsAppliedDamages,\n area: z.enum(AREA_TYPE).nullish().default(null),\n author: zDocumentUUID(\"Actor\").nullish().default(null),\n expended: z.number().min(0).default(0),\n item: zDocumentUUID(\"Item\").nullish().default(null),\n isRegen: z.boolean().default(false),\n options: z.array(z.string()).default([]),\n private: z.boolean().default(false),\n saveVariants: zSaveVariants,\n splashIndex: z.number().default(-1),\n traits: z.array(z.string()).default([]),\n type: z.enum(TARGET_MESSAGE_TYPE),\n});\n\nconst zDecodeTargetsData = zBaseTargetsData.extend({\n splashTargets: zTokenDocumentArrayDecode,\n targets: zTokenDocumentArrayDecode,\n});\n\nconst zEncodeTargetsData = zBaseTargetsData.extend({\n splashTargets: zTokenDocumentArrayEncode,\n targets: zTokenDocumentArrayEncode,\n});\n\nconst zTargetsData = zDecodeTargetsData;\n\nfunction encodeTargetsData(data: TargetsData, changes?: TargetsDataUpdates): TargetsDataSource {\n const encoded = zEncodeTargetsData.parse(data);\n return changes ? foundry.utils.mergeObject(encoded, changes, { inplace: true }) : encoded;\n}\n\ntype TargetsDataSource = z.input & z.input;\ntype TargetsData = z.output;\n\ntype SaveVariantSource = z.input;\ntype SaveVariant = z.output;\n\ntype SaveVariantsSource = z.input;\ntype SaveVariants = z.output;\n\ntype AppliedDamagesSource = z.input;\ntype AppliedDamages = z.output;\n\ntype TargetsAppliedDamagesSources = z.input;\ntype TargetsAppliedDamages = z.output;\n\ntype TargetAppliedDamage = z.output;\n\ntype TargetsDataUpdates = {\n [k in keyof TargetsDataSource]?: TargetsDataSource[k] | ForcedReplacement | ForcedDeletion;\n};\n\nexport { encodeTargetsData, zSaveVariant, zSaveVariants, zTargetsData, zTokenDocumentArrayDecode };\nexport type {\n AppliedDamages,\n AppliedDamagesSource,\n SaveVariant,\n SaveVariants,\n SaveVariantSource,\n SaveVariantsSource,\n TargetAppliedDamage,\n TargetsAppliedDamages,\n TargetsAppliedDamagesSources,\n TargetsData,\n TargetsDataSource,\n TargetsDataUpdates,\n};\n", "import {\n ActorPF2e,\n ChatMessagePF2e,\n getDocumentFromUUID,\n getExtraRollOptions,\n ItemPF2e,\n TokenDocumentPF2e,\n} from \"foundry-helpers\";\nimport {\n encodeTargetsData,\n SaveVariant,\n TargetAppliedDamage,\n TargetSaveInstance,\n TargetsData,\n TargetsDataSource,\n TargetsDataUpdates,\n} from \".\";\n\nclass TargetHelper {\n #data: TargetsData;\n #isGM: boolean;\n #variantId: string;\n\n constructor(data: TargetsData, variantId: string | null = null) {\n this.#data = data;\n this.#isGM = game.user.isGM;\n this.#variantId = String(variantId);\n }\n\n get variantId(): string {\n return this.#variantId;\n }\n\n get type(): toolbelt.targetHelper.TargetMessageType {\n return this.#data.type;\n }\n\n get author(): foundry.utils.DocumentUUID | null {\n return this.#data.author;\n }\n\n get targets(): TokenDocumentPF2e[] {\n return this.#data.targets;\n }\n\n get splashTargets(): TokenDocumentPF2e[] {\n return this.#data.splashTargets;\n }\n\n get splashIndex(): number {\n return this.#data.splashIndex;\n }\n\n get hasSave(): boolean {\n return !!this.saveVariant;\n }\n\n get hasTargets(): boolean {\n return this.targets.length > 0;\n }\n\n get hasSplashTargets(): boolean {\n return this.splashTargets.length > 0;\n }\n\n get hasSplashDamage(): boolean {\n return this.splashIndex > -1;\n }\n\n get saveVariant(): SaveVariant {\n return this.#data.saveVariants[this.#variantId];\n }\n\n get expended(): number {\n return this.#data.expended;\n }\n\n get itemUUID(): foundry.utils.DocumentUUID | null {\n return this.#data.item;\n }\n\n get isPrivate(): boolean {\n return !!this.#data.private;\n }\n\n get isBasic(): boolean {\n return !!this.saveVariant?.basic;\n }\n\n get isAction(): boolean {\n return this.type === \"action\";\n }\n\n get isAutoFire(): boolean {\n return this.area === \"auto-fire\";\n }\n\n get area(): \"area-fire\" | \"auto-fire\" | null {\n return this.#data.area;\n }\n\n get extraRollOptions(): string[] {\n return getExtraRollOptions(this.#data, this.isBasic);\n }\n\n get npcListToRoll(): TokenDocumentPF2e[] {\n const statistic = this.saveVariant?.statistic;\n if (!statistic || !this.#isGM) return [];\n\n return [...this.targets, ...this.splashTargets].filter((target) => {\n const actor = target.actor;\n return actor?.getStatistic(statistic) && !actor.hasPlayerOwner && !this.saveVariant.saves[target.id];\n });\n }\n\n get canRollNPCSaves(): boolean {\n return this.npcListToRoll.length > 0;\n }\n\n async getItem(message: ChatMessagePF2e): Promise | null> {\n return (await getDocumentFromUUID(\"Item\", this.itemUUID)) ?? message.item;\n }\n\n targetSave(id: string): TargetSaveInstance | undefined {\n return this.saveVariant.saves[id];\n }\n\n targetApplied(id: string): TargetAppliedDamage {\n return this.#data.applied[id] ?? {};\n }\n\n encode(changes?: TargetsDataUpdates): TargetsDataSource {\n return encodeTargetsData(this.#data, changes);\n }\n}\n\nexport { TargetHelper };\n", "import {\n ActorUUID,\n ChatMessagePF2e,\n getDragEventData,\n htmlClosest,\n ItemPF2e,\n ItemUUID,\n MODULE,\n resolveActorAndItemFromHTML,\n SaveType,\n splitListString,\n} from \"foundry-helpers\";\nimport { R, SAVE_TYPES } from \"foundry-helpers/dist\";\nimport { SaveVariantSource, TargetHelperTool, zSaveVariant } from \"..\";\n\nlet BASIC_SAVE_REGEX: RegExp;\nfunction getSaveLinkData(el: Maybe): SaveLinkData | null {\n if (!isValidSaveLink(el)) return null;\n\n const dataset = el.dataset;\n\n const dc = (() => {\n const adjustment = Number(dataset.pf2Adjustment) || 0;\n\n if (\"pf2Dc\" in dataset) {\n return Number(dataset.pf2Dc) + adjustment;\n }\n\n const actor = fromUuidSync(dataset.itemUuid, { strict: false })?.actor;\n const statisticDc = actor?.getStatistic(dataset.against)?.dc.value;\n if (!statisticDc) return;\n\n return statisticDc + adjustment;\n })();\n\n if (dc == null || isNaN(dc)) return null;\n\n const { item } = resolveActorAndItemFromHTML(el);\n const data: SaveLinkData = {\n saveVariants: { null: { dc, basic: false, statistic: dataset.pf2Check } },\n item: item?.uuid,\n options: splitListString(dataset.pf2RollOptions ?? \"\"),\n traits: splitListString(dataset.pf2Traits ?? \"\"),\n };\n\n if (dataset.isBasic == null) {\n const label = el.querySelector(\"span.label\")?.lastChild?.textContent?.trim();\n\n if (label) {\n if (!BASIC_SAVE_REGEX) {\n const saves = Object.values(CONFIG.PF2E.saves).map((x) => game.i18n.localize(x));\n const joined = game.i18n.format(\"PF2E.InlineCheck.BasicWithSave\", {\n save: `(${saves.join(\"|\")})`,\n });\n BASIC_SAVE_REGEX = new RegExp(joined);\n }\n data.saveVariants[\"null\"].basic = BASIC_SAVE_REGEX.test(label);\n }\n }\n\n return data;\n}\n\nfunction onChatMessageDrop(this: TargetHelperTool, event: DragEvent) {\n const target = htmlClosest(event.target, \"li.chat-message\");\n if (!target) return;\n\n const eventData = getDragEventData(event);\n if (!eventData || eventData.type !== `${MODULE.id}-check-roll`) return;\n\n const messageId = target.dataset.messageId;\n const message = messageId ? (game.messages.get(messageId) as ChatMessagePF2e) : undefined;\n const data = message && this.getMessageData(message);\n if (!data) return;\n\n if (!isMessageOwner(message)) {\n this.localize.warning(\"drop.unauth\");\n return;\n }\n\n if (data.saveVariants[\"null\"]) {\n this.localize.warning(\"drop.already\");\n return;\n }\n\n const updates = R.omit(eventData, [\"saveVariants\", \"type\"]);\n const saveVariant = zSaveVariant.safeParse(eventData.saveVariants.null).data;\n\n for (const [key, value] of R.entries(updates)) {\n data[key] = value as any;\n }\n\n if (saveVariant) {\n foundry.utils.setProperty(data, \"saveVariants.null\", saveVariant);\n }\n\n this.setMessageData(message, data);\n this.localize.info(\"drop.added\");\n}\n\nfunction isValidSaveLink(el: Maybe): el is HTMLAnchorElement & {\n dataset: CheckLinkData;\n} {\n if (!(el instanceof HTMLAnchorElement) || !el.classList.contains(\"inline-check\")) {\n return false;\n }\n\n const { pf2Dc, against, itemUuid, pf2Check, rollerRole } = el.dataset;\n\n return (\n ((rollerRole !== \"origin\" && !!pf2Dc) || !!(against && itemUuid)) && SAVE_TYPES.includes(pf2Check as SaveType)\n );\n}\n\nfunction isMessageOwner(message: ChatMessagePF2e) {\n return game.user.isGM || message.isAuthor;\n}\n\ntype SaveDragData = SaveLinkData & {\n type: `${string}-check-roll`;\n};\n\ntype SaveLinkData = {\n author?: ActorUUID;\n saveVariants: { null: SaveVariantSource };\n options: string[];\n traits: string[];\n item: ItemUUID | undefined;\n};\n\ntype CheckLinkData = {\n pf2Check: SaveType;\n pf2Adjustment?: `${number}`;\n pf2RollOptions?: string;\n pf2Traits?: string;\n isBasic?: boolean;\n} & ({ against: string; itemUuid: string } | { pf2Dc: `${number}` });\n\nexport { getSaveLinkData, isMessageOwner, onChatMessageDrop };\nexport type { SaveDragData, SaveLinkData };\n", "import { ChatMessagePF2e, createHTMLElement, R, selectTokens, TokenDocumentPF2e } from \"foundry-helpers\";\r\nimport { rollSaves, TargetHelperTool, TargetsType } from \".\";\r\nimport { TargetHelper } from \"..\";\r\n\r\nfunction createSetTargetsBtn(\r\n this: TargetHelperTool,\r\n message: ChatMessagePF2e,\r\n targetHelper: TargetHelper,\r\n splash?: boolean,\r\n): HTMLElement {\r\n const type: TargetsType = splash ? \"splashTargets\" : \"targets\";\r\n const btn = createHTMLElement(targetHelper.isAction ? \"a\" : \"button\", {\r\n classes: [\"pf2e-toolbelt-target-setTargets\", type],\r\n dataset: { action: \"set-targets\" },\r\n content:\r\n type === \"targets\" ? \"\" : \"\",\r\n });\r\n\r\n btn.title = this.localize(\"setTargets\", type);\r\n addSetTargetsListener.call(this, btn, message, type);\r\n\r\n return btn;\r\n}\r\n\r\nfunction addSetTargetsListener(this: TargetHelperTool, btn: HTMLElement, message: ChatMessagePF2e, type: TargetsType) {\r\n btn.addEventListener(\"click\", async (event) => {\r\n event.stopPropagation();\r\n\r\n const data = this.getMessageData(message);\r\n if (!data) return;\r\n\r\n const targets = this.getCurrentTargets();\r\n const otherType: TargetsType = type === \"targets\" ? \"splashTargets\" : \"targets\";\r\n const otherTargets = R.pipe(\r\n data[otherType],\r\n R.map((token) => token.uuid),\r\n R.difference(targets),\r\n );\r\n\r\n this.setMessageData(message, data, {\r\n [type]: targets,\r\n [otherType]: otherTargets,\r\n });\r\n });\r\n}\r\n\r\nfunction createRollNPCSavesBtn(\r\n this: TargetHelperTool,\r\n message: ChatMessagePF2e,\r\n targetHelper: TargetHelper,\r\n): HTMLElement | undefined {\r\n if (!targetHelper.canRollNPCSaves) return;\r\n\r\n const btn = createHTMLElement(targetHelper.isAction ? \"a\" : \"button\", {\r\n classes: [\"pf2e-toolbelt-target-rollSaves\"],\r\n content: \"\",\r\n });\r\n\r\n btn.title = this.localize(\"rollSaves\");\r\n addRollSavesListener.call(this, btn, message, targetHelper);\r\n\r\n return btn;\r\n}\r\n\r\nfunction addRollSavesListener(\r\n this: TargetHelperTool,\r\n btn: HTMLElement,\r\n message: ChatMessagePF2e,\r\n targetHelper: TargetHelper,\r\n) {\r\n btn.addEventListener(\"click\", async (event) => {\r\n event.stopPropagation();\r\n\r\n const targets = targetHelper.npcListToRoll;\r\n\r\n if (targets.length) {\r\n rollSaves.call(this, event, message, targetHelper, targets);\r\n }\r\n });\r\n}\r\n\r\nfunction addSaveBtnListener(\r\n this: TargetHelperTool,\r\n realBtn: HTMLButtonElement | HTMLAnchorElement,\r\n fakeBtn: HTMLButtonElement,\r\n message: ChatMessagePF2e,\r\n targetHelper: TargetHelper,\r\n) {\r\n const allTargets = targetHelper.targets.map((target) => target.uuid);\r\n\r\n fakeBtn.addEventListener(\"click\", (event) => {\r\n event.preventDefault();\r\n\r\n const selected = game.user.getActiveTokens();\r\n const targets: TokenDocumentPF2e[] = [];\r\n const remainSelected: TokenDocumentPF2e[] = [];\r\n\r\n for (const token of selected) {\r\n if (!targetHelper.targetSave(token.id) && allTargets.includes(token.uuid)) {\r\n targets.push(token);\r\n } else {\r\n remainSelected.push(token);\r\n }\r\n }\r\n\r\n if (remainSelected.length) {\r\n selectTokens(remainSelected);\r\n }\r\n\r\n if (remainSelected.length || !targets.length) {\r\n const clickEvent = new MouseEvent(\"click\", event);\r\n realBtn.dispatchEvent(clickEvent);\r\n }\r\n\r\n if (targets.length) {\r\n rollSaves.call(this, event, message, targetHelper, targets);\r\n }\r\n });\r\n}\r\n\r\nexport { addRollSavesListener, addSaveBtnListener, addSetTargetsListener, createRollNPCSavesBtn, createSetTargetsBtn };\r\n", "import {\n ChatMessagePF2e,\n CheckContextChatFlag,\n CheckRoll,\n CheckRollCallback,\n ErrorPF2e,\n eventToRollParams,\n getActiveModule,\n getCheckRollClass,\n R,\n Rolled,\n signedInteger,\n SYSTEM,\n TokenDocumentPF2e,\n waitDialog,\n} from \"foundry-helpers\";\nimport { DEGREE_OF_SUCCESS_STRINGS, DegreeOfSuccess, extractNotes, RollNotePF2e } from \"foundry-helpers/dist\";\nimport {\n RerollType,\n SaveInstanceModifier,\n TargetHelper,\n TargetHelperTool,\n TargetSaveInstance,\n TargetSaveInstanceSource,\n} from \"..\";\n\nconst REROLLS: Record = {\n hero: {\n icon: \"fa-solid fa-hospital-symbol\",\n reroll: \"PF2E.RerollMenu.HeroPoint\",\n rerolled: \"PF2E.RerollMenu.MessageHeroPoints\",\n },\n mythic: {\n icon: \"fa-solid fa-circle-m\",\n reroll: \"PF2E.RerollMenu.MythicPoint\",\n rerolled: \"PF2E.RerollMenu.MessageMythicPoints\",\n },\n new: {\n icon: \"fa-solid fa-dice\",\n reroll: \"PF2E.RerollMenu.KeepNew\",\n rerolled: \"PF2E.RerollMenu.MessageKeep.new\",\n },\n lower: {\n icon: \"fa-solid fa-dice-one\",\n reroll: \"PF2E.RerollMenu.KeepLower\",\n rerolled: \"PF2E.RerollMenu.MessageKeep.lower\",\n },\n higher: {\n icon: \"fa-solid fa-dice-six\",\n reroll: \"PF2E.RerollMenu.KeepHigher\",\n rerolled: \"PF2E.RerollMenu.MessageKeep.higher\",\n },\n};\n\nfunction showGhostDiceOnPrivate() {\n const dsn = getActiveModule(\"dice-so-nice\");\n return !!dsn && dsn.getSetting<\"0\" | \"1\" | \"2\">(\"showGhostDice\") !== \"0\";\n}\n\nfunction roll3dDice(\n roll: Rolled,\n target: TokenDocumentPF2e,\n isPrivate: boolean,\n): Promise | undefined {\n if (!game.dice3d) return;\n\n const speaker = ChatMessage.getSpeaker({ token: target });\n\n if (!isPrivate && (target.hasPlayerOwner || !showGhostDiceOnPrivate())) {\n return game.dice3d.showForRoll(roll, game.user, true, null, false, null, speaker);\n }\n\n const cloneRoll = Roll.fromTerms(roll.terms) as Rolled & { ghost: boolean };\n cloneRoll.ghost = true;\n\n game.dice3d.showForRoll(cloneRoll, game.user, true, null, true, null, speaker);\n return game.dice3d.showForRoll(roll, game.user, false, null, false, null, speaker);\n}\n\nasync function rollSaves(\n this: TargetHelperTool,\n event: MouseEvent,\n message: ChatMessagePF2e,\n targetHelper: TargetHelper,\n targets: TokenDocumentPF2e[],\n) {\n const dataSave = targetHelper.saveVariant;\n if (!dataSave) return;\n\n const extraRollOptions = targetHelper.extraRollOptions;\n const item = await targetHelper.getItem(message);\n\n const user = game.user;\n const origin = message.actor;\n const skipDefault = !user.settings.showCheckDialogs;\n const skipDialog = targets.length > 1 || (event.shiftKey ? !skipDefault : skipDefault);\n const rollParams = eventToRollParams(event, { type: \"check\" });\n const updates: Record = {};\n\n const targetsRollsPromise = targets.map((target) => {\n if (targetHelper.targetSave(target.id)) return;\n\n const statistic = target.actor?.getStatistic(dataSave.statistic);\n if (!statistic) return;\n\n return new Promise((resolve) => {\n const callback: CheckRollCallback = async (roll, success, rollMessage) => {\n const isPrivate =\n targetHelper.isPrivate ||\n rollMessage.whisper.filter((userId) => userId && game.users.get(userId)?.isGM).length > 0;\n\n await roll3dDice(roll, target, isPrivate);\n\n const context = rollMessage.flags[SYSTEM.id].context as CheckContextChatFlag;\n const modifiers = R.pipe(\n rollMessage.flags[SYSTEM.id].modifiers ?? [],\n R.filter((modifier) => !!modifier.enabled),\n R.map((modifier): SaveInstanceModifier => {\n return {\n excluded: false,\n label: modifier.label,\n modifier: modifier.modifier,\n slug: modifier.slug ?? \"unknown\",\n };\n }),\n );\n\n const rollData: TargetSaveInstance = {\n die: (roll.terms[0] as foundry.dice.terms.NumericTerm).total,\n dosAdjustments: context.dosAdjustments ?? {},\n modifiers: modifiers ?? [],\n notes: context.notes as any,\n private: isPrivate,\n roll: JSON.stringify(roll.toJSON()),\n significantModifiers: window.pf2eMm?.getSignificantModifiersOfMessage(rollMessage) ?? [],\n statistic: dataSave.statistic,\n success: success!,\n unadjustedOutcome: context.unadjustedOutcome,\n value: roll.total,\n };\n\n updates[target.id] = rollData;\n\n Hooks.callAll(\"pf2e-toolbelt.rollSave\", {\n roll,\n message,\n rollMessage,\n target,\n data: rollData,\n });\n\n resolve();\n };\n\n statistic.check.roll({\n ...rollParams,\n dc: { value: dataSave.dc },\n item,\n origin,\n skipDialog,\n extraRollOptions,\n createMessage: false,\n callback,\n });\n });\n });\n\n const filteredTargetsRollsPromise = targetsRollsPromise.filter(R.isTruthy);\n if (!filteredTargetsRollsPromise.length) return;\n\n if (!game.dice3d) {\n foundry.audio.AudioHelper.play({ src: CONFIG.sounds.dice }, true);\n }\n\n await Promise.all(filteredTargetsRollsPromise);\n\n this.updateMessageEmitable.call({\n message,\n saves: updates,\n variantId: targetHelper.variantId,\n });\n}\n\nasync function rerollSave(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n targetHelper: TargetHelper,\n target: TokenDocumentPF2e,\n) {\n const dataSave = targetHelper.saveVariant;\n const actor = target.actor;\n const targetSave = targetHelper.targetSave(target.id);\n if (!dataSave || !actor || !targetSave || targetSave.rerolled) return;\n\n const rerolls = R.entries(REROLLS);\n const isCharacter = actor.isOfType(\"character\");\n\n if (!isCharacter || actor.heroPoints.value <= 0) {\n rerolls.findSplice(([type]) => type === \"hero\");\n }\n\n if (!isCharacter || actor.system.resources.mythicPoints.value <= 0) {\n rerolls.findSplice(([type]) => type === \"mythic\");\n }\n\n const options = rerolls.map(([type, { icon, reroll }], i) => {\n const label = game.i18n.localize(reroll);\n const checked = i === 0 ? \"checked\" : \"\";\n\n return ``;\n });\n\n const result = await waitDialog<{ reroll: RerollType }>({\n content: options.join(\"\"),\n i18n: `${this.key}.reroll`,\n yes: {\n icon: \"fa-solid fa-rotate rotate\",\n },\n classes: [\"reroll\"],\n });\n\n if (!result) return;\n\n const hookOptions = {\n keep: R.isIncludedIn(result.reroll, [\"hero\", \"mythic\"]) ? \"new\" : result.reroll,\n };\n\n const resourceKey = result.reroll === \"hero\" ? \"hero-points\" : result.reroll === \"mythic\" ? \"mythic-points\" : \"\";\n const resource = actor.getResource(resourceKey);\n\n if (resource && isCharacter && resource.value < 1) {\n return ui.notifications.warn(\"PF2E.RerollMenu.WarnNoResource\", {\n localize: true,\n format: {\n name: actor.name,\n resource: resource.label,\n },\n });\n }\n\n /**\n * reworked version of\n * https://github.com/foundryvtt/pf2e/blob/e28d75364626c4b396c02f702afa2c12de0cf6ee/src/module/system/check/check.ts#L509-L510\n */\n const oldRoll = Roll.fromJSON(targetSave.roll) as Rolled;\n const pwolVariant = game.pf2e.settings.variants.pwol.enabled;\n\n const unevaluatedNewRoll = ((): CheckRoll => {\n if (resource?.slug !== \"mythic-points\" || !actor.isOfType(\"character\")) return oldRoll.clone();\n // Create a new CheckRoll in case of a mythic point reroll\n const proficiencyModifier = actor\n .getStatistic(targetSave.statistic)\n ?.modifiers.find((m) => m.slug === \"proficiency\");\n if (!proficiencyModifier) {\n throw ErrorPF2e(`Failed to reroll check with a mythic point. Check is missing a proficiency modifier!`);\n }\n // Set flag proficiency modifier to mythic modifier value\n const mythicModifierValue = 10 + (pwolVariant ? 0 : actor.level);\n const proficiencyModifierValue = proficiencyModifier.modifier;\n proficiencyModifier.modifier = mythicModifierValue;\n proficiencyModifier.label = game.i18n.localize(\"PF2E.TraitMythic\");\n // Calculate the new total modifier\n const options = foundry.utils.deepClone(oldRoll.options);\n options.totalModifier = (options.totalModifier ?? 0) - proficiencyModifierValue + mythicModifierValue;\n const CheckRoll = getCheckRollClass();\n return new CheckRoll(\n `${options.dice}${signedInteger(options.totalModifier, { emptyStringZero: true })}`,\n oldRoll.data,\n options,\n );\n })();\n unevaluatedNewRoll.options.isReroll = true;\n\n Hooks.callAll(\"pf2e.preReroll\", Roll.fromJSON(targetSave.roll), unevaluatedNewRoll, resource, hookOptions);\n\n const newRoll = await unevaluatedNewRoll.evaluate({ allowInteractive: !targetSave.private });\n Hooks.callAll(\"pf2e.reroll\", Roll.fromJSON(targetSave.roll), newRoll, resource, hookOptions);\n\n await roll3dDice(newRoll, target, targetSave.private);\n\n const keptRoll =\n (hookOptions.keep === \"higher\" && oldRoll.total > newRoll.total) ||\n (hookOptions.keep === \"lower\" && oldRoll.total < newRoll.total)\n ? oldRoll\n : newRoll;\n\n if (keptRoll === newRoll) {\n const success = new DegreeOfSuccess(newRoll, dataSave.dc, targetSave.dosAdjustments);\n keptRoll.options.degreeOfSuccess = success.value;\n }\n\n const domains = actor.saves?.[dataSave.statistic]?.domains ?? [];\n const outcome = DEGREE_OF_SUCCESS_STRINGS[keptRoll.degreeOfSuccess!];\n\n const notes = R.pipe(\n [...extractNotes(actor.synthetics.rollNotes, domains)],\n R.map((note) => {\n return note instanceof RollNotePF2e ? note : new RollNotePF2e(note);\n }),\n R.filter((note) => {\n const test = note.predicate.test([\n ...targetHelper.extraRollOptions,\n ...(note.rule?.item.getRollOptions(\"parent\") ?? []),\n ]);\n return test && (!note.outcome.length || (outcome && note.outcome.includes(outcome)));\n }),\n );\n\n const modifiers = foundry.utils.deepClone(targetSave.modifiers);\n\n if (result.reroll === \"mythic\") {\n const proficiencyIdx = modifiers.findIndex((modifier) => modifier.slug === \"proficiency\");\n\n const mythic = {\n excluded: false,\n label: game.i18n.localize(\"PF2E.TraitMythic\"),\n modifier: 10 + (pwolVariant ? 0 : actor.level),\n slug: \"proficiency\",\n };\n\n if (proficiencyIdx !== -1) {\n const proficiency = modifiers[proficiencyIdx];\n\n proficiency.excluded = true;\n modifiers.splice(proficiencyIdx + 1, 0, mythic);\n } else {\n modifiers.push(mythic);\n }\n }\n\n const rollData = {\n die: (keptRoll.terms[0] as foundry.dice.terms.NumericTerm).total,\n dosAdjustments: foundry.utils.deepClone(targetSave.dosAdjustments),\n modifiers,\n notes: notes.map((note) => note.toObject()),\n private: targetSave.private,\n rerolled: result.reroll,\n roll: JSON.stringify(keptRoll.toJSON()),\n significantModifiers: window.pf2eMm?.getSignificantModifiersOfMessage({\n ...message,\n rolls: [newRoll],\n }),\n statistic: dataSave.statistic,\n success: outcome,\n value: keptRoll.total,\n } satisfies TargetSaveInstanceSource;\n\n if (keptRoll.options.keeleyAdd10) {\n rollData.modifiers.push({\n excluded: false,\n label: this.localize(\"reroll.keeley\"),\n modifier: 10,\n slug: \"keeley-add-10\",\n });\n }\n\n Hooks.callAll(\"pf2e-toolbelt.rerollSave\", {\n oldRoll,\n newRoll,\n keptRoll,\n message,\n target,\n data: rollData,\n } satisfies toolbelt.targetHelper.RerollSaveHook);\n\n const updates = { [target.id]: rollData };\n\n if (resource && isCharacter) {\n await actor.updateResource(resource.slug, resource.value - 1);\n }\n\n this.updateMessageEmitable.call({\n message,\n saves: updates,\n variantId: targetHelper.variantId,\n });\n}\n\ntype RerollDetails = {\n icon: string;\n reroll: string;\n rerolled: string;\n};\n\nexport { REROLLS, rerollSave, rollSaves };\nexport type { RerollDetails };\n", "import {\r\n addListener,\r\n addListenerAll,\r\n ChatMessagePF2e,\r\n createHTMLElement,\r\n DegreeOfSuccessString,\r\n emitTokenHover,\r\n getActiveModule,\r\n getDocumentFromUUID,\r\n panToToken,\r\n pingToken,\r\n R,\r\n RollNotePF2e,\r\n SaveType,\r\n TokenDocumentPF2e,\r\n} from \"foundry-helpers\";\r\nimport { RerollDetails, REROLLS, rerollSave, rollSaves, TargetHelperTool } from \".\";\r\nimport { TargetHelper } from \"..\";\r\n\r\nconst SAVES_DETAILS: Record = {\r\n fortitude: { icon: \"fa-solid fa-chess-rook\", label: \"PF2E.SavesFortitude\" },\r\n reflex: { icon: \"fa-solid fa-person-running\", label: \"PF2E.SavesReflex\" },\r\n will: { icon: \"fa-solid fa-brain\", label: \"PF2E.SavesWill\" },\r\n};\r\n\r\nasync function addTargetsHeaders(\r\n this: TargetHelperTool,\r\n message: ChatMessagePF2e,\r\n targetHelper: TargetHelper,\r\n parent: HTMLElement,\r\n classes: string[] = [],\r\n) {\r\n if (!targetHelper.hasTargets && !targetHelper.hasSplashTargets) return;\r\n\r\n const rowsWrapper = createHTMLElement(\"div\", {\r\n classes: [\"pf2e-toolbelt-target-targetRows\", ...classes],\r\n });\r\n\r\n for (const { row } of await createTargetsRows.call(this, message, targetHelper, false)) {\r\n rowsWrapper.append(row);\r\n }\r\n\r\n parent.append(rowsWrapper);\r\n}\r\n\r\nasync function createTargetsRows(\r\n this: TargetHelperTool,\r\n message: ChatMessagePF2e,\r\n targetHelper: TargetHelper,\r\n all: boolean,\r\n): Promise {\r\n const targetGroups: [TargetsType, TokenDocumentPF2e[]][] = [[\"targets\", targetHelper.targets]];\r\n\r\n if (all) {\r\n targetGroups.push([\"splashTargets\", targetHelper.splashTargets]);\r\n }\r\n\r\n const isGM = game.user.isGM;\r\n const originActor = message.actor;\r\n const author = await getDocumentFromUUID(\"Actor\", targetHelper.author);\r\n const showBreakdowns = isGM || game.pf2e.settings.metagame.breakdowns;\r\n const showSignificant =\r\n showBreakdowns || !!getActiveModule(\"pf2e-modifiers-matter\")?.getSetting(\"always-show-highlights-to-everyone\");\r\n\r\n const cached: TargetRowDataCached = {\r\n isGM,\r\n isOriginFriendly: !originActor || originActor.isOwner || originActor.hasPlayerOwner,\r\n showBreakdowns,\r\n showDC: isGM || game.pf2e.settings.metagame.dcs || !!author?.hasPlayerOwner,\r\n showResults: isGM || game.pf2e.settings.metagame.results,\r\n showSignificant,\r\n tokenNameVisibility: game.pf2e.settings.tokens.nameVisibility,\r\n };\r\n\r\n type GroupedTarget = { target: TokenDocumentPF2e; type: TargetsType };\r\n\r\n const targets = R.pipe(\r\n targetGroups,\r\n R.flatMap(([type, targets]): GroupedTarget[] => {\r\n return targets.map((target): GroupedTarget => ({ target, type }));\r\n }),\r\n );\r\n\r\n const sortedTargets = isGM\r\n ? R.sortBy(\r\n targets,\r\n ({ target }) => target.hasPlayerOwner,\r\n ({ target }) => target.name,\r\n )\r\n : R.sortBy(\r\n targets,\r\n [({ target }) => target.isOwner, \"desc\"],\r\n [({ target }) => target.hasPlayerOwner, \"desc\"],\r\n ({ target }) => target.name,\r\n );\r\n\r\n const rowsPromise = sortedTargets.map(async ({ type, target }) => {\r\n const rowData = await getTargetRowData.call(this, target, targetHelper, cached);\r\n if (!rowData) return;\r\n\r\n const row = createHTMLElement(\"div\", {\r\n classes: [\"target-row\"],\r\n content: rowData.template,\r\n });\r\n\r\n row.addEventListener(\"mouseenter\", async (event) => {\r\n emitTokenHover(event, target, true);\r\n });\r\n\r\n row.addEventListener(\"mouseleave\", async (event) => {\r\n emitTokenHover(event, target, false);\r\n });\r\n\r\n row.addEventListener(\"dragenter\", (event) => {\r\n row.classList.add(\"drag-over\");\r\n emitTokenHover(event, target, true);\r\n });\r\n\r\n row.addEventListener(\"dragleave\", (event) => {\r\n const relatedTarget = event.relatedTarget as HTMLElement | null;\r\n if (relatedTarget && row.contains(relatedTarget)) return;\r\n\r\n row.classList.remove(\"drag-over\");\r\n emitTokenHover(event, target, false);\r\n });\r\n\r\n row.addEventListener(\"drop\", (event) => {\r\n row.classList.remove(\"drag-over\");\r\n target.actor?.sheet._onDrop(event);\r\n });\r\n\r\n addListener(row, \".name\", () => {\r\n panToToken(target, true);\r\n });\r\n\r\n addListener(row, \".name\", \"dblclick\", () => {\r\n target.actor?.sheet.render(true);\r\n });\r\n\r\n addListenerAll(row, \"[data-action]\", (el, event) => {\r\n type EventAction = \"ping-target\" | \"roll-save\" | \"reroll-save\";\r\n\r\n event.stopPropagation();\r\n\r\n const action = el.dataset.action as EventAction;\r\n\r\n if (action === \"ping-target\") {\r\n pingToken(target);\r\n } else if (action === \"roll-save\") {\r\n rollSaves.call(this, event, message, targetHelper, [target]);\r\n } else if (action === \"reroll-save\") {\r\n rerollSave.call(this, message, targetHelper, target);\r\n }\r\n });\r\n\r\n return { ...rowData, row, target, type } satisfies TargetRowData;\r\n });\r\n\r\n const rows = await Promise.all(rowsPromise);\r\n return rows.filter(R.isTruthy);\r\n}\r\n\r\nasync function getTargetRowData(\r\n this: TargetHelperTool,\r\n target: TokenDocumentPF2e,\r\n targetHelper: TargetHelper,\r\n {\r\n isGM,\r\n isOriginFriendly,\r\n showBreakdowns,\r\n showDC,\r\n showResults,\r\n showSignificant,\r\n tokenNameVisibility,\r\n }: TargetRowDataCached,\r\n): Promise {\r\n const isHidden = targetIsHidden(target);\r\n if (!isGM && isHidden) return;\r\n\r\n const isOwner = target.isOwner;\r\n const hasPlayerOwner = target.hasPlayerOwner;\r\n const isTargetFriendly = isOwner || hasPlayerOwner;\r\n const canSeeName = isOwner || !tokenNameVisibility || target.playersCanSeeName;\r\n\r\n const dataSave = targetHelper.saveVariant;\r\n const headerData: HeaderData = {\r\n hasPlayerOwner,\r\n isHidden,\r\n isOwner,\r\n showSuccess: showResults || isOriginFriendly,\r\n name: canSeeName ? target.name : this.localize(\"unnamed\"),\r\n };\r\n\r\n const save = await (async () => {\r\n if (!dataSave) return;\r\n\r\n const { icon, label } = SAVES_DETAILS[dataSave.statistic];\r\n const targetSave = targetHelper.targetSave(target.id);\r\n const targetStatistic = target.actor?.getStatistic(dataSave.statistic);\r\n\r\n const isPrivate = targetSave?.private && !hasPlayerOwner;\r\n const canSeeResult = isGM || !isPrivate;\r\n const canReroll = targetSave && !targetSave.rerolled;\r\n\r\n const significantList = foundry.utils.deepClone(targetSave?.significantModifiers) ?? [];\r\n const significantModifier = (() => {\r\n if (!showSignificant && !isTargetFriendly) return;\r\n if (!significantList.length) return;\r\n\r\n return R.pipe(\r\n significantList,\r\n R.map(({ value, significance }) => {\r\n return {\r\n value: Math.abs(value),\r\n css: `has-significant-modifiers ${significance}`,\r\n };\r\n }),\r\n R.firstBy([R.prop(\"value\"), \"desc\"]),\r\n )?.css;\r\n })();\r\n\r\n const rerolled = targetSave?.rerolled ? REROLLS[targetSave.rerolled] : undefined;\r\n\r\n const tooltip = await (async () => {\r\n if (!targetStatistic) return;\r\n\r\n const saveLabel = game.i18n.format(\"PF2E.SavingThrowWithName\", {\r\n saveName: game.i18n.localize(label),\r\n });\r\n const saveDC = showDC ? this.localize(\"tooltip.dcWithValue\", dataSave) : \"\";\r\n const tooltipLabel = `${saveLabel} ${saveDC}`;\r\n\r\n const adjustment = (() => {\r\n if (\r\n (!isTargetFriendly && !showBreakdowns) ||\r\n !targetSave?.unadjustedOutcome ||\r\n !targetSave.dosAdjustments ||\r\n targetSave.success === targetSave.unadjustedOutcome\r\n )\r\n return;\r\n\r\n const adjustments = R.filter(\r\n [\r\n targetSave.dosAdjustments[targetSave.unadjustedOutcome]?.label,\r\n targetSave.dosAdjustments.all?.label,\r\n ],\r\n R.isTruthy,\r\n );\r\n\r\n return adjustments.length ? adjustments.map((x) => game.i18n.localize(x)).join(\", \") : undefined;\r\n })();\r\n\r\n const result = (() => {\r\n if (!canSeeResult || !targetSave) return;\r\n\r\n let tmp = \"\";\r\n const offset = targetSave.value - dataSave.dc;\r\n\r\n if (showBreakdowns || isTargetFriendly) {\r\n tmp += `( ${targetSave.die}) `;\r\n }\r\n\r\n if (showResults || isOriginFriendly) {\r\n tmp += this.localize(`tooltip.result.${showDC ? \"withOffset\" : \"withoutOffset\"}`, {\r\n success: game.i18n.localize(`PF2E.Check.Result.Degree.Check.${targetSave.success}`),\r\n offset: offset >= 0 ? `+${offset}` : offset,\r\n });\r\n }\r\n\r\n if (tmp) {\r\n return this.localize(\"tooltip.result.format\", { result: tmp });\r\n }\r\n })();\r\n\r\n const modifiers = (() => {\r\n if (!targetSave || (!showBreakdowns && !isTargetFriendly)) return [];\r\n\r\n const mods = targetSave.modifiers.map(\r\n ({ excluded, label, modifier }): TooltipData[\"modifiers\"][number] => {\r\n const significant = significantList.findSplice(\r\n ({ name, value }) => name === label && modifier === value,\r\n );\r\n\r\n const classes: string[] = [significant?.significance ?? \"NONE\"];\r\n\r\n if (excluded) {\r\n classes.push(\"excluded\");\r\n }\r\n\r\n return {\r\n name: label.replace(/(.+) \\d+/, \"$1\"),\r\n value: modifier,\r\n css: classes.join(\" \"),\r\n };\r\n },\r\n );\r\n\r\n if (!significantList.length || (!showSignificant && !isTargetFriendly)) {\r\n return mods;\r\n }\r\n\r\n const significant = significantList.map(({ name, significance, value }) => ({\r\n name: name.replace(/(.+) \\d+/, \"$1\"),\r\n value,\r\n css: significance,\r\n }));\r\n\r\n return mods.concat(significant);\r\n })();\r\n\r\n const tooltipData: TooltipData = {\r\n adjustment,\r\n canReroll,\r\n check: tooltipLabel,\r\n modifiers,\r\n rerolled,\r\n result,\r\n };\r\n\r\n return this.render(\"tooltip\", tooltipData);\r\n })();\r\n\r\n const notes = (() => {\r\n if (!targetSave?.notes) return;\r\n\r\n const notesList = RollNotePF2e.notesToHTML(targetSave.notes.map((note) => new RollNotePF2e(note)));\r\n\r\n if (notesList) {\r\n notesList.classList.add(\"pf2e-toolbelt-target-notes\");\r\n return notesList.outerHTML;\r\n }\r\n })();\r\n\r\n return (headerData.save = {\r\n ...(targetSave ?? dataSave),\r\n basic: dataSave.basic,\r\n canSeeResult,\r\n canReroll,\r\n visibility: isGM && isPrivate ? \"data-visibility='gm'\" : \"\",\r\n significantModifier,\r\n icon,\r\n notes,\r\n rerolled,\r\n tooltip,\r\n });\r\n })();\r\n\r\n return {\r\n isOwner,\r\n save,\r\n template: await this.render(\"header\", headerData),\r\n };\r\n}\r\n\r\nfunction targetIsHidden(target: TokenDocumentPF2e): boolean {\r\n return target.hidden || !!target.actor?.hasCondition(\"unnoticed\", \"undetected\");\r\n}\r\n\r\ntype HeaderData = {\r\n hasPlayerOwner: boolean;\r\n isHidden: boolean;\r\n isOwner: boolean;\r\n name: string;\r\n save?: TargetRowSave;\r\n showSuccess: boolean;\r\n};\r\n\r\ntype BaseTargetRowData = {\r\n isOwner: boolean;\r\n template: string;\r\n save: TargetRowSave | undefined;\r\n};\r\n\r\ntype TargetRowSave = {\r\n basic: boolean | undefined;\r\n canReroll: boolean | undefined;\r\n canSeeResult: boolean;\r\n icon: string;\r\n notes: string | undefined;\r\n rerolled: RerollDetails | undefined;\r\n significantModifier: string | false | undefined;\r\n statistic: SaveType;\r\n success?: DegreeOfSuccessString | undefined;\r\n tooltip: string | undefined;\r\n unadjustedOutcome?: DegreeOfSuccessString | null;\r\n value?: number | undefined;\r\n visibility: string;\r\n};\r\n\r\ntype TargetRowData = BaseTargetRowData & {\r\n row: HTMLElement;\r\n target: TokenDocumentPF2e;\r\n type: TargetsType;\r\n};\r\n\r\ntype TargetRowDataCached = {\r\n isGM: boolean;\r\n isOriginFriendly: boolean;\r\n showBreakdowns: boolean;\r\n showDC: boolean;\r\n showResults: boolean;\r\n showSignificant: boolean;\r\n tokenNameVisibility: boolean;\r\n};\r\n\r\ntype TooltipData = {\r\n adjustment: string | undefined;\r\n canReroll: boolean | undefined;\r\n check: string;\r\n modifiers: { name: string; value: number; css: string }[];\r\n rerolled: RerollDetails | undefined;\r\n result: string | undefined;\r\n};\r\n\r\ntype TargetsType = \"targets\" | \"splashTargets\";\r\n\r\nexport { addTargetsHeaders, createTargetsRows };\r\nexport type { TargetsType };\r\n", "import {\n ChatMessagePF2e,\n createHTMLElement,\n createHTMLElementContent,\n htmlQuery,\n registerUpstreamHook,\n} from \"foundry-helpers\";\nimport {\n addTargetsHeaders,\n createRollNPCSavesBtn,\n createSetTargetsBtn,\n getSaveLinkData,\n isMessageOwner,\n onChatMessageDrop,\n TargetHelperTool,\n} from \".\";\nimport { TargetHelper, TargetsData, TargetsDataSource } from \"..\";\n\nconst SAVE_LINK_REGEX = //g;\n\nfunction prepareActionMessage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n updates: DeepPartial,\n): boolean {\n updates.type = \"action\";\n\n const match = message.content.match(SAVE_LINK_REGEX);\n if (!match || match.length !== 1) return true;\n\n const link = createHTMLElementContent({ content: match[0] });\n const linkData = getSaveLinkData(link);\n\n if (linkData) {\n linkData.author ??= message.actor?.uuid;\n foundry.utils.mergeObject(updates, linkData, { inplace: true });\n }\n\n return true;\n}\n\nasync function renderActionMessage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n html: HTMLElement,\n data: TargetsData,\n) {\n const msgContent = htmlQuery(html, \".message-content\");\n if (!msgContent) return;\n\n const targetHelper = new TargetHelper(data);\n const hasSave = targetHelper.hasSave;\n\n if (hasSave) {\n await addTargetsHeaders.call(this, message, targetHelper, msgContent, [\"pf2e-toolbelt-target-actionRows\"]);\n }\n\n if (!isMessageOwner(message)) return;\n\n html.addEventListener(\"drop\", onChatMessageDrop.bind(this));\n\n if (!hasSave) return;\n\n const chatCard = htmlQuery(msgContent, \".chat-card\");\n if (!chatCard) return;\n\n const footer = (() => {\n const exist = htmlQuery(chatCard, \"footer\");\n if (exist) return exist;\n\n const label = game.i18n.localize(\"TYPES.Item.action\");\n const added = createHTMLElement(\"footer\", { content: `${label}` });\n\n chatCard.append(added);\n return added;\n })();\n\n const buttonsWrapper = createHTMLElement(\"div\", { classes: [\"pf2e-toolbelt-target-buttons\"] });\n const setTargetsBtn = createSetTargetsBtn.call(this, message, targetHelper);\n\n const rollSavesBtn = createRollNPCSavesBtn.call(this, message, targetHelper);\n if (rollSavesBtn) {\n buttonsWrapper.append(rollSavesBtn);\n }\n\n buttonsWrapper.append(setTargetsBtn);\n\n footer.append(buttonsWrapper);\n\n const damageLinks = msgContent.querySelectorAll(\".inline-roll[data-formula][data-damage-roll]\");\n\n for (const link of damageLinks) {\n link.addEventListener(\n \"click\",\n (_event) => {\n // we cache the data & change its type\n const cached = targetHelper.encode({ type: \"damage\" });\n\n registerUpstreamHook(\n \"preCreateChatMessage\",\n (damageMessage: ChatMessagePF2e) => {\n // we feed all the data to the damage message\n this.updateSourceFlag(damageMessage, cached);\n },\n true,\n );\n\n // we clean the message save related data\n this.setMessageData(message, data, { saveVariants: _del });\n },\n true,\n );\n }\n}\n\nexport { prepareActionMessage, renderActionMessage };\n", "import {\n AreaAttackContextFlag,\n ChatMessagePF2e,\n CreaturePF2e,\n htmlQuery,\n isAreaOrAutoFireType,\n ItemPF2e,\n MeleePF2e,\n MODULE,\n SYSTEM,\n WeaponPF2e,\n} from \"foundry-helpers\";\nimport { isMessageOwner, renderSpellCardLikeMessage, TargetHelperTool } from \".\";\nimport { TargetHelper, TargetsData, TargetsDataSource } from \"..\";\nimport { createHTMLElement } from \"foundry-helpers/src\";\n\nconst EXTRA_AREA_OPTIONS = [\"damaging-effect\", \"area-damage\", \"area-effect\"];\n\nfunction isAreaMessage(message: ChatMessagePF2e): boolean {\n const context = message.flags[SYSTEM.id].context;\n return !!context && isAreaOrAutoFireType(context.type) && !!(context as AreaAttackContextFlag).dc?.value;\n}\n\nfunction prepareAreaMessage(this: TargetHelperTool, message: ChatMessagePF2e, updates: TargetsDataSource): boolean {\n const context = message.flags[SYSTEM.id].context as Required;\n\n updates.area = context.type;\n updates.author = message.item?.actor.uuid;\n updates.type = \"area\";\n\n updates.options ??= [];\n updates.options.push(...EXTRA_AREA_OPTIONS);\n\n if (!this.getMessageSaveVariants(message)) {\n updates.saveVariants = {\n null: {\n basic: true,\n dc: context.dc.value,\n statistic: \"reflex\",\n },\n };\n }\n\n return true;\n}\n\nasync function renderAreaMessage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n html: HTMLElement,\n data: TargetsData,\n) {\n const item = message.item;\n const msgContent = htmlQuery(html, \".message-content\");\n if (!msgContent || !isValidItem(item)) return;\n\n const targetHelper = new TargetHelper(data);\n const expendBtn = createAreaExpendBtn.call(this, message, targetHelper);\n\n if (expendBtn) {\n const buttonsWrapper = createHTMLElement(\"div\", {\n classes: [\"pf2e-toolbelt-target-buttons\"],\n content: expendBtn,\n });\n\n const damageBtn = htmlQuery(msgContent, `.message-buttons [data-action=\"roll-area-damage\"]`);\n\n if (damageBtn) {\n damageBtn.replaceWith(buttonsWrapper);\n buttonsWrapper.append(damageBtn);\n }\n }\n\n return renderSpellCardLikeMessage.call(\n this,\n message,\n msgContent,\n targetHelper,\n item,\n `.message-buttons [data-action=\"roll-area-save\"]`,\n `.message-buttons [data-action=\"roll-area-damage\"]`,\n );\n}\n\nfunction createAreaExpendBtn(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n data: TargetHelper,\n): HTMLButtonElement | undefined {\n if (!this.settings.expend) return;\n\n const item = message.item;\n if (!data.area || !item?.isOfType(\"weapon\")) return;\n\n const isGrenade = item.system.baseItem === \"grenade\";\n if (!isGrenade && !item.system.ammo) return;\n\n const nb = data.targets.length;\n const expended = data.expended;\n if (expended < 1 && nb < 1) return;\n\n const iconPath = isGrenade\n ? MODULE.imagePath(\"grenade\", \"svg\")\n : SYSTEM.relativePath(\"assets/icons/heavy-bullets.svg\");\n\n const totalExpend = isGrenade ? 1 : data.isAutoFire ? nb * 2 : item.system.expend || 1;\n\n const hasExpended = expended > 0;\n const displayedExpend = isGrenade ? \"\" : hasExpended ? expended : totalExpend;\n\n const tooltip = this.localize(\"expend-ammo\", hasExpended ? \"expended\" : \"expend\", isGrenade ? \"grenade\" : \"ammo\", {\n expend: data.isAutoFire ? `${nb}x2` : totalExpend,\n nb: totalExpend,\n });\n\n const btn = createHTMLElement(\"button\", {\n classes: [\"pf2e-toolbelt-target-expend\"],\n content: `${displayedExpend}`,\n dataset: { tooltip },\n });\n\n if (hasExpended) {\n btn.disabled = true;\n }\n\n if (hasExpended || !isMessageOwner(message)) {\n return btn;\n }\n\n btn.addEventListener(\"click\", async (event) => {\n event.stopPropagation();\n\n if (isGrenade) {\n if (item.quantity < 1) {\n return this.localize.warning(\"expend-ammo.warning.grenade\");\n } else {\n // we don't delete grenades as it would mess with the re-rendering of the message\n await item.update({ \"system.quantity\": item.quantity - 1 });\n }\n\n return this.updateMessageEmitable.call({ message, expended: 1 });\n }\n\n const ammo = item.ammo;\n\n if (item.system.expend && ammo?.isOfType(\"ammo\")) {\n if (ammo.uses.max > 1 ? ammo.uses.value < totalExpend : ammo.quantity < totalExpend) {\n return this.localize.warning(\"expend-ammo.warning.ammo\");\n }\n\n await ammo.consume(totalExpend);\n } else if (ammo?.isOfType(\"weapon\")) {\n if (ammo.quantity < totalExpend) {\n return this.localize.warning(\"expend-ammo.warning.ammo\");\n }\n\n if (!ammo.system.usage.canBeAmmo) {\n return this.localize.warning(\"expend-ammo.warning.error\");\n }\n\n await ammo.update({ \"system.quantity\": ammo.quantity - totalExpend });\n } else {\n return this.localize.warning(\"expend-ammo.warning.error\");\n }\n\n this.updateMessageEmitable.call({ message, expended: totalExpend });\n });\n\n return btn;\n}\n\nfunction isValidItem(item: Maybe): item is WeaponPF2e | MeleePF2e {\n return !!item?.isOfType(\"weapon\", \"melee\") && !!item.actor?.isOfType(\"creature\");\n}\n\nexport { createAreaExpendBtn, isAreaMessage, prepareAreaMessage, renderAreaMessage };\n", "import {\n canObserveActor,\n ChatMessagePF2e,\n createHTMLElementContent,\n firstElementWithText,\n htmlQuery,\n parseInlineParams,\n R,\n splitListString,\n} from \"foundry-helpers\";\nimport { SAVE_TYPES } from \"foundry-helpers/dist\";\nimport { anonymousTool, TRAITS_BLACKLIST } from \"tools\";\nimport {\n addRollSavesListener,\n addSaveBtnListener,\n addSetTargetsListener,\n addTargetsHeaders,\n getSaveLinkData,\n isDamageMessage,\n isMessageOwner,\n SaveLinkData,\n TargetHelperTool,\n} from \".\";\nimport { TargetHelper, TargetsData, TargetsDataSource } from \"..\";\n\nconst REPOST_CHECK_MESSAGE_REGEX = /^(?:.+?<\\/span> ?)?()$/;\nconst PROMPT_CHECK_MESSAGE_REGEX = /^(?:

    )?@Check\\[([^\\]]+)\\](?:{([^}]+)})?(?:<\\/p>)?$/;\n\nfunction prepareCheckMessage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n updates: DeepPartial,\n): boolean {\n const data = getCheckLinkData(message);\n if (!data) return false;\n\n foundry.utils.mergeObject(updates, data, { inplace: true });\n updates.type = \"check\";\n\n return true;\n}\n\nfunction getCheckLinkData(message: ChatMessagePF2e): SaveLinkData | null {\n const promptMatch = message.content.match(PROMPT_CHECK_MESSAGE_REGEX);\n if (promptMatch) {\n const [_match, paramString] = promptMatch;\n const rawParams = parseInlineParams(paramString, { first: \"type\" });\n if (!rawParams) return null;\n\n const statistic = rawParams.type?.trim();\n const dc = Number(rawParams.dc);\n if (!R.isIncludedIn(statistic, SAVE_TYPES) || isNaN(dc)) return null;\n\n const basic = \"basic\" in rawParams;\n const options = [...(basic ? [\"damaging-effect\"] : []), ...splitListString(rawParams.options ?? \"\")]\n .filter(R.isTruthy)\n .sort();\n\n return {\n author: message.actor?.uuid,\n saveVariants: { null: { dc, basic, statistic } },\n options,\n item: undefined,\n traits: splitListString(rawParams.traits ?? \"\"),\n } satisfies SaveLinkData;\n }\n\n const repostMatch = message.content.match(REPOST_CHECK_MESSAGE_REGEX);\n if (repostMatch) {\n const link = createHTMLElementContent({ content: repostMatch[1] });\n const linkData = getSaveLinkData(link);\n\n if (linkData) {\n linkData.author = message.actor?.uuid;\n }\n\n return linkData;\n }\n\n return null;\n}\n\nasync function renderCheckMessage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n html: HTMLElement,\n data: TargetsData,\n) {\n const msgContent = htmlQuery(html, \".message-content\");\n const link = htmlQuery(msgContent, \"a\");\n if (!msgContent || !link) return;\n\n const targetHelper = new TargetHelper(data);\n if (!targetHelper.hasSave) return;\n\n const isOwner = isMessageOwner(message);\n const canRollSaves = targetHelper.canRollNPCSaves;\n const canObserve = canObserveActor(message.actor);\n const item = await targetHelper.getItem(message);\n\n const flavor = htmlQuery(html, \".message-header .flavor-text\");\n const saveLabel = firstElementWithText(msgContent.lastElementChild);\n\n const label = firstElementWithText(flavor) ?? firstElementWithText(msgContent.firstElementChild);\n\n const traitsSetting = anonymousTool.settings.traits;\n const baseTraits = item?.traitChatData() ?? [];\n const traits = canObserve\n ? baseTraits\n : traitsSetting === \"all\"\n ? baseTraits\n : traitsSetting === \"blacklist\"\n ? baseTraits.filter((trait) => !R.isIncludedIn(trait.value, TRAITS_BLACKLIST))\n : [];\n\n msgContent.innerHTML = await this.render(\"check-card\", {\n item: canObserve ? item : null,\n isOwner,\n canRollSaves,\n speaker: message.speaker,\n label: label?.outerHTML || \"\",\n save: saveLabel?.outerHTML || \"\",\n traits,\n });\n\n flavor?.remove();\n msgContent.prepend(link);\n link.classList.add(\"hidden\");\n\n await addTargetsHeaders.call(this, message, targetHelper, msgContent);\n\n const fakeBtn = htmlQuery(msgContent, `[data-action=\"roll-fake-check\"]`);\n if (fakeBtn) {\n addSaveBtnListener.call(this, link, fakeBtn, message, targetHelper);\n }\n\n if (!isOwner) {\n html.classList.add(\"pf2e-toolbelt-check-player\");\n return;\n }\n\n html.classList.add(\"pf2e-toolbelt-check-gm\");\n\n const setTargetsBtn = htmlQuery(msgContent, `[data-action=\"set-targets\"]`);\n if (setTargetsBtn) {\n addSetTargetsListener.call(this, setTargetsBtn, message, \"targets\");\n }\n\n if (canRollSaves) {\n const rollSavesBtn = htmlQuery(msgContent, `[data-action=\"roll-saves\"]`);\n if (rollSavesBtn) {\n addRollSavesListener.call(this, rollSavesBtn, message, targetHelper);\n }\n }\n\n const mergeBtn = htmlQuery(msgContent, `[data-action=\"merge-to-damage\"]`);\n mergeBtn?.addEventListener(\"click\", () => {\n mergeToDamage.call(this, message, targetHelper);\n });\n}\n\nfunction mergeToDamage(this: TargetHelperTool, message: ChatMessagePF2e, targetHelper: TargetHelper) {\n const messages = game.messages.contents;\n const index = messages.findLastIndex((msg) => message === msg);\n const damageMessage = messages[index + 1];\n\n if (\n !damageMessage ||\n !isDamageMessage(damageMessage) ||\n !isMessageOwner(message) ||\n this.getFlag(damageMessage, \"save\")\n ) {\n return this.localize.warning(\"merge.none\");\n }\n\n const source = R.pick(targetHelper.encode(), [\"saveVariants\", \"targets\"]);\n this.setFlag(damageMessage, source);\n\n // we clean up the check message as we are not gonna use it anymore\n this.unsetFlag(message);\n}\n\nexport { prepareCheckMessage, renderCheckMessage };\n", "import {\n addListenerAll,\n ChatMessagePF2e,\n createHTMLElement,\n DamageDamageContextFlag,\n DamageMessage,\n DamageRoll,\n DegreeOfSuccessString,\n ErrorPF2e,\n getChoiceSetSelection,\n getItemSourceId,\n htmlClosest,\n htmlQuery,\n htmlQueryAll,\n isInstanceOf,\n R,\n removeIndexFromArray,\n SYSTEM,\n TokenDocumentPF2e,\n} from \"foundry-helpers\";\nimport { extractEphemeralEffects } from \"foundry-helpers/dist\";\nimport {\n createAreaExpendBtn,\n createRollNPCSavesBtn,\n createSetTargetsBtn,\n createTargetsRows,\n getSpellSaveVariants,\n isMessageOwner,\n onChatMessageDrop,\n TargetHelper,\n TargetHelperTool,\n TargetsData,\n TargetsDataSource,\n} from \"..\";\n\nconst THIRD_PATH_TO_PERFECTION = \"Compendium.pf2e.classfeatures.Item.haoTkr2U5k7kaAKN\";\n\nconst LEGENDARY_SAVES = [\n \"Compendium.pf2e.classfeatures.Item.TuL0UfqH14MtqYVh\", // Greater Juggernaut\n \"Compendium.pf2e.classfeatures.Item.XFcCeBYqeXgfiA84\", // Greater Dogged Will\n \"Compendium.pf2e.classfeatures.Item.rpLPCkTXCZlQ51SR\", // Greater Natural Reflexes\n \"Compendium.pf2e.classfeatures.Item.BTpL6XvMk4jvVYYJ\", // Greater Rogue Reflexes\n \"Compendium.pf2e.classfeatures.Item.syEkISIi0F9946zo\", // Assured Evasion\n \"Compendium.pf2e.classfeatures.Item.Kj59CmXnMJDKXKWx\", // Greater Mysterious Resolve\n \"Compendium.pf2e.classfeatures.Item.mRobjNNsABQdUUZq\", // Greater Performer's Heart\n \"Compendium.pf2e.classfeatures.Item.Hw6Ji7Fgx0XkVkac\", // Fortress of Will\n \"Compendium.pf2e.classfeatures.Item.5LOARurr4qWkfS9K\", // Greater Resolve\n \"Compendium.pf2e.classfeatures.Item.i3qjbhL7uukg9I80\", // Greater Kinetic Durability\n];\n\nfunction isDamageMessage(message: ChatMessagePF2e): message is DamageMessage {\n return message.isDamageRoll;\n}\n\nfunction prepareDamageMessage(\n this: TargetHelperTool,\n message: DamageMessage,\n updates: DeepPartial,\n): boolean {\n if (isPersistentDamageMessage(message)) return false;\n\n updates.type = \"damage\";\n updates.isRegen = isRegenMessage(message);\n\n area: if (!this.getFlag(message, \"area\")) {\n const context = message.flags[SYSTEM.id].context as DamageDamageContextFlag | undefined;\n if (!context) break area;\n\n updates.area = R.isIncludedIn(\"auto-fire-damage\", context.domains)\n ? \"auto-fire\"\n : R.isIncludedIn(\"area-fire-damage\", context.domains)\n ? \"area-fire\"\n : null;\n }\n\n if (!this.getMessageSaveVariants(message)) {\n const saveVariants = getSpellSaveVariants(message);\n\n if (saveVariants) {\n updates.saveVariants = saveVariants;\n }\n }\n\n if (updates.isRegen) {\n const token = message.token;\n updates.targets = token ? [token.uuid] : [];\n }\n\n if (message.rolls.length === 2) {\n const splashRollIndex = message.rolls.findIndex((roll) => roll.options.splashOnly);\n const regularRollIndex = message.rolls.findIndex((roll: DamageRoll) => {\n return (\n !roll.options.splashOnly &&\n roll.options.damage?.modifiers?.some((modifier) => {\n return (\n (\"category\" in modifier && modifier.category === \"splash\") ||\n (\"damageCategory\" in modifier && modifier.damageCategory === \"splash\")\n );\n })\n );\n });\n\n if (splashRollIndex !== -1 && regularRollIndex !== -1) {\n updates.splashIndex = splashRollIndex;\n }\n }\n\n return true;\n}\n\nasync function renderDamageMessage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n html: HTMLElement,\n data: TargetsData,\n) {\n const msgContent = htmlQuery(html, \".message-content\");\n if (!msgContent) return;\n\n const isOwner = isMessageOwner(message);\n const targetHelper = new TargetHelper(data);\n const hasTargets = targetHelper.hasTargets;\n const hasSplashTargets = targetHelper.hasSplashTargets;\n const isArea = !!targetHelper.area;\n if (!hasTargets && !hasSplashTargets && !isArea && !isOwner) return;\n\n const damageRows = htmlQueryAll(msgContent, \".damage-application\");\n const diceTotalElements = msgContent.querySelectorAll(\".dice-result .dice-total\");\n const wrappersParents = diceTotalElements.length\n ? diceTotalElements\n : msgContent.querySelectorAll(\".dice-result .dice-formula\");\n if (!damageRows.length && !wrappersParents.length) return;\n\n const hasSplashDamage = targetHelper.hasSplashDamage;\n const [btnWrapper, splashWrapper] = R.times(2, () => {\n return createHTMLElement(\"div\", { classes: [\"pf2e-toolbelt-target-buttons\"] });\n });\n\n if (hasTargets) {\n const rows = removeIndexFromArray(damageRows, targetHelper.splashIndex);\n const toggleBtn = createDamageToggleBtn.call(this, rows);\n btnWrapper.append(toggleBtn);\n }\n\n if (hasSplashDamage && (hasTargets || hasSplashTargets)) {\n const row = damageRows[targetHelper.splashIndex];\n const toggleBtn = createDamageToggleBtn.call(this, [row]);\n splashWrapper.append(toggleBtn);\n }\n\n if (isOwner) {\n const setTargetsBtn = createSetTargetsBtn.call(this, message, targetHelper);\n btnWrapper.append(setTargetsBtn);\n\n if (hasSplashDamage) {\n const setSplashTargetBtn = createSetTargetsBtn.call(this, message, targetHelper, true);\n splashWrapper.append(setSplashTargetBtn);\n }\n\n html.classList.add(\"pf2e-toolbelt-damage\");\n html.addEventListener(\"drop\", onChatMessageDrop.bind(this));\n }\n\n const rollSavesBtn = createRollNPCSavesBtn.call(this, message, targetHelper);\n if (rollSavesBtn) {\n btnWrapper.append(rollSavesBtn);\n }\n\n const expendBtn = isArea && createAreaExpendBtn.call(this, message, targetHelper);\n if (expendBtn) {\n btnWrapper.append(expendBtn);\n }\n\n wrappersParents[0].append(btnWrapper);\n\n if (hasSplashDamage) {\n wrappersParents[targetHelper.splashIndex]?.append(splashWrapper);\n }\n\n if (!hasTargets && !hasSplashTargets) return;\n\n const originActor = message.actor;\n const showResults =\n game.user.isGM ||\n game.pf2e.settings.metagame.results ||\n !originActor ||\n originActor.isOwner ||\n !!originActor.hasPlayerOwner;\n\n const rowsWrapper = createHTMLElement(\"div\", {\n classes: [\"pf2e-toolbelt-target-targetRows\", \"pf2e-toolbelt-target-damage\"],\n });\n\n const smallButtons = this.settings.small;\n const clonedDamageRows = damageRows.map((el) => {\n const clone = el.cloneNode(true) as HTMLElement;\n\n clone.classList.remove(\"hidden\");\n\n if (smallButtons) {\n clone.classList.add(\"small\");\n }\n\n const actionElements = clone.querySelectorAll(\"[data-action]\");\n\n for (const actionElement of actionElements) {\n const action = actionElement.dataset.action;\n actionElement.dataset.action = `target-${action}`;\n }\n\n return clone;\n });\n\n for (const targetData of await createTargetsRows.call(this, message, targetHelper, true)) {\n const { row, target, type, isOwner, save } = targetData;\n\n rowsWrapper.append(row);\n\n if (!isOwner) continue;\n\n const targetActor = target.actor;\n const applied = targetHelper.targetApplied(target.id);\n\n for (let i = 0; i < clonedDamageRows.length; i++) {\n if (type === \"splashTargets\" && i !== targetHelper.splashIndex) continue;\n\n const clonedDamageRow = clonedDamageRows[i];\n const clone = clonedDamageRow.cloneNode(true) as HTMLElement;\n\n clone.dataset.targetRollIndex = String(i);\n clone.dataset.targetUuid = target.uuid;\n\n clone.classList.toggle(\n \"applied\",\n !!applied[i] || (!!save?.basic && save.success === \"criticalSuccess\" && showResults),\n );\n\n if (save?.success && targetHelper.isBasic) {\n const success: DegreeOfSuccessString = (() => {\n if (\n save.unadjustedOutcome !== \"failure\" ||\n !targetActor?.isOfType(\"character\") ||\n targetActor.saves[save.statistic].rank !== 4\n ) {\n return save.success;\n }\n\n for (const item of targetActor.itemTypes.feat) {\n const sourceId = getItemSourceId(item);\n if (!sourceId) continue;\n\n if (sourceId === THIRD_PATH_TO_PERFECTION) {\n const selection = getChoiceSetSelection(item, {\n flag: \"pathToPerfection\",\n });\n\n if (selection === save.statistic) {\n return \"success\";\n }\n } else if (LEGENDARY_SAVES.includes(sourceId)) {\n return \"success\";\n }\n }\n\n return save.success;\n })();\n\n if (showResults) {\n clone.classList.add(success);\n }\n }\n\n addListenerAll(clone, \"[data-action]\", (el, event) => {\n onDamageBtnClick.call(this, event, el, target, message);\n });\n\n row.append(clone);\n }\n }\n\n msgContent.append(rowsWrapper);\n}\n\nfunction createDamageToggleBtn(this: TargetHelperTool, rows: HTMLElement[]): HTMLElement {\n const toggleBtn = createHTMLElement(\"button\", {\n classes: [\"pf2e-toolbelt-target-toggleDamageRows\"],\n content: ``,\n });\n\n toggleBtn.title = this.localize(\"damage.toggle\");\n toggleBtn.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n\n toggleBtn.classList.toggle(\"expanded\");\n\n for (const damageRow of rows) {\n damageRow.classList.toggle(\"hidden\");\n }\n });\n\n for (const damageRow of rows) {\n damageRow.classList.add(\"hidden\");\n }\n\n return toggleBtn;\n}\n\nfunction onDamageBtnClick(\n this: TargetHelperTool,\n event: MouseEvent,\n btn: HTMLElement,\n target: TokenDocumentPF2e,\n message: ChatMessagePF2e,\n) {\n type Action = \"target-applyDamage\" | \"target-shieldBlock\";\n\n const { action, multiplier } = btn.dataset as { action: Action; multiplier: `${number}` };\n\n if (action === \"target-shieldBlock\") {\n if (!btn.classList.contains(\"shield-activated\")) {\n toggleOffShieldBlock(message.id);\n }\n\n btn.classList.toggle(\"shield-activated\");\n CONFIG.PF2E.chatDamageButtonShieldToggle = !CONFIG.PF2E.chatDamageButtonShieldToggle;\n\n return;\n }\n\n const rollIndexStr = htmlClosest(btn, \"[data-target-uuid]\")?.dataset.targetRollIndex;\n const rollIndex = Number(rollIndexStr) || 0;\n\n applyDamageFromMessage.call(this, {\n message,\n multiplier: Number(multiplier),\n promptModifier: event.shiftKey,\n rollIndex,\n token: target,\n });\n}\n\n/**\n * slightly modified version of\n * https://github.com/foundryvtt/pf2e/blob/50b2b8e71a81c60f35fcb2e086e07c5e2706ca44/src/module/chat-message/helpers.ts#L88\n */\nasync function applyDamageFromMessage(\n this: TargetHelperTool,\n {\n message,\n multiplier = 1,\n addend = 0,\n promptModifier = false,\n rollIndex = 0,\n // ADDED BY MODULE\n token,\n }: ApplyDamageFromMessageParams,\n) {\n if (promptModifier) return shiftAdjustDamage.call(this, message, multiplier, rollIndex, token);\n\n // MODIFIED BY THE MODULE\n const tokens = [token];\n if (tokens.length === 0) {\n ui.notifications.error(\"PF2E.ErrorMessage.NoTokenSelected\", { localize: true });\n return;\n }\n\n const shieldBlockRequest = CONFIG.PF2E.chatDamageButtonShieldToggle;\n const roll = message.rolls.at(rollIndex);\n if (!isInstanceOf(roll, \"DamageRoll\")) throw ErrorPF2e(\"Unexpected error retrieving damage roll\");\n\n const damage = multiplier < 0 ? multiplier * roll.total + addend : roll.alter(multiplier, addend);\n\n // Get origin roll options and apply damage to a contextual clone: this may influence condition IWR, for example\n const context = message.flags[SYSTEM.id].context;\n const messageRollOptions = [...(context?.options ?? [])];\n const originRollOptions = messageRollOptions\n .filter((o) => o.startsWith(\"self:\"))\n .map((o) => o.replace(/^self/, \"origin\"));\n const messageItem = message.item;\n const effectRollOptions = messageItem?.isOfType(\"affliction\", \"condition\", \"effect\")\n ? messageItem.getRollOptions(\"item\")\n : [];\n\n for (const token of tokens) {\n if (!token.actor) continue;\n // Add roll option for ally/enemy status\n if (token.actor.alliance && message.actor) {\n const allyOrEnemy = token.actor.alliance === message.actor.alliance ? \"ally\" : \"enemy\";\n messageRollOptions.push(`origin:${allyOrEnemy}`);\n }\n\n // If no target was acquired during a roll, set roll options for it during damage application\n if (!messageRollOptions.some((o) => o.startsWith(\"target\"))) {\n messageRollOptions.push(...token.actor.getSelfRollOptions(\"target\"));\n }\n const domain = multiplier > 0 ? \"damage-received\" : \"healing-received\";\n const ephemeralEffects =\n multiplier > 0\n ? await extractEphemeralEffects({\n affects: \"target\",\n origin: message.actor,\n target: token.actor,\n item: message.item,\n domains: [domain],\n options: messageRollOptions,\n })\n : [];\n const contextClone = token.actor.getContextualClone(originRollOptions, ephemeralEffects);\n const rollOptions = new Set([\n ...messageRollOptions.filter((o) => !/^(?:self|target)(?::|$)/.test(o)),\n ...effectRollOptions,\n ...originRollOptions,\n ...contextClone.getSelfRollOptions(),\n ]);\n\n await contextClone.applyDamage({\n damage,\n token,\n item: message.item,\n skipIWR: multiplier <= 0,\n rollOptions,\n shieldBlockRequest,\n outcome: context?.outcome,\n });\n }\n toggleOffShieldBlock(message.id);\n\n // ADDED BY MODULE\n this.updateMessageEmitable.call({\n message,\n applied: {\n rollIndex,\n targetId: token.id,\n },\n });\n}\n\n/**\n * slightly modified version of\n * https://github.com/foundryvtt/pf2e/blob/50b2b8e71a81c60f35fcb2e086e07c5e2706ca44/src/module/chat-message/helpers.ts#L173\n */\nasync function shiftAdjustDamage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n multiplier: number,\n rollIndex: number,\n // ADDED BY MODULE\n token: TokenDocumentPF2e,\n): Promise {\n const content = await foundry.applications.handlebars.renderTemplate(\n SYSTEM.relativePath(\"templates/chat/damage/adjustment-dialog.hbs\"),\n );\n const AdjustmentDialog = class extends foundry.appv1.api.Dialog {\n override activateListeners($html: JQuery): void {\n super.activateListeners($html);\n $html[0].querySelector(\"input\")?.focus();\n }\n };\n const isHealing = multiplier < 0;\n new AdjustmentDialog({\n title: game.i18n.localize(isHealing ? \"PF2E.UI.shiftModifyHealingTitle\" : \"PF2E.UI.shiftModifyDamageTitle\"),\n content,\n buttons: {\n ok: {\n label: game.i18n.localize(\"PF2E.OK\"),\n callback: async ($dialog: JQuery) => {\n // In case of healing, multipler will have negative sign. The user will expect that positive\n // modifier would increase healing value, while negative would decrease.\n const adjustment = (Number($dialog[0].querySelector(\"input\")?.value) || 0) * Math.sign(multiplier);\n applyDamageFromMessage.call(this, {\n message,\n multiplier,\n addend: adjustment,\n promptModifier: false,\n rollIndex,\n token,\n });\n },\n },\n cancel: {\n label: \"Cancel\",\n },\n },\n default: \"ok\",\n close: () => {\n toggleOffShieldBlock(message.id);\n },\n }).render(true);\n}\n\nfunction toggleOffShieldBlock(messageId: string) {\n for (const id of [\"chat\", \"chat-popout\", \"chat-notifications\"]) {\n const buttons = document.querySelectorAll(\n `#${id} [data-message-id=\"${messageId}\"] button[data-action$=\"shieldBlock\"]`,\n );\n\n for (const button of buttons) {\n button.classList.remove(\"shield-activated\");\n }\n }\n\n CONFIG.PF2E.chatDamageButtonShieldToggle = false;\n}\n\nfunction isPersistentDamageMessage(message: ChatMessagePF2e): boolean {\n return !!message.rolls[0].options.evaluatePersistent;\n}\n\nlet HEALINGS_REGEX;\nfunction isRegenMessage(message: ChatMessagePF2e) {\n HEALINGS_REGEX ??= (() => {\n const healings = [\n game.i18n.localize(\"PF2E.Encounter.Broadcast.FastHealing.fast-healing.ReceivedMessage\"),\n game.i18n.localize(\"PF2E.Encounter.Broadcast.FastHealing.regeneration.ReceivedMessage\"),\n ];\n return new RegExp(`^

    (${healings.join(\"|\")})
    `);\n })();\n return HEALINGS_REGEX.test(message.flavor);\n}\n\ninterface ApplyDamageFromMessageParams {\n message: ChatMessagePF2e;\n multiplier?: number;\n addend?: number;\n promptModifier?: boolean;\n rollIndex?: number;\n // ADDED BY THE MODULE\n token: TokenDocumentPF2e;\n}\n\nexport { isDamageMessage, prepareDamageMessage, renderDamageMessage };\n", "import {\n ActorPF2e,\n ChatMessagePF2e,\n createHTMLElement,\n htmlQuery,\n MeleePF2e,\n R,\n registerUpstreamHook,\n SpellPF2e,\n WeaponPF2e,\n} from \"foundry-helpers\";\nimport {\n addSaveBtnListener,\n addTargetsHeaders,\n createRollNPCSavesBtn,\n createSetTargetsBtn,\n isMessageOwner,\n TargetHelperTool,\n} from \".\";\nimport { SaveVariantSource, SaveVariantsSource, TargetHelper, TargetsData, TargetsDataSource } from \"..\";\n\nfunction prepareSpellMessage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n updates: DeepPartial,\n): boolean {\n const saveVariants = getSpellSaveVariants(message);\n if (!saveVariants) return false;\n\n updates.type = \"spell\";\n\n if (!this.getMessageSaveVariants(message)) {\n updates.saveVariants = saveVariants;\n }\n\n return true;\n}\n\nfunction getSpellSaveVariants(message: ChatMessagePF2e): SaveVariantsSource | null {\n const spell = getMessageSpell(message);\n if (!spell) return null;\n\n const dc: number | undefined = spell.spellcasting?.statistic?.withRollOptions({ item: spell }).dc.value;\n if (!R.isNumber(dc)) return null;\n\n const baseSave = spell?.system.defense?.save;\n\n if (spell.hasVariants) {\n const saveVariants: SaveVariantsSource = {};\n\n for (const [id, { system }] of spell.overlays.entries()) {\n if (system?.defense === null) continue;\n\n const override = system?.defense?.save;\n if (!baseSave && !override) continue;\n\n const save = foundry.utils.mergeObject(baseSave ?? {}, { dc, ...override }, { inplace: false });\n\n if (save.statistic) {\n saveVariants[id] = save as Omit;\n }\n }\n\n return saveVariants;\n } else if (baseSave) {\n return { null: { dc, ...baseSave } };\n }\n\n return null;\n}\n\nasync function renderSpellMessage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n html: HTMLElement,\n data: TargetsData,\n) {\n const spell = getMessageSpell(message);\n const msgContent = htmlQuery(html, \".message-content\");\n if (!msgContent || !spell) return;\n if (spell.hasVariants && !spell.variantId) return;\n\n const targetHelper = new TargetHelper(data, spell.variantId);\n\n return renderSpellCardLikeMessage.call(\n this,\n message,\n msgContent,\n targetHelper,\n spell,\n `.card-buttons [data-action=\"spell-save\"]`,\n `.card-buttons [data-action=\"spell-damage\"]`,\n );\n}\n\nasync function renderSpellCardLikeMessage(\n this: TargetHelperTool,\n message: ChatMessagePF2e,\n msgContent: HTMLElement,\n data: TargetHelper,\n item: SpellPF2e | WeaponPF2e | MeleePF2e,\n saveBtnSelector: string,\n damageBtnSelector: string,\n): Promise {\n const save = data.saveVariant;\n if (!save) return;\n\n await addTargetsHeaders.call(this, message, data, msgContent);\n\n const saveBtn = htmlQuery(msgContent, saveBtnSelector);\n if (!(saveBtn instanceof HTMLButtonElement)) return;\n\n const buttonsWrapper = createHTMLElement(\"div\", { classes: [\"pf2e-toolbelt-target-buttons\"] });\n const fakeSaveBtn = saveBtn.cloneNode(true) as HTMLButtonElement;\n\n fakeSaveBtn.dataset.save = \"reflex\";\n delete fakeSaveBtn.dataset.action;\n\n saveBtn.classList.add(\"hidden\");\n saveBtn.after(buttonsWrapper);\n\n addSaveBtnListener.call(this, saveBtn, fakeSaveBtn, message, data);\n buttonsWrapper.append(fakeSaveBtn);\n\n if (!isMessageOwner(message)) return;\n\n const setTargetsBtn = createSetTargetsBtn.call(this, message, data);\n buttonsWrapper.prepend(setTargetsBtn);\n\n const rollSavesBtn = createRollNPCSavesBtn.call(this, message, data);\n if (rollSavesBtn) {\n buttonsWrapper.append(rollSavesBtn);\n }\n\n // weapons that don't deal damage shouldn't even have a damage button, but they do so..\n if (!item.isOfType(\"spell\") && !item.dealsDamage) return;\n\n const damageBtn = htmlQuery(msgContent, damageBtnSelector);\n if (!damageBtn) return;\n\n damageBtn.addEventListener(\n \"click\",\n () => {\n // we cache the data & add the spell just in case\n const cached = data.encode({\n type: \"damage\",\n item: data.itemUUID ?? item.uuid,\n saveVariants: _replace({ null: save }),\n });\n\n registerUpstreamHook(\n \"preCreateChatMessage\",\n (damageMessage: ChatMessagePF2e) => {\n // we feed all the data to the damage message\n this.updateSourceFlag(damageMessage, cached);\n },\n true,\n );\n\n // we clean up the spell message as we are not gonna use it anymore\n this.unsetFlag(message);\n },\n true,\n );\n}\n\nfunction getMessageSpell(message: ChatMessagePF2e): SpellPF2e | null {\n const item = message.item;\n if (!item) return null;\n\n return item.isOfType(\"spell\") ? item : item.isOfType(\"consumable\") ? item.embeddedSpell : null;\n}\n\nexport { getSpellSaveVariants, prepareSpellMessage, renderSpellCardLikeMessage, renderSpellMessage };\n", "import {\n ActorPF2e,\n ChatMessagePF2e,\n createEmitable,\n createToggleHook,\n createToggleWrapper,\n getCurrentTargets,\n getFirstActiveToken,\n htmlQuery,\n isActionMessage,\n isHoldingModifierKey,\n isSpellMessage,\n ItemOriginFlag,\n MODULE,\n oppositeAlliance,\n refreshLatestMessages,\n RegionDocumentPF2e,\n SYSTEM,\n TextEditorPF2e,\n TokenDocumentPF2e,\n TokenDocumentUUID,\n waitDialog,\n} from \"foundry-helpers\";\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\nimport { lineIntersect, sharedMessageRenderHTML } from \"tools\";\nimport {\n getSaveLinkData,\n isAreaMessage,\n isDamageMessage,\n prepareActionMessage,\n prepareAreaMessage,\n prepareCheckMessage,\n prepareDamageMessage,\n prepareSpellMessage,\n renderActionMessage,\n renderAreaMessage,\n renderCheckMessage,\n renderDamageMessage,\n renderSpellMessage,\n SaveDragData,\n} from \".\";\nimport {\n AppliedDamagesSource,\n encodeTargetsData,\n SaveVariants,\n TargetsAppliedDamagesSources,\n TargetSaveInstanceSource,\n TargetsData,\n TargetsDataSource,\n TargetsDataUpdates,\n zSaveVariants,\n zTargetsData,\n zTokenDocumentArrayDecode,\n} from \"..\";\n\nconst COLORBLIND_CLASS = \"pf2e-toolbelt-target-helper-save-colorblind\";\nconst INLINE_CHECK_REGEX = /(data-pf2-check=\"[\\w]+\")/g;\n\nclass TargetHelperTool extends ModuleTool {\n #updateQueue = new foundry.utils.Semaphore(1);\n\n #debounceRefreshMessages = foundry.utils.debounce(() => {\n refreshLatestMessages(20);\n }, 100);\n\n updateMessageEmitable = createEmitable(this.key, (options: UpdateMessageOptions, userId: string) => {\n this.#updateQueue.add(this.#updateMessage.bind(this), options, userId);\n });\n\n #textEditorEnrichHTMLWrapper = createToggleWrapper(\n \"WRAPPER\",\n \"CONFIG.ux.TextEditor.enrichHTML\",\n this.#textEditorEnrichHTML,\n { context: this },\n );\n\n #messageRenderHTMLWrapper = sharedMessageRenderHTML.register(this.#messageRenderHTML, {\n context: this,\n });\n\n #preCreateChatMessageHook = createToggleHook(\"preCreateChatMessage\", this.#onPreCreateChatMessage.bind(this));\n\n #createRegionTemplateHook = createToggleHook(\"createRegion\", this.#onCreateRegion.bind(this));\n\n get key(): \"targetHelper\" {\n return \"targetHelper\";\n }\n\n get settingsSchema(): ToolSettingsList {\n return [\n {\n key: \"enabled\",\n type: Boolean,\n default: false,\n scope: \"world\",\n requiresReload: true,\n },\n {\n key: \"targets\",\n type: Boolean,\n default: true,\n scope: \"user\",\n onChange: () => {\n this.configurate();\n },\n },\n {\n key: \"checks\",\n type: Boolean,\n default: true,\n scope: \"user\",\n onChange: () => {\n this.configurate();\n },\n },\n {\n key: \"small\",\n type: Boolean,\n default: true,\n scope: \"user\",\n onChange: () => {\n this.#debounceRefreshMessages();\n },\n },\n {\n key: \"expend\",\n type: Boolean,\n default: true,\n scope: \"user\",\n onChange: () => {\n this.#debounceRefreshMessages();\n },\n },\n {\n key: \"template\",\n type: Boolean,\n default: true,\n scope: \"user\",\n onChange: (value: boolean) => {\n this.#createRegionTemplateHook.toggle(value);\n },\n },\n {\n key: \"colorblind\",\n type: Boolean,\n default: false,\n scope: \"user\",\n onChange: (value: boolean) => {\n document.body.classList.toggle(COLORBLIND_CLASS, value);\n },\n },\n {\n key: \"dismissTemplate\",\n type: Boolean,\n default: true,\n scope: \"user\",\n config: false,\n },\n ];\n }\n\n get api(): toolbelt.Api[\"targetHelper\"] {\n return {\n getMessageTargets: this.getMessageTargets.bind(this),\n setMessageFlagTargets: this.setMessageFlagTargets.bind(this),\n };\n }\n\n init(): void {\n if (!this.settings.enabled) return;\n\n this.updateMessageEmitable.activate();\n this.#preCreateChatMessageHook.activate();\n this.#createRegionTemplateHook.toggle(this.settings.template);\n this.#textEditorEnrichHTMLWrapper.activate();\n this.#messageRenderHTMLWrapper.toggle(this.settings.targets || this.settings.checks);\n\n document.body.classList.toggle(COLORBLIND_CLASS, this.settings.colorblind);\n document.body.addEventListener(\"dragstart\", this.#onDragStart.bind(this), true);\n }\n\n _configurate(): void {\n this.#messageRenderHTMLWrapper.toggle(this.settings.enabled && (this.settings.targets || this.settings.checks));\n this.#debounceRefreshMessages();\n }\n\n getMessageTargets(message: ChatMessagePF2e): TokenDocumentPF2e[] | undefined {\n const flag = this.getFlag(message, \"targets\");\n return flag ? zTokenDocumentArrayDecode.safeParse(flag).data : undefined;\n }\n\n setMessageTargets(message: ChatMessagePF2e, targets: TokenDocumentUUID[]): Promise {\n return this.setFlag(message, \"targets\", targets);\n }\n\n setMessageFlagTargets>(updates: T, targets: TokenDocumentUUID[]): T {\n return this.setFlagProperty(updates, \"targets\", targets);\n }\n\n getMessageSaveVariants(message: ChatMessagePF2e): SaveVariants | undefined {\n const flag = this.getFlag(message, \"saveVariants\");\n return flag ? zSaveVariants.safeParse(flag).data : undefined;\n }\n\n getMessageData(message: ChatMessagePF2e): TargetsData | undefined {\n const flag = this.getFlag(message);\n return flag ? zTargetsData.safeParse(flag).data : undefined;\n }\n\n setMessageData(\n message: ChatMessagePF2e,\n data: TargetsData,\n changes?: TargetsDataUpdates,\n ): Promise {\n const encoded = encodeTargetsData(data, changes);\n return this.setFlag(message, encoded);\n }\n\n getCurrentTargets(): TokenDocumentUUID[] {\n return getCurrentTargets({ types: [\"creature\", \"hazard\", \"vehicle\"], uuid: true });\n }\n\n async #updateMessage(\n { message, applied, expended, saves, variantId = \"null\" }: UpdateMessageOptions,\n _userId: string,\n ) {\n const data = this.getMessageData(message);\n if (!data) return;\n\n if (applied) {\n const udpate = { applied: this.#applyDamageUpdates(data, applied) };\n foundry.utils.mergeObject(data, udpate, { inplace: true });\n }\n\n if (expended) {\n data.expended = expended;\n }\n\n if (saves) {\n const update = { [`saveVariants.${variantId}.saves`]: saves };\n foundry.utils.mergeObject(data, update, { inplace: true });\n }\n\n this.setMessageData(message, data);\n }\n\n #applyDamageUpdates(\n data: TargetsData,\n { rollIndex, targetId }: UpdateMessageApplied,\n ): TargetsAppliedDamagesSources {\n const splashIndex = data.splashIndex;\n\n const targetApplied: AppliedDamagesSource = {\n [rollIndex]: true,\n };\n\n const applied: TargetsAppliedDamagesSources = {\n [targetId]: targetApplied,\n };\n\n if (splashIndex !== -1) {\n const regularIndex = data.splashIndex === 0 ? 1 : 0;\n\n if (rollIndex === splashIndex) {\n targetApplied[regularIndex] = true;\n } else {\n targetApplied[splashIndex] = true;\n\n for (const otherTarget of data.targets) {\n const otherId = otherTarget.id;\n if (otherId === targetId) continue;\n\n applied[otherId] = { [regularIndex]: true };\n }\n }\n }\n\n return applied;\n }\n\n #onDragStart(event: DragEvent) {\n const target = event.target;\n const dataTransfer = event.dataTransfer;\n const saveData = getSaveLinkData(target);\n if (!dataTransfer || !saveData) return;\n\n event.stopPropagation();\n\n dataTransfer.setData(\n \"text/plain\",\n JSON.stringify({ ...saveData, type: `${MODULE.id}-check-roll` } satisfies SaveDragData),\n );\n }\n\n async #textEditorEnrichHTML(\n _editor: TextEditorPF2e,\n wrapped: libWrapper.RegisterCallback,\n ...args: any[]\n ): Promise {\n const enriched = (await wrapped(...args)) as string;\n return enriched.replace(INLINE_CHECK_REGEX, \"$1 draggable='true'\");\n }\n\n async #onCreateRegion(region: RegionDocumentPF2e, _context: any, userId: string) {\n const user = game.user;\n\n if (\n user.id !== userId ||\n !canvas.scene ||\n !region.isEffectArea ||\n isHoldingModifierKey(\"Control\") ||\n this.getFlag(region, \"skip\")\n )\n return;\n\n const shape = region.shapes.at(0);\n const flagOrigin = region.flags[SYSTEM.id].origin as (ItemOriginFlag & { name: string }) | undefined;\n if (!flagOrigin || !shape) return;\n\n const dismiss = this.settings.dismissTemplate;\n const actor = flagOrigin?.actor ? await fromUuid(flagOrigin.actor) : null;\n const self = actor ? getFirstActiveToken(actor)?.object : undefined;\n\n const result = await waitDialog>({\n content: this.templatePath(\"template\"),\n i18n: this.path(\"template\"),\n title: flagOrigin?.name,\n classes: [\"pf2e-toolbelt-template-helper\"],\n data: {\n noSelf: !self,\n dismiss,\n },\n no: {\n callback: (_event, _btn, dialog) => {\n return {\n dismiss: !!htmlQuery(dialog.element, `[name=\"dismiss\"]`)?.checked,\n };\n },\n },\n });\n\n if (!result) return;\n\n const returnAndDismiss = () => {\n if (dismiss !== result.dismiss) {\n this.settings.dismissTemplate = result.dismiss;\n }\n if (result.dismiss && region.rendered) {\n region.delete();\n }\n return;\n };\n\n if (!(\"targets\" in result)) {\n return returnAndDismiss();\n }\n\n const alliance = actor ? actor.alliance : user.isGM ? \"opposition\" : \"party\";\n const opposition = oppositeAlliance(alliance);\n const debug = MODULE.isDebug;\n\n const origin =\n shape instanceof foundry.data.PolygonShapeData\n ? shape.origin\n : shape instanceof foundry.data.EmanationShapeData\n ? { x: shape.base.x, y: shape.base.y }\n : { x: shape.x, y: shape.y };\n\n if (debug) {\n canvas.controls.debug.clear();\n }\n\n const targets = [...region.tokens].filter((tokenDoc) => {\n if (self && !result.self && tokenDoc.object === self) return false;\n\n const token = tokenDoc.object;\n if (!token || tokenDoc.hidden) return false;\n\n const targetActor = tokenDoc.actor;\n if (!targetActor?.isOfType(\"creature\", \"hazard\", \"vehicle\") || targetActor.isDead) return false;\n\n const targetAlliance = targetActor.alliance;\n if (targetAlliance === null && !result.neutral) return false;\n if (result.targets === \"allies\" && targetAlliance !== alliance) return false;\n if (result.targets === \"enemies\" && targetAlliance !== opposition) return false;\n\n return !lineIntersect(origin, token.center, debug);\n });\n\n const messageId = region.flags[SYSTEM.id].messageId;\n const targetsIds = targets.map((token) => token.id);\n const message = messageId && game.messages.get(messageId);\n\n canvas.tokens.setTargets(targetsIds);\n\n if (message) {\n const uuids = targets.map((token) => token.uuid);\n const updates = this.setMessageFlagTargets({}, uuids);\n message.update(updates);\n }\n\n returnAndDismiss();\n }\n\n #onPreCreateChatMessage(message: ChatMessagePF2e) {\n if (message.isCheckRoll) return;\n\n const updates = {} as TargetsDataSource;\n\n if (isAreaMessage(message)) {\n if (!prepareAreaMessage.call(this, message, updates)) return;\n } else if (isDamageMessage(message)) {\n if (!prepareDamageMessage.call(this, message, updates)) return;\n } else if (isSpellMessage(message)) {\n if (!prepareSpellMessage.call(this, message, updates)) return;\n } else if (\n !prepareCheckMessage.call(this, message, updates) &&\n (!isActionMessage(message) || !prepareActionMessage.call(this, message, updates))\n ) {\n return;\n }\n\n if (!updates.targets?.length && !this.getMessageTargets(message)) {\n updates.targets = this.getCurrentTargets();\n }\n\n this.updateSourceFlag(message, updates);\n }\n\n async #messageRenderHTML(message: ChatMessagePF2e, html: HTMLElement) {\n const data = this.getMessageData(message);\n if (!data) return;\n\n if (data.type === \"action\") {\n this.settings.targets && (await renderActionMessage.call(this, message, html, data));\n } else if (data.type === \"area\") {\n this.settings.targets && (await renderAreaMessage.call(this, message, html, data));\n } else if (data.type === \"check\") {\n this.settings.checks && (await renderCheckMessage.call(this, message, html, data));\n } else if (data.type === \"damage\") {\n this.settings.targets && (await renderDamageMessage.call(this, message, html, data));\n } else if (data.type === \"spell\") {\n this.settings.targets && (await renderSpellMessage.call(this, message, html, data));\n }\n }\n}\n\nconst targetHelperTool = new TargetHelperTool();\n\ntype ToolSettings = {\n checks: boolean;\n colorblind: boolean;\n dismissTemplate: boolean;\n enabled: boolean;\n expend: boolean;\n small: boolean;\n targets: boolean;\n template: boolean;\n};\n\ntype UpdateMessageOptions = {\n applied?: UpdateMessageApplied;\n expended?: number;\n message: ChatMessagePF2e;\n saves?: Record;\n variantId?: string;\n};\n\ntype UpdateMessageApplied = {\n targetId: string;\n rollIndex: number;\n};\n\ntype TemplateDialogData = {\n dismiss: boolean;\n neutral: boolean;\n self: boolean;\n targets: \"enemies\" | \"allies\" | \"all\";\n};\n\nexport { targetHelperTool };\nexport type { TargetHelperTool };\n", "import { createToggleHook, ItemPF2e, ItemSourcePF2e } from \"foundry-helpers\";\r\nimport { ModuleTool, ToolSettingsList } from \"module-tool\";\r\n\r\nclass UnidedTool extends ModuleTool {\r\n #preCreateItemHook = createToggleHook(\"preCreateItem\", this.#onPrecreateItem.bind(this));\r\n #preUpdateItemHook = createToggleHook(\"preUpdateItem\", this.#onPreUpdateItem.bind(this));\r\n\r\n get key(): \"unided\" {\r\n return \"unided\";\r\n }\r\n\r\n get settingsSchema(): ToolSettingsList {\r\n return [\r\n {\r\n key: \"create\",\r\n type: Boolean,\r\n default: false,\r\n scope: \"world\",\r\n onChange: (value) => {\r\n this.#preCreateItemHook.toggle(value);\r\n },\r\n },\r\n {\r\n key: \"update\",\r\n type: Boolean,\r\n default: false,\r\n scope: \"world\",\r\n onChange: (value) => {\r\n this.#preUpdateItemHook.toggle(value);\r\n },\r\n },\r\n ];\r\n }\r\n\r\n init(): void {\r\n this.#preCreateItemHook.toggle(this.settings.create);\r\n this.#preUpdateItemHook.toggle(this.settings.update);\r\n }\r\n\r\n #onPrecreateItem(item: ItemPF2e) {\r\n if (item.isOfType(\"physical\")) {\r\n item.updateSource({ \"system.identification.unidentified.img\": item.img });\r\n }\r\n }\r\n\r\n #onPreUpdateItem(item: ItemPF2e, data: DeepPartial) {\r\n if (\"img\" in item && item.isOfType(\"physical\")) {\r\n foundry.utils.setProperty(data, \"system.identification.unidentified.img\", data.img);\r\n }\r\n }\r\n}\r\n\r\ntype ToolSettings = {\r\n create: boolean;\r\n update: boolean;\r\n};\r\n\r\nexport { UnidedTool };\r\n", "import { getSetting, MODULE, R, registerModuleKeybinds, registerModuleSettings, userIsGM } from \"foundry-helpers\";\nimport {\n actionable,\n anonymousTool,\n ArpTool,\n AutoCoverTool,\n BetterChatTool,\n BetterEffectsPanelTool,\n BetterInventoryTool,\n betterMerchantTool,\n BetterMovementTool,\n BetterSheetTool,\n BetterToolTool,\n BetterTradeTool,\n CharacterImporterTool,\n ConditionManagerTool,\n DroppethTool,\n GivethTool,\n HeroActionsTool,\n IdentifyTool,\n // PerceptionTool,\n ResourceTrackerTool,\n RollTrackerTool,\n shareDataTool,\n targetHelperTool,\n UnidedTool,\n} from \"tools\";\n\nconst TOOLS = [\n actionable,\n anonymousTool,\n new ArpTool(),\n new AutoCoverTool(),\n new BetterChatTool(),\n new BetterSheetTool(),\n new BetterEffectsPanelTool(),\n new BetterInventoryTool(),\n betterMerchantTool,\n new BetterMovementTool(),\n new BetterToolTool(),\n new BetterTradeTool(),\n new CharacterImporterTool(),\n new ConditionManagerTool(),\n new DroppethTool(),\n new GivethTool(),\n new HeroActionsTool(),\n new IdentifyTool(),\n // new PerceptionTool(),\n new ResourceTrackerTool(),\n new RollTrackerTool(),\n new UnidedTool(),\n shareDataTool,\n targetHelperTool,\n // new UndergroundTool(),\n] as const;\n\nMODULE.register(\"pf2e-toolbelt\");\n\nfor (const tool of TOOLS) {\n MODULE.apiExpose(tool.key, tool.api);\n}\n\nHooks.once(\"init\", () => {\n const isGM = userIsGM();\n\n registerModuleKeybinds(\n R.pipe(\n TOOLS,\n R.map((tool) => {\n const schemas = tool.keybindsSchema;\n if (schemas.length) {\n return [tool.key, schemas] as const;\n }\n }),\n R.filter(R.isTruthy),\n R.fromEntries(),\n ),\n );\n\n registerModuleSettings(\n R.pipe(\n TOOLS,\n R.map((tool) => [tool.key, tool._getToolSettings()] as const),\n R.fromEntries(),\n ),\n );\n\n const context = (game.toolbelt ??= {} as toolbelt.GamePF2e);\n Object.defineProperty(context, \"getToolSetting\", {\n value: function (tool: string, setting: string) {\n return getSetting(`${tool}.${setting}`);\n },\n writable: false,\n configurable: false,\n enumerable: false,\n });\n\n for (const tool of TOOLS) {\n tool._initialize(isGM);\n tool.init(isGM);\n }\n});\n\nHooks.once(\"setup\", () => {\n const isGM = userIsGM();\n\n for (const tool of TOOLS) {\n tool.setup(isGM);\n }\n});\n\nHooks.once(\"ready\", () => {\n const isGM = userIsGM();\n\n for (const tool of TOOLS) {\n tool.ready(isGM);\n }\n});\n\nMODULE.debugExpose(\"tools\", R.indexBy(TOOLS, R.prop(\"key\")));\n"], "mappings": "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", "names": ["LuxonError", "__name", "InvalidDateTimeError", "reason", "InvalidIntervalError", "InvalidDurationError", "ConflictingSpecificationError", "InvalidUnitError", "unit", "InvalidArgumentError", "ZoneIsAbstractError", "n", "s", "l", "DATE_SHORT", "DATE_MED", "DATE_MED_WITH_WEEKDAY", "DATE_FULL", "DATE_HUGE", "TIME_SIMPLE", "TIME_WITH_SECONDS", "TIME_WITH_SHORT_OFFSET", "TIME_WITH_LONG_OFFSET", "TIME_24_SIMPLE", "TIME_24_WITH_SECONDS", "TIME_24_WITH_SHORT_OFFSET", "TIME_24_WITH_LONG_OFFSET", "DATETIME_SHORT", "DATETIME_SHORT_WITH_SECONDS", "DATETIME_MED", "DATETIME_MED_WITH_SECONDS", "DATETIME_MED_WITH_WEEKDAY", "DATETIME_FULL", "DATETIME_FULL_WITH_SECONDS", "DATETIME_HUGE", "DATETIME_HUGE_WITH_SECONDS", "Zone", "ts", "opts", "format", "otherZone", "singleton", "SystemZone", "_SystemZone", "locale", "parseZoneInfo", "formatOffset", "dtfCache", "makeDTF", "zoneName", "dtf", "typeToPos", "hackyOffset", "date", "formatted", "parsed", "fMonth", "fDay", "fYear", "fadOrBc", "fHour", "fMinute", "fSecond", "partsOffset", "filled", "i", "type", "value", "pos", "isUndefined", "ianaZoneCache", "IANAZone", "_IANAZone", "name", "zone", "year", "month", "day", "adOrBc", "hour", "minute", "second", "asUTC", "objToLocalTS", "asTS", "over", "intlLFCache", "getCachedLF", "locString", "key", "intlDTCache", "getCachedDTF", "intlNumCache", "getCachedINF", "inf", "intlRelCache", "getCachedRTF", "base", "cacheKeyOpts", "sysLocaleCache", "systemLocale", "intlResolvedOptionsCache", "getCachedIntResolvedOptions", "weekInfoCache", "getCachedWeekInfo", "data", "fallbackWeekSettings", "parseLocaleString", "localeStr", "xIndex", "uIndex", "options", "selectedStr", "smaller", "numberingSystem", "calendar", "intlConfigString", "outputCalendar", "mapMonths", "f", "ms", "dt", "DateTime", "mapWeekdays", "listStuff", "loc", "length", "englishFn", "intlFn", "mode", "supportsFastNumbers", "PolyNumberFormatter", "intl", "forceSimple", "padTo", "floor", "otherOpts", "intlOpts", "fixed", "roundTo", "padStart", "PolyDateFormatter", "z", "gmtOffset", "offsetZ", "parts", "part", "offsetName", "PolyRelFormatter", "isEnglish", "hasRelative", "count", "English.formatRelativeTime", "Locale", "_Locale", "weekSettings", "defaultToEN", "specifiedLocale", "Settings", "localeR", "numberingSystemR", "outputCalendarR", "weekSettingsR", "validateWeekSettings", "numbering", "parsedLocale", "parsedNumberingSystem", "parsedOutputCalendar", "isActuallyEn", "hasNoWeirdness", "alts", "English.months", "monthSpecialCase", "formatStr", "mapper", "English.weekdays", "English.meridiems", "English.eras", "field", "df", "results", "matching", "m", "hasLocaleWeekInfo", "other", "FixedOffsetZone", "_FixedOffsetZone", "offset", "r", "signedOffset", "InvalidZone", "normalizeZone", "input", "defaultZone", "isString", "lowered", "isNumber", "numberingSystems", "numberingSystemsUTF16", "hanidecChars", "parseDigits", "str", "code", "min", "max", "digitRegexCache", "resetDigitRegexCache", "digitRegex", "append", "ns", "appendCache", "regex", "now", "defaultLocale", "defaultNumberingSystem", "defaultOutputCalendar", "twoDigitCutoffYear", "throwOnInvalid", "defaultWeekSettings", "cutoffYear", "t", "Invalid", "explanation", "nonLeapLadder", "leapLadder", "unitOutOfRange", "dayOfWeek", "d", "js", "computeOrdinal", "isLeapYear", "uncomputeOrdinal", "ordinal", "table", "month0", "isoWeekdayToLocal", "isoWeekday", "startOfWeek", "gregorianToWeek", "gregObj", "minDaysInFirstWeek", "weekday", "weekNumber", "weekYear", "weeksInWeekYear", "timeObject", "weekToGregorian", "weekData", "weekdayOfJan4", "yearInDays", "daysInYear", "gregorianToOrdinal", "gregData", "ordinalToGregorian", "ordinalData", "usesLocalWeekValues", "obj", "hasInvalidWeekData", "validYear", "isInteger", "validWeek", "integerBetween", "validWeekday", "hasInvalidOrdinalData", "validOrdinal", "hasInvalidGregorianData", "validMonth", "validDay", "daysInMonth", "hasInvalidTimeData", "millisecond", "validHour", "validMinute", "validSecond", "validMillisecond", "o", "isDate", "maybeArray", "thing", "bestBy", "arr", "by", "compare", "best", "next", "pair", "pick", "keys", "a", "k", "hasOwnProperty", "prop", "settings", "v", "bottom", "top", "floorMod", "x", "isNeg", "padded", "parseInteger", "string", "parseFloating", "parseMillis", "fraction", "number", "digits", "rounding", "factor", "modMonth", "modYear", "firstWeekOffset", "weekOffset", "weekOffsetNext", "untruncateYear", "offsetFormat", "timeZone", "modified", "offHourStr", "offMinuteStr", "offHour", "offMin", "offMinSigned", "asNumber", "numericValue", "normalizeObject", "normalizer", "normalized", "u", "hours", "minutes", "sign", "monthsLong", "monthsShort", "monthsNarrow", "months", "weekdaysLong", "weekdaysShort", "weekdaysNarrow", "weekdays", "meridiems", "erasLong", "erasShort", "erasNarrow", "eras", "meridiemForDateTime", "weekdayForDateTime", "monthForDateTime", "eraForDateTime", "formatRelativeTime", "numeric", "narrow", "units", "lastable", "isDay", "isInPast", "fmtValue", "singular", "lilUnits", "fmtUnit", "stringifyTokens", "splits", "tokenToString", "token", "macroTokenToFormatOpts", "Formats.DATE_SHORT", "Formats.DATE_MED", "Formats.DATE_FULL", "Formats.DATE_HUGE", "Formats.TIME_SIMPLE", "Formats.TIME_WITH_SECONDS", "Formats.TIME_WITH_SHORT_OFFSET", "Formats.TIME_WITH_LONG_OFFSET", "Formats.TIME_24_SIMPLE", "Formats.TIME_24_WITH_SECONDS", "Formats.TIME_24_WITH_SHORT_OFFSET", "Formats.TIME_24_WITH_LONG_OFFSET", "Formats.DATETIME_SHORT", "Formats.DATETIME_MED", "Formats.DATETIME_FULL", "Formats.DATETIME_HUGE", "Formats.DATETIME_SHORT_WITH_SECONDS", "Formats.DATETIME_MED_WITH_SECONDS", "Formats.DATETIME_FULL_WITH_SECONDS", "Formats.DATETIME_HUGE_WITH_SECONDS", "Formatter", "_Formatter", "fmt", "current", "currentFull", "bracketed", "formatOpts", "interval", "p", "signDisplay", "knownEnglish", "useDateTimeFormatter", "extract", "meridiem", "English.meridiemForDateTime", "standalone", "English.monthForDateTime", "English.weekdayForDateTime", "maybeMacro", "era", "English.eraForDateTime", "dur", "invertLargest", "tokenToField", "lildur", "info", "mapped", "inversionFactor", "tokens", "realTokens", "found", "literal", "val", "collapsed", "durationInfo", "ianaRegex", "combineRegexes", "regexes", "full", "combineExtractors", "extractors", "mergedVals", "mergedZone", "cursor", "ex", "parse", "patterns", "extractor", "simpleParse", "match", "ret", "offsetRegex", "isoExtendedZone", "isoTimeBaseRegex", "isoTimeRegex", "isoTimeExtensionRegex", "isoYmdRegex", "isoWeekRegex", "isoOrdinalRegex", "extractISOWeekData", "extractISOOrdinalData", "sqlYmdRegex", "sqlTimeRegex", "sqlTimeExtensionRegex", "int", "fallback", "extractISOYmd", "extractISOTime", "extractISOOffset", "local", "fullOffset", "extractIANAZone", "isoTimeOnly", "isoDuration", "extractISODuration", "yearStr", "monthStr", "weekStr", "dayStr", "hourStr", "minuteStr", "secondStr", "millisecondsStr", "hasNegativePrefix", "negativeSeconds", "maybeNegate", "num", "force", "obsOffsets", "fromStrings", "weekdayStr", "result", "English.monthsShort", "English.weekdaysLong", "English.weekdaysShort", "rfc2822", "extractRFC2822", "obsOffset", "milOffset", "preprocessRFC2822", "rfc1123", "rfc850", "ascii", "extractRFC1123Or850", "extractASCII", "isoYmdWithTimeExtensionRegex", "isoWeekWithTimeExtensionRegex", "isoOrdinalWithTimeExtensionRegex", "isoTimeCombinedRegex", "extractISOYmdTimeAndOffset", "extractISOWeekTimeAndOffset", "extractISOOrdinalDateAndTime", "extractISOTimeAndOffset", "parseISODate", "parseRFC2822Date", "parseHTTPDate", "parseISODuration", "extractISOTimeOnly", "parseISOTimeOnly", "sqlYmdWithTimeExtensionRegex", "sqlTimeCombinedRegex", "extractISOTimeOffsetAndIANAZone", "parseSQL", "INVALID", "lowOrderMatrix", "casualMatrix", "daysInYearAccurate", "daysInMonthAccurate", "accurateMatrix", "orderedUnits", "reverseUnits", "clone", "clear", "conf", "Duration", "durationToMillis", "matrix", "vals", "sum", "normalizeValues", "previous", "previousVal", "conv", "rollUp", "removeZeroes", "newVals", "_Duration", "config", "accurate", "durationLike", "text", "invalid", "fmtOpts", "showZeros", "millis", "duration", "fn", "values", "mixed", "conversionAccuracy", "built", "accumulated", "lastUnit", "own", "ak", "negated", "eq", "v1", "v2", "validateStartEnd", "start", "end", "Interval", "_Interval", "builtStart", "friendlyDateTime", "builtEnd", "validateError", "e", "startIsValid", "endIsValid", "dateTime", "dateTimes", "sorted", "b", "added", "idx", "numberOfParts", "intervals", "final", "sofar", "item", "currentCount", "ends", "flattened", "dateFormat", "separator", "mapFn", "Info", "proto", "locObj", "dayDiff", "earlier", "later", "utcDayStart", "highOrderDiffs", "differs", "days", "lowestOrder", "highWater", "differ", "diff", "remainingMillis", "lowerOrderUnits", "MISSING_FTP", "intUnit", "post", "NBSP", "spaceOrNBSP", "spaceOrNBSPRegExp", "fixListRegex", "stripInsensitivities", "oneOf", "strings", "startIndex", "groups", "h", "simple", "escapeToken", "unitForToken", "one", "two", "three", "four", "six", "oneOrTwo", "oneToThree", "oneToSix", "oneToNine", "twoToFour", "fourToSix", "partTypeStyleToTokenVal", "tokenForPart", "resolvedOpts", "isSpace", "style", "actualType", "buildRegex", "handlers", "matches", "all", "matchIndex", "dateTimeFromMatches", "toField", "specificOffset", "dummyDateTimeCache", "getDummyDateTime", "maybeExpandMacroToken", "formatOptsToTokens", "expandMacroTokens", "TokenParser", "regexString", "rawMatches", "explainFromTokens", "parseFromTokens", "invalidReason", "MAX_DATE", "unsupportedZone", "possiblyCachedWeekData", "possiblyCachedLocalWeekData", "inst", "fixOffset", "localTS", "tz", "utcGuess", "o2", "o3", "tsToObj", "objToTS", "adjustTime", "oPre", "c", "millisToAdd", "parseDataToDateTime", "parsedZone", "setZone", "interpretationZone", "toTechFormat", "allowZ", "toISODate", "extended", "precision", "longFormat", "toISOTime", "suppressSeconds", "suppressMilliseconds", "includeOffset", "extendedZone", "showSeconds", "defaultUnitValues", "defaultWeekUnitValues", "defaultOrdinalUnitValues", "orderedWeekUnits", "orderedOrdinalUnits", "normalizeUnit", "normalizeUnitWithLocalWeeks", "guessOffsetForZone", "zoneOffsetTs", "offsetGuess", "zoneOffsetGuessCache", "quickDT", "offsetProvis", "diffRelative", "round", "lastOpts", "argList", "args", "_DateTime", "ot", "zoneToUse", "milliseconds", "seconds", "tsNow", "containsOrdinal", "containsGregorYear", "containsGregorMD", "containsGregor", "definiteWeekDef", "useWeekData", "defaultValues", "objNow", "foundFirst", "higherOrderInvalid", "gregorian", "tsFinal", "offsetFinal", "localeToUse", "localeOpts", "tokenList", "dayMs", "minuteMs", "oEarlier", "oLater", "o1", "ts1", "ts2", "c1", "c2", "keepLocalTime", "keepCalendarTime", "newTS", "asObj", "settingWeekStuff", "useLocaleWeeks", "normalizedUnit", "q", "ext", "includePrefix", "includeZone", "includeOffsetSpace", "otherDateTime", "durOpts", "otherIsLater", "diffed", "inputMs", "adjustedToZone", "padding", "formatParser", "Formats.DATE_MED_WITH_WEEKDAY", "Formats.DATETIME_MED_WITH_WEEKDAY", "dateTimeish", "dist_exports", "__export", "t", "n", "e", "r", "e", "t", "r", "__name", "n", "t", "n", "r", "e", "__name", "t", "n", "__name", "e", "t", "n", "__name", "e", "t", "n", "__name", "e", "t", "n", "__name", "e", "t", "n", "__name", "e", "e", "__name", "n", "r", "t", "i", "n", "t", "e", "__name", "t", "n", "__name", "e", "r", "i", "t", "n", "__name", "e", "t", "n", "__name", "e", "a", "o", "i", "r", "t", "n", "__name", "e", "e", "t", "__name", "t", "e", "r", "n", "__name", "e", "__name", "t", "n", "__name", "e", "r", "i", "a", "e", "t", "r", "i", "a", "o", "s", "c", "__name", "l", "u", "t", "n", "__name", "e", "e", "t", "n", "__name", "r", "t", "e", "a", "o", "r", "s", "i", "n", "__name", "c", "l", "t", "n", "r", "i", "__name", "r", "e", "t", "i", "__name", "n", "n", "e", "t", "r", "__name", "t", "n", "__name", "e", "e", "t", "__name", "r", "t", "i", "a", "__name", "e", "t", "n", "__name", "e", "e", "t", "__name", "n", "e", "t", "i", "__name", "r", "a", "o", "e", "t", "a", "i", "r", "o", "__name", "n", "s", "c", "r", "e", "n", "i", "__name", "a", "o", "s", "t", "n", "__name", "e", "t", "n", "__name", "e", "t", "n", "__name", "e", "r", "t", "n", "__name", "e", "t", "__name", "t", "n", "__name", "e", "r", "i", "n", "t", "r", "i", "__name", "e", "e", "__name", "r", "t", "i", "e", "a", "__name", "n", "t", "n", "__name", "e", "t", "n", "__name", "e", "r", "t", "n", "__name", "e", "n", "t", "r", "e", "i", "__name", "a", "n", "e", "t", "r", "__name", "n", "r", "e", "i", "__name", "t", "a", "t", "n", "r", "__name", "e", "i", "n", "t", "e", "__name", "t", "n", "r", "__name", "e", "t", "n", "__name", "e", "r", "t", "__name", "t", "n", "__name", "e", "r", "i", "e", "t", "__name", "n", "r", "i", "a", "o", "s", "c", "l", "u", "f", "p", "m", "t", "n", "__name", "e", "r", "i", "a", "t", "n", "__name", "e", "r", "t", "n", "__name", "e", "r", "i", "a", "n", "t", "r", "__name", "e", "e", "t", "__name", "t", "n", "__name", "e", "r", "i", "a", "r", "e", "t", "i", "__name", "n", "n", "e", "t", "r", "__name", "t", "n", "__name", "e", "r", "e", "__name", "e", "__name", "e", "__name", "e", "__name", "e", "__name", "e", "__name", "e", "t", "__name", "e", "__name", "e", "__name", "e", "t", "__name", "e", "__name", "e", "__name", "e", "t", "__name", "e", "__name", "e", "__name", "e", "__name", "e", "t", "__name", "e", "__name", "t", "n", "__name", "e", "r", "i", "t", "n", "__name", "e", "e", "__name", "e", "__name", "e", "__name", "t", "n", "__name", "e", "t", "__name", "t", "n", "__name", "e", "t", "n", "__name", "e", "t", "n", "r", "__name", "e", "t", "n", "__name", "e", "r", "i", "a", "t", "n", "__name", "e", "r", "i", "a", "o", "t", "n", "__name", "e", "r", "i", "t", "n", "__name", "e", "i", "t", "n", "__name", "e", "n", "t", "r", "__name", "e", "t", "n", "__name", "e", "r", "i", "t", "r", "__name", "n", "e", "t", "n", "__name", "e", "e", "t", "__name", "n", "t", "r", "__name", "e", "i", "a", "o", "s", "t", "n", "__name", "e", "t", "__name", "e", "r", "n", "i", "a", "o", "s", "n", "r", "__name", "e", "t", "t", "n", "__name", "e", "n", "t", "r", "__name", "e", "t", "n", "__name", "e", "r", "i", "e", "t", "__name", "t", "n", "__name", "e", "e", "t", "__name", "e", "t", "__name", "t", "n", "__name", "e", "r", "i", "t", "n", "__name", "e", "r", "t", "n", "__name", "e", "r", "t", "n", "__name", "e", "r", "i", "t", "n", "__name", "t", "n", "__name", "e", "e", "n", "r", "t", "__name", "t", "n", "__name", "e", "r", "i", "a", "o", "e", "r", "i", "a", "o", "s", "t", "n", "__name", "e", "t", "r", "__name", "t", "n", "__name", "e", "t", "n", "__name", "e", "r", "t", "n", "__name", "e", "r", "i", "t", "n", "__name", "e", "t", "n", "__name", "e", "n", "t", "e", "__name", "t", "n", "__name", "e", "r", "t", "n", "__name", "e", "t", "n", "__name", "e", "r", "a", "t", "n", "__name", "e", "r", "i", "e", "t", "n", "__name", "t", "n", "__name", "e", "t", "n", "__name", "e", "e", "t", "r", "i", "a", "__name", "n", "t", "r", "__name", "e", "n", "t", "r", "__name", "e", "n", "t", "e", "__name", "n", "t", "r", "__name", "e", "n", "t", "r", "__name", "e", "t", "n", "__name", "e", "r", "i", "e", "t", "n", "__name", "t", "n", "__name", "e", "t", "n", "__name", "e", "t", "n", "__name", "e", "e", "t", "n", "r", "i", "a", "o", "s", "__name", "t", "n", "__name", "e", "t", "n", "__name", "e", "r", "i", "a", "t", "n", "__name", "e", "r", "i", "a", "t", "n", "__name", "e", "r", "i", "n", "t", "r", "i", "__name", "e", "r", "e", "n", "i", "__name", "a", "o", "t", "n", "__name", "e", "t", "n", "__name", "e", "t", "n", "__name", "e", "r", "i", "t", "n", "__name", "e", "t", "n", "__name", "e", "r", "e", "t", "__name", "n", "r", "t", "n", "e", "r", "__name", "n", "t", "r", "__name", "e", "t", "n", "__name", "e", "n", "t", "r", "__name", "e", "t", "n", "e", "r", "__name", "t", "n", "__name", "e", "e", "n", "r", "t", "__name", "i", "t", "n", "__name", "e", "n", "e", "t", "r", "__name", "n", "e", "t", "r", "__name", "i", "a", "o", "n", "e", "t", "r", "__name", "i", "t", "__name", "e", "n", "r", "t", "__name", "t", "n", "r", "__name", "e", "t", "i", "a", "e", "n", "r", "__name", "zod_exports", "__export", "$brand", "$input", "$output", "NEVER", "TimePrecision", "ZodAny", "ZodArray", "ZodBase64", "ZodBase64URL", "ZodBigInt", "ZodBigIntFormat", "ZodBoolean", "ZodCIDRv4", "ZodCIDRv6", "ZodCUID", "ZodCUID2", "ZodCatch", "ZodCodec", "ZodCustom", "ZodCustomStringFormat", "ZodDate", "ZodDefault", "ZodDiscriminatedUnion", "ZodE164", "ZodEmail", "ZodEmoji", "ZodEnum", "ZodError", "ZodExactOptional", "ZodFile", "ZodFirstPartyTypeKind", "ZodFunction", "ZodGUID", "ZodIPv4", "ZodIPv6", "ZodISODate", "ZodISODateTime", "ZodISODuration", "ZodISOTime", "ZodIntersection", "ZodIssueCode", "ZodJWT", "ZodKSUID", "ZodLazy", "ZodLiteral", "ZodMAC", "ZodMap", "ZodNaN", "ZodNanoID", "ZodNever", "ZodNonOptional", "ZodNull", "ZodNullable", "ZodNumber", "ZodNumberFormat", "ZodObject", "ZodOptional", "ZodPipe", "ZodPrefault", "ZodPromise", "ZodReadonly", "ZodRealError", "ZodRecord", "ZodSet", "ZodString", "ZodStringFormat", "ZodSuccess", "ZodSymbol", "ZodTemplateLiteral", "ZodTransform", "ZodTuple", "ZodType", "ZodULID", "ZodURL", "ZodUUID", "ZodUndefined", "ZodUnion", "ZodUnknown", "ZodVoid", "ZodXID", "ZodXor", "_ZodString", "_default", "_function", "any", "array", "base64", "base64url", "bigint", "boolean", "_catch", "check", "cidrv4", "cidrv6", "clone", "codec", "coerce_exports", "config", "core_exports", "cuid", "cuid2", "custom", "date", "decode", "decodeAsync", "zod_default", "describe", "discriminatedUnion", "e164", "email", "emoji", "encode", "encodeAsync", "_endsWith", "_enum", "exactOptional", "file", "flattenError", "float32", "float64", "formatError", "fromJSONSchema", "getErrorMap", "globalRegistry", "_gt", "_gte", "guid", "hash", "hex", "hostname", "httpUrl", "_includes", "_instanceof", "int", "int32", "int64", "intersection", "ipv4", "ipv6", "iso_exports", "json", "jwt", "keyof", "ksuid", "lazy", "_length", "literal", "locales_exports", "looseObject", "looseRecord", "_lowercase", "_lt", "_lte", "mac", "map", "_maxLength", "_maxSize", "meta", "_mime", "_minLength", "_minSize", "_multipleOf", "nan", "nanoid", "nativeEnum", "_negative", "never", "_nonnegative", "nonoptional", "_nonpositive", "_normalize", "_null", "nullable", "nullish", "number", "object", "optional", "_overwrite", "parse", "parseAsync", "partialRecord", "pipe", "_positive", "prefault", "preprocess", "prettifyError", "promise", "_property", "readonly", "record", "refine", "_regex", "regexes_exports", "registry", "safeDecode", "safeDecodeAsync", "safeEncode", "safeEncodeAsync", "safeParse", "safeParseAsync", "set", "setErrorMap", "_size", "_slugify", "_startsWith", "strictObject", "string", "stringFormat", "stringbool", "success", "superRefine", "symbol", "templateLiteral", "toJSONSchema", "_toLowerCase", "_toUpperCase", "transform", "treeifyError", "_trim", "tuple", "uint32", "uint64", "ulid", "_undefined", "union", "unknown", "_uppercase", "url", "util_exports", "uuid", "uuidv4", "uuidv6", "uuidv7", "_void", "xid", "xor", "external_exports", "external_exports", "__export", "$brand", "$input", "$output", "NEVER", "TimePrecision", "ZodAny", "ZodArray", "ZodBase64", "ZodBase64URL", "ZodBigInt", "ZodBigIntFormat", "ZodBoolean", "ZodCIDRv4", "ZodCIDRv6", "ZodCUID", "ZodCUID2", "ZodCatch", "ZodCodec", "ZodCustom", "ZodCustomStringFormat", "ZodDate", "ZodDefault", "ZodDiscriminatedUnion", "ZodE164", "ZodEmail", "ZodEmoji", "ZodEnum", "ZodError", "ZodExactOptional", "ZodFile", "ZodFirstPartyTypeKind", "ZodFunction", "ZodGUID", "ZodIPv4", "ZodIPv6", "ZodISODate", "ZodISODateTime", "ZodISODuration", "ZodISOTime", "ZodIntersection", "ZodIssueCode", "ZodJWT", "ZodKSUID", "ZodLazy", "ZodLiteral", "ZodMAC", "ZodMap", "ZodNaN", "ZodNanoID", "ZodNever", "ZodNonOptional", "ZodNull", "ZodNullable", "ZodNumber", "ZodNumberFormat", "ZodObject", "ZodOptional", "ZodPipe", "ZodPrefault", "ZodPromise", "ZodReadonly", "ZodRealError", "ZodRecord", "ZodSet", "ZodString", "ZodStringFormat", "ZodSuccess", "ZodSymbol", "ZodTemplateLiteral", "ZodTransform", "ZodTuple", "ZodType", "ZodULID", "ZodURL", "ZodUUID", "ZodUndefined", "ZodUnion", "ZodUnknown", "ZodVoid", "ZodXID", "ZodXor", "_ZodString", "_default", "_function", "any", "array", "base64", "base64url", "bigint", "boolean", "_catch", "check", "cidrv4", "cidrv6", "clone", "codec", "coerce_exports", "config", "core_exports", "cuid", "cuid2", "custom", "date", "decode", "decodeAsync", "describe", "discriminatedUnion", "e164", "email", "emoji", "encode", "encodeAsync", "_endsWith", "_enum", "exactOptional", "file", "flattenError", "float32", "float64", "formatError", "fromJSONSchema", "getErrorMap", "globalRegistry", "_gt", "_gte", "guid", "hash", "hex", "hostname", "httpUrl", "_includes", "_instanceof", "int", "int32", "int64", "intersection", "ipv4", "ipv6", "iso_exports", "json", "jwt", "keyof", "ksuid", "lazy", "_length", "literal", "locales_exports", "looseObject", "looseRecord", "_lowercase", "_lt", "_lte", "mac", "map", "_maxLength", "_maxSize", "meta", "_mime", "_minLength", "_minSize", "_multipleOf", "nan", "nanoid", "nativeEnum", "_negative", "never", "_nonnegative", "nonoptional", "_nonpositive", "_normalize", "_null", "nullable", "nullish", "number", "object", "optional", "_overwrite", "parse", "parseAsync", "partialRecord", "pipe", "_positive", "prefault", "preprocess", "prettifyError", "promise", "_property", "readonly", "record", "refine", "_regex", "regexes_exports", "registry", "safeDecode", "safeDecodeAsync", "safeEncode", "safeEncodeAsync", "safeParse", "safeParseAsync", "set", "setErrorMap", "_size", "_slugify", "_startsWith", "strictObject", "string", "stringFormat", "stringbool", "success", "superRefine", "symbol", "templateLiteral", "toJSONSchema", "_toLowerCase", "_toUpperCase", "transform", "treeifyError", "_trim", "tuple", "uint32", "uint64", "ulid", "_undefined", "union", "unknown", "_uppercase", "url", "util_exports", "uuid", "uuidv4", "uuidv6", "uuidv7", "_void", "xid", "xor", "core_exports", "__export", "$ZodAny", "$ZodArray", "$ZodAsyncError", "$ZodBase64", "$ZodBase64URL", "$ZodBigInt", "$ZodBigIntFormat", "$ZodBoolean", "$ZodCIDRv4", "$ZodCIDRv6", "$ZodCUID", "$ZodCUID2", "$ZodCatch", "$ZodCheck", "$ZodCheckBigIntFormat", "$ZodCheckEndsWith", "$ZodCheckGreaterThan", "$ZodCheckIncludes", "$ZodCheckLengthEquals", "$ZodCheckLessThan", "$ZodCheckLowerCase", "$ZodCheckMaxLength", "$ZodCheckMaxSize", "$ZodCheckMimeType", "$ZodCheckMinLength", "$ZodCheckMinSize", "$ZodCheckMultipleOf", "$ZodCheckNumberFormat", "$ZodCheckOverwrite", "$ZodCheckProperty", "$ZodCheckRegex", "$ZodCheckSizeEquals", "$ZodCheckStartsWith", "$ZodCheckStringFormat", "$ZodCheckUpperCase", "$ZodCodec", "$ZodCustom", "$ZodCustomStringFormat", "$ZodDate", "$ZodDefault", "$ZodDiscriminatedUnion", "$ZodE164", "$ZodEmail", "$ZodEmoji", "$ZodEncodeError", "$ZodEnum", "$ZodError", "$ZodExactOptional", "$ZodFile", "$ZodFunction", "$ZodGUID", "$ZodIPv4", "$ZodIPv6", "$ZodISODate", "$ZodISODateTime", "$ZodISODuration", "$ZodISOTime", "$ZodIntersection", "$ZodJWT", "$ZodKSUID", "$ZodLazy", "$ZodLiteral", "$ZodMAC", "$ZodMap", "$ZodNaN", "$ZodNanoID", "$ZodNever", "$ZodNonOptional", "$ZodNull", "$ZodNullable", "$ZodNumber", "$ZodNumberFormat", "$ZodObject", "$ZodObjectJIT", "$ZodOptional", "$ZodPipe", "$ZodPrefault", "$ZodPromise", "$ZodReadonly", "$ZodRealError", "$ZodRecord", "$ZodRegistry", "$ZodSet", "$ZodString", "$ZodStringFormat", "$ZodSuccess", "$ZodSymbol", "$ZodTemplateLiteral", "$ZodTransform", "$ZodTuple", "$ZodType", "$ZodULID", "$ZodURL", "$ZodUUID", "$ZodUndefined", "$ZodUnion", "$ZodUnknown", "$ZodVoid", "$ZodXID", "$ZodXor", "$brand", "$constructor", "$input", "$output", "Doc", "json_schema_exports", "JSONSchemaGenerator", "NEVER", "TimePrecision", "_any", "_array", "_base64", "_base64url", "_bigint", "_boolean", "_catch", "_check", "_cidrv4", "_cidrv6", "_coercedBigint", "_coercedBoolean", "_coercedDate", "_coercedNumber", "_coercedString", "_cuid", "_cuid2", "_custom", "_date", "_decode", "_decodeAsync", "_default", "_discriminatedUnion", "_e164", "_email", "_emoji", "_encode", "_encodeAsync", "_endsWith", "_enum", "_file", "_float32", "_float64", "_gt", "_gte", "_guid", "_includes", "_int", "_int32", "_int64", "_intersection", "_ipv4", "_ipv6", "_isoDate", "_isoDateTime", "_isoDuration", "_isoTime", "_jwt", "_ksuid", "_lazy", "_length", "_literal", "_lowercase", "_lt", "_lte", "_mac", "_map", "_maxLength", "_maxSize", "_mime", "_minLength", "_minSize", "_multipleOf", "_nan", "_nanoid", "_nativeEnum", "_negative", "_never", "_nonnegative", "_nonoptional", "_nonpositive", "_normalize", "_null", "_nullable", "_number", "_optional", "_overwrite", "_parse", "_parseAsync", "_pipe", "_positive", "_promise", "_property", "_readonly", "_record", "_refine", "_regex", "_safeDecode", "_safeDecodeAsync", "_safeEncode", "_safeEncodeAsync", "_safeParse", "_safeParseAsync", "_set", "_size", "_slugify", "_startsWith", "_string", "_stringFormat", "_stringbool", "_success", "_superRefine", "_symbol", "_templateLiteral", "_toLowerCase", "_toUpperCase", "_transform", "_trim", "_tuple", "_uint32", "_uint64", "_ulid", "_undefined", "_union", "_unknown", "_uppercase", "_url", "_uuid", "_uuidv4", "_uuidv6", "_uuidv7", "_void", "_xid", "_xor", "clone", "config", "createStandardJSONSchemaMethod", "createToJSONSchemaMethod", "decode", "decodeAsync", "describe", "encode", "encodeAsync", "extractDefs", "finalize", "flattenError", "formatError", "globalConfig", "globalRegistry", "initializeContext", "isValidBase64", "isValidBase64URL", "isValidJWT", "locales_exports", "meta", "parse", "parseAsync", "prettifyError", "process", "regexes_exports", "registry", "safeDecode", "safeDecodeAsync", "safeEncode", "safeEncodeAsync", "safeParse", "safeParseAsync", "toDotPath", "toJSONSchema", "treeifyError", "util_exports", "version", "NEVER", "$constructor", "name", "initializer", "params", "init", "inst", "def", "_", "proto", "keys", "i", "k", "__name", "Parent", "Definition", "_a", "fn", "$brand", "$ZodAsyncError", "$ZodEncodeError", "globalConfig", "config", "newConfig", "util_exports", "__export", "BIGINT_FORMAT_RANGES", "Class", "NUMBER_FORMAT_RANGES", "aborted", "allowsEval", "assert", "assertEqual", "assertIs", "assertNever", "assertNotEqual", "assignProp", "base64ToUint8Array", "base64urlToUint8Array", "cached", "captureStackTrace", "cleanEnum", "cleanRegex", "clone", "cloneDef", "createTransparentProxy", "defineLazy", "esc", "escapeRegex", "extend", "finalizeIssue", "floatSafeRemainder", "getElementAtPath", "getEnumValues", "getLengthableOrigin", "getParsedType", "getSizableOrigin", "hexToUint8Array", "isObject", "isPlainObject", "issue", "joinValues", "jsonStringifyReplacer", "merge", "mergeDefs", "normalizeParams", "nullish", "numKeys", "objectClone", "omit", "optionalKeys", "parsedType", "partial", "pick", "prefixIssues", "primitiveTypes", "promiseAllObject", "propertyKeyTypes", "randomString", "required", "safeExtend", "shallowClone", "slugify", "stringifyPrimitive", "uint8ArrayToBase64", "uint8ArrayToBase64url", "uint8ArrayToHex", "unwrapMessage", "assertEqual", "val", "__name", "assertNotEqual", "assertIs", "_arg", "assertNever", "_x", "assert", "_", "getEnumValues", "entries", "numericValues", "v", "k", "joinValues", "array", "separator", "stringifyPrimitive", "jsonStringifyReplacer", "value", "cached", "getter", "nullish", "input", "cleanRegex", "source", "start", "end", "floatSafeRemainder", "step", "valDecCount", "stepString", "stepDecCount", "match", "decCount", "valInt", "stepInt", "EVALUATING", "defineLazy", "object", "key", "objectClone", "obj", "assignProp", "target", "prop", "mergeDefs", "defs", "mergedDescriptors", "def", "descriptors", "cloneDef", "schema", "getElementAtPath", "path", "acc", "promiseAllObject", "promisesObj", "keys", "promises", "results", "resolvedObj", "i", "randomString", "length", "chars", "str", "esc", "slugify", "captureStackTrace", "_args", "isObject", "data", "allowsEval", "F", "isPlainObject", "o", "ctor", "prot", "shallowClone", "numKeys", "keyCount", "getParsedType", "t", "propertyKeyTypes", "primitiveTypes", "escapeRegex", "clone", "inst", "params", "cl", "normalizeParams", "_params", "createTransparentProxy", "receiver", "descriptor", "optionalKeys", "shape", "NUMBER_FORMAT_RANGES", "BIGINT_FORMAT_RANGES", "pick", "mask", "currDef", "checks", "newShape", "omit", "extend", "existingShape", "_shape", "safeExtend", "merge", "a", "b", "partial", "Class", "oldShape", "required", "aborted", "x", "startIndex", "prefixIssues", "issues", "iss", "_a", "unwrapMessage", "message", "finalizeIssue", "ctx", "config", "full", "getSizableOrigin", "getLengthableOrigin", "parsedType", "issue", "args", "cleanEnum", "el", "base64ToUint8Array", "base64", "binaryString", "bytes", "uint8ArrayToBase64", "base64urlToUint8Array", "base64url", "padding", "uint8ArrayToBase64url", "hexToUint8Array", "hex", "cleanHex", "uint8ArrayToHex", "initializer", "__name", "inst", "def", "jsonStringifyReplacer", "$ZodError", "$constructor", "$ZodRealError", "flattenError", "error", "mapper", "issue", "fieldErrors", "formErrors", "sub", "formatError", "processError", "issues", "curr", "i", "el", "treeifyError", "result", "path", "_a", "_b", "fullpath", "terminal", "toDotPath", "_path", "segs", "seg", "prettifyError", "lines", "a", "b", "_parse", "__name", "_Err", "schema", "value", "_ctx", "_params", "ctx", "result", "$ZodAsyncError", "e", "iss", "finalizeIssue", "config", "captureStackTrace", "parse", "$ZodRealError", "_parseAsync", "params", "parseAsync", "_safeParse", "$ZodError", "safeParse", "_safeParseAsync", "safeParseAsync", "_encode", "encode", "_decode", "decode", "_encodeAsync", "encodeAsync", "_decodeAsync", "decodeAsync", "_safeEncode", "safeEncode", "_safeDecode", "safeDecode", "_safeEncodeAsync", "safeEncodeAsync", "_safeDecodeAsync", "safeDecodeAsync", "regexes_exports", "__export", "base64", "base64url", "bigint", "boolean", "browserEmail", "cidrv4", "cidrv6", "cuid", "cuid2", "date", "datetime", "domain", "duration", "e164", "email", "emoji", "extendedDuration", "guid", "hex", "hostname", "html5Email", "idnEmail", "integer", "ipv4", "ipv6", "ksuid", "lowercase", "mac", "md5_base64", "md5_base64url", "md5_hex", "nanoid", "_null", "number", "rfc5322Email", "sha1_base64", "sha1_base64url", "sha1_hex", "sha256_base64", "sha256_base64url", "sha256_hex", "sha384_base64", "sha384_base64url", "sha384_hex", "sha512_base64", "sha512_base64url", "sha512_hex", "string", "time", "ulid", "_undefined", "unicodeEmail", "uppercase", "uuid", "uuid4", "uuid6", "uuid7", "xid", "cuid", "cuid2", "ulid", "xid", "ksuid", "nanoid", "duration", "extendedDuration", "guid", "uuid", "__name", "version", "uuid4", "uuid6", "uuid7", "email", "html5Email", "rfc5322Email", "unicodeEmail", "idnEmail", "browserEmail", "_emoji", "emoji", "ipv4", "ipv6", "mac", "delimiter", "escapedDelim", "escapeRegex", "cidrv4", "cidrv6", "base64", "base64url", "hostname", "domain", "e164", "dateSource", "date", "timeSource", "args", "hhmm", "time", "datetime", "opts", "timeRegex", "string", "params", "regex", "bigint", "integer", "number", "boolean", "_null", "_undefined", "lowercase", "uppercase", "hex", "fixedBase64", "bodyLength", "padding", "__name", "fixedBase64url", "length", "md5_hex", "md5_base64", "md5_base64url", "sha1_hex", "sha1_base64", "sha1_base64url", "sha256_hex", "sha256_base64", "sha256_base64url", "sha384_hex", "sha384_base64", "sha384_base64url", "sha512_hex", "sha512_base64", "sha512_base64url", "$ZodCheck", "$constructor", "inst", "def", "_a", "numericOriginMap", "$ZodCheckLessThan", "origin", "bag", "curr", "payload", "$ZodCheckGreaterThan", "$ZodCheckMultipleOf", "floatSafeRemainder", "$ZodCheckNumberFormat", "isInt", "minimum", "maximum", "NUMBER_FORMAT_RANGES", "integer", "input", "$ZodCheckBigIntFormat", "BIGINT_FORMAT_RANGES", "$ZodCheckMaxSize", "val", "nullish", "getSizableOrigin", "$ZodCheckMinSize", "$ZodCheckSizeEquals", "size", "tooBig", "$ZodCheckMaxLength", "getLengthableOrigin", "$ZodCheckMinLength", "$ZodCheckLengthEquals", "length", "$ZodCheckStringFormat", "_b", "$ZodCheckRegex", "$ZodCheckLowerCase", "lowercase", "$ZodCheckUpperCase", "uppercase", "$ZodCheckIncludes", "escapedRegex", "escapeRegex", "pattern", "$ZodCheckStartsWith", "$ZodCheckEndsWith", "handleCheckPropertyResult", "result", "property", "prefixIssues", "__name", "$ZodCheckProperty", "$ZodCheckMimeType", "mimeSet", "$ZodCheckOverwrite", "Doc", "__name", "args", "fn", "arg", "lines", "x", "minIndent", "dedented", "line", "F", "version", "$ZodType", "$constructor", "inst", "def", "_a", "version", "checks", "ch", "fn", "runChecks", "__name", "payload", "ctx", "isAborted", "aborted", "asyncResult", "currLen", "_", "$ZodAsyncError", "handleCanaryResult", "canary", "checkResult", "result", "defineLazy", "value", "r", "safeParse", "safeParseAsync", "$ZodString", "string", "$ZodStringFormat", "$ZodCheckStringFormat", "$ZodGUID", "guid", "$ZodUUID", "v", "uuid", "$ZodEmail", "email", "$ZodURL", "trimmed", "url", "$ZodEmoji", "emoji", "$ZodNanoID", "nanoid", "$ZodCUID", "cuid", "$ZodCUID2", "cuid2", "$ZodULID", "ulid", "$ZodXID", "xid", "$ZodKSUID", "ksuid", "$ZodISODateTime", "datetime", "$ZodISODate", "date", "$ZodISOTime", "time", "$ZodISODuration", "duration", "$ZodIPv4", "ipv4", "$ZodIPv6", "ipv6", "$ZodMAC", "mac", "$ZodCIDRv4", "cidrv4", "$ZodCIDRv6", "cidrv6", "parts", "address", "prefix", "prefixNum", "isValidBase64", "data", "$ZodBase64", "base64", "isValidBase64URL", "base64url", "c", "padded", "$ZodBase64URL", "$ZodE164", "e164", "isValidJWT", "token", "algorithm", "tokensParts", "header", "parsedHeader", "$ZodJWT", "$ZodCustomStringFormat", "$ZodNumber", "number", "_ctx", "input", "received", "$ZodNumberFormat", "$ZodCheckNumberFormat", "$ZodBoolean", "boolean", "$ZodBigInt", "bigint", "$ZodBigIntFormat", "$ZodCheckBigIntFormat", "$ZodSymbol", "$ZodUndefined", "_undefined", "$ZodNull", "_null", "$ZodAny", "$ZodUnknown", "$ZodNever", "$ZodVoid", "$ZodDate", "isDate", "handleArrayResult", "final", "index", "prefixIssues", "$ZodArray", "proms", "i", "item", "handlePropertyResult", "key", "isOptionalOut", "normalizeDef", "keys", "k", "okeys", "optionalKeys", "handleCatchall", "unrecognized", "keySet", "_catchall", "t", "$ZodObject", "sh", "newSh", "_normalized", "cached", "shape", "propValues", "field", "isObject", "catchall", "el", "$ZodObjectJIT", "superParse", "generateFastpass", "doc", "Doc", "normalized", "parseStr", "esc", "ids", "counter", "id", "fastpass", "jit", "globalConfig", "fastEnabled", "allowsEval", "handleUnionResults", "results", "nonaborted", "iss", "finalizeIssue", "config", "$ZodUnion", "o", "option", "patterns", "p", "cleanRegex", "single", "first", "async", "handleExclusiveUnionResults", "successes", "$ZodXor", "$ZodDiscriminatedUnion", "_super", "pv", "val", "disc", "opts", "map", "values", "opt", "$ZodIntersection", "left", "right", "handleIntersectionResults", "mergeValues", "a", "b", "isPlainObject", "bKeys", "sharedKeys", "newObj", "sharedValue", "newArray", "itemA", "itemB", "unrecKeys", "unrecIssue", "bothKeys", "f", "merged", "$ZodTuple", "items", "reversedIndex", "optStart", "tooBig", "tooSmall", "handleTupleResult", "rest", "$ZodRecord", "recordKeys", "keyResult", "retryResult", "$ZodMap", "valueResult", "handleMapResult", "propertyKeyTypes", "$ZodSet", "handleSetResult", "$ZodEnum", "getEnumValues", "valuesSet", "escapeRegex", "$ZodLiteral", "$ZodFile", "$ZodTransform", "$ZodEncodeError", "_out", "output", "handleOptionalResult", "$ZodOptional", "pattern", "$ZodExactOptional", "$ZodNullable", "$ZodDefault", "handleDefaultResult", "$ZodPrefault", "$ZodNonOptional", "x", "handleNonOptionalResult", "$ZodSuccess", "$ZodCatch", "$ZodNaN", "$ZodPipe", "handlePipeResult", "next", "$ZodCodec", "handleCodecAResult", "transformed", "handleCodecTxResult", "nextSchema", "$ZodReadonly", "handleReadonlyResult", "$ZodTemplateLiteral", "regexParts", "part", "source", "start", "end", "primitiveTypes", "$ZodFunction", "func", "args", "parsedArgs", "parse", "parseAsync", "F", "$ZodPromise", "inner", "$ZodLazy", "$ZodCustom", "$ZodCheck", "handleRefineResult", "_iss", "issue", "locales_exports", "__export", "ar_default", "az_default", "be_default", "bg_default", "ca_default", "cs_default", "da_default", "de_default", "en_default", "eo_default", "es_default", "fa_default", "fi_default", "fr_default", "fr_CA_default", "he_default", "hu_default", "hy_default", "id_default", "is_default", "it_default", "ja_default", "ka_default", "kh_default", "km_default", "ko_default", "lt_default", "mk_default", "ms_default", "nl_default", "no_default", "ota_default", "pl_default", "ps_default", "pt_default", "ru_default", "sl_default", "sv_default", "ta_default", "th_default", "tr_default", "ua_default", "uk_default", "ur_default", "uz_default", "vi_default", "yo_default", "zh_CN_default", "zh_TW_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ar_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "az_default", "getBelarusianPlural", "count", "one", "few", "many", "absCount", "lastDigit", "lastTwoDigits", "__name", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "maxValue", "unit", "minValue", "_issue", "be_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "invalid_adj", "bg_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ca_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "cs_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "da_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "de_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "en_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "eo_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "es_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "fa_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "fi_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "fr_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "fr_CA_default", "error", "__name", "TypeNames", "Sizable", "typeEntry", "t", "typeLabel", "e", "withDefinite", "verbFor", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expectedKey", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "stringified", "v", "lastValue", "sizing", "subject", "comparison", "verb", "adj", "be", "singularPhrase", "_issue", "nounEntry", "noun", "adjective", "joinValues", "he_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "hu_default", "getArmenianPlural", "count", "one", "many", "__name", "withDefiniteArticle", "word", "vowels", "lastChar", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "maxValue", "unit", "minValue", "_issue", "hy_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "id_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "is_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "it_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ja_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ka_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "km_default", "kh_default", "km_default", "__name", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "suffix", "sizing", "unit", "_issue", "ko_default", "capitalizeFirstCharacter", "__name", "text", "getUnitTypeFromNumber", "number", "abs", "last", "last2", "error", "Sizable", "getSizing", "origin", "unitType", "inclusive", "targetShouldBe", "result", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "sizing", "adj", "_issue", "lt_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "mk_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ms_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "longName", "shortName", "_issue", "nl_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "no_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ota_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ps_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "pl_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "pt_default", "getRussianPlural", "count", "one", "few", "many", "absCount", "lastDigit", "lastTwoDigits", "__name", "error", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "maxValue", "unit", "minValue", "_issue", "ru_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "sl_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "sv_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ta_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "th_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "tr_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "uk_default", "ua_default", "uk_default", "__name", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "ur_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "uz_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "vi_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "zh_CN_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "zh_TW_default", "error", "__name", "Sizable", "getSizing", "origin", "FormatDictionary", "TypeDictionary", "issue", "expected", "receivedType", "parsedType", "received", "stringifyPrimitive", "joinValues", "adj", "sizing", "_issue", "yo_default", "_a", "$output", "$input", "$ZodRegistry", "__name", "schema", "_meta", "meta", "p", "pm", "f", "registry", "globalRegistry", "_string", "Class", "params", "normalizeParams", "__name", "_coercedString", "_email", "_guid", "_uuid", "_uuidv4", "_uuidv6", "_uuidv7", "_url", "_emoji", "_nanoid", "_cuid", "_cuid2", "_ulid", "_xid", "_ksuid", "_ipv4", "_ipv6", "_mac", "_cidrv4", "_cidrv6", "_base64", "_base64url", "_e164", "_jwt", "TimePrecision", "_isoDateTime", "_isoDate", "_isoTime", "_isoDuration", "_number", "_coercedNumber", "_int", "_float32", "_float64", "_int32", "_uint32", "_boolean", "_coercedBoolean", "_bigint", "_coercedBigint", "_int64", "_uint64", "_symbol", "_undefined", "_null", "_any", "_unknown", "_never", "_void", "_date", "_coercedDate", "_nan", "_lt", "value", "$ZodCheckLessThan", "_lte", "_gt", "value", "params", "$ZodCheckGreaterThan", "normalizeParams", "__name", "_gte", "_positive", "params", "_gt", "__name", "_negative", "_lt", "_nonpositive", "_lte", "_nonnegative", "_gte", "_multipleOf", "value", "$ZodCheckMultipleOf", "normalizeParams", "_maxSize", "maximum", "$ZodCheckMaxSize", "_minSize", "minimum", "$ZodCheckMinSize", "_size", "size", "$ZodCheckSizeEquals", "_maxLength", "$ZodCheckMaxLength", "_minLength", "$ZodCheckMinLength", "_length", "length", "$ZodCheckLengthEquals", "_regex", "pattern", "$ZodCheckRegex", "_lowercase", "$ZodCheckLowerCase", "_uppercase", "$ZodCheckUpperCase", "_includes", "includes", "$ZodCheckIncludes", "_startsWith", "prefix", "$ZodCheckStartsWith", "_endsWith", "suffix", "$ZodCheckEndsWith", "_property", "property", "schema", "$ZodCheckProperty", "_mime", "types", "$ZodCheckMimeType", "_overwrite", "tx", "$ZodCheckOverwrite", "_normalize", "form", "input", "_trim", "_toLowerCase", "_toUpperCase", "_slugify", "slugify", "_array", "Class", "element", "_union", "options", "_xor", "_discriminatedUnion", "discriminator", "_intersection", "left", "right", "_tuple", "items", "_paramsOrRest", "_params", "hasRest", "$ZodType", "rest", "_record", "keyType", "valueType", "_map", "_set", "_enum", "values", "entries", "v", "_nativeEnum", "_literal", "_file", "_transform", "fn", "_optional", "innerType", "_nullable", "_default", "defaultValue", "shallowClone", "_nonoptional", "_success", "_catch", "catchValue", "_pipe", "in_", "out", "_readonly", "_templateLiteral", "parts", "_lazy", "getter", "_promise", "_custom", "norm", "_refine", "_superRefine", "ch", "_check", "payload", "issue", "_issue", "$ZodCheck", "describe", "description", "inst", "existing", "globalRegistry", "meta", "metadata", "_stringbool", "Classes", "truthyArray", "falsyArray", "truthySet", "falsySet", "_Codec", "$ZodCodec", "_Boolean", "$ZodBoolean", "_String", "$ZodString", "stringSchema", "booleanSchema", "codec", "data", "_payload", "_stringFormat", "format", "fnOrRegex", "def", "val", "initializeContext", "params", "target", "globalRegistry", "__name", "process", "schema", "ctx", "_params", "_a", "def", "seen", "result", "overrideSchema", "_json", "processor", "parent", "meta", "isTransforming", "extractDefs", "root", "idToSchema", "entry", "id", "existing", "makeURI", "defsSegment", "externalId", "uriGenerator", "defUriPrefix", "defId", "extractToDef", "ref", "key", "ext", "finalize", "flattenRef", "zodSchema", "_cached", "refSeen", "refSchema", "parentSeen", "defs", "finalized", "createStandardJSONSchemaMethod", "_schema", "_ctx", "option", "item", "createToJSONSchemaMethod", "processors", "io", "libraryOptions", "formatMap", "stringProcessor", "__name", "schema", "ctx", "_json", "_params", "json", "minimum", "maximum", "format", "patterns", "contentEncoding", "regexes", "regex", "numberProcessor", "multipleOf", "exclusiveMaximum", "exclusiveMinimum", "booleanProcessor", "_schema", "_ctx", "bigintProcessor", "symbolProcessor", "nullProcessor", "undefinedProcessor", "voidProcessor", "neverProcessor", "anyProcessor", "unknownProcessor", "dateProcessor", "enumProcessor", "def", "values", "getEnumValues", "v", "literalProcessor", "vals", "val", "nanProcessor", "templateLiteralProcessor", "pattern", "fileProcessor", "file", "mime", "m", "successProcessor", "customProcessor", "functionProcessor", "transformProcessor", "mapProcessor", "setProcessor", "arrayProcessor", "params", "process", "objectProcessor", "shape", "key", "allKeys", "requiredKeys", "unionProcessor", "isExclusive", "options", "x", "i", "intersectionProcessor", "a", "b", "isSimpleIntersection", "allOf", "tupleProcessor", "prefixPath", "restPath", "prefixItems", "rest", "recordProcessor", "keyType", "valueSchema", "keyValues", "validKeyValues", "nullableProcessor", "inner", "seen", "nonoptionalProcessor", "defaultProcessor", "prefaultProcessor", "catchProcessor", "catchValue", "pipeProcessor", "innerType", "readonlyProcessor", "promiseProcessor", "optionalProcessor", "lazyProcessor", "allProcessors", "toJSONSchema", "input", "registry", "initializeContext", "defs", "entry", "_", "schemas", "external", "extractDefs", "finalize", "defsSegment", "JSONSchemaGenerator", "__name", "value", "params", "normalizedTarget", "initializeContext", "allProcessors", "schema", "_params", "process", "extractDefs", "result", "finalize", "_", "plainResult", "json_schema_exports", "schemas_exports", "__export", "ZodAny", "ZodArray", "ZodBase64", "ZodBase64URL", "ZodBigInt", "ZodBigIntFormat", "ZodBoolean", "ZodCIDRv4", "ZodCIDRv6", "ZodCUID", "ZodCUID2", "ZodCatch", "ZodCodec", "ZodCustom", "ZodCustomStringFormat", "ZodDate", "ZodDefault", "ZodDiscriminatedUnion", "ZodE164", "ZodEmail", "ZodEmoji", "ZodEnum", "ZodExactOptional", "ZodFile", "ZodFunction", "ZodGUID", "ZodIPv4", "ZodIPv6", "ZodIntersection", "ZodJWT", "ZodKSUID", "ZodLazy", "ZodLiteral", "ZodMAC", "ZodMap", "ZodNaN", "ZodNanoID", "ZodNever", "ZodNonOptional", "ZodNull", "ZodNullable", "ZodNumber", "ZodNumberFormat", "ZodObject", "ZodOptional", "ZodPipe", "ZodPrefault", "ZodPromise", "ZodReadonly", "ZodRecord", "ZodSet", "ZodString", "ZodStringFormat", "ZodSuccess", "ZodSymbol", "ZodTemplateLiteral", "ZodTransform", "ZodTuple", "ZodType", "ZodULID", "ZodURL", "ZodUUID", "ZodUndefined", "ZodUnion", "ZodUnknown", "ZodVoid", "ZodXID", "ZodXor", "_ZodString", "_default", "_function", "any", "array", "base64", "base64url", "bigint", "boolean", "_catch", "check", "cidrv4", "cidrv6", "codec", "cuid", "cuid2", "custom", "date", "describe", "discriminatedUnion", "e164", "email", "emoji", "_enum", "exactOptional", "file", "float32", "float64", "guid", "hash", "hex", "hostname", "httpUrl", "_instanceof", "int", "int32", "int64", "intersection", "ipv4", "ipv6", "json", "jwt", "keyof", "ksuid", "lazy", "literal", "looseObject", "looseRecord", "mac", "map", "meta", "nan", "nanoid", "nativeEnum", "never", "nonoptional", "_null", "nullable", "nullish", "number", "object", "optional", "partialRecord", "pipe", "prefault", "preprocess", "promise", "readonly", "record", "refine", "set", "strictObject", "string", "stringFormat", "stringbool", "success", "superRefine", "symbol", "templateLiteral", "transform", "tuple", "uint32", "uint64", "ulid", "_undefined", "union", "unknown", "url", "uuid", "uuidv4", "uuidv6", "uuidv7", "_void", "xid", "xor", "checks_exports", "__export", "_endsWith", "_gt", "_gte", "_includes", "_length", "_lowercase", "_lt", "_lte", "_maxLength", "_maxSize", "_mime", "_minLength", "_minSize", "_multipleOf", "_negative", "_nonnegative", "_nonpositive", "_normalize", "_overwrite", "_positive", "_property", "_regex", "_size", "_slugify", "_startsWith", "_toLowerCase", "_toUpperCase", "_trim", "_uppercase", "iso_exports", "__export", "ZodISODate", "ZodISODateTime", "ZodISODuration", "ZodISOTime", "date", "datetime", "duration", "time", "ZodISODateTime", "$constructor", "inst", "def", "$ZodISODateTime", "ZodStringFormat", "datetime", "params", "_isoDateTime", "__name", "ZodISODate", "$ZodISODate", "date", "_isoDate", "ZodISOTime", "$ZodISOTime", "time", "_isoTime", "ZodISODuration", "$ZodISODuration", "duration", "_isoDuration", "initializer", "__name", "inst", "issues", "$ZodError", "mapper", "formatError", "flattenError", "issue", "jsonStringifyReplacer", "ZodError", "$constructor", "ZodRealError", "parse", "_parse", "ZodRealError", "parseAsync", "_parseAsync", "safeParse", "_safeParse", "safeParseAsync", "_safeParseAsync", "encode", "_encode", "decode", "_decode", "encodeAsync", "_encodeAsync", "decodeAsync", "_decodeAsync", "safeEncode", "_safeEncode", "safeDecode", "_safeDecode", "safeEncodeAsync", "_safeEncodeAsync", "safeDecodeAsync", "_safeDecodeAsync", "ZodType", "$constructor", "inst", "def", "$ZodType", "createStandardJSONSchemaMethod", "createToJSONSchemaMethod", "checks", "util_exports", "ch", "params", "clone", "reg", "meta", "data", "parse", "safeParse", "parseAsync", "safeParseAsync", "encode", "decode", "encodeAsync", "decodeAsync", "safeEncode", "safeDecode", "safeEncodeAsync", "safeDecodeAsync", "check", "refine", "refinement", "superRefine", "fn", "_overwrite", "optional", "exactOptional", "nullable", "nonoptional", "array", "arg", "union", "intersection", "tx", "pipe", "transform", "_default", "prefault", "_catch", "target", "readonly", "description", "cl", "globalRegistry", "args", "_ZodString", "$ZodString", "ctx", "json", "stringProcessor", "bag", "_regex", "_includes", "_startsWith", "_endsWith", "_minLength", "_maxLength", "_length", "_lowercase", "_uppercase", "_trim", "_normalize", "_toLowerCase", "_toUpperCase", "_slugify", "ZodString", "_email", "ZodEmail", "_url", "ZodURL", "_jwt", "ZodJWT", "_emoji", "ZodEmoji", "_guid", "ZodGUID", "_uuid", "ZodUUID", "_uuidv4", "_uuidv6", "_uuidv7", "_nanoid", "ZodNanoID", "_cuid", "ZodCUID", "_cuid2", "ZodCUID2", "_ulid", "ZodULID", "_base64", "ZodBase64", "_base64url", "ZodBase64URL", "_xid", "ZodXID", "_ksuid", "ZodKSUID", "_ipv4", "ZodIPv4", "_ipv6", "ZodIPv6", "_cidrv4", "ZodCIDRv4", "_cidrv6", "ZodCIDRv6", "_e164", "ZodE164", "datetime", "date", "time", "duration", "string", "_string", "__name", "ZodStringFormat", "$ZodStringFormat", "$ZodEmail", "email", "$ZodGUID", "guid", "$ZodUUID", "uuid", "uuidv4", "uuidv6", "uuidv7", "$ZodURL", "url", "httpUrl", "regexes_exports", "$ZodEmoji", "emoji", "$ZodNanoID", "nanoid", "$ZodCUID", "cuid", "$ZodCUID2", "cuid2", "$ZodULID", "ulid", "$ZodXID", "xid", "$ZodKSUID", "ksuid", "$ZodIPv4", "ipv4", "ZodMAC", "$ZodMAC", "mac", "_mac", "$ZodIPv6", "ipv6", "$ZodCIDRv4", "cidrv4", "$ZodCIDRv6", "cidrv6", "$ZodBase64", "base64", "$ZodBase64URL", "base64url", "$ZodE164", "e164", "$ZodJWT", "jwt", "ZodCustomStringFormat", "$ZodCustomStringFormat", "stringFormat", "format", "fnOrRegex", "_params", "_stringFormat", "hostname", "hex", "hash", "alg", "enc", "regex", "ZodNumber", "$ZodNumber", "numberProcessor", "value", "_gt", "_gte", "_lt", "_lte", "int", "_multipleOf", "number", "_number", "ZodNumberFormat", "$ZodNumberFormat", "_int", "float32", "_float32", "float64", "_float64", "int32", "_int32", "uint32", "_uint32", "ZodBoolean", "$ZodBoolean", "booleanProcessor", "boolean", "_boolean", "ZodBigInt", "$ZodBigInt", "bigintProcessor", "bigint", "_bigint", "ZodBigIntFormat", "$ZodBigIntFormat", "int64", "_int64", "uint64", "_uint64", "ZodSymbol", "$ZodSymbol", "symbolProcessor", "symbol", "_symbol", "ZodUndefined", "$ZodUndefined", "undefinedProcessor", "_undefined", "ZodNull", "$constructor", "inst", "def", "$ZodNull", "ZodType", "ctx", "json", "params", "nullProcessor", "_null", "__name", "ZodAny", "$constructor", "inst", "def", "$ZodAny", "ZodType", "ctx", "json", "params", "anyProcessor", "any", "_any", "__name", "ZodUnknown", "$ZodUnknown", "unknownProcessor", "unknown", "_unknown", "ZodNever", "$ZodNever", "neverProcessor", "never", "_never", "ZodVoid", "$ZodVoid", "voidProcessor", "_void", "ZodDate", "$constructor", "inst", "def", "$ZodDate", "ZodType", "ctx", "json", "params", "dateProcessor", "value", "_gte", "_lte", "c", "date", "_date", "__name", "ZodArray", "$ZodArray", "arrayProcessor", "minLength", "_minLength", "maxLength", "_maxLength", "len", "_length", "array", "element", "_array", "keyof", "schema", "shape", "_enum", "ZodObject", "$ZodObjectJIT", "objectProcessor", "util_exports", "catchall", "unknown", "never", "incoming", "other", "mask", "args", "ZodOptional", "ZodNonOptional", "object", "strictObject", "looseObject", "ZodUnion", "$ZodUnion", "unionProcessor", "union", "options", "ZodXor", "$ZodXor", "xor", "ZodDiscriminatedUnion", "$ZodDiscriminatedUnion", "discriminatedUnion", "discriminator", "ZodIntersection", "$ZodIntersection", "intersectionProcessor", "intersection", "left", "right", "ZodTuple", "$ZodTuple", "tupleProcessor", "rest", "tuple", "items", "_paramsOrRest", "_params", "hasRest", "$ZodType", "ZodRecord", "$ZodRecord", "recordProcessor", "record", "keyType", "valueType", "partialRecord", "k", "clone", "looseRecord", "ZodMap", "$ZodMap", "mapProcessor", "_minSize", "_maxSize", "_size", "map", "ZodSet", "$ZodSet", "setProcessor", "set", "ZodEnum", "$ZodEnum", "enumProcessor", "keys", "values", "newEntries", "entries", "v", "nativeEnum", "entries", "params", "ZodEnum", "util_exports", "__name", "ZodLiteral", "$constructor", "inst", "def", "$ZodLiteral", "ZodType", "ctx", "json", "literalProcessor", "literal", "value", "ZodFile", "$ZodFile", "fileProcessor", "size", "_minSize", "_maxSize", "types", "_mime", "file", "_file", "ZodTransform", "$ZodTransform", "transformProcessor", "payload", "_ctx", "$ZodEncodeError", "issue", "_issue", "output", "transform", "fn", "ZodOptional", "$ZodOptional", "optionalProcessor", "optional", "innerType", "ZodExactOptional", "$ZodExactOptional", "exactOptional", "ZodNullable", "$ZodNullable", "nullableProcessor", "nullable", "nullish", "ZodDefault", "$ZodDefault", "defaultProcessor", "_default", "defaultValue", "ZodPrefault", "$ZodPrefault", "prefaultProcessor", "prefault", "ZodNonOptional", "$ZodNonOptional", "nonoptionalProcessor", "nonoptional", "ZodSuccess", "$ZodSuccess", "successProcessor", "success", "ZodCatch", "$ZodCatch", "catchProcessor", "_catch", "catchValue", "ZodNaN", "$constructor", "inst", "def", "$ZodNaN", "ZodType", "ctx", "json", "params", "nanProcessor", "nan", "_nan", "__name", "ZodPipe", "$ZodPipe", "pipeProcessor", "pipe", "in_", "out", "ZodCodec", "$ZodCodec", "codec", "ZodReadonly", "$ZodReadonly", "readonlyProcessor", "readonly", "innerType", "ZodTemplateLiteral", "$ZodTemplateLiteral", "templateLiteralProcessor", "templateLiteral", "parts", "util_exports", "ZodLazy", "$ZodLazy", "lazyProcessor", "lazy", "getter", "ZodPromise", "$ZodPromise", "promiseProcessor", "promise", "ZodFunction", "$ZodFunction", "functionProcessor", "_function", "tuple", "array", "unknown", "ZodCustom", "$constructor", "inst", "def", "$ZodCustom", "ZodType", "ctx", "json", "params", "customProcessor", "check", "fn", "ch", "$ZodCheck", "__name", "custom", "_params", "_custom", "refine", "_refine", "superRefine", "_superRefine", "describe", "meta", "_instanceof", "cls", "data", "util_exports", "payload", "stringbool", "__name", "args", "_stringbool", "ZodCodec", "ZodBoolean", "ZodString", "json", "params", "jsonSchema", "lazy", "union", "string", "number", "boolean", "_null", "array", "record", "preprocess", "fn", "schema", "pipe", "transform", "ZodIssueCode", "setErrorMap", "map", "config", "__name", "getErrorMap", "ZodFirstPartyTypeKind", "z", "schemas_exports", "checks_exports", "iso_exports", "RECOGNIZED_KEYS", "detectVersion", "schema", "defaultTarget", "$schema", "__name", "resolveRef", "ref", "ctx", "path", "defsKey", "key", "convertBaseSchema", "refPath", "resolved", "zodSchema", "convertSchema", "enumValues", "v", "literalSchemas", "type", "typeSchemas", "t", "typeSchema", "stringSchema", "format", "numberSchema", "shape", "properties", "requiredSet", "propSchema", "propZodSchema", "keySchema", "valueSchema", "objectSchema", "recordSchema", "patternProps", "patternKeys", "looseRecords", "pattern", "patternValue", "schemasToIntersect", "result", "i", "prefixItems", "items", "tupleItems", "item", "rest", "element", "arraySchema", "baseSchema", "hasExplicitType", "options", "s", "anyOfUnion", "oneOfUnion", "startIdx", "extraMeta", "coreMetadataKeys", "contentMetadataKeys", "fromJSONSchema", "params", "version", "defs", "globalRegistry", "coerce_exports", "__export", "bigint", "boolean", "date", "number", "string", "string", "params", "_coercedString", "ZodString", "__name", "number", "_coercedNumber", "ZodNumber", "boolean", "_coercedBoolean", "ZodBoolean", "bigint", "_coercedBigint", "ZodBigInt", "date", "_coercedDate", "ZodDate", "config", "en_default", "zod_default", "external_exports", "zDocumentId", "strict", "core", "zod_default", "__name", "validators", "zDocumentUUID", "options", "embedded", "type", "dist_exports", "zod_default", "value", "resolvedUUID", "__name", "zClientDocument", "model", "zod_default", "value", "__name", "zFilePath", "options", "base64", "categories", "virtual", "wildcard", "dist_exports", "c", "zod_exports", "value", "category", "err", "__name", "CONJUNCTION_TYPES", "EQUIPMENT_CATEGORIES", "zTraitData", "zod_default", "__name", "zLevelData", "max", "zSearchData", "zCheckboxData", "zRangeData", "zEquipmentFilter", "zForeignDocument", "model", "validator", "ModelClass", "zod_default", "zDocumentId", "zClientDocument", "id", "doc", "__name", "zForeignItem", "type", "embedded", "ItemCls", "types", "dist_exports", "zod_default", "zDocumentUUID", "zClientDocument", "uuid", "item", "doc", "__name", "zRange", "min", "max", "zod_default", "value", "dist_exports", "valueBetween", "__name", "zSafeArray", "schema", "unique", "zod_default", "arr", "result", "dist_exports", "entry", "parsed", "__name", "_cached", "zAttribute", "attribute", "dist_exports", "zod_default", "__name", "ZodDocument", "__name", "#data", "data", "property", "value", "encoder", "SYSTEM", "__name", "dist_exports", "path", "tail", "pf2e", "sf2e", "entries", "index", "entry", "uuid", "singleUuid", "text", "options", "name", "CustomModule", "__name", "#api", "#current", "#debug", "#globalName", "#group", "#id", "id", "globalName", "_", "c", "self", "context", "setting", "getSetting", "localize", "label", "args", "dist_exports", "path", "joined", "tail", "ext", "str", "error", "message", "key", "toExpose", "exposed", "getActiveModule", "module", "MODULE", "actionImgMap", "dist_exports", "tail", "SYSTEM", "actionGlyphMap", "getActionIcon", "action", "fallback", "value", "sanitized", "__name", "getActionGlyph", "updateActionFrequency", "event", "item", "virtualData", "target", "frequency", "parent", "ruleIndex", "useAction", "macro", "use", "newValue", "applySelfEffect", "msg", "effect", "actor", "token", "traits", "trait", "effectSource", "isDefaultActionIcon", "img", "belongToPartyAlliance", "actor", "__name", "oppositeAlliance", "alliance", "isAllyActor", "isMerchant", "getMythicOrHeroPoints", "slug", "resource", "renderApplications", "type", "types", "apps", "dist_exports", "app", "x", "isInstanceOf", "__name", "renderCharacterSheets", "renderActorSheets", "renderItemSheets", "enrichHTML", "content", "options", "removeIndexFromArray", "array", "index", "copy", "usedArray", "__name", "arraysEqual", "arr1", "arr2", "dist_exports", "entry", "includesAny", "haystack", "needles", "latestChatMessages", "nb", "fromMessage", "messages", "startIndex", "message", "i", "__name", "refreshLatestMessages", "isActionMessage", "message", "origin", "context", "SYSTEM", "dist_exports", "__name", "isSpellMessage", "filterTraits", "traits", "selected", "condition", "selectedTraits", "s", "t", "__name", "openBrowserTab", "tab", "data", "filters", "browser", "_tab", "html", "controls", "htmlQuery", "btn", "createHTMLElement", "event", "_cached", "getDamageRollClass", "Roll", "__name", "waitDialog", "classes", "content", "data", "expand", "i18n", "no", "onRender", "position", "title", "yes", "MODULE", "dialogOptions", "localize", "_event", "_btn", "dialog", "createFormData", "generateDialogContent", "event", "htmlQuery", "generateDialogTitle", "__name", "confirmDialog", "dist_exports", "render", "getDocumentFromUUID", "type", "uuid", "DocumentCls", "doc", "__name", "getInMemory", "obj", "path", "MODULE", "__name", "setInMemory", "args", "value", "deleteInMemory", "isScriptMacro", "doc", "isValidTargetDocuments", "target", "dist_exports", "isTokenObject", "createCustomEffect", "badge", "duration", "img", "itemSlug", "level", "name", "rules", "show", "unidentified", "system", "actor", "token", "__name", "createCustomCondition", "options", "alterations", "counter", "slug", "condition", "rule", "flagPath", "path", "MODULE", "__name", "getFlag", "doc", "dist_exports", "setFlag", "args", "value", "unsetFlag", "setFlagProperty", "obj", "args", "value", "flagPath", "__name", "setFlagProperties", "properties", "unsetFlagProperty", "path", "deleteFlagProperty", "updateSourceFlag", "doc", "render", "args", "data", "template", "path", "MODULE", "localize", "dist_exports", "SYSTEM", "__name", "registerUpstreamHook", "event", "listener", "once", "id", "hook", "x", "__name", "createToggleHook", "options", "_ids", "_hook", "path", "enabled", "executeWhenReady", "fn", "htmlQuery", "parent", "selectors", "__name", "htmlQueryAll", "htmlClosest", "child", "htmlQueryIn", "parentSelector", "siblingSelector", "firstElementWithText", "el", "skipEmpty", "childNodes", "withText", "createHTMLElement", "nodeName", "classes", "dataset", "content", "id", "style", "element", "assignStyle", "key", "value", "dist_exports", "createHTMLElementContent", "options", "createButtonElement", "addListener", "parent", "selectors", "args", "element", "event", "listener", "useCapture", "e", "__name", "addListenerAll", "elements", "addEnterKeyListeners", "html", "inputType", "selector", "type", "el", "getInputValue", "toggleSummary", "summaryElem", "createFormData", "expand", "form", "htmlQuery", "formData", "data", "dist_exports", "value", "assignStyle", "el", "style", "__name", "styleValue", "value", "setStyleProperty", "html", "property", "ITEM_CARRY_TYPES", "PHYSICAL_ITEM_TYPES", "itemIsOfType", "item", "types", "t", "setHasElement", "PHYSICAL_ITEM_TYPES", "__name", "getItemSourceId", "item", "__name", "getItemSlug", "SYSTEM", "itemWithActor", "actor", "item", "__name", "usePhysicalItem", "event", "isConsumable", "isCastConsumable", "macro", "use", "consumeItem", "msg", "speaker", "flags", "SYSTEM", "contentHTML", "createHTMLElementContent", "htmlQuery", "uses", "content", "DamageRoll", "getDamageRollClass", "formula", "type", "kind", "key", "flavor", "newQuantity", "itemIsEquipped", "item", "equipableItem", "isInvested", "__name", "simulateDropItem", "item", "target", "fromInventory", "event", "data", "__name", "isCastConsumable", "item", "dist_exports", "__name", "isSF2eItem", "includesAny", "isAreaOrAutoFireType", "type", "isHoldingModifierKey", "key", "dist_exports", "__name", "registerModuleKeybinds", "keybinds", "group", "entries", "dist_exports", "keybind", "MODULE", "_", "html", "options", "onRenderControlsConfig", "__name", "id", "tab", "htmlQuery", "keybindKeys", "i", "key", "title", "createHTMLElement", "localize", "createToggleKeybind", "_actions", "context", "enabled", "registerWrapper", "type", "path", "callback", "context", "ids", "paths", "dist_exports", "wrapped", "args", "key", "id", "MODULE", "__name", "unregisterWrapper", "createSharedWrapper", "sharedCallback", "sharedId", "_registered", "wrapper", "wrapperArgs", "registered", "active", "listener", "wrapperIsEnabled", "x", "activateWrapper", "disableWrapper", "register", "priority", "registerId", "enabled", "createToggleWrapper", "options", "wrapperIds", "createCreatureSheetWrapper", "partialPath", "partial", "Localize", "_Localize", "__name", "subkeys", "self", "localize", "args", "data", "path", "MODULE", "dist_exports", "type", "permanent", "str", "key", "getTemplateData", "i18n", "localize", "Localize", "valueBetween", "value", "min", "max", "__name", "MapOfArrays", "__name", "entries", "key", "entry", "create", "dist_exports", "exist", "arr", "x", "fn", "index", "transformed", "value", "isInstanceOf", "obj", "cls", "cursor", "_cached", "SAVE_TYPES", "getCheckRollClass", "Roll", "__name", "getStatisticClass", "actor", "getExtraRollOptions", "traits", "options", "isBasic", "maybeTraits", "dist_exports", "splitListString", "additionalTraits", "t", "allOptions", "DEGREE_OF_SUCCESS_STRINGS", "DEGREE_ADJUSTMENT_AMOUNTS", "DegreeOfSuccess", "_DegreeOfSuccess", "__name", "roll", "dc", "dosAdjustments", "t", "d", "#calculateDegreeOfSuccess", "#getDegreeAdjustment", "#adjustDegreeOfSuccess", "degree", "adjustments", "outcome", "DEGREE_OF_SUCCESS_STRINGS", "label", "amount", "degreeOfSuccess", "#adjustDegreeByDieValue", "degreeOfSuccessString", "value", "dcAdjustments", "dcByLevel", "rarityToDCAdjustment", "rarity", "__name", "adjustDC", "dc", "adjustment", "dcAdjustments", "adjustDCByRarity", "calculateDC", "level", "pwol", "dcByLevel", "getPreferredName", "document", "t", "__name", "resolveActorAndItemFromHTML", "html", "messageId", "htmlClosest", "message", "sheetDocument", "resolveSheetDocument", "sheetActor", "isInstanceOf", "sheetItem", "item", "isItemUUID", "itemId", "doc", "uuid", "options", "parseResult", "isEmbedded", "getDcRarity", "item", "__name", "getItemIdentificationDCs", "pwol", "notMatchingTraditionModifier", "SYSTEM", "baseDC", "calculateDC", "rarity", "dc", "adjustDCByRarity", "getIdentifyMagicDCs", "getMagicTraditions", "traits", "t", "setHasElement", "MAGIC_TRADITIONS", "result", "traditions", "key", "IdentifyItemPopup", "identifiedName", "dcs", "action", "path", "content", "dist_exports", "$html", "html", "updateButton", "_event", "formData", "status", "COIN_DENOMINATIONS", "COIN_COMPENDIUM_UUIDS", "SYSTEM", "_physicalItemTypes", "getPhysicalItemTypes", "dist_exports", "_", "x", "type", "__name", "splitListString", "str", "delimiter", "unique", "list", "el", "dist_exports", "__name", "setHasElement", "set", "value", "ErrorPF2e", "message", "traitSlugToObject", "trait", "dictionary", "traitObject", "objectHasKey", "objectHasKey", "obj", "key", "__name", "isRelevantEvent", "event", "eventToRollParams", "event", "rollType", "key", "skipDefault", "isRelevantEvent", "params", "__name", "parseInlineParams", "paramString", "options", "splitListString", "result", "part", "idx", "colonIdx", "portions", "pluralRules", "ordinalString", "value", "suffix", "intlNumberFormat", "signedInteger", "value", "emptyStringZero", "zeroIsNegative", "nf", "maybeNegativeZero", "__name", "tupleHasValue", "array", "extractEphemeralEffects", "affects", "origin", "target", "item", "domains", "options", "effectsFrom", "effectsTo", "fullOptions", "resolvables", "s", "d", "dist_exports", "effect", "__name", "extractNotes", "rollNotes", "selectors", "s", "n", "__name", "RollNotePF2e", "_RollNotePF2e", "__name", "params", "notes", "createHTMLElement", "element", "strong", "MAGIC_TRADITIONS", "getSpellRankLabel", "group", "ordinalString", "__name", "CANTRIP_DECK_UUID", "SYSTEM", "createConsumableFromSpell", "spell", "type", "rank", "mystified", "itemImg", "itemName", "temp", "data", "objectHasKey", "uuid", "consumable", "ErrorPF2e", "consumableSource", "traits", "dist_exports", "t", "setHasElement", "MAGIC_TRADITIONS", "nameTemplate", "description", "paragraphElement", "containerElement", "hrElement", "__name", "SPELLCASTING_CATEGORIES", "createCounteractStatistic", "ability", "actor", "baseModifier", "m", "StatisticCls", "dist_exports", "__name", "getRuleElementCls", "__name", "ruleElementResolveField", "options", "context", "ResolveFieldCls", "getChoiceSetSelection", "item", "option", "flag", "rule", "settingPath", "path", "MODULE", "__name", "getSetting", "key", "setSetting", "value", "registerSetting", "options", "isGM", "userIsGM", "dist_exports", "choice", "_onChange", "operation", "userId", "registerModuleSettings", "settings", "group", "entries", "dist_exports", "setting", "registerSetting", "_", "html", "options", "onRenderSettingsConfig", "__name", "getUserSetting", "key", "userId", "moduleKey", "MODULE", "storage", "setUserSetting", "user", "value", "assertSetting", "json", "cleanJSON", "current", "namespace", "id", "err", "category", "tab", "htmlQuery", "gmOnlyLabel", "localize", "playerOnlyLabel", "reloadLabel", "gmOnly", "player", "reload", "entry", "name", "extras", "input", "htmlClosest", "label", "span", "createHTMLElement", "settingKeys", "i", "title", "EMITING_STYLE", "socketOn", "callback", "MODULE", "__name", "socketOff", "socketEmit", "packet", "_emitingElement", "displayEmiting", "emitingElement", "label", "localize", "createHTMLElement", "createEmitable", "prefix", "_enabled", "onSocket", "userId", "callOptions", "convertToCallOptions", "emit", "options", "convertToEmitOptions", "dist_exports", "userIsGM", "enabled", "__converter__", "__source__", "converted", "key", "value", "convertToCallOption", "convertTargetFromPacket", "target", "actor", "convertedOptions", "isTokenObject", "isValidTargetDocuments", "ROMAN_RANKS", "getSpellCollectionCls", "actor", "__name", "getActorMaxRank", "createSpellcastingSource", "name", "category", "attribute", "flags", "proficiencyRank", "proficiencySlug", "showSlotlessRanks", "sort", "tradition", "TimeChangeMode", "TimeOfDay", "_TimeOfDay", "__name", "hour", "minute", "second", "worldTime", "mode", "targetTime", "targetDayDifference", "currentTime", "getWorldTime", "__name", "waitTimeout", "time", "resolve", "__name", "advanceTime", "interval", "direction", "sign", "increment", "getShortTime", "DateTime", "getShortDateTime", "worldClock", "worldTime", "date", "timestampToLocalTime", "isTokenObject", "token", "__name", "getCurrentTargets", "types", "user", "uuid", "targets", "target", "actor", "__name", "selectTokens", "tokens", "positionTokenFromCoords", "x", "y", "token", "snapped", "position", "getFirstActiveToken", "linked", "match", "scene", "actorToken", "ping", "origin", "options", "scene", "types", "isPull", "isAlert", "style", "activity", "__name", "pingToken", "token", "local", "emitTokenHover", "event", "hover", "tokenObj", "isInstanceOf", "panToToken", "control", "getCurrentUser", "x", "__name", "getSelectedActor", "fn", "actor", "selected", "dist_exports", "assigned", "userIsGM", "user", "isPrimaryUpdater", "primaryPlayerOwner", "isPrimaryOwner", "canObserveActor", "withParty", "party", "activateHooksAndWrappers", "entries", "entry", "__name", "toggleHooksAndWrappers", "entries", "enabled", "entry", "__name", "localeCompare", "a", "b", "getDragEventData", "event", "__name", "stringNumber", "value", "sharedWeaponPrepareBaseData", "createSharedWrapper", "registered", "wrapped", "listener", "sharedArmorPrepareBaseData", "sharedCharacterPrepareData", "sharedNpcPrepareData", "sharedMessageRenderHTML", "_args", "html", "sharedCharacterSheetActivateListeners", "$html", "createTradeMessage", "cost", "item", "message", "quantity", "source", "subtitle", "target", "userId", "sourceName", "getPreferredName", "targetName", "formattedMessageData", "enrichHTML", "glyph", "getActionGlyph", "flavor", "SYSTEM", "content", "__name", "createTradeQuantityDialog", "options", "data", "dist_exports", "resolve", "_event", "_button", "dialog", "createFormData", "lineIntersect", "origin", "debug", "intersects", "drawDebugLine", "color", "hex", "createAbilityViewData", "item", "dist_exports", "getActionGlyph", "t", "traitSlugToObject", "r", "__name", "getActionSheetData", "baseData", "actionIcon", "getActionIcon", "defaultIcon", "isDefaultImage", "applyActorGroupUpdate", "actor", "data", "render", "keepId", "actorUpdates", "itemCreates", "itemUpdates", "itemDeletes", "lastRender", "ModuleToolApplication", "__name", "#localize", "#tool", "tool", "options", "path", "context", "result", "content", "html", "ITEM_CAST_REGEX", "ITEM_CAST_DC_REGEX", "ITEM_CAST_RANK_REGEX", "GenerateItemCast", "ModuleToolApplication", "__name", "#data", "#item", "item", "tool", "options", "_options", "description", "match", "spells", "existingUUIDs", "dist_exports", "rule", "uuid", "index", "segment", "data", "dcRaw", "rankRaw", "ROMAN_RANKS", "_event", "target", "action", "parent", "htmlClosest", "#addRule", "getValueFromSelect", "getValueFromInputNumber", "getPredicateFromInput", "htmlQuery", "getValueFromInputText", "htmlQueryAll", "el", "rules", "generateItemCastRuleSource", "rawPredicate", "parsed", "name", "ItemCastSpellcasting", "__name", "id", "name", "actor", "statistic", "tradition", "original", "castPredicate", "createCounteractStatistic", "spell", "origin", "rollOptions", "options", "spells", "collectionData", "#getEphemeralData", "dist_exports", "collection", "groupedByRank", "s", "a", "b", "rankStr", "rank", "label", "ordinalString", "createActionableRuleElement", "ActionableRuleElement", "getRuleElementCls", "__name", "data", "options", "uuid", "type", "dist_exports", "fields", "#setData", "actionable", "rollOptions", "itemIsEquipped", "changes", "sourceOnly", "item", "sourceIndex", "rules", "rule", "parentItem", "subitems", "subitem", "i", "parent", "source", "action", "SYSTEM", "__name", "dist_exports", "path", "tail", "pf2e", "sf2e", "entries", "index", "entry", "uuid", "singleUuid", "text", "options", "name", "CustomModule", "__name", "#api", "#current", "#debug", "#globalName", "#group", "#id", "id", "globalName", "_", "c", "self", "context", "setting", "getSetting", "localize", "label", "args", "dist_exports", "path", "joined", "tail", "ext", "str", "error", "message", "key", "toExpose", "exposed", "MODULE", "CustomModule", "actionImgMap", "dist_exports", "tail", "SYSTEM", "htmlQuery", "parent", "selectors", "__name", "createHTMLElement", "nodeName", "classes", "dataset", "content", "id", "style", "element", "assignStyle", "key", "value", "dist_exports", "__name", "assignStyle", "el", "style", "__name", "ITEM_CARRY_TYPES", "Localize", "_Localize", "__name", "subkeys", "self", "localize", "args", "data", "path", "MODULE", "dist_exports", "type", "permanent", "str", "key", "getTemplateData", "i18n", "localize", "Localize", "dcAdjustments", "dcByLevel", "rarityToDCAdjustment", "rarity", "__name", "adjustDC", "dc", "adjustment", "dcAdjustments", "adjustDCByRarity", "calculateDC", "level", "pwol", "dcByLevel", "getDcRarity", "item", "__name", "getItemIdentificationDCs", "pwol", "notMatchingTraditionModifier", "SYSTEM", "baseDC", "calculateDC", "rarity", "dc", "adjustDCByRarity", "getIdentifyMagicDCs", "getMagicTraditions", "traits", "t", "setHasElement", "MAGIC_TRADITIONS", "result", "traditions", "key", "IdentifyItemPopup", "identifiedName", "dcs", "action", "path", "content", "dist_exports", "$html", "html", "updateButton", "_event", "formData", "status", "COIN_COMPENDIUM_UUIDS", "SYSTEM", "splitListString", "str", "delimiter", "unique", "list", "el", "dist_exports", "__name", "setHasElement", "set", "value", "MAGIC_TRADITIONS", "CANTRIP_DECK_UUID", "SYSTEM", "getSetting", "key", "MODULE", "__name", "TimeOfDay", "_TimeOfDay", "hour", "minute", "second", "__name", "worldTime", "mode", "targetTime", "targetDayDifference", "currentTime", "fields", "createItemCastRuleElement", "ItemCastRuleElement", "getRuleElementCls", "__name", "#isAmmo", "#isConsumable", "#isWeapon", "data", "options", "isCastConsumable", "dist_exports", "uuid", "ruleElementResolveField", "resolved", "max", "#setData", "entryId", "spellId", "existAmmo", "actionable", "item", "existWeapon", "rollOptions", "actor", "spellSource", "isCantrip", "traits", "t", "setHasElement", "MAGIC_TRADITIONS", "source", "thisMany", "formatParams", "message", "parent", "newValue", "changes", "sourceOnly", "sourceIndex", "rules", "rule", "parentItem", "subitems", "subitem", "i", "spell", "generateItemCastRuleSource", "attribute", "dc", "rank", "recharge", "statistic", "tradition", "splitListString", "ModuleTool", "__name", "#localize", "#settings", "localize", "isGM", "path", "dist_exports", "setting", "key", "value", "setSetting", "doc", "getFlag", "args", "setFlag", "unsetFlag", "obj", "setFlagProperty", "setFlagProperties", "unsetFlagProperty", "deleteFlagProperty", "updateSourceFlag", "getInMemory", "setInMemory", "deleteInMemory", "template", "data", "render", "settings", "self", "getSetting", "_onChange", "operation", "userId", "ActionableTool", "ModuleTool", "__name", "#renderCreatureSheetPF2eHook", "createToggleHook", "#onRenderCreatureSheetPF2e", "#actionWrappers", "createToggleWrapper", "#actionSheetRenderInner", "#actionSheetPF2eOnDrop", "#itemWrappers", "#itemSheetRenderInner", "#spellWrappers", "#spellcastingEntryCast", "value", "toggleHooksAndWrappers", "renderItemSheets", "generateItemCastRuleSource", "actor", "id", "#rechargeVirtualSpell", "#updateVirtualSpellValue", "event", "item", "virtualData", "updateActionFrequency", "useAction", "castEnabled", "physicalEnabled", "createActionableRuleElement", "sharedCharacterPrepareData", "#characterPrepareData", "createItemCastRuleElement", "#onRenderCharacterSheetPF2e", "#onRenderPhysicalItemSheetPF2e", "registerWrapper", "#characterCreateEmbeddedDocuments", "#characterPrepareEmbeddedDocuments", "#characterRecharge", "#characterSheetGetData", "sharedCharacterSheetActivateListeners", "#characterSheetActivateListeners", "skipRenders", "actionEnabled", "itemEnabled", "renderCharacterSheets", "action", "uuid", "macro", "isScriptMacro", "data", "includesAny", "cloneData", "dist_exports", "sheet", "$html", "html", "tab", "htmlQuery", "nerdDetails", "lastGroup", "group", "createHTMLElement", "label", "tooltip", "btn", "GenerateItemCast", "virtualSpellData", "SpellCollectionCls", "getSpellCollectionCls", "spellId", "parent", "spell", "actorStatistic", "getFirstStatistic", "dc", "existingEntry", "getExistingSpellcastingEntry", "attribute", "tradition", "statistic", "#extendActorStatistic", "#createSpellcastingStatistic", "itemCasting", "ItemCastSpellcasting", "collection", "wrapped", "embeddedName", "operation", "ItemCls", "itemSource", "isPhysicalCategory", "ruleSource", "options", "elapsed", "specificDurations", "virtualActions", "virtualSpells", "originalCommit", "commitData", "ruleIndex", "frequency", "per", "specificPerIdx", "Duration", "update", "max", "recharge", "applyActorGroupUpdate", "virtuals", "sheetData", "getActionMacro", "addedTypes", "type", "actionData", "getActionSheetData", "isDefaultActionIcon", "added", "a", "b", "li", "controls", "summaryBtn", "imageBtn", "useBtn", "lock", "addCaptureListener", "el", "listener", "summary", "itemWithActor", "chatData", "toggleSummary", "_el", "frequencyInput", "equipped", "itemIsEquipped", "spellSection", "castBtn", "headerRow", "nameDiv", "template", "outer", "addListener", "isCastConsumable", "autoDestroy", "min", "rule", "#updateActorActions", "#updateActorItems", "useConsumables", "getItemMacro", "items", "section", "getSectionItems", "panel", "itemsPromise", "isConsumable", "usePhysicalItem", "isCharacter", "actionGroups", "actions", "useLabel", "autoApply", "actionable", "actionsPromise", "itemId", "actionImg", "selfEffect", "actionCost", "glyph", "getActionGlyph", "existingBtn", "wrapper", "imgEl", "#renderDropzone", "linked", "isEditable", "dropzone", "createHTMLElementContent", "addListenerAll", "droppedItem", "#resolveDroppedItem", "ErrorPF2e", "newDropzone", "hint", "sheetItem", "updates", "droppedSourceId", "getItemSourceId", "feats", "newFeatures", "_entry", "macroOptions", "effectOnly", "dataString", "dropData", "err", "MODULE", "Statistic", "getStatisticClass", "domains", "saveSelectors", "attackSelectors", "modifiers", "statistics", "slug", "heldItems", "regularEntries", "matching", "entry", "best", "TRAITS_BLACKLIST", "TRAITS_SETTING", "CONTEXT_OPTIONS", "message", "isValidMessage", "isValidActionMessage", "isValidSpellMessage", "AnonymousTool", "ModuleTool", "__name", "#traitsBlacklist", "#getChatContextOptionsHook", "createToggleHook", "#onGetChatMessageContextOptions", "#messageRenderHTMLWrapper", "sharedMessageRenderHTML", "#messageRenderHTML", "trait", "isGM", "_chat", "options", "getMessage", "el", "messageId", "icon", "test", "type", "msg", "_event", "html", "isSpell", "isAction", "members", "partyKnowsSpell", "actor", "line", "htmlQuery", "traits", "isSpellDamage", "SYSTEM", "tags", "child", "dist_exports", "action", "label", "cardHeader", "spell", "sourceId", "entry", "spellId", "slot", "prepared", "isActionMessage", "anonymousTool", "HANDWRAPS_SLUG", "STRIKING_SHIELDS", "GRADES", "ArpTool", "_ArpTool", "ModuleTool", "__name", "#baseWrappers", "sharedWeaponPrepareBaseData", "#weaponPrepareBaseData", "sharedArmorPrepareBaseData", "#armorPrepareBaseData", "#basePriceWrappers", "createToggleWrapper", "#weaponPrepareDerivedData", "#armorPrepareDerivedData", "#shieldPrepareBaseDataWrapper", "#shieldPrepareBaseData", "#shieldPrepareDeriveDataWrapper", "#shieldPrepareDerivedData", "priceEnabled", "activateHooksAndWrappers", "weapon", "actor", "isValidActor", "isValidWeapon", "force", "level", "isSF2eItem", "updateItemGrade", "expectedPotency", "expectedStriking", "wrapped", "coins", "updateItemPriceByGrade", "potency", "striking", "newPrice", "armor", "isValidArmor", "expectedResilient", "resiliency", "shield", "isValidShield", "expected", "reinforcing", "characterOnly", "SYSTEM", "specific", "category", "group", "baseItem", "traits", "dist_exports", "isHandwrap", "hasHandwrap", "item", "type", "getExpectedGrade", "grade", "improvements", "nextGrade", "nextLevel", "slug", "equipped", "identification", "carryType", "invested", "inSlot", "COVER_VALUES", "SIZES", "RECT_CORNERS", "RECT_SPREAD", "getRectPoint", "point", "rect", "__name", "getRectEdges", "margin", "opposite", "tokenSpread", "token", "type", "spread", "tokenToSpread", "origin", "target", "debug", "originCenter", "lineIntersect", "spreadToToken", "targetCenter", "CoverHighlightRenderer", "__name", "#layer", "#token", "#tool", "token", "tool", "#addLayer", "#shouldRender", "#tokenIsEligible", "level", "target", "thickness", "outerThickness", "radius", "lineColor", "mid_x", "mid_y", "vect_x", "vect_y", "perp_vect_x", "perp_vect_y", "offsetScale", "perp_x", "perp_y", "style", "dimensions", "labelText", "text", "rotation", "CREATURE_SETTINGS", "WALL_INTERSECTIONS_SETTING", "COVER_UUID", "SYSTEM", "AutoCoverTool", "ModuleTool", "__name", "#wrappers", "createToggleWrapper", "#checkRoll", "#tokenRefreshVisibility", "#tokenDestroy", "createToggleHook", "#onRenderCheckModifiersDialog", "enabled", "toggleHooksAndWrappers", "token", "fallback", "current", "CoverHighlightRenderer", "actor", "coverUUID", "effect", "getItemSourceId", "effects", "isProne", "allSelections", "level", "getChoiceSetSelection", "COVER_VALUES", "selections", "dist_exports", "context", "rawBonus", "origin", "target", "debug", "MODULE", "lineIntersect", "tokenToSpread", "spreadToToken", "originToken", "targetToken", "scene", "setting", "originActor", "targetActor", "drawDebugLine", "cover", "skipDead", "skipProne", "originSize", "SIZES", "targetSize", "margin", "canHaveExtraLarges", "isExtraLarge", "size", "intersectsEdge", "edge", "intersects", "intersectsWith", "edges", "getRectEdges", "tokenDocument", "extraLarge", "wrapped", "coverHighlight", "_check", "args", "getFirstActiveToken", "targetIsProne", "existing", "items", "#addCoverSourceToContext", "dialog", "$html", "coverEffects", "html", "separator", "options", "slug", "select", "getDisplayedBonus", "bonus", "signedInteger", "bonusSpan", "createHTMLElement", "row", "htmlQuery", "event", "ids", "allItems", "item", "sourceName", "source", "#coverSourceRules", "statistic", "getMessageMergeFlagData", "message", "flag", "dist_exports", "data", "zMergeData", "__name", "getMessageMergeData", "source", "sourceFlag", "SYSTEM", "flavor", "createHTMLElement", "option", "htmlQueryAll", "x", "setMessageMergeUpdateFlags", "updates", "targets", "targetHelperTool", "zMergeData", "zod_exports", "DEGREE_OF_SUCCESS_STRINGS", "mergeDamages", "targetMessage", "originMessage", "options", "groups", "damageLabel", "data", "getMessageMergeData", "name", "notes", "tags", "modifiers", "outcome", "group", "note", "exists", "result", "rolls", "showBreakdown", "groupRolls", "messageData", "SYSTEM", "dist_exports", "setMessageMergeUpdateFlags", "ChatMessagePF2e", "__name", "injectDamage", "updates", "getRoll", "roll", "mergeType", "originMerge", "targetMerge", "groupedInstances", "messageRoll", "otherRoll", "instances", "instance", "x", "material", "DamageRoll", "getDamageRollClass", "index", "prev", "curr", "value", "type", "createTermGroup", "ignoredResistances", "formula", "total", "term", "materials", "persistent", "msg", "terms", "_cached", "MERGE_MESSAGES", "MERGE_TYPES", "ICONS", "renderChatMessageMergeDamage", "targetMessage", "html", "isMessageOwner", "actor", "targets", "injected", "buttons", "buttonsElement", "createHTMLElement", "type", "getButton", "htmlQuery", "getInjectedIcon", "addListenerAll", "el", "event", "action", "dist_exports", "originMessage", "latestChatMessages", "isMerge", "otherTargets", "arraysEqual", "mergeOptions", "mergeMenu", "mergeDamages", "injectDamage", "data", "getMessageMergeFlagData", "sources", "source", "ChatMessagePF2e", "__name", "isInject", "split", "message", "header", "radios", "label", "waitDialog", "icon", "main", "tooltip", "AVERAGE_SETTING_TYPES", "BetterChatTool", "ModuleTool", "__name", "#mergeDamageHooks", "createToggleHook", "renderChatMessageMergeDamage", "#onDiceSoNiceMessageProcessed", "#averageHook", "#renderChatMessageAverageDamage", "originMessage", "targetMessage", "options", "injectDamage", "mergeDamages", "toggleHooksAndWrappers", "refreshLatestMessages", "message", "targets", "targetHelperTool", "target", "SYSTEM", "html", "roll", "minValue", "maxValue", "ratio", "hue", "formulaElement", "htmlQuery", "diceRollElement", "template", "messageId", "interception", "flag", "BetterEffectsPanelTool", "ModuleTool", "__name", "#renderEffectsPanelHook", "createToggleHook", "#onRenderEffectsPanel", "value", "_panel", "html", "data", "effects", "effect", "addListener", "_el", "event", "#onRemoveEffect", "BetterInventoryTool", "ModuleTool", "__name", "#actorPrepareEmbeddedDocumentsWrapper", "createToggleWrapper", "#actorPrepareEmbeddedDocuments", "#treasurePreparedBaseDataWrapper", "#treasurePreparedBaseData", "#renderSheetSettingUpdate", "#renderActorSheetHook", "renderActorSheets", "createToggleHook", "#onRenderActorSheet", "#mergeItems", "#splitItem", "actor", "wrapped", "InventoryBulkClass", "_value", "item", "MODULE", "treasure", "sheet", "$html", "html", "inventory", "htmlQuery", "btn", "createButtonElement", "li", "createHTMLElement", "elements", "el", "quantity", "itemId", "htmlClosest", "#createImprovisedWeapon", "source", "waitTimeout", "identicalItems", "dist_exports", "getItemSourceId", "items", "getIdenticalItems", "content", "result", "waitDialog", "selected", "deletes", "updates", "biggest", "update", "max", "uses", "remains", "fields", "sorted", "identical", "others", "diff", "zDefaultFilter", "defaultRatio", "zod_exports", "__name", "zBaseFilter", "zDocumentId", "zServiceDefaultFilter", "zServiceFilter", "zBuyDefaultFilter", "zSellDefaultFilter", "zItemFilter", "zEquipmentFilter", "COINS", "DEFAULT_SERVICE_ICON", "zRawCoins", "zod_exports", "zCoins", "value", "raw", "coins", "zService", "zDocumentId", "zFilePath", "zDocumentUUID", "exportService", "service", "data", "__name", "BaseFilter", "ZodDocument", "__name", "DefaultFilter", "args", "BuyDefaultFilter", "DefaultFilter", "__name", "zBuyDefaultFilter", "item", "ratio", "qty", "calculateItemPrice", "SellDefaultFilter", "zSellDefaultFilter", "ItemFilter", "_ItemFilter", "BaseFilter", "#wordSegmenter", "zItemFilter", "textFilter", "dist_exports", "itemName", "wordSegmenter", "term", "t", "segment", "tab", "checkboxes", "source", "traits", "ranges", "level", "itemLevel", "filterPrice", "itemPrice", "filterItemTypes", "itemCategory", "itemGroup", "filterArmorTypes", "filterWeaponTypes", "filterTraits", "filterSource", "itemSource", "SYSTEM", "filterRarity", "filter", "original", "ServiceDefaultFilter", "DefaultFilter", "__name", "zServiceDefaultFilter", "service", "calculateServicePrice", "ServiceFilter", "BaseFilter", "zServiceFilter", "enabled", "level", "tag", "filter", "original", "ratio", "serviceToTemplate", "filters", "enrichedPrice", "enrichHTML", "getServiceMacro", "macroUUID", "macro", "isScriptMacro", "FiltersMenu", "ModuleToolApplication", "__name", "#actor", "tool", "actor", "options", "_options", "dist_exports", "type", "_event", "target", "getSectionTypeFromElement", "action", "#addFilter", "filterId", "getFilterIdFromElement", "#deleteFilter", "#editFilter", "#moveFilter", "filters", "html", "addEnterKeyListeners", "addListenerAll", "key", "value", "getInputValue", "filter", "x", "confirmDialog", "direction", "index", "newIndex", "label", "merchantFilter", "filterData", "range", "checkbox", "openBrowserTab", "#getEquipmentFilter", "addFilter", "data", "ServiceFilter", "source", "ItemFilter", "tab", "htmlClosest", "FILTER_TYPES", "BrowserPullMenu", "_BrowserPullMenu", "ModuleToolApplication", "__name", "#actor", "#owned", "#results", "#selected", "tool", "actor", "tab", "options", "dist_exports", "item", "#selectToLimit", "_options", "data", "ranks", "rank", "getSpellRankLabel", "_context", "#updateCheckboxes", "_event", "target", "action", "#addToMerchant", "html", "addListenerAll", "el", "uuid", "htmlQueryIn", "entry", "selected", "selection", "confirmDialog", "groups", "getItemSource", "createConsumableFromSpell", "SYSTEM", "entries", "sources", "itemsUl", "htmlQuery", "countEl", "isAtLimit", "element", "iterator", "checked", "SellItemsMenu", "ModuleToolApplication", "__name", "#merchant", "#seller", "tool", "merchant", "seller", "options", "_options", "filters", "defaultFilter", "defaultRatio", "groups", "dist_exports", "item", "filter", "x", "ratio", "originalPrice", "price", "diffRatio", "type", "items", "info", "prepareCurrency", "context", "_event", "target", "action", "getItem", "itemId", "htmlClosest", "simulateDropItem", "actor", "SYSTEM_ID", "currency", "coins", "COIN_DENOMINATIONS", "showPF2e", "d", "showSF2e", "denominations", "accumulated", "ServiceMenu", "_ServiceMenu", "ModuleToolApplication", "__name", "#actor", "#service", "#onFormUpdate", "actor", "serviceId", "tool", "options", "service", "x", "MODULE", "_options", "services", "enrichHTML", "getServiceMacro", "htmlQuery", "frame", "exportBtn", "_event", "target", "action", "macroInput", "#updateService", "#editImage", "data", "exportService", "html", "addEnterKeyListeners", "addListener", "_el", "event", "dataString", "dropData", "macro", "macroUUID", "isScriptMacro", "err", "img", "path", "form", "formData", "dataObj", "DEFAULT_SERVICE_ICON", "FILTER_TYPES", "BuyDefaultFilter", "ItemFilter", "SellDefaultFilter", "ServiceDefaultFilter", "ServiceFilter", "BetterMerchantTool", "_BetterMerchantTool", "ModuleTool", "__name", "#useServiceEmitable", "createEmitable", "#useService", "#tradeItemEmitable", "#tradeItem", "#wrappers", "createToggleWrapper", "#actorSheetPF2eMoveItemBetweenActors", "#lootSheetPF2eRenderInner", "#lootSheetPF2eActivateListeners", "#actorTransferItemToActor", "renderActorSheets", "enabled", "toggleHooksAndWrappers", "tab", "actor", "type", "sources", "ModelCls", "schema", "dist_exports", "source", "data", "filters", "encoder", "encoded", "filter", "zService", "services", "service", "serviceId", "deleted", "label", "callback", "BrowserPullMenu", "openBrowserTab", "html", "invalids", "el", "merchant", "items", "isMerchant", "item", "isOwnedCustomer", "x", "_sheet", "wrapped", "event", "targetActor", "sourceActor", "isPurchase", "isSelling", "result", "#initiateTrade", "containerId", "htmlClosest", "stackable", "infinite", "title", "prompt", "createTradeQuantityDialog", "args", "target", "quantity", "newStack", "merchantSelling", "merchantBuying", "error", "reason", "customer", "infiniteAll", "realQty", "price", "filterId", "free", "userId", "seller", "buyer", "isContainer", "remainingQty", "existingItem", "itemSource", "newItem", "createTradeMessage", "sheet", "$html", "isGM", "inventoryList", "htmlQuery", "content", "serviceToTemplate", "servicesElement", "createHTMLElement", "itemFilters", "infiniteAllLabel", "notForSellLabel", "itemId", "ratio", "priceElement", "quantityElement", "controls", "buyBtn", "sheetElement", "bulkElement", "wealthElement", "addListenerAll", "#onBetterAction", "addListener", "sellBtn", "getSelectedActor", "isCustomer", "SellItemsMenu", "#importServices", "waitDialog", "parsed", "toAdd", "MODULE", "#buyService", "isServiceCustomer", "#buyItem", "confirmDialog", "simulateDropItem", "getServiceIdFromElement", "ServiceMenu", "#updateServiceFromElement", "#getServiceDataFromElement", "#serviceMessage", "FiltersMenu", "summary", "htmlQueryIn", "toggleSummary", "updateService", "macroServiceData", "calculatedPrice", "macro", "isScriptMacro", "trade", "token", "tradeMsg", "getPreferredName", "ChatMessagePF2e", "betterMerchantTool", "TELEPORT_SETTING", "BetterMovementTool", "_BetterMovementTool", "ModuleTool", "__name", "#cancelTeleport", "#shouldRecordMovementHistoryWrapper", "createToggleWrapper", "#shouldRecordMovementHistory", "#teleportKeybind", "createToggleKeybind", "#activeTeleport", "#disableTeleport", "#unselectKeybind", "value", "enabled", "isGM", "_token", "unselect", "tokens", "listener", "event", "#onCanvasStagePointerDown", "operation", "updates", "#spreadTokens", "#groupTokens", "_id", "selectTokens", "largeTokens", "otherTokens", "dist_exports", "token", "hasLargeToken", "gridSize", "localPosition", "clickPosition", "sortedLargeTokens", "i", "x", "y", "positionTokenFromCoords", "getOffsetPosition", "spread", "testCollision", "targetSpread", "originSpread", "origin", "target", "intersects", "MODULE", "getSpreadKey", "origins", "originKeys", "outerSpread", "innerSpread", "spreadIndex", "spreadMap", "addUpdate", "spreadKey", "test", "coords", "update", "position", "FeatRetrainPopup", "ModuleToolApplication", "__name", "#actor", "#category", "#current", "#featSlot", "#filters", "#grantedBy", "#retrainFeat", "tool", "currentFeat", "category", "options", "featSlot", "slot", "browser", "filters", "#getCustomFilters", "openBrowserTab", "level", "sourceId", "getItemSourceId", "rule", "choicesFilters", "dist_exports", "selectedTraits", "addTrait", "option", "not", "value", "label", "isTraitEntry", "entry", "_options", "_context", "_event", "target", "#retrain", "html", "event", "data", "getDragEventData", "item", "position", "element", "newPosition", "setStyleProperty", "currentId", "source", "SYSTEM", "granterUpdates", "itemGrants", "_flag", "currentSourceId", "granterRules", "choiceRule", "BetterSheetTool", "ModuleTool", "__name", "#partyAsObservedHooks", "createToggleWrapper", "#characterSheetPF2eTemplate", "#npcSheetPF2eTemplate", "#familiarSheetPF2eGetData", "#retrainFeatsHook", "createToggleHook", "#onRenderCharacterSheetPF2e", "#showPlayersHook", "#showPlayersOnRender", "#sortListHooks", "#sortListOnRender", "value", "toggleHooksAndWrappers", "renderActorSheets", "renderCharacterSheets", "isGM", "sheet", "$html", "html", "tab", "htmlQuery", "actor", "sections", "section", "category", "selector", "dist_exports", "featRows", "featRow", "controls", "btn", "createHTMLElement", "event", "currentFeat", "FeatRetrainPopup", "SYSTEM", "belongToPartyAlliance", "template", "wrapped", "options", "data", "imgPanel", "#addActionsSortList", "#addCraftingSortList", "#addInventorySortList", "#addSpellcastingSortList", "#createSortBtn", "disabled", "label", "classes", "#sortCollectionSpells", "collection", "updates", "spell", "group", "a", "b", "item", "index", "#sortPrepCollection", "entry", "slot", "spellA", "spellB", "collectionId", "isInstanceOf", "name", "prepared", "collectionIsDisabled", "actionsTab", "type", "craftingTab", "#addCraftingFormulasSort", "#addCraftingEntriesSort", "entries", "header", "ability", "formulas", "uuid", "crafting", "isLoot", "inventory", "headers", "itemsList", "types", "hasContainer", "container", "services", "betterMerchantTool", "localeCompare", "sortItems", "mapItems", "spells", "BetterToolTool", "ModuleTool", "__name", "#deleteRegionUnderCursor", "scene", "mouse", "dist_exports", "region", "BetterTradeTool", "ModuleTool", "__name", "#onDropItemWrapper", "createCreatureSheetWrapper", "#creatureSheetOnDropItem", "value", "isGM", "actor", "wrapped", "event", "data", "newEvent", "itemCanBeRefreshed", "item", "r", "__name", "ERROR_ACCESSING", "onEntryAction", "actor", "el", "data", "dataset", "htmlClosest", "itemType", "index", "MODULE", "onEntryInstall", "item", "itemCanBeRefreshed", "error", "__name", "entry", "getEntrySelection", "source", "isSpellEntry", "spellcasting", "current", "getCurrentItem", "isFeatEntry", "featSlot", "getFeatSlot", "isPhysicalEntry", "currentContainerId", "currentContents", "isContainerEntry", "isEquipmentEntry", "parent", "slotId", "slot", "ACTION_ICONS", "prepareEntry", "itemType", "entry", "current", "depth", "disabled", "isOverride", "selection", "getEntrySelection", "matchLabel", "label", "dist_exports", "itemCanBeRefreshed", "type", "SYSTEM", "__name", "prepareFeatEntry", "actor", "data", "index", "getCurrentItem", "prepareFeatEntries", "parent", "level", "matchParent", "stringNumber", "category", "feat", "itemsList", "isFeatEntry", "featSlot", "getFeatSlot", "selectionUUID", "selectionSlug", "getItemSlug", "sourceUUID", "sourceSlug", "item", "itemSlug", "itemSourceId", "getItemSourceId", "prepareCoreTab", "actor", "data", "actorLevel", "dataLevel", "awardedFeats", "dist_exports", "feat", "index", "entries", "CHARACTER_CATEGORIES", "itemType", "entry", "preparedEntry", "prepareEntry", "parent", "expected", "awarded", "uuid", "match", "_", "featData", "prepareFeatEntry", "prepareFeatEntries", "attributesLevels", "getLevelsAttributes", "level", "boosts", "ATTRIBUTE_KEYS", "key", "selected", "type", "boostIsPartial", "levelThreshold", "warning", "attributesTotals", "ancestryUUID", "x", "ancestryItem", "allAncestryBoosts", "ancestryBoosts", "tooltip", "ancestryFlaws", "backgroundBoosts", "classUUID", "classItem", "classKeys", "classBoosts", "__name", "addCoreEventListeners", "html", "addListenerAll", "el", "assignAttributes", "setAttributes", "values", "abilities", "attr", "levels", "assignBoosts", "available", "item", "validateBoosts", "recipiants", "_index", "value", "assigned", "assignables", "arr", "list", "recipiantsSize", "update", "isAttributeLevel", "isAttributeKey", "attribute", "isApex", "build", "a", "flaws", "netBoosts", "cssClasses", "prepareDetailsTab", "actor", "data", "actorDetails", "localizeAndSort", "__name", "addDetailsEventListeners", "html", "addListenerAll", "el", "assignDetails", "assignLanguages", "languages", "dist_exports", "slug", "x", "prepareFeatsTab", "actor", "data", "dist_exports", "prepareFeatEntries", "entrys", "__name", "addFeatsEventListeners", "html", "prepareInventoryTab", "actor", "data", "currency", "currencies", "dist_exports", "SYSTEM", "COIN_DENOMINATIONS", "unit", "items", "entry", "index", "current", "getCurrentItem", "prepareEntry", "containers", "children", "item", "sections", "entries", "backpacks", "section", "a", "b", "localeCompare", "__name", "addInventoryEventListeners", "html", "addListenerAll", "el", "assignCredits", "assignCurrencies", "currentValue", "diff", "updates", "denominations", "currentCurrencies", "toAdd", "toDelete", "toUpdate", "expected", "missing", "uuid", "COIN_COMPENDIUM_UUIDS", "source", "prepareSkillsTab", "actor", "data", "skills", "dist_exports", "slug", "getSkillEntry", "lores", "label", "rank", "getLoreSlug", "__name", "addSkillsEventListeners", "html", "addListenerAll", "el", "assignSkills", "hasLores", "SYSTEM", "prepareSpellsTab", "actor", "data", "level", "spellcasting", "dist_exports", "spellcastingEntry", "entryIndex", "entries", "entry", "isMatchingSpellcasting", "selected", "selectedId", "spells", "spellEntry", "spellIndex", "current", "getCurrentItem", "prepareEntry", "spell", "actorRituals", "rituals", "index", "selection", "getEntrySelection", "__name", "addSpellsEventListeners", "html", "getSpellcastingIndex", "el", "htmlClosest", "addListenerAll", "action", "addSpellcasting", "fillRituals", "fillSpellcasting", "refreshSpellcasting", "getSelectedSpellcasting", "isInstanceOf", "spellcastingSlots", "maxRank", "getActorMaxRank", "isPrepared", "updates", "slot", "slotKey", "value", "spellcastingSlot", "sources", "source", "confirmDialog", "isPreparedOrSpontaneous", "createSpellcastingSource", "slots", "i", "importData", "html", "actor", "fromFile", "codeOrFile", "importFromFilePopup", "importFromUrlPopup", "code", "importFromFile", "importFromUrl", "parsed", "dist_exports", "currentSource", "importedSource", "fromPathbuilder", "currentFeats", "featEntriesEqual", "__name", "a", "b", "feat", "current", "isCharacterCategory", "currentParent", "importedParent", "container", "equipment", "spellcastingEntriesEqual", "entry", "spell", "parent", "mergedSource", "merged", "CharacterImport", "error", "file", "result", "waitDialog", "ANCESTRY_KEYS", "ATTRIBUTE_KEYS", "ATTRIBUTE_LEVELS", "CHARACTER_CATEGORIES", "zBoosts", "zod_exports", "zBoostsRecord", "keys", "dist_exports", "__name", "zImportedEntry", "type", "zForeignItem", "zAttributes", "zFeat", "categories", "value", "isCharacterCategory", "zContainer", "zEquipment", "types", "getPhysicalItemTypes", "zProficiencyRank", "zRange", "zSpellRank", "zSkills", "zLore", "zCurrencies", "zSpell", "zSpellcastingEntry", "zAttribute", "zDocumentId", "SPELLCASTING_CATEGORIES", "zCharacterImport", "category", "getEntrySelection", "entry", "isAttributeKey", "isAttributeLevel", "CharacterImport", "_CharacterImport", "ZodDocument", "__name", "source", "strict", "data", "zCharacterImport", "itemType", "index", "isCharacterCategory", "#getEntries", "value", "#updateCoreOverride", "dist_exports", "isPhysicalCategory", "#updateIndexedEntryOverride", "key", "entry", "isEquipmentEntry", "physicalTypes", "getPhysicalItemTypes", "CORE_PACKS", "FEAT_PACKS", "EQUIPMENT_PACK", "FEATS_PACK", "SPELLS_PACK", "getIndexFromPack", "value", "packNames", "dist_exports", "systemName", "moduleName", "SYSTEM", "packs", "pack", "slug", "entry", "__name", "getCoreUuidFromPack", "category", "getFeatUuidFromPack", "getEquipmentDataFromPack", "getSpellUuidFromPack", "isAttribute", "isMagicTradition", "isSpellcastingCategory", "SPELLCASTING_CATEGORIES", "isSpellRank", "valueBetween", "EXTRA_FEAT_REGEX", "BACKPACK_UUID", "SPACIOUS_POUCH_UUID", "FEAT_CATEGORIES", "fromPathbuilder", "raw", "data", "dist_exports", "classe", "parseCoreEntry", "classParentKey", "SYSTEM", "featsPromises", "entry", "i", "feats", "value", "_", "categoryValue", "level", "child", "choice", "parent", "sluggifiedCategory", "categoryK", "category", "awarded", "hasParent", "foundParent", "feat", "parentCategory", "parentIsCore", "isCharacterCategory", "featureMatch", "getFeatUuidFromPack", "match", "index", "x", "getBoosts", "__name", "boosts", "v", "isAttributeKey", "rawBoosts", "levelsBoosts", "key", "actualLevel", "valueBetween", "acc", "getBoostsAtPath", "path", "attributes", "ATTRIBUTE_KEYS", "attr", "mod", "skills", "slug", "rank", "parseSkillRank", "lores", "label", "currencies", "containersPromises", "identifier", "containers", "containersIdentifiers", "containersNames", "equipmentsPromises", "name", "quantity", "getEquipmentDataFromPack", "weaponsAndArmorsPromises", "qty", "allSpells", "spellcastingPromises", "isAttribute", "isMagicTradition", "isSpellcastingCategory", "spellsSlotsPromises", "spellsEntry", "isSpellRank", "parseSpells", "spells", "perDay", "slots", "slot", "focusPromises", "tradition", "entries", "attribute", "spellcastingEntry", "ritualsPromises", "getSpellUuidFromPack", "languageKeys", "languages", "ancestry", "ancestryFlaws", "ancestryLockedBoosts", "alternativeBoosts", "ancestryItem", "list", "spellsPromises", "spellName", "getCoreUuidFromPack", "MENU", "MENU_TYPES", "dist_exports", "type", "ENABLED_SETTING", "SHEET_MENU_CLASS", "SHEET_MENU_LOADER_CLASS", "CharacterImporterTool", "ModuleTool", "__name", "#loaded", "#sheetRenderHook", "createToggleHook", "#onRenderCharacterSheetPF2e", "value", "activate", "#loadTemplates", "renderCharacterSheets", "isGM", "enabled", "actor", "sourceOnly", "source", "model", "CharacterImport", "data", "encoded", "code", "path", "MODULE", "html", "htmlQuery", "loader", "createHTMLElement", "context", "#prepareContext", "content", "#addEventListeners", "key", "tabs", "prepareCoreTab", "prepareDetailsTab", "prepareFeatsTab", "prepareInventoryTab", "prepareSkillsTab", "prepareSpellsTab", "templates", "sheet", "$html", "levelEl", "cancelTooltip", "importTooltip", "btn", "scroll", "isTabKey", "tabKey", "nav", "tab", "addListenerAll", "el", "action", "onEntryAction", "confirmDialog", "importData", "onScroll", "_", "event", "entry", "htmlClosest", "dataString", "dropData", "itemType", "isPhysicalCategory", "item", "error", "addCoreEventListeners", "addDetailsEventListeners", "addFeatsEventListeners", "addInventoryEventListeners", "addSkillsEventListeners", "addSpellsEventListeners", "ConditionManager", "ModuleToolApplication", "__name", "#label", "#actor", "#combat", "#combatant", "#origin", "#condition", "#counter", "#duration", "#unidentified", "tool", "condition", "options", "label", "_options", "isGM", "anonLabel", "labelPlaceholder", "combatants", "dist_exports", "combatant", "origin", "_event", "target", "#createEffect", "effect", "createCustomCondition", "html", "addListenerAll", "el", "input", "value", "isUnit", "ConditionManagerTool", "ModuleTool", "__name", "#preCreateItemHook", "createToggleHook", "#onPreCreateItem", "#manageKeybind", "createToggleKeybind", "value", "item", "ConditionManager", "DroppethTool", "_DroppethTool", "ModuleTool", "__name", "#deleteTokenHook", "createToggleHook", "#onDeleteToken", "#dropCanvasDataHook", "#onDropCanvasData", "#droppethItemEmitable", "createEmitable", "#droppethItem", "#onEmbeddedDocumentChangeWrapper", "createToggleWrapper", "#actorOnEmbeddedDocumentChange", "#droppethKeybind", "createToggleKeybind", "SYSTEM", "options", "enabled", "userIsGM", "actor", "token", "uuid", "item", "lightRule", "rule", "wrapped", "isPrimaryUpdater", "onlyItem", "dist_exports", "img", "name", "tokenUpdate", "_canvas", "data", "itemIsOfType", "tradeData", "#initiateTrade", "userId", "error", "err", "scene", "owner", "folder", "tokenId", "tokenUuid", "actorSource", "mainItem", "tokenSource", "tokenDocument", "position", "positionTokenFromCoords", "createTradeMessage", "createTradeQuantityDialog", "EFFECT_SETTING", "GivethTool", "ModuleTool", "__name", "#givethEmitable", "createEmitable", "#givethEffect", "#handleDroppedItemWrapper", "createCreatureSheetWrapper", "#creatureSheetHandleDroppedItem", "#handleGiveth", "#shouldHandleEffectDrop", "effects", "userIsGM", "actor", "data", "source", "_userId", "value", "level", "context", "originItem", "isInstanceOf", "effectTraits", "t", "item", "isAllyActor", "targetActor", "originalItem", "rule", "RuleCls", "ItemCls", "itemSource", "itemUpdates", "sourceIndex", "ruleSource", "actorSheet", "wrapped", "event", "zHeroAction", "zod_exports", "zDocumentUUID", "TradeHeroAction", "_TradeHeroAction", "ModuleToolApplication", "__name", "#actions", "#others", "#resolve", "#selected", "actions", "others", "tool", "resolve", "options", "_options", "_event", "target", "action", "openDescriptionFromElement", "#trade", "html", "addListener", "el", "form", "data", "HeroActionsTool", "_HeroActionsTool", "ModuleTool", "__name", "#drawHeroActionsEmitable", "createEmitable", "#drawHeroActions", "#onSocket", "options", "#tradeRequest", "#tradeReject", "#exchangeActions", "#hooks", "createToggleWrapper", "#characterSheetRenderInner", "sharedCharacterSheetActivateListeners", "#characterSheetActivateListeners", "renderCharacterSheets", "enabled", "toggleHooksAndWrappers", "socketOn", "socketOff", "actor", "dist_exports", "data", "zHeroAction", "x", "uuid", "table", "entry", "parent", "page", "description", "triggerLabel", "actions", "usesCount", "heroPoints", "getMythicOrHeroPoints", "diff", "mustDiscard", "mustDraw", "onRender", "_event", "dialog", "html", "allInput", "htmlQuery", "actorInputs", "htmlQueryAll", "allChecked", "actorInput", "actorsChecked", "result", "waitDialog", "updates", "id", "isUnique", "actionsList", "documentUuidFromTableResult", "name", "labelfromTableResult", "addListenerAll", "el", "target", "htmlClosest", "#expandActionDescription", "selected", "tableUpdates", "key", "#createActionsMessage", "count", "uuids", "removed", "action", "resource", "points", "index", "details", "type", "flavorText", "isPrivate", "others", "other", "otherActions", "TradeHeroAction", "targetUser", "primaryPlayerOwner", "localize", "displayEmiting", "socketEmit", "sheet", "wrapped", "$html", "template", "tab", "attacks", "sheetElement", "createHTMLElement", "#onDiscardAction", "origin", "originActor", "targetActor", "originActions", "targetActions", "originAction", "targetAction", "_actor", "summary", "textElement", "enrichHTML", "toggleSummary", "_userId", "drawn", "nb", "i", "draw", "toDiscard", "discarded", "senderId", "otherId", "links", "flavor", "content", "user", "give", "want", "rows", "openDescriptionFromElement", "documentUuidFromTableResultDescription", "zIdentifiedItem", "zod_exports", "PARTIAL_SLUGH_REGEX", "EIDOLON_ICON", "COMPANION_ICON", "ACTOR_TYPE_ICONS", "IdentifyTracker", "_IdentifyTracker", "ModuleToolApplication", "__name", "#hooks", "#itemsUUIDs", "#knownItems", "#loading", "#removedFaillures", "#unlockedUUIDs", "#updates", "item", "tool", "options", "_options", "useOptions", "dist_exports", "#reset", "itemOrUUID", "itemUUID", "hadLockedItems", "elements", "element", "#onClickLocked", "event", "id", "party", "members", "characters", "actor", "spellLists", "itemGroups", "MapOfArrays", "useDelay", "worldTime", "date", "time", "getShortDateTime", "items", "ghostItems", "uuid", "allItems", "hasLockedItems", "isIdentified", "itemType", "data", "isConsumable", "scrollWandSpell", "isCastConsumable", "tradition", "itemSlug", "SYSTEM", "partialSlug", "locked", "itemClasses", "owner", "getOwnerIcon", "groupItem", "actorId", "failed", "fail", "failTime", "DateTime", "diffTime", "removeFail", "known", "flag", "identification", "entry", "zIdentifiedItem", "x", "partial", "canRecallKnowledge", "list", "getSpellList", "tooltip", "update", "canToggle", "createIdenticationTooltip", "type", "_context", "#onUpdateActor", "#onUpdateItem", "listener", "target", "action", "getItem", "itemUuid", "htmlClosest", "#identifyAll", "direction", "advanceTime", "IdentifyItemPopup", "#saveUpdates", "#selectUpdate", "html", "highlightElements", "el", "cells", "actorCells", "itemCells", "cell", "itemUpdate", "currentUpdate", "currentValue", "newValue", "newUpdate", "knownUUIDS", "selectedList", "confirmDialog", "createDialogItemList", "#setLoading", "#identifyList", "toIdentify", "updateElements", "htmlQueryAll", "identifyUpdates", "failUpdates", "addFailedUpdate", "remove", "itemActorUpdates", "itemUpdates", "elementsUpdatesPromises", "updateElement", "itemName", "actorUpdates", "updates", "actors", "itemId", "failUpdate", "toId", "actorsUpdates", "enabled", "dcs", "getItemIdentificationDCs", "skill", "dc", "name", "actorType", "traits", "traditions", "spell", "IdentifyTool", "ModuleTool", "__name", "#actorSheetHook", "createToggleHook", "#onRenderActorSheetPF2e", "#requestEmitable", "createEmitable", "#onRequestIdentify", "value", "IdentifyTracker", "item", "application", "enabled", "playerRequest", "userIsGM", "renderActorSheets", "skipNotify", "sheet", "user", "isGM", "actor", "isMerchant", "listElement", "htmlQuery", "itemsElements", "itemElement", "itemId", "subitemId", "realItemId", "htmlClosest", "realItem", "toggleElement", "createHTMLElement", "dataElement", "controlsElement", "siblingElement", "userId", "confirmDialog", "zTrackedResource", "zod_exports", "zDocumentId", "getWorldTime", "resource", "ResourceTracker", "ModuleToolApplication", "__name", "#userConnectedHook", "createToggleHook", "#setPosition", "dist_exports", "left", "top", "options", "_options", "worldResources", "allUsersResources", "getUserSetting", "usersResources", "user", "userId", "ownResources", "otherResources", "value", "resources", "data", "zTrackedResource", "resource", "generateTooltip", "frame", "windowHeader", "htmlQuery", "header", "createHTMLElement", "_context", "x", "y", "_position", "event", "target", "action", "resourceId", "htmlClosest", "#editResource", "#createResource", "#updateValue", "direction", "step", "newValue", "getWorldTime", "#resourceMenu", "isCreate", "waitDialog", "#updateResource", "changes", "min", "max", "diff", "result", "blank", "steps", "click", "localize", "ResourceTrackerTool", "ModuleTool", "__name", "#updateWorldTimeHook", "createToggleHook", "#onUpdateWorldTime", "#application", "#resources", "value", "#showApplication", "_", "userId", "#onResourceUpdate", "userIsGM", "#onGetSceneControlButtons", "#setResources", "getWorldTime", "entries", "entry", "resources", "data", "resource", "zTrackedResource", "hasTimeout", "isTimeout", "worldTime", "updated", "decrements", "show", "ResourceTracker", "controls", "tokenTools", "settingPath", "_event", "active", "ROLL_TYPES", "zUserRoll", "zod_exports", "DEGREE_OF_SUCCESS_STRINGS", "zTimedEvents", "FILTERS", "RollTracker", "ModuleToolApplication", "__name", "#combat", "#filter", "#filters", "#list", "#mode", "#modes", "#selections", "#session", "#time", "tool", "options", "encounters", "sessions", "#getTimedEventArrays", "#resetTime", "localize", "value", "modes", "checkOutcomes", "DEGREE_OF_SUCCESS_STRINGS", "x", "createRollMode", "rolls", "roll", "dist_exports", "i", "outcome", "degreeOfSuccessString", "save", "index", "skills", "half", "slugs", "slug", "_", "label", "entries", "type", "values", "labels", "userid", "_options", "mode", "list", "selected", "excludes", "user", "actors", "actor", "id", "permission", "userIndex", "selectIndex", "userActors", "actorId", "actorIndex", "stats", "modeEntries", "count", "maxCount", "valuesMax", "maxValue", "groups", "__", "j", "formatTimedEventOption", "result", "content", "scrollPosition", "htmlQuery", "event", "target", "action", "#select", "time", "date", "html", "addListenerAll", "el", "select", "input", "timestampToLocalTime", "face", "RollTrackerTool", "ModuleTool", "__name", "#application", "#hooks", "createToggleHook", "#onCreateChatMessage", "rollMessage", "#onRerollSave", "RollTracker", "value", "enabled", "toggleHooksAndWrappers", "zTimedEvents", "MODULE", "nbUsers", "user", "isGM", "#onCombatStart", "#onGetSceneControlButtons", "roll", "rolls", "values", "userid", "dist_exports", "getUserSetting", "data", "zUserRoll", "paused", "id", "sessions", "timestampToLocalTime", "time", "days", "date", "createEndOfDayDate", "hint", "result", "waitDialog", "setUserSetting", "encounters", "entries", "entryTime", "currentRolls", "combat", "controls", "tokenTools", "settingPath", "message", "_data", "userId", "die", "context", "SYSTEM", "isCheckContextFlag", "tupleHasValue", "newRoll", "target", "success", "degreeOfSuccessString", "DURATION_UNITS", "GRADES", "BANDS_OF_FORCE_SLUGS", "ShareDataTool", "ModuleTool", "__name", "#updateMasterEmitable", "createEmitable", "#updateMaster", "#slaveTurnEmitable", "#slaveTurn", "#slaveInitiativeEmitable", "#slaveInitiative", "isGM", "registerToolWrapper", "path", "callback", "registerWrapper", "registerToolOverride", "registerCreatureWrapper", "type", "sharedCharacterPrepareData", "#actorPrepareData", "sharedNpcPrepareData", "#actorUndoDamage", "#actorPrepareBaseData", "#actorPrepareDerivedData", "#actorPreUpdate", "#actorOnUpdate", "#actorOnDelete", "#combatantStartTurn", "#combatantEndTurn", "#combatantOnUpdate", "#combatResetActors", "#effectRemainingDuration", "sharedWeaponPrepareBaseData", "#weaponPrepareBaseData", "#onGetCreatureSheetPF2eHeaderButtons", "actor", "rawFlag", "flag", "dist_exports", "zShareData", "id", "masterId", "idOnly", "uuids", "slaves", "uuid", "slave", "effect", "durationData", "isExpired", "start", "combatant", "unit", "expiry", "duration", "addend", "remaining", "result", "startInitiative", "currentInitiative", "fightyActor", "atTurnStart", "master", "origin", "weapon", "#getMasterIfOption", "masterWeapon", "item", "encounter", "actors", "extras", "#isInvalidNonCombatantSlave", "#resetActors", "options", "s", "t", "token", "a", "wrapped", "changed", "operation", "userId", "isPrimaryOwner", "eventType", "#performActorUpdates", "#combatantTurn", "slaveCombatant", "#createCombatant", "activeConditions", "condition", "hookEvent", "event", "actorUpdates", "rule", "updates", "appliedDamage", "hpUpdate", "update", "spUpdates", "ChatMessageCls", "icon", "msg", "changes", "MODULE", "newData", "newMasterId", "previousMaster", "updateKeys", "#getShareOptionInMemory", "masterUpdates", "value", "actorId", "toRemove", "#removeSlaveFromMemory", "isPrimaryUpdater", "slaveId", "executeWhenReady", "data", "masterPerception", "slavePerception", "PerceptionCls", "modifiers", "modifier", "perception", "StatisticCls", "getStatisticClass", "slug", "skill", "check", "domains", "rank", "currentRank", "attribute", "actualRank", "statistic", "SYSTEM", "#createEncounterRollOptions", "participants", "c", "b", "participant", "initiativeRoll", "initiativeRank", "initiativeStatistic", "threat", "numericThreat", "entries", "wornArmor", "wornArmorIsSF2e", "isSF2eItem", "armor", "bracers", "bracerBonus", "selector", "runeType", "armorValue", "construct", "label", "modifierType", "includesAny", "sheet", "buttons", "ShareDataConfig", "option", "scene", "getFirstActiveToken", "CombatantPF2e", "shareDataTool", "BASE_SHARE_DATA", "CHARACTER_MASTER_SHARE_DATA", "CHARACTER_SHARE_DATA", "ALL_SHARE_DATA", "isValidMaster", "shareDataTool", "zShareMaster", "zForeignDocument", "zShareData", "zod_exports", "data", "disableOptions", "__name", "options", "option", "ShareDataConfig", "ModuleToolApplication", "__name", "#actor", "#data", "actor", "tool", "options", "slaves", "shareDataTool", "data", "MODULE", "actorId", "master", "masterIsCharacter", "bothCharacters", "masters", "rawOptions", "BASE_SHARE_DATA", "name", "CHARACTER_MASTER_SHARE_DATA", "CHARACTER_SHARE_DATA", "dist_exports", "character", "disabled", "_event", "target", "action", "#save", "html", "addListener", "el", "zShareMaster", "form", "createFormData", "ADJUSTMENT_TYPES", "DEGREE_OF_SUCCESS_STRINGS", "REROLL_TYPES", "VISIBILITY_TYPES", "zAdjustement", "zod_exports", "DEGREE_ADJUSTMENT_AMOUNTS", "zModifier", "zNote", "zSignificantModifier", "zTargetSaveInstance", "SAVE_TYPES", "AREA_TYPE", "TARGET_MESSAGE_TYPE", "zSaveVariant", "zod_exports", "zTargetSaveInstance", "SAVE_TYPES", "zSaveVariants", "zAppliedDamages", "zTargetsAppliedDamages", "zTokenDocumentArrayDecode", "zSafeArray", "zDocumentUUID", "uuids", "dist_exports", "uuid", "token", "SYSTEM", "zTokenDocumentArrayEncode", "zClientDocument", "tokens", "zBaseTargetsData", "zDecodeTargetsData", "zEncodeTargetsData", "zTargetsData", "encodeTargetsData", "data", "changes", "encoded", "__name", "TargetHelper", "__name", "#data", "#isGM", "#variantId", "data", "variantId", "getExtraRollOptions", "statistic", "target", "actor", "message", "getDocumentFromUUID", "id", "changes", "encodeTargetsData", "BASIC_SAVE_REGEX", "getSaveLinkData", "el", "isValidSaveLink", "dataset", "dc", "adjustment", "statisticDc", "item", "resolveActorAndItemFromHTML", "data", "splitListString", "label", "saves", "x", "joined", "__name", "onChatMessageDrop", "event", "target", "htmlClosest", "eventData", "getDragEventData", "MODULE", "messageId", "message", "isMessageOwner", "updates", "dist_exports", "saveVariant", "zSaveVariant", "key", "value", "pf2Dc", "against", "itemUuid", "pf2Check", "rollerRole", "SAVE_TYPES", "createSetTargetsBtn", "message", "targetHelper", "splash", "type", "btn", "createHTMLElement", "addSetTargetsListener", "__name", "event", "data", "targets", "otherType", "otherTargets", "dist_exports", "token", "createRollNPCSavesBtn", "addRollSavesListener", "rollSaves", "addSaveBtnListener", "realBtn", "fakeBtn", "allTargets", "target", "selected", "remainSelected", "selectTokens", "clickEvent", "REROLLS", "showGhostDiceOnPrivate", "dsn", "getActiveModule", "__name", "roll3dDice", "roll", "target", "isPrivate", "speaker", "cloneRoll", "rollSaves", "event", "message", "targetHelper", "targets", "dataSave", "extraRollOptions", "item", "user", "origin", "skipDefault", "skipDialog", "rollParams", "eventToRollParams", "updates", "filteredTargetsRollsPromise", "statistic", "resolve", "callback", "success", "rollMessage", "userId", "context", "SYSTEM", "modifiers", "dist_exports", "modifier", "rollData", "rerollSave", "actor", "targetSave", "rerolls", "isCharacter", "type", "options", "icon", "reroll", "i", "label", "result", "waitDialog", "hookOptions", "resourceKey", "resource", "oldRoll", "pwolVariant", "unevaluatedNewRoll", "proficiencyModifier", "m", "ErrorPF2e", "mythicModifierValue", "proficiencyModifierValue", "CheckRoll", "getCheckRollClass", "signedInteger", "newRoll", "keptRoll", "DegreeOfSuccess", "domains", "outcome", "DEGREE_OF_SUCCESS_STRINGS", "notes", "extractNotes", "note", "RollNotePF2e", "proficiencyIdx", "mythic", "proficiency", "SAVES_DETAILS", "addTargetsHeaders", "message", "targetHelper", "parent", "classes", "rowsWrapper", "createHTMLElement", "row", "createTargetsRows", "__name", "all", "targetGroups", "isGM", "originActor", "author", "getDocumentFromUUID", "showBreakdowns", "showSignificant", "getActiveModule", "cached", "targets", "dist_exports", "type", "target", "rowsPromise", "rowData", "getTargetRowData", "event", "emitTokenHover", "relatedTarget", "addListener", "panToToken", "addListenerAll", "el", "action", "pingToken", "rollSaves", "rerollSave", "isOriginFriendly", "showDC", "showResults", "tokenNameVisibility", "isHidden", "targetIsHidden", "isOwner", "hasPlayerOwner", "isTargetFriendly", "canSeeName", "dataSave", "headerData", "save", "icon", "label", "targetSave", "targetStatistic", "isPrivate", "canSeeResult", "canReroll", "significantList", "significantModifier", "value", "significance", "rerolled", "REROLLS", "tooltip", "saveLabel", "saveDC", "tooltipLabel", "adjustment", "adjustments", "x", "result", "tmp", "offset", "modifiers", "mods", "excluded", "modifier", "name", "significant", "tooltipData", "notes", "notesList", "RollNotePF2e", "note", "SAVE_LINK_REGEX", "prepareActionMessage", "message", "updates", "match", "link", "createHTMLElementContent", "linkData", "getSaveLinkData", "__name", "renderActionMessage", "html", "data", "msgContent", "htmlQuery", "targetHelper", "TargetHelper", "hasSave", "addTargetsHeaders", "isMessageOwner", "onChatMessageDrop", "chatCard", "footer", "exist", "label", "added", "createHTMLElement", "buttonsWrapper", "setTargetsBtn", "createSetTargetsBtn", "rollSavesBtn", "createRollNPCSavesBtn", "damageLinks", "_event", "cached", "registerUpstreamHook", "damageMessage", "EXTRA_AREA_OPTIONS", "isAreaMessage", "message", "context", "SYSTEM", "isAreaOrAutoFireType", "__name", "prepareAreaMessage", "updates", "renderAreaMessage", "html", "data", "item", "msgContent", "htmlQuery", "isValidItem", "targetHelper", "TargetHelper", "expendBtn", "createAreaExpendBtn", "buttonsWrapper", "createHTMLElement", "damageBtn", "renderSpellCardLikeMessage", "isGrenade", "nb", "expended", "iconPath", "MODULE", "totalExpend", "hasExpended", "displayedExpend", "tooltip", "btn", "isMessageOwner", "event", "ammo", "REPOST_CHECK_MESSAGE_REGEX", "PROMPT_CHECK_MESSAGE_REGEX", "prepareCheckMessage", "message", "updates", "data", "getCheckLinkData", "__name", "promptMatch", "_match", "paramString", "rawParams", "parseInlineParams", "statistic", "dc", "dist_exports", "SAVE_TYPES", "basic", "options", "splitListString", "repostMatch", "link", "createHTMLElementContent", "linkData", "getSaveLinkData", "renderCheckMessage", "html", "msgContent", "htmlQuery", "targetHelper", "TargetHelper", "isOwner", "isMessageOwner", "canRollSaves", "canObserve", "canObserveActor", "item", "flavor", "saveLabel", "firstElementWithText", "label", "traitsSetting", "anonymousTool", "baseTraits", "traits", "trait", "TRAITS_BLACKLIST", "addTargetsHeaders", "fakeBtn", "addSaveBtnListener", "setTargetsBtn", "addSetTargetsListener", "rollSavesBtn", "addRollSavesListener", "mergeToDamage", "messages", "index", "msg", "damageMessage", "isDamageMessage", "source", "THIRD_PATH_TO_PERFECTION", "LEGENDARY_SAVES", "isDamageMessage", "message", "__name", "prepareDamageMessage", "updates", "isPersistentDamageMessage", "isRegenMessage", "area", "context", "SYSTEM", "dist_exports", "saveVariants", "getSpellSaveVariants", "token", "splashRollIndex", "roll", "regularRollIndex", "modifier", "renderDamageMessage", "html", "data", "msgContent", "htmlQuery", "isOwner", "isMessageOwner", "targetHelper", "TargetHelper", "hasTargets", "hasSplashTargets", "isArea", "damageRows", "htmlQueryAll", "diceTotalElements", "wrappersParents", "hasSplashDamage", "btnWrapper", "splashWrapper", "createHTMLElement", "rows", "removeIndexFromArray", "toggleBtn", "createDamageToggleBtn", "row", "setTargetsBtn", "createSetTargetsBtn", "setSplashTargetBtn", "onChatMessageDrop", "rollSavesBtn", "createRollNPCSavesBtn", "expendBtn", "createAreaExpendBtn", "originActor", "showResults", "rowsWrapper", "smallButtons", "clonedDamageRows", "el", "clone", "actionElements", "actionElement", "action", "targetData", "createTargetsRows", "target", "type", "save", "targetActor", "applied", "i", "success", "item", "sourceId", "getItemSourceId", "getChoiceSetSelection", "addListenerAll", "event", "onDamageBtnClick", "damageRow", "btn", "multiplier", "toggleOffShieldBlock", "rollIndexStr", "htmlClosest", "rollIndex", "applyDamageFromMessage", "addend", "promptModifier", "shiftAdjustDamage", "tokens", "shieldBlockRequest", "isInstanceOf", "ErrorPF2e", "damage", "messageRollOptions", "originRollOptions", "o", "messageItem", "effectRollOptions", "allyOrEnemy", "domain", "ephemeralEffects", "extractEphemeralEffects", "contextClone", "rollOptions", "content", "AdjustmentDialog", "$html", "isHealing", "$dialog", "adjustment", "messageId", "id", "buttons", "button", "HEALINGS_REGEX", "healings", "prepareSpellMessage", "message", "updates", "saveVariants", "getSpellSaveVariants", "__name", "spell", "getMessageSpell", "dc", "dist_exports", "baseSave", "id", "system", "override", "save", "renderSpellMessage", "html", "data", "msgContent", "htmlQuery", "targetHelper", "TargetHelper", "renderSpellCardLikeMessage", "item", "saveBtnSelector", "damageBtnSelector", "addTargetsHeaders", "saveBtn", "buttonsWrapper", "createHTMLElement", "fakeSaveBtn", "addSaveBtnListener", "isMessageOwner", "setTargetsBtn", "createSetTargetsBtn", "rollSavesBtn", "createRollNPCSavesBtn", "damageBtn", "cached", "registerUpstreamHook", "damageMessage", "COLORBLIND_CLASS", "INLINE_CHECK_REGEX", "TargetHelperTool", "ModuleTool", "__name", "#updateQueue", "#debounceRefreshMessages", "refreshLatestMessages", "createEmitable", "options", "userId", "#updateMessage", "#textEditorEnrichHTMLWrapper", "createToggleWrapper", "#textEditorEnrichHTML", "#messageRenderHTMLWrapper", "sharedMessageRenderHTML", "#messageRenderHTML", "#preCreateChatMessageHook", "createToggleHook", "#onPreCreateChatMessage", "#createRegionTemplateHook", "#onCreateRegion", "value", "#onDragStart", "message", "flag", "zTokenDocumentArrayDecode", "targets", "updates", "zSaveVariants", "zTargetsData", "data", "changes", "encoded", "encodeTargetsData", "getCurrentTargets", "applied", "expended", "saves", "variantId", "_userId", "udpate", "#applyDamageUpdates", "update", "rollIndex", "targetId", "splashIndex", "targetApplied", "regularIndex", "otherTarget", "otherId", "event", "target", "dataTransfer", "saveData", "getSaveLinkData", "MODULE", "_editor", "wrapped", "args", "region", "_context", "user", "isHoldingModifierKey", "shape", "flagOrigin", "SYSTEM", "dismiss", "actor", "self", "getFirstActiveToken", "result", "waitDialog", "_event", "_btn", "dialog", "htmlQuery", "returnAndDismiss", "alliance", "opposition", "oppositeAlliance", "debug", "origin", "tokenDoc", "token", "targetActor", "targetAlliance", "lineIntersect", "messageId", "targetsIds", "uuids", "isAreaMessage", "prepareAreaMessage", "isDamageMessage", "prepareDamageMessage", "isSpellMessage", "prepareSpellMessage", "prepareCheckMessage", "isActionMessage", "prepareActionMessage", "html", "renderActionMessage", "renderAreaMessage", "renderCheckMessage", "renderDamageMessage", "renderSpellMessage", "targetHelperTool", "UnidedTool", "ModuleTool", "__name", "#preCreateItemHook", "createToggleHook", "#onPrecreateItem", "#preUpdateItemHook", "#onPreUpdateItem", "value", "item", "data", "TOOLS", "actionable", "anonymousTool", "ArpTool", "AutoCoverTool", "BetterChatTool", "BetterSheetTool", "BetterEffectsPanelTool", "BetterInventoryTool", "betterMerchantTool", "BetterMovementTool", "BetterToolTool", "BetterTradeTool", "CharacterImporterTool", "ConditionManagerTool", "DroppethTool", "GivethTool", "HeroActionsTool", "IdentifyTool", "ResourceTrackerTool", "RollTrackerTool", "UnidedTool", "shareDataTool", "targetHelperTool", "MODULE", "tool", "isGM", "userIsGM", "registerModuleKeybinds", "dist_exports", "schemas", "registerModuleSettings", "context", "setting", "getSetting"] }