@flesh-and-blood/search 5.0.4 → 5.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/filters.js CHANGED
@@ -5,7 +5,6 @@ import {
5
5
  Release,
6
6
  Treatment,
7
7
  Type,
8
- setIdentifierToSetMappings,
9
8
  setToSetIdentifierMappings
10
9
  } from "@flesh-and-blood/types";
11
10
  import { getAbbreviation } from "./abbreviations.js";
@@ -13,6 +12,10 @@ import { getExcludedMetaFilters, getMetaFilters } from "./metaFilters.js";
13
12
  import { multiWordShorthands, singleWordShorthands } from "./shorthands.js";
14
13
  import { PUNCTUATION } from "./constants.js";
15
14
  import { getTextWithoutMarkup } from "./helpers.js";
15
+ import {
16
+ getLookupWithoutInheritedKeys,
17
+ releasesBySetIdentifier
18
+ } from "./lookups.js";
16
19
  import {
17
20
  getCardsByName,
18
21
  getCardsReferencedBy,
@@ -275,7 +278,7 @@ const filtersToCardPropertyMappings = {
275
278
  x: typeTextFilter,
276
279
  year: yearFilter
277
280
  };
278
- const filtersToCardPropertyMappingsByKey = filtersToCardPropertyMappings;
281
+ const filtersToCardPropertyMappingsByKey = getLookupWithoutInheritedKeys(filtersToCardPropertyMappings);
279
282
  const punctuationOverrides = [
280
283
  {
281
284
  text: Release.ClassicBattlesRhinarDorinthea.toLowerCase(),
@@ -597,7 +600,7 @@ const getMatchingReleasesFromRawValue = (rawValue, additionalSets = []) => {
597
600
  releases.push(setFromValue);
598
601
  }
599
602
  if (releases.length === 0) {
600
- const setFromSetIdentifier = setIdentifierToSetMappings[rawValue];
603
+ const setFromSetIdentifier = releasesBySetIdentifier[rawValue];
601
604
  if (setFromSetIdentifier) {
602
605
  releases.push(setFromSetIdentifier);
603
606
  }
@@ -620,20 +623,21 @@ const getMatchingReleasesFromRawValue = (rawValue, additionalSets = []) => {
620
623
  }
621
624
  return releases;
622
625
  };
623
- const pitchValuesMapping = {
626
+ const pitchValuesMapping = getLookupWithoutInheritedKeys({
624
627
  purple: 4,
625
628
  blue: 3,
626
629
  yellow: 2,
627
630
  red: 1,
628
631
  white: 0
629
- };
632
+ });
630
633
  const getPitchValuesFromText = (rawValues) => {
631
634
  const values = [];
632
635
  for (const rawValue of rawValues) {
633
- if (pitchValuesMapping[rawValue] || pitchValuesMapping[rawValue] === 0) {
634
- values.push(pitchValuesMapping[rawValue].toString());
635
- } else {
636
+ const pitchValue = pitchValuesMapping[rawValue];
637
+ if (pitchValue === void 0) {
636
638
  values.push(rawValue);
639
+ } else {
640
+ values.push(pitchValue.toString());
637
641
  }
638
642
  }
639
643
  return values;
@@ -647,22 +651,20 @@ const getTodayAsReleaseDate = () => {
647
651
  const dayOfMonth = `${now.getDate()}`.padStart(2, "0");
648
652
  return `${now.getFullYear()}-${month}-${dayOfMonth}`;
649
653
  };
650
- const metaValuesMapping = {
654
+ const metaValuesMapping = getLookupWithoutInheritedKeys({
651
655
  dual: Meta.DualClass,
652
656
  exp: Meta.Expansion,
653
657
  expansion: Meta.Expansion,
654
- expansionSlot: Meta.Expansion,
655
658
  rainbow: Meta.Rainbow,
656
659
  reprint: Meta.Reprint,
657
660
  reprints: Meta.Reprint
658
- };
661
+ });
659
662
  const getMetaValuesFromText = (rawValues) => {
660
663
  const values = [];
661
664
  for (const rawValue of rawValues) {
662
- if (metaValuesMapping[rawValue]) {
663
- values.push(metaValuesMapping[rawValue]);
664
- } else if (Meta[rawValue]) {
665
- values.push(Meta[rawValue]);
665
+ const meta = metaValuesMapping[rawValue];
666
+ if (meta) {
667
+ values.push(meta);
666
668
  }
667
669
  }
668
670
  if (rawValues.length > 0 && values.length === 0) {
@@ -677,7 +679,7 @@ const getMetaValuesFromText = (rawValues) => {
677
679
  }
678
680
  return values;
679
681
  };
680
- const foilingValuesMapping = {
682
+ const foilingValuesMapping = getLookupWithoutInheritedKeys({
681
683
  r: Foiling.Rainbow,
682
684
  rf: Foiling.Rainbow,
683
685
  rainbow: Foiling.Rainbow,
@@ -687,7 +689,7 @@ const foilingValuesMapping = {
687
689
  g: Foiling.Gold,
688
690
  gf: Foiling.Gold,
689
691
  gold: Foiling.Gold
690
- };
692
+ });
691
693
  const getFoilingValuesFromText = (rawValues) => {
692
694
  const values = [];
693
695
  for (const rawValue of rawValues) {
@@ -697,7 +699,7 @@ const getFoilingValuesFromText = (rawValues) => {
697
699
  }
698
700
  return values;
699
701
  };
700
- const treatmentValuesMapping = {
702
+ const treatmentValuesMapping = getLookupWithoutInheritedKeys({
701
703
  ...Object.values(Treatment).reduce(
702
704
  (treatmentsByLowercasedName, treatment) => {
703
705
  treatmentsByLowercasedName[treatment.toLowerCase()] = treatment;
@@ -722,8 +724,8 @@ const treatmentValuesMapping = {
722
724
  full: Treatment.FA,
723
725
  "full art": Treatment.FA
724
726
  }
725
- };
726
- const treatmentsByAbbreviation = Treatment;
727
+ });
728
+ const treatmentsByAbbreviation = getLookupWithoutInheritedKeys(Treatment);
727
729
  const getTreatmentValuesFromText = (rawValues) => {
728
730
  const values = [];
729
731
  for (const rawValue of rawValues) {
@@ -737,7 +739,7 @@ const getTreatmentValuesFromText = (rawValues) => {
737
739
  }
738
740
  return values;
739
741
  };
740
- const RARITY_VALUES_MAPPING = {
742
+ const RARITY_VALUES_MAPPING = getLookupWithoutInheritedKeys({
741
743
  b: Rarity.Basic,
742
744
  c: Rarity.Common,
743
745
  f: Rarity.Fabled,
@@ -748,7 +750,7 @@ const RARITY_VALUES_MAPPING = {
748
750
  s: Rarity.SuperRare,
749
751
  t: Rarity.Token,
750
752
  v: Rarity.Marvel
751
- };
753
+ });
752
754
  const getRarityValuesFromText = (rawValues) => {
753
755
  const values = [];
754
756
  for (const rawValue of rawValues) {
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var Cr=Object.create;var te=Object.defineProperty;var mr=Object.getOwnPropertyDescriptor;var br=Object.getOwnPropertyNames;var Tr=Object.getPrototypeOf,Mr=Object.prototype.hasOwnProperty;var Fr=(e,r)=>{for(var t in r)te(e,t,{get:r[t],enumerable:!0})},Ee=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of br(r))!Mr.call(e,i)&&i!==t&&te(e,i,{get:()=>r[i],enumerable:!(a=mr(r,i))||a.enumerable});return e};var vr=(e,r,t)=>(t=e!=null?Cr(Tr(e)):{},Ee(r||!e||!e.__esModule?te(t,"default",{value:e,enumerable:!0}):t,e)),Ar=e=>Ee(te({},"__esModule",{value:!0}),e);var Rt={};Fr(Rt,{FilterProperty:()=>Q,MARKUP:()=>he,NO_CARD_PROPERTY:()=>U,PUNCTUATION:()=>b,RARITY_VALUES_MAPPING:()=>Ie,abbreviations:()=>Ce,availableExclusions:()=>cr,availableModifiers:()=>dr,default:()=>yr,filterCard:()=>hr,filtersToCardPropertyMappings:()=>pr,getAbbreviation:()=>ae,getAbbreviationByCard:()=>xr,getCardsByName:()=>le,getCardsByReferencedCardIdentifier:()=>wt,getCardsReferencedBy:()=>ce,getCardsReferencing:()=>de,getCatalogueIndex:()=>ve,getCleanText:()=>$,getExcludedMetaFilters:()=>be,getKeywordsAndAppliedFiltersFromText:()=>Be,getMetaFilters:()=>me,getNormalizedText:()=>X,getOtherPitches:()=>Pt,getReferencedCards:()=>St,getTextWithoutMarkup:()=>J,getTokensReferencedByCards:()=>kt,multiWordShorthands:()=>Me,shorthands:()=>Te,singleWordShorthands:()=>Fe});module.exports=Ar(Rt);var ge=require("@flesh-and-blood/types"),Ne=vr(require("fuse.js"),1);var b=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g,he=/\*/g;var d=require("@flesh-and-blood/types");var ae=e=>Ce.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),xr=e=>Ce.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),Ce=[{abbreviations:["10k"],card:"10,000 Year Reunion"},{abbreviations:["Pajamas","PJs"],card:"Alluvion Constellas"},{abbreviations:["Slippy","Arakni Slipped Through the Cracks","Arakni, Slipped Through the Cracks"],card:"Arakni, 5L!p3d 7hRu 7h3 cR4X"},{abbreviations:["Dullcap"],card:"Arcanite Skullcap"},{abbreviations:["ALS"],card:"Arc Light Sentinel"},{abbreviations:["AoW"],card:"Art of War"},{abbreviations:["BBD"],card:"Barraging Beatdown"},{abbreviations:["BBS"],card:"Big Blue Sky"},{abbreviations:["Starvo"],card:"Bravo, Star of the Show"},{abbreviations:["BEB"],card:"Bull's Eye Bracers"},{abbreviations:["BLW"],card:"Be Like Water"},{abbreviations:["BoJ"],card:"Balance of Justice"},{abbreviations:["BOHH"],card:"Blood on Her Hands"},{abbreviations:["BRB"],card:"Bloodrush Bellow"},{abbreviations:["Breezies"],card:"Breeze Rider Boots"},{abbreviations:["BTA"],card:"Burn Them All"},{abbreviations:["CStrike","C-Strike","C Strike"],card:"Celestial Cataclysm"},{abbreviations:["CBelly"],card:"Cerebellum Processor"},{abbreviations:["CLF"],card:"Channel Lake Frigid"},{abbreviations:["CLV"],card:"Channel Lightning Valley"},{abbreviations:["CMH"],card:"Channel Mount Heroic"},{abbreviations:["CMI"],card:"Channel Mount Isen"},{abbreviations:["CMT"],card:"Channel the Millennium Tree"},{abbreviations:["CnC","C&C"],card:"Command and Conquer"},{abbreviations:["Sea and Sea"],card:"Conqueror of the High Seas"},{abbreviations:["CYB"],card:"Count Your Blessings"},{abbreviations:["Cat","Kitty"],card:"Crouching Tiger"},{abbreviations:["CoD"],card:"Crown of Dominion"},{abbreviations:["CoP"],card:"Crown of Providence"},{abbreviations:["CtW"],card:"Crush the Weak"},{abbreviations:["DD"],card:"Death Dealer"},{abbreviations:["DnD"],card:"Devotion Never Dies"},{abbreviations:["DIO"],card:"Dash I/O"},{abbreviations:["EBTT"],card:"Even Bigger Than That!"},{abbreviations:["NewNigma"],card:"Enigma, New Moon"},{abbreviations:["EPot","E Pot"],card:"Energy Potion"},{abbreviations:["EStrike","E-Strike","E Strike"],card:"Enlightened Strike"},{abbreviations:["FFS"],card:"Fyendal's Fighting Spirit"},{abbreviations:["FoN"],card:"Force of Nature"},{abbreviations:["Frosty","\u{1F976}","\u{1F9CA}","\u2744\uFE0F"],card:"Frostbite"},{abbreviations:["Yum yum"],card:"Fruits of the Forest"},{abbreviations:["GnT"],card:"Give and Take"},{abbreviations:["Habibi"],card:"Hanabi Blaster"},{abbreviations:["HMH"],card:"Hope Merchant's Hood"},{abbreviations:["HoI"],card:"Heart of Ice"},{abbreviations:["Pumpkin"],card:"Jack-o'-lantern"},{abbreviations:["RKO","Cheato"],card:"Kayo, Underhanded Cheat"},{abbreviations:["KKBB"],card:"Knick Knack Bric-a-brac"},{abbreviations:["BStrike"],card:"Levels of Enlightenment"},{abbreviations:["LAG","Twominaris"],card:"Luminaris, Angel's Glow"},{abbreviations:["LCF","Newminaris"],card:"Luminaris, Celestial Fury"},{abbreviations:["LDE"],card:"Last Ditch Effort"},{abbreviations:["LtC"],card:"Lead the Charge"},{abbreviations:["LNW"],card:"Leave No Witnesses"},{abbreviations:["LFaL","L4aL"],card:"Life for a Life"},{abbreviations:["LiT"],card:"Lost in Thought"},{abbreviations:["MMB"],card:"Mage Master Boots"},{abbreviations:["MaxV"],card:"Maximum Velocity"},{abbreviations:["MoM"],card:"Mask of Momentum"},{abbreviations:["MoPL"],card:"Mask of the Pouncing Lynx"},{abbreviations:["MnG"],card:"Meat and Greet"},{abbreviations:["Cake","\u{1F382}"],card:"Ninth Blade of the Blood Oath"},{abbreviations:["PoM"],card:"Peace of Mind"},{abbreviations:["P-Bone"],card:"Performance Bonus"},{abbreviations:["PF","\u{1F525}"],card:"Phoenix Flame"},{abbreviations:["PtW"],card:"Poison the Well"},{abbreviations:["Thanos","Infinity Gauntlet"],card:"Polarity Reversal Script"},{abbreviations:["DPot","D Pot"],card:"Potion of D\xE9j\xE0 Vu"},{abbreviations:["Ponder Run"],card:"Premeditate"},{abbreviations:["Qi Unbound"],card:"Qi Unleashed"},{abbreviations:["RitL"],card:"Red in the Ledger"},{abbreviations:["Cats","Ghost cat","Ghost cats"],card:"Restless Coalescence"},{abbreviations:["Eugene"],card:"Rhinar, Reckless Rampage",isHidden:!0},{abbreviations:["SSGB"],card:"Sandscour Greatbow"},{abbreviations:["SSP"],card:"Sand Sketched Plan"},{abbreviations:["SFaS","S4aS"],card:"Scar for a Scar"},{abbreviations:["Tyler"],card:"Scurv, Stowaway",isHidden:!0},{abbreviations:["SWOMB"],card:"Shifting Winds of the Mystic Beast"},{abbreviations:["Snaps"],card:"Snapdragon Scalers"},{abbreviations:["SWK"],card:"Spinning Wheel Kick"},{abbreviations:["SFTL"],card:"Swing Fist, Think Later"},{abbreviations:["TTT"],card:"Take the Tempo"},{abbreviations:["Ultron"],card:"Teklovossen, the Mechropotent"},{abbreviations:["ToS"],card:"Test of Strength"},{abbreviations:["TAYG"],card:"That All You Got?"},{abbreviations:["TROM"],card:"This Round's on Me"},{abbreviations:["3oak"],card:"Three of a Kind"},{abbreviations:["Pox Malone","Post Malone"],card:"Virulent Touch"},{abbreviations:["Cast Homes"],card:"Visit Goldmane Estate"},{abbreviations:["Frosty Hammer"],card:"Winter's Wail"},{abbreviations:["Wreckless Wing"],card:"War Cry of Bellona"},{abbreviations:["ZTS"],card:"Zero to Sixty"}];var k=require("@flesh-and-blood/types");var Q={BannedFormats:"bannedFormats",LegalFormats:"legalFormats",LegalHeroes:"legalHeroes"},ne=Array.from(Array(50).keys()).map(e=>`${e}`),Pr=[{format:k.Format.ClassicConstructed,nicknames:["cc","classic"]},{format:k.Format.LivingLegend,nicknames:["cc ll","classic constructed ll","ll cc","ll","living legend"]},{format:k.Format.SilverAge,nicknames:["sage"]},{format:k.Format.GoldenAge,nicknames:["gage"]},{format:k.Format.UltimatePitFight,nicknames:["upf"]}],Sr=Object.values(k.Format).map(e=>{let r=Pr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(b,"");return r?{...r,format:t}:{format:t}}),wr=[{hero:k.Hero.DataDoll,nicknames:["data","datadoll"]},{hero:k.Hero.Dorinthea,nicknames:["dori"]},{hero:k.Hero.Genis,nicknames:["genis"]},{hero:k.Hero.GravyBones,nicknames:["gravy"]},{hero:k.Hero.Iyslander,nicknames:["islander"]}],kr=Object.values(k.Hero).map(e=>{let r=wr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(b,"");return r?{...r,hero:t}:{hero:t}}),ie=["common","rare","super rare","majestic","legendary","fabled"],Rr=(e,r,t,a)=>{let i=[];if(!r)i.push(...e);else for(let s of e)switch(r){case">=":{let o=!1;for(let n of ie)o?i.push(n):n===s&&(o=!0,i.push(n));break}case">":{let o=!1;for(let n of ie)o?i.push(n):n===s&&(o=!0);break}case"<=":{let o=!1;for(let n of ie.slice().reverse())o?i.push(n):n===s&&(o=!0,i.push(n));break}case"<":{let o=!1;for(let n of ie.slice().reverse())o?i.push(n):n===s&&(o=!0);break}default:break}return{filterToPropertyMapping:{nestedProperty:"rarity",property:"printings",isArray:!0},isExcluded:t,isOptional:a,isOr:!0,values:i}},De=(e,r,t,a,i)=>{let s=a.map(p=>({hero:p.toLowerCase().replaceAll(b,"")})),o=[],n=[],c=[];for(let p of e){let f=Sr.find(({format:T,nicknames:M})=>T===p||!!M&&M.includes(p));if(f)n.push(f.format);else{let T=kr.find(({hero:M,nicknames:L})=>M===p||!!L&&L.includes(p))||s.find(({hero:M})=>M===p);T&&c.push(T.hero)}}let F=i||"legalFormats";return n.length>0&&o.push({filterToPropertyMapping:{property:F,isArray:!0},values:n,isOr:!0,isExcluded:r,isOptional:t}),c.length>0&&o.push({filterToPropertyMapping:{property:Q.LegalHeroes,isArray:!0},values:c,isOr:!0,isExcluded:r,isOptional:t}),o},Ir=(e,r,t,a)=>De(e,r,t,a,"bannedFormats"),me=(e,r,t,a,i,s)=>{let o=[];return Nr(t)?o.push(...De(a,e,r,s)):Dr(t)?o.push(...Ir(a,e,r,s)):Hr(t)&&o.push(Rr(a,i,e,r)),o},Y=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:ne},{filterToPropertyMapping:{property:"specialCost",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]}],G=[{filterToPropertyMapping:{property:"defense",isNumber:!0},isExcluded:!0,values:ne},{filterToPropertyMapping:{property:"specialDefense",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["hero","placeholder","token","weapon"]}],se=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:ne},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],_=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:ne},{filterToPropertyMapping:{property:"specialPower",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token"]}],oe=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(k.Talent).map(e=>e.toLowerCase())}],Br={"!co":Y,"-co":Y,"!cost":Y,"-cost":Y,"!color":Y,"-color":Y,"!b":G,"-b":G,"!block":G,"-block":G,"!d":G,"-d":G,"!def":G,"-def":G,"!defense":G,"-defense":G,"!pitch":se,"-pitch":se,"!p":se,"-p":se,"!attack":_,"-attack":_,"!power":_,"-power":_,"!pwr":_,"-pwr":_,"!pow":_,"-pow":_,"!talents":oe,"-talents":oe,"!tal":oe,"-tal":oe},be=e=>{let r=[],t=Br[e];return t&&r.push(...t),r},Lr=["l","legal","hero"],Nr=e=>Lr.includes(e),Er=["banned"],Dr=e=>Er.includes(e),Or=["r","rarity"],Hr=e=>Or.includes(e);var D=require("@flesh-and-blood/types"),Te=[{description:"Attack actions",expanded:["st:attack"],filters:{subtypes:[D.Subtype.Attack]},isCardProperty:!1,shorthands:["AA"]},{description:"Arcane barrier",expanded:['k:"arcane barrier"'],filters:{keywords:[D.Keyword.ArcaneBarrier]},isCardProperty:!1,shorthands:["AB"]},{description:"Attack reactions",expanded:['t:"attack reaction"'],filters:{types:[D.Type.AttackReaction]},isCardProperty:!1,shorthands:["AR"]},{description:"Defense reactions",expanded:['t:"defense reaction"'],filters:{types:[D.Type.DefenseReaction]},isCardProperty:!1,shorthands:["DR"]},{description:"Gain life",expanded:["gain {h}"],filters:{functionalText:"gain {h}"},isCardProperty:!1,shorthands:["Gain life","Gains life"]},{description:"Go again",expanded:['k:"go again"'],filters:{keywords:[D.Keyword.GoAgain]},isCardProperty:!1,shorthands:["GA"]},{description:"Non-attack actions",expanded:["t:action","st:non-attack"],filters:{subtypes:[D.Subtype.NonAttack],types:[D.Type.Action]},isCardProperty:!1,shorthands:["NAA"]},{description:"Plus defense",expanded:["+ {d}"],filters:{functionalText:"+ {d}"},isCardProperty:!1,shorthands:["Pump defense","Pumps defense","Buff defense","Buffs defense"]},{description:"Spellvoid",expanded:['k:"spellvoid"'],filters:{keywords:[D.Keyword.Spellvoid]},isCardProperty:!1,shorthands:["SV"]}],Me=Te.filter(({shorthands:e})=>e.some(r=>r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)})),Fe=Te.filter(({shorthands:e})=>e.some(r=>!r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>!r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)}));var $=e=>X(e.toLowerCase().trim().replace(b,"")),X=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,""),J=e=>e.replace(he,"");var q=require("@flesh-and-blood/types");var Oe=new WeakMap,j=Object.freeze([]),Vr=Number.MAX_SAFE_INTEGER,He=(e,r)=>{let t=new Map;for(let a of e)for(let i of r(a)||[]){let s=t.get(i);s?s.push(a):t.set(i,[a])}return t},Gr=e=>{let r=new Map;for(let t of e){let a=t.types.includes(q.Type.Hero)&&!t.isCardBack,i=a?q.CardRole.Hero:(0,q.getCardRole)(t);if(a||i!==q.CardRole.Hero){let o=r.get(i);o?o.push(t):r.set(i,[t])}}return r},Wr=e=>{let r,t,a,i,s,o=()=>{if(!r){let l=new Map,g=new Map,u=[],y=new Map,m=0;for(let R of e){l.set(R.cardIdentifier,R),g.set(R.cardIdentifier,m),m++;let A=$(R.name),B=y.get(A);B?B.push(R):(y.set(A,[R]),u.push(A))}r={cardByCardIdentifier:l,corpusPositionByCardIdentifier:g,cleanedNames:u,pitchCycleByCleanedName:y}}return r},n=l=>{let{corpusPositionByCardIdentifier:g}=o(),u=({cardIdentifier:y})=>g.get(y)??Vr;return[...l].sort((y,m)=>u(y)-u(m))},c=l=>o().cardByCardIdentifier.get(l),F=l=>{let{cardByCardIdentifier:g}=o(),u=[];for(let y of l||[]){let m=g.get(y);m&&u.push(m)}return n(u)},p=l=>{let g=new Map;return u=>{let y=g.get(u);if(!y){let m=c(u),R=F(m&&l(m)),A=R.length>0;y=A?R:j,A&&g.set(u,y)}return y}},f=l=>{let{pitchCycleByCleanedName:g}=o(),u=c(l);return u?g.get($(u.name))??j:j},T=l=>{let{cleanedNames:g,pitchCycleByCleanedName:u}=o(),y=$(l),m=u.get(y);if(!m&&y.length>0){let A=g.find(B=>B.includes(y));A&&(m=u.get(A))}return m??j},M=l=>{let{pitchCycleByCleanedName:g}=o();return g.get($(l))??j},L=()=>{if(!s){let l=new Set;for(let g of e)for(let u of g.artists)l.add(u);s=[...l].sort((g,u)=>g.localeCompare(u,"en",{sensitivity:"base"}))}return s},O=p(({oppositeSideCardIdentifiers:l})=>l),W=p(({referencedCards:l})=>l),P=l=>(t||(t=He(e,({referencedCards:g})=>g)),t.get(l)??j),S=p(({createdExtras:l})=>l);return{cards:e,getCard:c,getPitchCycle:f,getCardsByName:T,getCardsByExactName:M,getArtists:L,getOppositeSide:O,getReferences:W,getReferencedBy:P,getCreates:S,getCreatedBy:l=>(a||(a=He(e,({createdExtras:g})=>g)),a.get(l)??j),getCreatedClosure:l=>{let g=new Map,u=new Set,y=[...l];for(let m of y)if(!u.has(m)){u.add(m);for(let A of S(m))g.set(A.cardIdentifier,A),y.push(A.cardIdentifier)}return n([...g.values()])},getByRole:l=>(i||(i=Gr(e)),i.get(l)??j),getCardsInCorpusOrder:n}},ve=e=>{let r=Oe.get(e);return r||(r=Wr(e),Oe.set(e,r)),r},Ae=(e,r)=>e.getPitchCycle(r.cardIdentifier),le=(e,r)=>e.getCardsByName(r),Ve=(e,r)=>{let t=new Map;for(let a of r)for(let i of Ae(e,a))t.set(i.cardIdentifier,i);return e.getCardsInCorpusOrder([...t.values()])},de=(e,r)=>{let t=[];for(let a of Ae(e,r))t.push(...e.getReferencedBy(a.cardIdentifier));return Ve(e,t)},ce=(e,r)=>{let t=[];for(let a of Ae(e,r))t.push(...e.getReferences(a.cardIdentifier));return Ve(e,t)};var dr=[">=",">","<=","<"],cr=["!","-"],U="n/a",Ur={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},xe={property:"artists",isArray:!0,partialMatch:!0},Ge={property:U,isMeta:!0},We={property:"bonds",isArray:!0},Kr={property:"cardIdentifier",isString:!0,isNormalized:!0},Ue=(e,{isAnd:r,isExcluded:t,isOptional:a,modifier:i})=>({filterToPropertyMapping:Kr,values:[...e],valuesSet:e,isAnd:r,isOr:!0,modifier:i,isExcluded:t,isOptional:a}),_r={property:U},Ke={property:"classes",isArray:!0,partialMatch:!0},_e={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},Z={property:"defense",specialProperty:"specialDefense",isNumber:!0},je={property:"flows",isArray:!0},ze={nestedProperty:"foiling",property:"printings",isArray:!0},qe={property:"fusions",isArray:!0},Ye={property:"intellect",isNumber:!0},$e={property:"keywords",isArray:!0},Pe={property:U,isMeta:!0},Je={property:"life",specialProperty:"specialLife",isNumber:!0},Re={property:"meta",isArray:!0},Qe={property:"name",isString:!0,partialMatch:!0},Se={property:"pitch",isNumber:!0},Xe={property:"firstReleaseDate",isDate:!0},pe={property:"power",specialProperty:"specialPower",isNumber:!0},jr={property:"setIdentifiers",isArray:!0,partialMatch:!0},Ze={property:U,isMeta:!0},zr={property:U},qr={property:U},er={property:"sets",isArray:!0,partialMatch:!0},we={property:"shorthands",isArray:!0,partialMatch:!0},ue={property:"specializations",isArray:!0,partialMatch:!0},rr={property:"subtypes",isArray:!0},tr={property:"types",isArray:!0},ar={property:"talents",isArray:!0},Yr={property:"functionalText",hasMarkup:!0,isString:!0,partialMatch:!0},$r={property:"traits",isArray:!0,partialMatch:!0},Jr={property:"typeText",isString:!0,partialMatch:!0},fe={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},Qr={property:"firstReleaseDate",isString:!0,partialMatch:!0},pr={arcane:Ur,a:xe,artist:xe,art:xe,attack:pe,b:Z,block:Z,banned:Ge,bond:We,bonds:We,c:Ke,class:Ke,chain:_r,co:_e,cost:_e,color:Se,d:Z,def:Z,defense:Z,flow:je,flows:je,f:qe,fusion:qe,foil:ze,foiling:ze,i:Ye,intellect:Ye,is:Re,k:$e,keyword:$e,l:Pe,legal:Pe,hero:Pe,li:Je,life:Je,meta:Re,n:Qe,name:Qe,p:Se,pitch:Se,pwr:pe,pow:pe,power:pe,print:jr,r:Ze,rarity:Ze,referencedby:zr,references:qr,rf:Ge,s:er,set:er,short:we,shorthand:we,shorthands:we,sp:ue,spec:ue,specialization:ue,specializations:ue,st:rr,subtype:rr,t:tr,type:tr,tal:ar,talent:ar,text:Yr,trait:$r,treat:fe,treatment:fe,var:fe,variation:fe,x:Jr,year:Qr},ur=pr,Xr=[{text:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(b,"")}],Zr=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:s}of Xr)t.includes(i)&&(t=t.replace(i,s));if(ae(t)?.card)r.push(t);else{let i=t.split(/[ ]+/),s="",o=0;for(let n of i)o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0),o<2&&n.split('"').length===2?(s+=" "+n,o++):o===0&&s===""?r.push(n):o===1&&(s+=" "+n);o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0)}return r},et=20,Be=(e,r,t=[],a=[],i=nt())=>{let s=e.trim().toLowerCase();for(let{expanded:P,shorthands:S}of Me)for(let h of S)if(s.includes(h)){s=s.replace(h,P.join(" "));break}for(let[P,S]of Object.entries(d.setToSetIdentifierMappings))s.includes(P.toLowerCase())&&(s=s.replace(P.toLowerCase(),S[0]));let o=Zr(s),n=[];for(let P of o){let S=Fe.find(({shorthands:h})=>h.includes(P));S&&!S.isCardProperty?n.push(...S.expanded):n.push(P)}let c=[],F=[],p=[],f=[],T=!1,M=[],L=[],O=[],W=[];for(let P of n)if(ht(P)){let[S,h]=P.split(":"),{modifier:E,values:C,isAnd:l,isOr:g}=gt(h),{filterKey:u,isExcluded:y,isOptional:m,isMeta:R}=yt(S),A=!1;if(R){if(["rarity","r"].includes(u)){let B=ft(C);y||(L=[...B]),C=B.map(x=>x.toLowerCase())}["legal","l","hero"].includes(u),c.push(...me(y,m,u,C,E,t))}else{if(["chain"].includes(u)){let x=new Set,I=[],H=new Set,V=w=>{x.add(w.cardIdentifier),H.has(w.name)||(H.add(w.name),I.push(w))},z=w=>{w.types.includes(d.Type.Hero)||V(w)};for(let w of C)if(w)for(let N of le(r,w))V(N);let K=0;for(let w of I){if(K>et)break;for(let ye of ce(r,w))z(ye);if(K===0)for(let ye of de(r,w))z(ye);K++}c.push(Ue(x,{isAnd:l,isExcluded:y,isOptional:m,modifier:E})),A=!0}else if(["referencedby","references"].includes(u)){let x=["referencedby"].includes(u),I=new Set;for(let H of C)if(H)for(let V of le(r,H)){let z=x?ce(r,V):de(r,V);for(let K of z)I.add(K.cardIdentifier)}c.push(Ue(I,{isAnd:l,isExcluded:y,isOptional:m,modifier:E})),A=!0}else if(["art","artist"].includes(u))F=C;else if(["print","prints","printing","printings"].includes(u))M=C;else if(["is","meta"].includes(u)){let x=[],I=[],H=[],V=[];for(let N of C)it.includes(N)?x.push(N):st.includes(N)?I.push(N):ot.includes(N)?H.push(N):V.push(N);x.length>0&&(c.push({filterToPropertyMapping:Re,values:[d.Meta.Reprint.toLowerCase().replaceAll(b,"")],isAnd:l,isOr:g,isExcluded:!y,isOptional:m}),A=V.length===0);let z=I.length>0;z&&c.push({filterToPropertyMapping:Xe,values:[i],isAnd:l,isOr:g,isExcluded:y,isOptional:m});let K=H.length>0;K&&c.push({filterToPropertyMapping:Xe,values:[i],isAnd:l,isOr:g,isExcluded:!y,isOptional:m}),(z||K)&&(A=V.length===0);let w=lt(V);C=w.map(N=>N.toLowerCase().replaceAll(b,"")),w.includes(d.Meta.Expansion)&&!y&&(T=!0)}else["foiling","foil"].includes(u)?(f=dt(C),C=f.map(x=>x.toLowerCase())):["treat","treatment","var","variation"].includes(u)?(W=ut(C),C=W.map(x=>x.toLowerCase())):["set","s"].includes(u)?(O=rt(C,a),C=O.map(x=>x.toLowerCase().replaceAll(b,""))):["pitch","p","color"].includes(u)&&(C=at(C));let B=ur[u];B&&!A&&c.push({filterToPropertyMapping:B,values:B.hasMarkup?C.map(x=>J(x)):C,isAnd:l,isOr:g,modifier:E,isExcluded:y,isOptional:m})}}else if(P){let S=ae(P)?.card,h=be(P);S?p.push(`"${S.toLowerCase().replace(b,"")}"`):h&&h.length>0?c.push(...h):p.push(P.replace(b,""))}return{appliedFilters:c,attributes:{artists:F,foilings:f,isExpansionSlot:T,prints:M,rarities:L,releases:O,treatments:W},keywords:p}},rt=(e,r=[])=>{let t=[];for(let a of e)t.push(...tt(a,r));return t},tt=(e,r=[])=>{let t=[],a=Object.values(d.Release).find(i=>i.toLowerCase().replaceAll(b,"")===e);if(a&&t.push(a),t.length===0){let i=d.setIdentifierToSetMappings[e];i&&t.push(i)}if(t.length===0){let i=Object.values(d.Release).filter(s=>s.toLowerCase().includes(e));i.length>0&&t.push(...i)}if(t.length===0){let i=r.find(s=>s.toLowerCase().replaceAll(b,"")===e);i&&t.push(i)}return t},ke={purple:4,blue:3,yellow:2,red:1,white:0},at=e=>{let r=[];for(let t of e)ke[t]||ke[t]===0?r.push(ke[t].toString()):r.push(t);return r},it=["unique"],st=["preview","spoiler","unreleased"],ot=["released"],nt=()=>{let e=new Date,r=`${e.getMonth()+1}`.padStart(2,"0"),t=`${e.getDate()}`.padStart(2,"0");return`${e.getFullYear()}-${r}-${t}`},ir={dual:d.Meta.DualClass,exp:d.Meta.Expansion,expansion:d.Meta.Expansion,expansionSlot:d.Meta.Expansion,rainbow:d.Meta.Rainbow,reprint:d.Meta.Reprint,reprints:d.Meta.Reprint},lt=e=>{let r=[];for(let t of e)ir[t]?r.push(ir[t]):d.Meta[t]&&r.push(d.Meta[t]);if(e.length>0&&r.length===0){for(let t of Object.values(d.Meta))for(let a of e)if(t.toLowerCase().includes(a)){r.push(t);break}}return r},sr={r:d.Foiling.Rainbow,rf:d.Foiling.Rainbow,rainbow:d.Foiling.Rainbow,c:d.Foiling.Cold,cf:d.Foiling.Cold,cold:d.Foiling.Cold,g:d.Foiling.Gold,gf:d.Foiling.Gold,gold:d.Foiling.Gold},dt=e=>{let r=[];for(let t of e)sr[t]&&r.push(sr[t]);return r},ct={...Object.values(d.Treatment).reduce((e,r)=>(e[r.toLowerCase()]=r,e),{}),aa:d.Treatment.AA,alt:d.Treatment.AA,"alt art":d.Treatment.AA,ab:d.Treatment.AB,"alt border":d.Treatment.AB,at:d.Treatment.AT,"alt text":d.Treatment.AT,ea:d.Treatment.EA,extended:d.Treatment.EA,"extended art":d.Treatment.EA,fa:d.Treatment.FA,full:d.Treatment.FA,"full art":d.Treatment.FA},pt=d.Treatment,ut=e=>{let r=[];for(let t of e){let a=ct[t],i=pt[t.toUpperCase()];a?r.push(a):i&&r.push(i)}return r},Ie={b:d.Rarity.Basic,c:d.Rarity.Common,f:d.Rarity.Fabled,l:d.Rarity.Legendary,m:d.Rarity.Majestic,p:d.Rarity.Promo,r:d.Rarity.Rare,s:d.Rarity.SuperRare,t:d.Rarity.Token,v:d.Rarity.Marvel},ft=e=>{let r=[];for(let t of e)Ie[t]?r.push(Ie[t]):r.push(t);return r},gt=e=>{let r=[],t,a,i=dr.find(s=>e.includes(s));if(i){let[,s]=e.split(i);or(s)?(t=!0,r.push(...s.trim().split("+").map(o=>o.replace(b,"")))):nr(s)?(a=!0,r.push(...s.trim().split(",").map(o=>o.replace(b,"")))):r.push(s.trim().replace(b,""))}else or(e)?(t=!0,r.push(...e.trim().split("+").map(s=>s.replace(b,"")))):nr(e)?(a=!0,r.push(...e.trim().split(",").map(s=>s.replace(b,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(b,"")):r.push(e.trim().replace(b,""));return{modifier:i,values:r,isAnd:t,isOr:a}},yt=e=>{let r=Ct(e);if(r){let[,t]=e.split(r);return{filterKey:t,isExcluded:!0,isOptional:!1,isMeta:lr(t)}}else return{filterKey:e,isExcluded:!1,isOptional:!1,isMeta:lr(e)}},ht=e=>e.indexOf(":")>=0,or=e=>e.indexOf("+")>=0,nr=e=>e.indexOf(",")>=0,lr=e=>!!ur[e]?.isMeta,Ct=e=>cr.find(r=>e.includes(r))?.slice(0,1);var v=require("@flesh-and-blood/types"),fr={artists:["Hoodwill"],cardIdentifier:"fangs-a-lot-blue",classes:[v.Class.Generic],defaultImage:"FNG000",firstReleaseDate:"2022-06-02",functionalText:"If Fangs A Lot is put into your banished zone from your graveyard, instead put it into your hand.",legalFormats:[],legalHeroes:[v.Hero.Kayo,v.Hero.Levia,v.Hero.Rhinar],printings:[{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000",print:"FNG000",rarity:v.Rarity.Rare,set:v.Release.Promos},{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000_Marvel",print:`FNG000-${v.Treatment.FA}`,rarity:v.Rarity.Marvel,set:v.Release.Promos,treatment:v.Treatment.FA}],name:"Fangs A Lot",rarities:[v.Rarity.Rare,v.Rarity.Marvel],rarity:v.Rarity.Rare,sets:[v.Release.Promos],setIdentifiers:["FNG000"],specialImage:"FNG000_Marvel",subtypes:[v.Subtype.Attack],types:[v.Type.Action],typeText:"Generic Action - Attack"},gr=[{keyword:fr.name.toLowerCase(),card:fr}];var mt={getFn:(e,r)=>{let t=Ne.default.config.getFn(e,r),a=t;if(Array.isArray(t))a=t.map(i=>X(i.replace(b,"")));else if(t){let i=X(t).replace(b,"");a=r.includes("functionalText")?J(i):i}return a},ignoreLocation:!0,includeScore:!0,keys:[{name:"name",weight:10},{name:"functionalText",weight:6},{name:"shorthands",weight:4},{name:"setIdentifiers",weight:2},{name:"traits",weight:4},{name:"typeText",weight:6}],threshold:.15,useExtendedSearch:!0},Le=class{constructor(r,t=[],a=[],i=!1){this.getFuse=()=>(this.fuse||(this.fuse=new Ne.default(this.cards,mt)),this.fuse);this.log=(r,...t)=>{this.debug&&console.log(r,...t)};this.search=(r,t)=>{let a,{appliedFilters:i,attributes:s,keywords:o}=Be(r,this.index,this.additionalHeroes,this.additionalSets),n=o.join(" "),c=t?gr.filter(h=>h.keyword===n):[];if(c.length>0?a=c.map(({card:h})=>h):o.length?a=this.getFuse().search(n).map(h=>h.item):a=[...this.cards],i.length&&(a=a.filter(h=>h&&hr(h,i))),o.length===0){let h="";if(s.releases.length===1)try{let l=s.releases[0];h=ge.setToSetIdentifierMappings[l][0].toUpperCase()}catch(l){console.error("Error getting set identifier from search",l)}if(!h&&s.prints.length===1)try{let l=s.prints[0];ge.setIdentifierToSetMappings[l]&&(h=l.toUpperCase())}catch(l){console.error("Error getting set identifier from search",l)}h?a.sort((l,g)=>{let u=l.setIdentifiers.find(m=>m.includes(h))?.replace(h,""),y=g.setIdentifiers.find(m=>m.includes(h))?.replace(h,"");return u&&y?u.localeCompare(y):-1}):a.sort((l,g)=>l.name===g.name?`${l.pitch}`.localeCompare(`${g.pitch}`):l.name.localeCompare(g.name))}else{let h=[],E=[],C=o.map(l=>l.toLowerCase().replace(b,"")).join(" ");for(let l of a)l.name.toLowerCase().replace(b,"")===C?h.push(l):E.push(l);a=[...h,...E]}let F=[],{artists:p,isExpansionSlot:f,foilings:T,prints:M,rarities:L,releases:O,treatments:W}=s;(p.length>0||f||T.length>0||M.length>0||L.length>0||O.length>0||W.length>0)&&(F=a.map(h=>{let E=h.printings.filter(C=>{let l=!!C.image,g=p.length===0||p.some(I=>C.artists.find(H=>H.replace(b,"").toLowerCase().includes(I))),u=!f||f===C.isExpansionSlot,y=T.length===0||!!C.foiling&&T.includes(C.foiling),m=M.length===0||M.some(I=>C.identifier.includes(I.toUpperCase())),R=L.length===0||L.includes(C.rarity),A=O.length===0||O.includes(C.set),B=W.length===0||C.treatments?.some(I=>W.includes(I));return l&&g&&u&&y&&m&&R&&A&&B});return{...h,matchingPrintings:E}}));let S=F.length>0?F:a;return{appliedFilters:i,attributes:s,keywords:o,searchResults:S}};let s=Array.isArray(t)?{additionalHeroes:t,additionalSets:a,debug:i}:t;this.additionalHeroes=s.additionalHeroes||[],this.additionalSets=s.additionalSets||[],this.cards=[...r],this.debug=s.debug||!1,this.index=s.index||ve(r)}},yr=Le,hr=(e,r)=>{let t=!0,a=!1;for(let i of r){let s=i.isOptional,{isNumber:o,isString:n,isArray:c,isBoolean:F,isDate:p}=i.filterToPropertyMapping;if(o){let f=bt(e,i);s?f&&(a=!0):t=t&&f}else if(n){let f=Tt(e,i);s?f&&(a=!0):t=t&&f}else if(c){let f=Mt(e,i,r);s?f&&(a=!0):t=t&&f}else if(F){let f=Ft(e,i);s?f&&(a=!0):t=t&&f}else if(p){let f=vt(e,i);s?f&&(a=!0):t=t&&f}}return t},bt=(e,r)=>{if(re(r,e)){let{values:t,modifier:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=ee(e,r);if(o!=null&&!isNaN(o))if(o=parseInt(o),a)switch(a){case">=":{let n=t?.some(c=>o>=parseInt(c));return i?!n:n}case">":{let n=t?.some(c=>o>parseInt(c));return i?!n:n}case"<=":{let n=t?.some(c=>o<=parseInt(c));return i?!n:n}case"<":{let n=t?.some(c=>o<parseInt(c));return i?!n:n}default:return!1}else{let n=t?.some(c=>o===parseInt(c));return i?!n:n}else{let n=xt(e,r)?.toLowerCase(),c=s?t?.some(F=>n?.includes(F)):t?.some(F=>n===F);return i?!c:c}}else return!0},Tt=(e,r)=>{if(re(r,e)){let{values:t,valuesSet:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{hasMarkup:o,isNormalized:n,partialMatch:c}}=r,F=ee(e,r),p=n?F:F?.replaceAll(b,"").toLowerCase(),f=o&&p?J(p):p;if(c){let T=i?t?.every(M=>f?.includes(M)):t?.some(M=>f?.includes(M));return s?!T:T}else{let T;return i?T=t?.every(M=>f===M):a?T=a.has(f):T=t?.some(M=>f===M),s?!T:T}}else return!0},Mt=(e,r,t)=>{if(re(r,e)){let{values:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{partialMatch:o}}=r,n=At(e,r,t).map(c=>c?.replaceAll(b,""));if(o){let c=i?a.every(p=>n?.some(f=>f?.toLowerCase().includes(p))):a.some(p=>n?.some(f=>f?.toLowerCase().includes(p))),F=n.length===0;return s?!c||F:c}else{let c=i?a.every(F=>n?.some(p=>p?.toLowerCase()===F)):a.some(F=>n?.some(p=>p?.toLowerCase()===F));return s?!c:c}}else return!0},Ft=(e,r)=>{if(re(r,e)){let{isExcluded:t}=r,a=ee(e,r);return t?!a:a}else return!0},vt=(e,r)=>{if(re(r,e)){let{values:t,isExcluded:a}=r,i=ee(e,r),s=t?.some(o=>i>o);return a?!s:s}else return!0},ee=(e,r)=>{let{filterToPropertyMapping:{property:t}}=r,a;return t!==U&&(a=e[t]),a},At=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i}}=r,s=[],o=Object.keys(e.legalOverrides||{}).length>0,n=r.filterToPropertyMapping.property===Q.LegalHeroes,c=t.find(({filterToPropertyMapping:p})=>p.property===Q.LegalFormats);if(o&&n&&!!c){let p=new Set;for(let{format:f,heroes:T}of e.legalOverrides||[])if(c.values.includes(f.toLowerCase()))for(let M of T)p.add(M);s=Array.from(p)}if(s.length===0)if(i){let p=new Set;for(let f of e.printings){let T=f[i];if(a){if(Array.isArray(T))for(let M of T)p.add(M)}else T&&typeof T=="string"&&p.add(T)}s=Array.from(p)}else{let p=ee(e,r);if(Array.isArray(p))for(let f of p)typeof f=="string"&&s.push(f)}return s},xt=(e,r)=>{let{filterToPropertyMapping:{specialProperty:t}}=r,a;return t&&(a=e[t]),a},re=({cardTypes:e},{types:r,subtypes:t})=>!e||e?.some(a=>r.map(i=>i.toLowerCase()).includes(a.toLowerCase())||t.map(i=>i.toLowerCase()).includes(a.toLowerCase()));var Pt=(e,r)=>{let t=[];if(e)for(let a of r){let i=a.name===e.name,s=a.cardIdentifier!==e.cardIdentifier,o=a.pitch!==e.pitch;i&&s&&o&&t.push(a)}return t},St=(e,r)=>{let t=new Set(e?.referencedCards),a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a},wt=e=>{let r=new Map;for(let t of e)for(let a of t.referencedCards||[]){let i=r.get(a);i?i.push(t):r.set(a,[t])}return r},kt=(e,r)=>{let t=new Set;for(let i of e)for(let s of i.createdExtras||[])t.add(s);let a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a};0&&(module.exports={FilterProperty,MARKUP,NO_CARD_PROPERTY,PUNCTUATION,RARITY_VALUES_MAPPING,abbreviations,availableExclusions,availableModifiers,filterCard,filtersToCardPropertyMappings,getAbbreviation,getAbbreviationByCard,getCardsByName,getCardsByReferencedCardIdentifier,getCardsReferencedBy,getCardsReferencing,getCatalogueIndex,getCleanText,getExcludedMetaFilters,getKeywordsAndAppliedFiltersFromText,getMetaFilters,getNormalizedText,getOtherPitches,getReferencedCards,getTextWithoutMarkup,getTokensReferencedByCards,multiWordShorthands,shorthands,singleWordShorthands});
1
+ "use strict";var mr=Object.create;var ae=Object.defineProperty;var br=Object.getOwnPropertyDescriptor;var Tr=Object.getOwnPropertyNames;var Mr=Object.getPrototypeOf,Fr=Object.prototype.hasOwnProperty;var vr=(e,r)=>{for(var t in r)ae(e,t,{get:r[t],enumerable:!0})},De=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Tr(r))!Fr.call(e,i)&&i!==t&&ae(e,i,{get:()=>r[i],enumerable:!(a=br(r,i))||a.enumerable});return e};var Ar=(e,r,t)=>(t=e!=null?mr(Mr(e)):{},De(r||!e||!e.__esModule?ae(t,"default",{value:e,enumerable:!0}):t,e)),xr=e=>De(ae({},"__esModule",{value:!0}),e);var Lt={};vr(Lt,{FilterProperty:()=>X,MARKUP:()=>me,NO_CARD_PROPERTY:()=>K,PUNCTUATION:()=>b,RARITY_VALUES_MAPPING:()=>Be,abbreviations:()=>be,availableExclusions:()=>pr,availableModifiers:()=>cr,default:()=>hr,filterCard:()=>Cr,filtersToCardPropertyMappings:()=>ur,getAbbreviation:()=>ie,getAbbreviationByCard:()=>Pr,getCardsByName:()=>pe,getCardsByReferencedCardIdentifier:()=>It,getCardsReferencedBy:()=>fe,getCardsReferencing:()=>ue,getCatalogueIndex:()=>xe,getCleanText:()=>J,getExcludedMetaFilters:()=>Me,getKeywordsAndAppliedFiltersFromText:()=>Le,getMetaFilters:()=>Te,getNormalizedText:()=>Z,getOtherPitches:()=>kt,getReferencedCards:()=>Rt,getTextWithoutMarkup:()=>Q,getTokensReferencedByCards:()=>Bt,multiWordShorthands:()=>ve,shorthands:()=>Fe,singleWordShorthands:()=>Ae});module.exports=xr(Lt);var Ee=Ar(require("fuse.js"),1);var b=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g,me=/\*/g;var d=require("@flesh-and-blood/types");var ie=e=>be.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),Pr=e=>be.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),be=[{abbreviations:["10k"],card:"10,000 Year Reunion"},{abbreviations:["Pajamas","PJs"],card:"Alluvion Constellas"},{abbreviations:["Slippy","Arakni Slipped Through the Cracks","Arakni, Slipped Through the Cracks"],card:"Arakni, 5L!p3d 7hRu 7h3 cR4X"},{abbreviations:["Dullcap"],card:"Arcanite Skullcap"},{abbreviations:["ALS"],card:"Arc Light Sentinel"},{abbreviations:["AoW"],card:"Art of War"},{abbreviations:["BBD"],card:"Barraging Beatdown"},{abbreviations:["BBS"],card:"Big Blue Sky"},{abbreviations:["Starvo"],card:"Bravo, Star of the Show"},{abbreviations:["BEB"],card:"Bull's Eye Bracers"},{abbreviations:["BLW"],card:"Be Like Water"},{abbreviations:["BoJ"],card:"Balance of Justice"},{abbreviations:["BOHH"],card:"Blood on Her Hands"},{abbreviations:["BRB"],card:"Bloodrush Bellow"},{abbreviations:["Breezies"],card:"Breeze Rider Boots"},{abbreviations:["BTA"],card:"Burn Them All"},{abbreviations:["CStrike","C-Strike","C Strike"],card:"Celestial Cataclysm"},{abbreviations:["CBelly"],card:"Cerebellum Processor"},{abbreviations:["CLF"],card:"Channel Lake Frigid"},{abbreviations:["CLV"],card:"Channel Lightning Valley"},{abbreviations:["CMH"],card:"Channel Mount Heroic"},{abbreviations:["CMI"],card:"Channel Mount Isen"},{abbreviations:["CMT"],card:"Channel the Millennium Tree"},{abbreviations:["CnC","C&C"],card:"Command and Conquer"},{abbreviations:["Sea and Sea"],card:"Conqueror of the High Seas"},{abbreviations:["CYB"],card:"Count Your Blessings"},{abbreviations:["Cat","Kitty"],card:"Crouching Tiger"},{abbreviations:["CoD"],card:"Crown of Dominion"},{abbreviations:["CoP"],card:"Crown of Providence"},{abbreviations:["CtW"],card:"Crush the Weak"},{abbreviations:["DD"],card:"Death Dealer"},{abbreviations:["DnD"],card:"Devotion Never Dies"},{abbreviations:["DIO"],card:"Dash I/O"},{abbreviations:["EBTT"],card:"Even Bigger Than That!"},{abbreviations:["NewNigma"],card:"Enigma, New Moon"},{abbreviations:["EPot","E Pot"],card:"Energy Potion"},{abbreviations:["EStrike","E-Strike","E Strike"],card:"Enlightened Strike"},{abbreviations:["FFS"],card:"Fyendal's Fighting Spirit"},{abbreviations:["FoN"],card:"Force of Nature"},{abbreviations:["Frosty","\u{1F976}","\u{1F9CA}","\u2744\uFE0F"],card:"Frostbite"},{abbreviations:["Yum yum"],card:"Fruits of the Forest"},{abbreviations:["GnT"],card:"Give and Take"},{abbreviations:["Habibi"],card:"Hanabi Blaster"},{abbreviations:["HMH"],card:"Hope Merchant's Hood"},{abbreviations:["HoI"],card:"Heart of Ice"},{abbreviations:["Pumpkin"],card:"Jack-o'-lantern"},{abbreviations:["RKO","Cheato"],card:"Kayo, Underhanded Cheat"},{abbreviations:["KKBB"],card:"Knick Knack Bric-a-brac"},{abbreviations:["BStrike"],card:"Levels of Enlightenment"},{abbreviations:["LAG","Twominaris"],card:"Luminaris, Angel's Glow"},{abbreviations:["LCF","Newminaris"],card:"Luminaris, Celestial Fury"},{abbreviations:["LDE"],card:"Last Ditch Effort"},{abbreviations:["LtC"],card:"Lead the Charge"},{abbreviations:["LNW"],card:"Leave No Witnesses"},{abbreviations:["LFaL","L4aL"],card:"Life for a Life"},{abbreviations:["LiT"],card:"Lost in Thought"},{abbreviations:["MMB"],card:"Mage Master Boots"},{abbreviations:["MaxV"],card:"Maximum Velocity"},{abbreviations:["MoM"],card:"Mask of Momentum"},{abbreviations:["MoPL"],card:"Mask of the Pouncing Lynx"},{abbreviations:["MnG"],card:"Meat and Greet"},{abbreviations:["Cake","\u{1F382}"],card:"Ninth Blade of the Blood Oath"},{abbreviations:["PoM"],card:"Peace of Mind"},{abbreviations:["P-Bone"],card:"Performance Bonus"},{abbreviations:["PF","\u{1F525}"],card:"Phoenix Flame"},{abbreviations:["PtW"],card:"Poison the Well"},{abbreviations:["Thanos","Infinity Gauntlet"],card:"Polarity Reversal Script"},{abbreviations:["DPot","D Pot"],card:"Potion of D\xE9j\xE0 Vu"},{abbreviations:["Ponder Run"],card:"Premeditate"},{abbreviations:["Qi Unbound"],card:"Qi Unleashed"},{abbreviations:["RitL"],card:"Red in the Ledger"},{abbreviations:["Cats","Ghost cat","Ghost cats"],card:"Restless Coalescence"},{abbreviations:["Eugene"],card:"Rhinar, Reckless Rampage",isHidden:!0},{abbreviations:["SSGB"],card:"Sandscour Greatbow"},{abbreviations:["SSP"],card:"Sand Sketched Plan"},{abbreviations:["SFaS","S4aS"],card:"Scar for a Scar"},{abbreviations:["Tyler"],card:"Scurv, Stowaway",isHidden:!0},{abbreviations:["SWOMB"],card:"Shifting Winds of the Mystic Beast"},{abbreviations:["Snaps"],card:"Snapdragon Scalers"},{abbreviations:["SWK"],card:"Spinning Wheel Kick"},{abbreviations:["SFTL"],card:"Swing Fist, Think Later"},{abbreviations:["TTT"],card:"Take the Tempo"},{abbreviations:["Ultron"],card:"Teklovossen, the Mechropotent"},{abbreviations:["ToS"],card:"Test of Strength"},{abbreviations:["TAYG"],card:"That All You Got?"},{abbreviations:["TROM"],card:"This Round's on Me"},{abbreviations:["3oak"],card:"Three of a Kind"},{abbreviations:["Pox Malone","Post Malone"],card:"Virulent Touch"},{abbreviations:["Cast Homes"],card:"Visit Goldmane Estate"},{abbreviations:["Frosty Hammer"],card:"Winter's Wail"},{abbreviations:["Wreckless Wing"],card:"War Cry of Bellona"},{abbreviations:["ZTS"],card:"Zero to Sixty"}];var k=require("@flesh-and-blood/types");var se=require("@flesh-and-blood/types"),E=e=>Object.assign(Object.create(null),e),oe=E(se.setIdentifierToSetMappings),Oe=E(se.setToSetIdentifierMappings);var X={BannedFormats:"bannedFormats",LegalFormats:"legalFormats",LegalHeroes:"legalHeroes"},ce=Array.from(Array(50).keys()).map(e=>`${e}`),Sr=[{format:k.Format.ClassicConstructed,nicknames:["cc","classic"]},{format:k.Format.LivingLegend,nicknames:["cc ll","classic constructed ll","ll cc","ll","living legend"]},{format:k.Format.SilverAge,nicknames:["sage"]},{format:k.Format.GoldenAge,nicknames:["gage"]},{format:k.Format.UltimatePitFight,nicknames:["upf"]}],wr=Object.values(k.Format).map(e=>{let r=Sr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(b,"");return r?{...r,format:t}:{format:t}}),kr=[{hero:k.Hero.DataDoll,nicknames:["data","datadoll"]},{hero:k.Hero.Dorinthea,nicknames:["dori"]},{hero:k.Hero.Genis,nicknames:["genis"]},{hero:k.Hero.GravyBones,nicknames:["gravy"]},{hero:k.Hero.Iyslander,nicknames:["islander"]}],Rr=Object.values(k.Hero).map(e=>{let r=kr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(b,"");return r?{...r,hero:t}:{hero:t}}),ne=["common","rare","super rare","majestic","legendary","fabled"],Ir=(e,r,t,a)=>{let i=[];if(!r)i.push(...e);else for(let s of e)switch(r){case">=":{let o=!1;for(let n of ne)o?i.push(n):n===s&&(o=!0,i.push(n));break}case">":{let o=!1;for(let n of ne)o?i.push(n):n===s&&(o=!0);break}case"<=":{let o=!1;for(let n of ne.slice().reverse())o?i.push(n):n===s&&(o=!0,i.push(n));break}case"<":{let o=!1;for(let n of ne.slice().reverse())o?i.push(n):n===s&&(o=!0);break}default:break}return{filterToPropertyMapping:{nestedProperty:"rarity",property:"printings",isArray:!0},isExcluded:t,isOptional:a,isOr:!0,values:i}},He=(e,r,t,a,i)=>{let s=a.map(p=>({hero:p.toLowerCase().replaceAll(b,"")})),o=[],n=[],c=[];for(let p of e){let f=wr.find(({format:T,nicknames:M})=>T===p||!!M&&M.includes(p));if(f)n.push(f.format);else{let T=Rr.find(({hero:M,nicknames:L})=>M===p||!!L&&L.includes(p))||s.find(({hero:M})=>M===p);T&&c.push(T.hero)}}let F=i||"legalFormats";return n.length>0&&o.push({filterToPropertyMapping:{property:F,isArray:!0},values:n,isOr:!0,isExcluded:r,isOptional:t}),c.length>0&&o.push({filterToPropertyMapping:{property:X.LegalHeroes,isArray:!0},values:c,isOr:!0,isExcluded:r,isOptional:t}),o},Br=(e,r,t,a)=>He(e,r,t,a,"bannedFormats"),Te=(e,r,t,a,i,s)=>{let o=[];return Er(t)?o.push(...He(a,e,r,s)):Or(t)?o.push(...Br(a,e,r,s)):Vr(t)&&o.push(Ir(a,i,e,r)),o},$=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:ce},{filterToPropertyMapping:{property:"specialCost",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]}],W=[{filterToPropertyMapping:{property:"defense",isNumber:!0},isExcluded:!0,values:ce},{filterToPropertyMapping:{property:"specialDefense",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["hero","placeholder","token","weapon"]}],le=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:ce},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],_=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:ce},{filterToPropertyMapping:{property:"specialPower",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token"]}],de=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(k.Talent).map(e=>e.toLowerCase())}],Lr=E({"!co":$,"-co":$,"!cost":$,"-cost":$,"!color":$,"-color":$,"!b":W,"-b":W,"!block":W,"-block":W,"!d":W,"-d":W,"!def":W,"-def":W,"!defense":W,"-defense":W,"!pitch":le,"-pitch":le,"!p":le,"-p":le,"!attack":_,"-attack":_,"!power":_,"-power":_,"!pwr":_,"-pwr":_,"!pow":_,"-pow":_,"!talents":de,"-talents":de,"!tal":de,"-tal":de}),Me=e=>{let r=[],t=Lr[e];return t&&r.push(...t),r},Nr=["l","legal","hero"],Er=e=>Nr.includes(e),Dr=["banned"],Or=e=>Dr.includes(e),Hr=["r","rarity"],Vr=e=>Hr.includes(e);var O=require("@flesh-and-blood/types"),Fe=[{description:"Attack actions",expanded:["st:attack"],filters:{subtypes:[O.Subtype.Attack]},isCardProperty:!1,shorthands:["AA"]},{description:"Arcane barrier",expanded:['k:"arcane barrier"'],filters:{keywords:[O.Keyword.ArcaneBarrier]},isCardProperty:!1,shorthands:["AB"]},{description:"Attack reactions",expanded:['t:"attack reaction"'],filters:{types:[O.Type.AttackReaction]},isCardProperty:!1,shorthands:["AR"]},{description:"Defense reactions",expanded:['t:"defense reaction"'],filters:{types:[O.Type.DefenseReaction]},isCardProperty:!1,shorthands:["DR"]},{description:"Gain life",expanded:["gain {h}"],filters:{functionalText:"gain {h}"},isCardProperty:!1,shorthands:["Gain life","Gains life"]},{description:"Go again",expanded:['k:"go again"'],filters:{keywords:[O.Keyword.GoAgain]},isCardProperty:!1,shorthands:["GA"]},{description:"Non-attack actions",expanded:["t:action","st:non-attack"],filters:{subtypes:[O.Subtype.NonAttack],types:[O.Type.Action]},isCardProperty:!1,shorthands:["NAA"]},{description:"Plus defense",expanded:["+ {d}"],filters:{functionalText:"+ {d}"},isCardProperty:!1,shorthands:["Pump defense","Pumps defense","Buff defense","Buffs defense"]},{description:"Spellvoid",expanded:['k:"spellvoid"'],filters:{keywords:[O.Keyword.Spellvoid]},isCardProperty:!1,shorthands:["SV"]}],ve=Fe.filter(({shorthands:e})=>e.some(r=>r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)})),Ae=Fe.filter(({shorthands:e})=>e.some(r=>!r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>!r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)}));var J=e=>Z(e.toLowerCase().trim().replace(b,"")),Z=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,""),Q=e=>e.replace(me,"");var Y=require("@flesh-and-blood/types");var Ve=new WeakMap,z=Object.freeze([]),Gr=Number.MAX_SAFE_INTEGER,Ge=(e,r)=>{let t=new Map;for(let a of e)for(let i of r(a)||[]){let s=t.get(i);s?s.push(a):t.set(i,[a])}return t},Wr=e=>{let r=new Map;for(let t of e){let a=t.types.includes(Y.Type.Hero)&&!t.isCardBack,i=a?Y.CardRole.Hero:(0,Y.getCardRole)(t);if(a||i!==Y.CardRole.Hero){let o=r.get(i);o?o.push(t):r.set(i,[t])}}return r},Ur=e=>{let r,t,a,i,s,o=()=>{if(!r){let l=new Map,g=new Map,u=[],y=new Map,m=0;for(let R of e){l.set(R.cardIdentifier,R),g.set(R.cardIdentifier,m),m++;let A=J(R.name),B=y.get(A);B?B.push(R):(y.set(A,[R]),u.push(A))}r={cardByCardIdentifier:l,corpusPositionByCardIdentifier:g,cleanedNames:u,pitchCycleByCleanedName:y}}return r},n=l=>{let{corpusPositionByCardIdentifier:g}=o(),u=({cardIdentifier:y})=>g.get(y)??Gr;return[...l].sort((y,m)=>u(y)-u(m))},c=l=>o().cardByCardIdentifier.get(l),F=l=>{let{cardByCardIdentifier:g}=o(),u=[];for(let y of l||[]){let m=g.get(y);m&&u.push(m)}return n(u)},p=l=>{let g=new Map;return u=>{let y=g.get(u);if(!y){let m=c(u),R=F(m&&l(m)),A=R.length>0;y=A?R:z,A&&g.set(u,y)}return y}},f=l=>{let{pitchCycleByCleanedName:g}=o(),u=c(l);return u?g.get(J(u.name))??z:z},T=l=>{let{cleanedNames:g,pitchCycleByCleanedName:u}=o(),y=J(l),m=u.get(y);if(!m&&y.length>0){let A=g.find(B=>B.includes(y));A&&(m=u.get(A))}return m??z},M=l=>{let{pitchCycleByCleanedName:g}=o();return g.get(J(l))??z},L=()=>{if(!s){let l=new Set;for(let g of e)for(let u of g.artists)l.add(u);s=[...l].sort((g,u)=>g.localeCompare(u,"en",{sensitivity:"base"}))}return s},H=p(({oppositeSideCardIdentifiers:l})=>l),U=p(({referencedCards:l})=>l),P=l=>(t||(t=Ge(e,({referencedCards:g})=>g)),t.get(l)??z),S=p(({createdExtras:l})=>l);return{cards:e,getCard:c,getPitchCycle:f,getCardsByName:T,getCardsByExactName:M,getArtists:L,getOppositeSide:H,getReferences:U,getReferencedBy:P,getCreates:S,getCreatedBy:l=>(a||(a=Ge(e,({createdExtras:g})=>g)),a.get(l)??z),getCreatedClosure:l=>{let g=new Map,u=new Set,y=[...l];for(let m of y)if(!u.has(m)){u.add(m);for(let A of S(m))g.set(A.cardIdentifier,A),y.push(A.cardIdentifier)}return n([...g.values()])},getByRole:l=>(i||(i=Wr(e)),i.get(l)??z),getCardsInCorpusOrder:n}},xe=e=>{let r=Ve.get(e);return r||(r=Ur(e),Ve.set(e,r)),r},Pe=(e,r)=>e.getPitchCycle(r.cardIdentifier),pe=(e,r)=>e.getCardsByName(r),We=(e,r)=>{let t=new Map;for(let a of r)for(let i of Pe(e,a))t.set(i.cardIdentifier,i);return e.getCardsInCorpusOrder([...t.values()])},ue=(e,r)=>{let t=[];for(let a of Pe(e,r))t.push(...e.getReferencedBy(a.cardIdentifier));return We(e,t)},fe=(e,r)=>{let t=[];for(let a of Pe(e,r))t.push(...e.getReferences(a.cardIdentifier));return We(e,t)};var cr=[">=",">","<=","<"],pr=["!","-"],K="n/a",Kr={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},Se={property:"artists",isArray:!0,partialMatch:!0},Ue={property:K,isMeta:!0},Ke={property:"bonds",isArray:!0},jr={property:"cardIdentifier",isString:!0,isNormalized:!0},je=(e,{isAnd:r,isExcluded:t,isOptional:a,modifier:i})=>({filterToPropertyMapping:jr,values:[...e],valuesSet:e,isAnd:r,isOr:!0,modifier:i,isExcluded:t,isOptional:a}),_r={property:K},_e={property:"classes",isArray:!0,partialMatch:!0},ze={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},ee={property:"defense",specialProperty:"specialDefense",isNumber:!0},qe={property:"flows",isArray:!0},Ye={nestedProperty:"foiling",property:"printings",isArray:!0},$e={property:"fusions",isArray:!0},Je={property:"intellect",isNumber:!0},Qe={property:"keywords",isArray:!0},we={property:K,isMeta:!0},Xe={property:"life",specialProperty:"specialLife",isNumber:!0},Ie={property:"meta",isArray:!0},Ze={property:"name",isString:!0,partialMatch:!0},ke={property:"pitch",isNumber:!0},er={property:"firstReleaseDate",isDate:!0},ge={property:"power",specialProperty:"specialPower",isNumber:!0},zr={property:"setIdentifiers",isArray:!0,partialMatch:!0},rr={property:K,isMeta:!0},qr={property:K},Yr={property:K},tr={property:"sets",isArray:!0,partialMatch:!0},Re={property:"shorthands",isArray:!0,partialMatch:!0},ye={property:"specializations",isArray:!0,partialMatch:!0},ar={property:"subtypes",isArray:!0},ir={property:"types",isArray:!0},sr={property:"talents",isArray:!0},$r={property:"functionalText",hasMarkup:!0,isString:!0,partialMatch:!0},Jr={property:"traits",isArray:!0,partialMatch:!0},Qr={property:"typeText",isString:!0,partialMatch:!0},he={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},Xr={property:"firstReleaseDate",isString:!0,partialMatch:!0},ur={arcane:Kr,a:Se,artist:Se,art:Se,attack:ge,b:ee,block:ee,banned:Ue,bond:Ke,bonds:Ke,c:_e,class:_e,chain:_r,co:ze,cost:ze,color:ke,d:ee,def:ee,defense:ee,flow:qe,flows:qe,f:$e,fusion:$e,foil:Ye,foiling:Ye,i:Je,intellect:Je,is:Ie,k:Qe,keyword:Qe,l:we,legal:we,hero:we,li:Xe,life:Xe,meta:Ie,n:Ze,name:Ze,p:ke,pitch:ke,pwr:ge,pow:ge,power:ge,print:zr,r:rr,rarity:rr,referencedby:qr,references:Yr,rf:Ue,s:tr,set:tr,short:Re,shorthand:Re,shorthands:Re,sp:ye,spec:ye,specialization:ye,specializations:ye,st:ar,subtype:ar,t:ir,type:ir,tal:sr,talent:sr,text:$r,trait:Jr,treat:he,treatment:he,var:he,variation:he,x:Qr,year:Xr},fr=E(ur),Zr=[{text:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(b,"")}],et=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:s}of Zr)t.includes(i)&&(t=t.replace(i,s));if(ie(t)?.card)r.push(t);else{let i=t.split(/[ ]+/),s="",o=0;for(let n of i)o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0),o<2&&n.split('"').length===2?(s+=" "+n,o++):o===0&&s===""?r.push(n):o===1&&(s+=" "+n);o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0)}return r},rt=20,Le=(e,r,t=[],a=[],i=dt())=>{let s=e.trim().toLowerCase();for(let{expanded:P,shorthands:S}of ve)for(let h of S)if(s.includes(h)){s=s.replace(h,P.join(" "));break}for(let[P,S]of Object.entries(d.setToSetIdentifierMappings))s.includes(P.toLowerCase())&&(s=s.replace(P.toLowerCase(),S[0]));let o=et(s),n=[];for(let P of o){let S=Ae.find(({shorthands:h})=>h.includes(P));S&&!S.isCardProperty?n.push(...S.expanded):n.push(P)}let c=[],F=[],p=[],f=[],T=!1,M=[],L=[],H=[],U=[];for(let P of n)if(bt(P)){let[S,h]=P.split(":"),{modifier:D,values:C,isAnd:l,isOr:g}=Ct(h),{filterKey:u,isExcluded:y,isOptional:m,isMeta:R}=mt(S),A=!1;if(R){if(["rarity","r"].includes(u)){let B=ht(C);y||(L=[...B]),C=B.map(x=>x.toLowerCase())}["legal","l","hero"].includes(u),c.push(...Te(y,m,u,C,D,t))}else{if(["chain"].includes(u)){let x=new Set,I=[],V=new Set,G=w=>{x.add(w.cardIdentifier),V.has(w.name)||(V.add(w.name),I.push(w))},q=w=>{w.types.includes(d.Type.Hero)||G(w)};for(let w of C)if(w)for(let N of pe(r,w))G(N);let j=0;for(let w of I){if(j>rt)break;for(let Ce of fe(r,w))q(Ce);if(j===0)for(let Ce of ue(r,w))q(Ce);j++}c.push(je(x,{isAnd:l,isExcluded:y,isOptional:m,modifier:D})),A=!0}else if(["referencedby","references"].includes(u)){let x=["referencedby"].includes(u),I=new Set;for(let V of C)if(V)for(let G of pe(r,V)){let q=x?fe(r,G):ue(r,G);for(let j of q)I.add(j.cardIdentifier)}c.push(je(I,{isAnd:l,isExcluded:y,isOptional:m,modifier:D})),A=!0}else if(["art","artist"].includes(u))F=C;else if(["print","prints","printing","printings"].includes(u))M=C;else if(["is","meta"].includes(u)){let x=[],I=[],V=[],G=[];for(let N of C)ot.includes(N)?x.push(N):nt.includes(N)?I.push(N):lt.includes(N)?V.push(N):G.push(N);x.length>0&&(c.push({filterToPropertyMapping:Ie,values:[d.Meta.Reprint.toLowerCase().replaceAll(b,"")],isAnd:l,isOr:g,isExcluded:!y,isOptional:m}),A=G.length===0);let q=I.length>0;q&&c.push({filterToPropertyMapping:er,values:[i],isAnd:l,isOr:g,isExcluded:y,isOptional:m});let j=V.length>0;j&&c.push({filterToPropertyMapping:er,values:[i],isAnd:l,isOr:g,isExcluded:!y,isOptional:m}),(q||j)&&(A=G.length===0);let w=pt(G);C=w.map(N=>N.toLowerCase().replaceAll(b,"")),w.includes(d.Meta.Expansion)&&!y&&(T=!0)}else["foiling","foil"].includes(u)?(f=ut(C),C=f.map(x=>x.toLowerCase())):["treat","treatment","var","variation"].includes(u)?(U=yt(C),C=U.map(x=>x.toLowerCase())):["set","s"].includes(u)?(H=tt(C,a),C=H.map(x=>x.toLowerCase().replaceAll(b,""))):["pitch","p","color"].includes(u)&&(C=st(C));let B=fr[u];B&&!A&&c.push({filterToPropertyMapping:B,values:B.hasMarkup?C.map(x=>Q(x)):C,isAnd:l,isOr:g,modifier:D,isExcluded:y,isOptional:m})}}else if(P){let S=ie(P)?.card,h=Me(P);S?p.push(`"${S.toLowerCase().replace(b,"")}"`):h&&h.length>0?c.push(...h):p.push(P.replace(b,""))}return{appliedFilters:c,attributes:{artists:F,foilings:f,isExpansionSlot:T,prints:M,rarities:L,releases:H,treatments:U},keywords:p}},tt=(e,r=[])=>{let t=[];for(let a of e)t.push(...at(a,r));return t},at=(e,r=[])=>{let t=[],a=Object.values(d.Release).find(i=>i.toLowerCase().replaceAll(b,"")===e);if(a&&t.push(a),t.length===0){let i=oe[e];i&&t.push(i)}if(t.length===0){let i=Object.values(d.Release).filter(s=>s.toLowerCase().includes(e));i.length>0&&t.push(...i)}if(t.length===0){let i=r.find(s=>s.toLowerCase().replaceAll(b,"")===e);i&&t.push(i)}return t},it=E({purple:4,blue:3,yellow:2,red:1,white:0}),st=e=>{let r=[];for(let t of e){let a=it[t];a===void 0?r.push(t):r.push(a.toString())}return r},ot=["unique"],nt=["preview","spoiler","unreleased"],lt=["released"],dt=()=>{let e=new Date,r=`${e.getMonth()+1}`.padStart(2,"0"),t=`${e.getDate()}`.padStart(2,"0");return`${e.getFullYear()}-${r}-${t}`},ct=E({dual:d.Meta.DualClass,exp:d.Meta.Expansion,expansion:d.Meta.Expansion,rainbow:d.Meta.Rainbow,reprint:d.Meta.Reprint,reprints:d.Meta.Reprint}),pt=e=>{let r=[];for(let t of e){let a=ct[t];a&&r.push(a)}if(e.length>0&&r.length===0){for(let t of Object.values(d.Meta))for(let a of e)if(t.toLowerCase().includes(a)){r.push(t);break}}return r},or=E({r:d.Foiling.Rainbow,rf:d.Foiling.Rainbow,rainbow:d.Foiling.Rainbow,c:d.Foiling.Cold,cf:d.Foiling.Cold,cold:d.Foiling.Cold,g:d.Foiling.Gold,gf:d.Foiling.Gold,gold:d.Foiling.Gold}),ut=e=>{let r=[];for(let t of e)or[t]&&r.push(or[t]);return r},ft=E({...Object.values(d.Treatment).reduce((e,r)=>(e[r.toLowerCase()]=r,e),{}),aa:d.Treatment.AA,alt:d.Treatment.AA,"alt art":d.Treatment.AA,ab:d.Treatment.AB,"alt border":d.Treatment.AB,at:d.Treatment.AT,"alt text":d.Treatment.AT,ea:d.Treatment.EA,extended:d.Treatment.EA,"extended art":d.Treatment.EA,fa:d.Treatment.FA,full:d.Treatment.FA,"full art":d.Treatment.FA}),gt=E(d.Treatment),yt=e=>{let r=[];for(let t of e){let a=ft[t],i=gt[t.toUpperCase()];a?r.push(a):i&&r.push(i)}return r},Be=E({b:d.Rarity.Basic,c:d.Rarity.Common,f:d.Rarity.Fabled,l:d.Rarity.Legendary,m:d.Rarity.Majestic,p:d.Rarity.Promo,r:d.Rarity.Rare,s:d.Rarity.SuperRare,t:d.Rarity.Token,v:d.Rarity.Marvel}),ht=e=>{let r=[];for(let t of e)Be[t]?r.push(Be[t]):r.push(t);return r},Ct=e=>{let r=[],t,a,i=cr.find(s=>e.includes(s));if(i){let[,s]=e.split(i);nr(s)?(t=!0,r.push(...s.trim().split("+").map(o=>o.replace(b,"")))):lr(s)?(a=!0,r.push(...s.trim().split(",").map(o=>o.replace(b,"")))):r.push(s.trim().replace(b,""))}else nr(e)?(t=!0,r.push(...e.trim().split("+").map(s=>s.replace(b,"")))):lr(e)?(a=!0,r.push(...e.trim().split(",").map(s=>s.replace(b,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(b,"")):r.push(e.trim().replace(b,""));return{modifier:i,values:r,isAnd:t,isOr:a}},mt=e=>{let r=Tt(e);if(r){let[,t]=e.split(r);return{filterKey:t,isExcluded:!0,isOptional:!1,isMeta:dr(t)}}else return{filterKey:e,isExcluded:!1,isOptional:!1,isMeta:dr(e)}},bt=e=>e.indexOf(":")>=0,nr=e=>e.indexOf("+")>=0,lr=e=>e.indexOf(",")>=0,dr=e=>!!fr[e]?.isMeta,Tt=e=>pr.find(r=>e.includes(r))?.slice(0,1);var v=require("@flesh-and-blood/types"),gr={artists:["Hoodwill"],cardIdentifier:"fangs-a-lot-blue",classes:[v.Class.Generic],defaultImage:"FNG000",firstReleaseDate:"2022-06-02",functionalText:"If Fangs A Lot is put into your banished zone from your graveyard, instead put it into your hand.",legalFormats:[],legalHeroes:[v.Hero.Kayo,v.Hero.Levia,v.Hero.Rhinar],printings:[{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000",print:"FNG000",rarity:v.Rarity.Rare,set:v.Release.Promos},{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000_Marvel",print:`FNG000-${v.Treatment.FA}`,rarity:v.Rarity.Marvel,set:v.Release.Promos,treatment:v.Treatment.FA}],name:"Fangs A Lot",rarities:[v.Rarity.Rare,v.Rarity.Marvel],rarity:v.Rarity.Rare,sets:[v.Release.Promos],setIdentifiers:["FNG000"],specialImage:"FNG000_Marvel",subtypes:[v.Subtype.Attack],types:[v.Type.Action],typeText:"Generic Action - Attack"},yr=[{keyword:gr.name.toLowerCase(),card:gr}];var Mt={getFn:(e,r)=>{let t=Ee.default.config.getFn(e,r),a=t;if(Array.isArray(t))a=t.map(i=>Z(i.replace(b,"")));else if(t){let i=Z(t).replace(b,"");a=r.includes("functionalText")?Q(i):i}return a},ignoreLocation:!0,includeScore:!0,keys:[{name:"name",weight:10},{name:"functionalText",weight:6},{name:"shorthands",weight:4},{name:"setIdentifiers",weight:2},{name:"traits",weight:4},{name:"typeText",weight:6}],threshold:.15,useExtendedSearch:!0},Ne=class{constructor(r,t=[],a=[],i=!1){this.getFuse=()=>(this.fuse||(this.fuse=new Ee.default(this.cards,Mt)),this.fuse);this.log=(r,...t)=>{this.debug&&console.log(r,...t)};this.search=(r,t)=>{let a,{appliedFilters:i,attributes:s,keywords:o}=Le(r,this.index,this.additionalHeroes,this.additionalSets),n=o.join(" "),c=t?yr.filter(h=>h.keyword===n):[];if(c.length>0?a=c.map(({card:h})=>h):o.length?a=this.getFuse().search(n).map(h=>h.item):a=[...this.cards],i.length&&(a=a.filter(h=>h&&Cr(h,i))),o.length===0){let h="";if(s.releases.length===1){let l=Oe[s.releases[0]];l?.length&&(h=l[0].toUpperCase())}if(!h&&s.prints.length===1){let l=s.prints[0];oe[l]&&(h=l.toUpperCase())}h?a.sort((l,g)=>{let u=l.setIdentifiers.find(m=>m.includes(h))?.replace(h,""),y=g.setIdentifiers.find(m=>m.includes(h))?.replace(h,"");return u&&y?u.localeCompare(y):-1}):a.sort((l,g)=>l.name===g.name?`${l.pitch}`.localeCompare(`${g.pitch}`):l.name.localeCompare(g.name))}else{let h=[],D=[],C=o.map(l=>l.toLowerCase().replace(b,"")).join(" ");for(let l of a)l.name.toLowerCase().replace(b,"")===C?h.push(l):D.push(l);a=[...h,...D]}let F=[],{artists:p,isExpansionSlot:f,foilings:T,prints:M,rarities:L,releases:H,treatments:U}=s;(p.length>0||f||T.length>0||M.length>0||L.length>0||H.length>0||U.length>0)&&(F=a.map(h=>{let D=h.printings.filter(C=>{let l=!!C.image,g=p.length===0||p.some(I=>C.artists.find(V=>V.replace(b,"").toLowerCase().includes(I))),u=!f||f===C.isExpansionSlot,y=T.length===0||!!C.foiling&&T.includes(C.foiling),m=M.length===0||M.some(I=>C.identifier.includes(I.toUpperCase())),R=L.length===0||L.includes(C.rarity),A=H.length===0||H.includes(C.set),B=U.length===0||C.treatments?.some(I=>U.includes(I));return l&&g&&u&&y&&m&&R&&A&&B});return{...h,matchingPrintings:D}}));let S=F.length>0?F:a;return{appliedFilters:i,attributes:s,keywords:o,searchResults:S}};let s=Array.isArray(t)?{additionalHeroes:t,additionalSets:a,debug:i}:t;this.additionalHeroes=s.additionalHeroes||[],this.additionalSets=s.additionalSets||[],this.cards=[...r],this.debug=s.debug||!1,this.index=s.index||xe(r)}},hr=Ne,Cr=(e,r)=>{let t=!0,a=!1;for(let i of r){let s=i.isOptional,{isNumber:o,isString:n,isArray:c,isBoolean:F,isDate:p}=i.filterToPropertyMapping;if(o){let f=Ft(e,i);s?f&&(a=!0):t=t&&f}else if(n){let f=vt(e,i);s?f&&(a=!0):t=t&&f}else if(c){let f=At(e,i,r);s?f&&(a=!0):t=t&&f}else if(F){let f=xt(e,i);s?f&&(a=!0):t=t&&f}else if(p){let f=Pt(e,i);s?f&&(a=!0):t=t&&f}}return t},Ft=(e,r)=>{if(te(r,e)){let{values:t,modifier:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=re(e,r);if(o!=null&&!isNaN(o))if(o=parseInt(o),a)switch(a){case">=":{let n=t?.some(c=>o>=parseInt(c));return i?!n:n}case">":{let n=t?.some(c=>o>parseInt(c));return i?!n:n}case"<=":{let n=t?.some(c=>o<=parseInt(c));return i?!n:n}case"<":{let n=t?.some(c=>o<parseInt(c));return i?!n:n}default:return!1}else{let n=t?.some(c=>o===parseInt(c));return i?!n:n}else{let n=wt(e,r)?.toLowerCase(),c=s?t?.some(F=>n?.includes(F)):t?.some(F=>n===F);return i?!c:c}}else return!0},vt=(e,r)=>{if(te(r,e)){let{values:t,valuesSet:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{hasMarkup:o,isNormalized:n,partialMatch:c}}=r,F=re(e,r),p=n?F:F?.replaceAll(b,"").toLowerCase(),f=o&&p?Q(p):p;if(c){let T=i?t?.every(M=>f?.includes(M)):t?.some(M=>f?.includes(M));return s?!T:T}else{let T;return i?T=t?.every(M=>f===M):a?T=a.has(f):T=t?.some(M=>f===M),s?!T:T}}else return!0},At=(e,r,t)=>{if(te(r,e)){let{values:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{partialMatch:o}}=r,n=St(e,r,t).map(c=>c?.replaceAll(b,""));if(o){let c=i?a.every(p=>n?.some(f=>f?.toLowerCase().includes(p))):a.some(p=>n?.some(f=>f?.toLowerCase().includes(p))),F=n.length===0;return s?!c||F:c}else{let c=i?a.every(F=>n?.some(p=>p?.toLowerCase()===F)):a.some(F=>n?.some(p=>p?.toLowerCase()===F));return s?!c:c}}else return!0},xt=(e,r)=>{if(te(r,e)){let{isExcluded:t}=r,a=re(e,r);return t?!a:a}else return!0},Pt=(e,r)=>{if(te(r,e)){let{values:t,isExcluded:a}=r,i=re(e,r),s=t?.some(o=>i>o);return a?!s:s}else return!0},re=(e,r)=>{let{filterToPropertyMapping:{property:t}}=r,a;return t!==K&&(a=e[t]),a},St=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i}}=r,s=[],o=Object.keys(e.legalOverrides||{}).length>0,n=r.filterToPropertyMapping.property===X.LegalHeroes,c=t.find(({filterToPropertyMapping:p})=>p.property===X.LegalFormats);if(o&&n&&!!c){let p=new Set;for(let{format:f,heroes:T}of e.legalOverrides||[])if(c.values.includes(f.toLowerCase()))for(let M of T)p.add(M);s=Array.from(p)}if(s.length===0)if(i){let p=new Set;for(let f of e.printings){let T=f[i];if(a){if(Array.isArray(T))for(let M of T)p.add(M)}else T&&typeof T=="string"&&p.add(T)}s=Array.from(p)}else{let p=re(e,r);if(Array.isArray(p))for(let f of p)typeof f=="string"&&s.push(f)}return s},wt=(e,r)=>{let{filterToPropertyMapping:{specialProperty:t}}=r,a;return t&&(a=e[t]),a},te=({cardTypes:e},{types:r,subtypes:t})=>!e||e?.some(a=>r.map(i=>i.toLowerCase()).includes(a.toLowerCase())||t.map(i=>i.toLowerCase()).includes(a.toLowerCase()));var kt=(e,r)=>{let t=[];if(e)for(let a of r){let i=a.name===e.name,s=a.cardIdentifier!==e.cardIdentifier,o=a.pitch!==e.pitch;i&&s&&o&&t.push(a)}return t},Rt=(e,r)=>{let t=new Set(e?.referencedCards),a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a},It=e=>{let r=new Map;for(let t of e)for(let a of t.referencedCards||[]){let i=r.get(a);i?i.push(t):r.set(a,[t])}return r},Bt=(e,r)=>{let t=new Set;for(let i of e)for(let s of i.createdExtras||[])t.add(s);let a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a};0&&(module.exports={FilterProperty,MARKUP,NO_CARD_PROPERTY,PUNCTUATION,RARITY_VALUES_MAPPING,abbreviations,availableExclusions,availableModifiers,filterCard,filtersToCardPropertyMappings,getAbbreviation,getAbbreviationByCard,getCardsByName,getCardsByReferencedCardIdentifier,getCardsReferencedBy,getCardsReferencing,getCatalogueIndex,getCleanText,getExcludedMetaFilters,getKeywordsAndAppliedFiltersFromText,getMetaFilters,getNormalizedText,getOtherPitches,getReferencedCards,getTextWithoutMarkup,getTokensReferencedByCards,multiWordShorthands,shorthands,singleWordShorthands});
@@ -0,0 +1,21 @@
1
+ import { Release } from "@flesh-and-blood/types";
2
+ /**
3
+ * Copies a lookup table onto a null prototype so that a key can only ever match
4
+ * a real entry. Keys here come from raw search text, and a plain object literal
5
+ * answers `constructor`, `__proto__` and the rest of `Object.prototype` with an
6
+ * inherited member, handing the caller a function where it expects a value.
7
+ *
8
+ * Deliberately not re-exported from the package barrel: it guards an internal
9
+ * invariant rather than serving consumers.
10
+ */
11
+ export declare const getLookupWithoutInheritedKeys: <T>(entries: {
12
+ [key: string]: T;
13
+ }) => {
14
+ [key: string]: T;
15
+ };
16
+ export declare const releasesBySetIdentifier: {
17
+ [key: string]: Release;
18
+ };
19
+ export declare const setIdentifiersByRelease: {
20
+ [key: string]: string[] | undefined;
21
+ };
@@ -0,0 +1,14 @@
1
+ import {
2
+ setIdentifierToSetMappings,
3
+ setToSetIdentifierMappings
4
+ } from "@flesh-and-blood/types";
5
+ const getLookupWithoutInheritedKeys = (entries) => Object.assign(/* @__PURE__ */ Object.create(null), entries);
6
+ const releasesBySetIdentifier = getLookupWithoutInheritedKeys(
7
+ setIdentifierToSetMappings
8
+ );
9
+ const setIdentifiersByRelease = getLookupWithoutInheritedKeys(setToSetIdentifierMappings);
10
+ export {
11
+ getLookupWithoutInheritedKeys,
12
+ releasesBySetIdentifier,
13
+ setIdentifiersByRelease
14
+ };
@@ -1,5 +1,6 @@
1
1
  import { Format, Hero, Talent } from "@flesh-and-blood/types";
2
2
  import { PUNCTUATION } from "./constants.js";
3
+ import { getLookupWithoutInheritedKeys } from "./lookups.js";
3
4
  const FilterProperty = {
4
5
  BannedFormats: "bannedFormats",
5
6
  LegalFormats: "legalFormats",
@@ -343,7 +344,7 @@ const noTalents = [
343
344
  values: Object.values(Talent).map((talent) => talent.toLowerCase())
344
345
  }
345
346
  ];
346
- const excludedFilters = {
347
+ const excludedFilters = getLookupWithoutInheritedKeys({
347
348
  "!co": noCost,
348
349
  "-co": noCost,
349
350
  "!cost": noCost,
@@ -376,7 +377,7 @@ const excludedFilters = {
376
377
  "-talents": noTalents,
377
378
  "!tal": noTalents,
378
379
  "-tal": noTalents
379
- };
380
+ });
380
381
  const getExcludedMetaFilters = (filterKey) => {
381
382
  const filters = [];
382
383
  const matchingFilters = excludedFilters[filterKey];
package/dist/search.js CHANGED
@@ -1,7 +1,3 @@
1
- import {
2
- setIdentifierToSetMappings,
3
- setToSetIdentifierMappings
4
- } from "@flesh-and-blood/types";
5
1
  import Fuse from "fuse.js";
6
2
  import { PUNCTUATION } from "./constants.js";
7
3
  import {
@@ -10,6 +6,7 @@ import {
10
6
  } from "./filters.js";
11
7
  import { memes } from "./memes.js";
12
8
  import { getNormalizedText, getTextWithoutMarkup } from "./helpers.js";
9
+ import { releasesBySetIdentifier, setIdentifiersByRelease } from "./lookups.js";
13
10
  import { FilterProperty } from "./metaFilters.js";
14
11
  import { getCatalogueIndex } from "./searchIndex.js";
15
12
  const searchOptions = {
@@ -77,33 +74,25 @@ class Search {
77
74
  );
78
75
  }
79
76
  if (keywords.length === 0) {
80
- let setIdentifieToSortBy = "";
77
+ let setIdentifierToSortBy = "";
81
78
  const shouldSortByRelease = attributes.releases.length === 1;
82
79
  if (shouldSortByRelease) {
83
- try {
84
- const setToSort = attributes.releases[0];
85
- const matchingSetIdentifiers = setToSetIdentifierMappings[setToSort];
86
- setIdentifieToSortBy = matchingSetIdentifiers[0].toUpperCase();
87
- } catch (e) {
88
- console.error(`Error getting set identifier from search`, e);
80
+ const matchingSetIdentifiers = setIdentifiersByRelease[attributes.releases[0]];
81
+ if (matchingSetIdentifiers?.length) {
82
+ setIdentifierToSortBy = matchingSetIdentifiers[0].toUpperCase();
89
83
  }
90
84
  }
91
- const shouldSortByPrint = !setIdentifieToSortBy && attributes.prints.length === 1;
85
+ const shouldSortByPrint = !setIdentifierToSortBy && attributes.prints.length === 1;
92
86
  if (shouldSortByPrint) {
93
- try {
94
- const setToSort = attributes.prints[0];
95
- const matchingSetIdentifiers = setIdentifierToSetMappings[setToSort];
96
- if (matchingSetIdentifiers) {
97
- setIdentifieToSortBy = setToSort.toUpperCase();
98
- }
99
- } catch (e) {
100
- console.error(`Error getting set identifier from search`, e);
87
+ const setToSort = attributes.prints[0];
88
+ if (releasesBySetIdentifier[setToSort]) {
89
+ setIdentifierToSortBy = setToSort.toUpperCase();
101
90
  }
102
91
  }
103
- if (setIdentifieToSortBy) {
92
+ if (setIdentifierToSortBy) {
104
93
  results.sort((c1, c2) => {
105
- const c1SetNumber = c1.setIdentifiers.find((identifier) => identifier.includes(setIdentifieToSortBy))?.replace(setIdentifieToSortBy, "");
106
- const c2SetNumber = c2.setIdentifiers.find((identifier) => identifier.includes(setIdentifieToSortBy))?.replace(setIdentifieToSortBy, "");
94
+ const c1SetNumber = c1.setIdentifiers.find((identifier) => identifier.includes(setIdentifierToSortBy))?.replace(setIdentifierToSortBy, "");
95
+ const c2SetNumber = c2.setIdentifiers.find((identifier) => identifier.includes(setIdentifierToSortBy))?.replace(setIdentifierToSortBy, "");
107
96
  return c1SetNumber && c2SetNumber ? c1SetNumber.localeCompare(c2SetNumber) : -1;
108
97
  });
109
98
  } else {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@flesh-and-blood/search",
3
3
  "description": "TypeScript search engine for Flesh and Blood cards",
4
- "version": "5.0.4",
4
+ "version": "5.0.5",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "dist/index.cjs",
@@ -46,8 +46,8 @@
46
46
  "@flesh-and-blood/types": "^5.0.0"
47
47
  },
48
48
  "devDependencies": {
49
- "@flesh-and-blood/cards": "^5.0.4",
50
- "@flesh-and-blood/types": "^5.0.4",
49
+ "@flesh-and-blood/cards": "^5.0.5",
50
+ "@flesh-and-blood/types": "^5.0.5",
51
51
  "@types/jest": "^29.5.11",
52
52
  "@types/node": "^20.10.5",
53
53
  "esbuild": "^0.19.10",
@@ -77,5 +77,5 @@
77
77
  "FAB",
78
78
  "FABTCG"
79
79
  ],
80
- "gitHead": "0079c17039ad1e1590e9ce119e79584bf5e30985"
80
+ "gitHead": "f0584b7f17254f1abce4397e5127b4503b2ad951"
81
81
  }