@flesh-and-blood/search 5.0.1 → 5.0.2

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/index.cjs CHANGED
@@ -1 +1 @@
1
- var hr=Object.create;var X=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var br=Object.getOwnPropertyNames;var mr=Object.getPrototypeOf,Tr=Object.prototype.hasOwnProperty;var Mr=(e,r)=>{for(var t in r)X(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))!Tr.call(e,i)&&i!==t&&X(e,i,{get:()=>r[i],enumerable:!(a=Cr(r,i))||a.enumerable});return e};var Fr=(e,r,t)=>(t=e!=null?hr(mr(e)):{},Ee(r||!e||!e.__esModule?X(t,"default",{value:e,enumerable:!0}):t,e)),vr=e=>Ee(X({},"__esModule",{value:!0}),e);var Pt={};Mr(Pt,{FilterProperty:()=>Ne,MARKUP:()=>ge,PUNCTUATION:()=>m,RARITY_VALUES_MAPPING:()=>ke,abbreviations:()=>ye,availableExclusions:()=>pr,availableModifiers:()=>cr,default:()=>gr,filterCard:()=>yr,filtersToCardPropertyMappings:()=>Ie,getAbbreviation:()=>Z,getAbbreviationByCard:()=>Ar,getCardsByName:()=>ie,getCardsByReferencedCardIdentifier:()=>xt,getCardsReferencedBy:()=>oe,getCardsReferencing:()=>se,getCatalogueIndex:()=>Me,getCleanText:()=>$,getExcludedMetaFilters:()=>Ce,getKeywordsAndAppliedFiltersFromText:()=>Re,getMetaFilters:()=>he,getNormalizedText:()=>Y,getOtherPitches:()=>vt,getReferencedCards:()=>At,getTextWithoutMarkup:()=>_,getTokensReferencedByCards:()=>St,multiWordShorthands:()=>me,shorthands:()=>be,singleWordShorthands:()=>Te});module.exports=vr(Pt);var ce=require("@flesh-and-blood/types"),Le=Fr(require("fuse.js"),1);var m=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g,ge=/\*/g;var d=require("@flesh-and-blood/types");var Z=e=>ye.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),Ar=e=>ye.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),ye=[{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 Ne=(a=>(a.BannedFormats="bannedFormats",a.LegalFormats="legalFormats",a.LegalHeroes="legalHeroes",a))(Ne||{}),ae=Array.from(Array(50).keys()).map(e=>`${e}`),xr=[{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=xr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(m,"");return r?{...r,format:t}:{format:t}}),Pr=[{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"]}],wr=Object.values(k.Hero).map(e=>{let r=Pr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(m,"");return r?{...r,hero:t}:{hero:t}}),ee=["common","rare","super rare","majestic","legendary","fabled"],kr=(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 ee)o?i.push(n):n===s&&(o=!0,i.push(n));break}case">":{let o=!1;for(let n of ee)o?i.push(n):n===s&&(o=!0);break}case"<=":{let o=!1;for(let n of ee.slice().reverse())o?i.push(n):n===s&&(o=!0,i.push(n));break}case"<":{let o=!1;for(let n of ee.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(g=>({hero:g.toLowerCase().replaceAll(m,"")})),o=[],n=[],u=[];for(let g of e){let f=Sr.find(({format:h,nicknames:M})=>h===g||!!M&&M.includes(g));if(f)n.push(f.format);else{let h=wr.find(({hero:M,nicknames:A})=>M===g||!!A&&A.includes(g))||s.find(({hero:M})=>M===g);h&&u.push(h.hero)}}let T=i||"legalFormats";return n.length>0&&o.push({filterToPropertyMapping:{property:T,isArray:!0},values:n,isOr:!0,isExcluded:r,isOptional:t}),u.length>0&&o.push({filterToPropertyMapping:{property:"legalHeroes",isArray:!0},values:u,isOr:!0,isExcluded:r,isOptional:t}),o},Ir=(e,r,t,a)=>De(e,r,t,a,"bannedFormats"),he=(e,r,t,a,i,s)=>{let o=[];return Lr(t)?o.push(...De(a,e,r,s)):Nr(t)?o.push(...Ir(a,e,r,s)):Or(t)&&o.push(kr(a,i,e,r)),o},q=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:ae},{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"]}],O=[{filterToPropertyMapping:{property:"defense",isNumber:!0},isExcluded:!0,values:ae},{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"]}],re=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:ae},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],W=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:ae},{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"]}],te=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(k.Talent).map(e=>e.toLowerCase())}],Rr={"!co":q,"-co":q,"!cost":q,"-cost":q,"!color":q,"-color":q,"!b":O,"-b":O,"!block":O,"-block":O,"!d":O,"-d":O,"!def":O,"-def":O,"!defense":O,"-defense":O,"!pitch":re,"-pitch":re,"!p":re,"-p":re,"!attack":W,"-attack":W,"!power":W,"-power":W,"!pwr":W,"-pwr":W,"!pow":W,"-pow":W,"!talents":te,"-talents":te,"!tal":te,"-tal":te},Ce=e=>{let r=[],t=Rr[e];return t&&r.push(...t),r},Br=["l","legal","hero"],Lr=e=>Br.includes(e),Er=["banned"],Nr=e=>Er.includes(e),Dr=["r","rarity"],Or=e=>Dr.includes(e);var E=require("@flesh-and-blood/types"),be=[{description:"Attack actions",expanded:["st:attack"],filters:{subtypes:[E.Subtype.Attack]},isCardProperty:!1,shorthands:["AA"]},{description:"Arcane barrier",expanded:['k:"arcane barrier"'],filters:{keywords:[E.Keyword.ArcaneBarrier]},isCardProperty:!1,shorthands:["AB"]},{description:"Attack reactions",expanded:['t:"attack reaction"'],filters:{types:[E.Type.AttackReaction]},isCardProperty:!1,shorthands:["AR"]},{description:"Defense reactions",expanded:['t:"defense reaction"'],filters:{types:[E.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:[E.Keyword.GoAgain]},isCardProperty:!1,shorthands:["GA"]},{description:"Non-attack actions",expanded:["t:action","st:non-attack"],filters:{subtypes:[E.Subtype.NonAttack],types:[E.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:[E.Keyword.Spellvoid]},isCardProperty:!1,shorthands:["SV"]}],me=be.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)})),Te=be.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=>Y(e.toLowerCase().trim().replace(m,"")),Y=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,""),_=e=>e.replace(ge,"");var j=require("@flesh-and-blood/types");var Oe=new WeakMap,K=Object.freeze([]),Hr=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},Vr=e=>{let r=new Map;for(let t of e){let a=t.types.includes(j.Type.Hero)&&!t.isCardBack,i=a?j.CardRole.Hero:(0,j.getCardRole)(t);if(a||i!==j.CardRole.Hero){let o=r.get(i);o?o.push(t):r.set(i,[t])}}return r},Gr=e=>{let r,t,a,i,s=()=>{if(!r){let l=new Map,C=new Map,c=[],p=new Map,y=0;for(let b of e){l.set(b.cardIdentifier,b),C.set(b.cardIdentifier,y),y++;let F=$(b.name),x=p.get(F);x?x.push(b):(p.set(F,[b]),c.push(F))}r={cardByCardIdentifier:l,corpusPositionByCardIdentifier:C,cleanedNames:c,pitchCycleByCleanedName:p}}return r},o=l=>{let{corpusPositionByCardIdentifier:C}=s(),c=({cardIdentifier:p})=>C.get(p)??Hr;return[...l].sort((p,y)=>c(p)-c(y))},n=l=>s().cardByCardIdentifier.get(l),u=l=>{let{cardByCardIdentifier:C}=s(),c=[];for(let p of l||[]){let y=C.get(p);y&&c.push(y)}return o(c)},T=l=>{let C=new Map;return c=>{let p=C.get(c);if(!p){let y=n(c),b=u(y&&l(y)),F=b.length>0;p=F?b:K,F&&C.set(c,p)}return p}},g=l=>{let{pitchCycleByCleanedName:C}=s(),c=n(l);return c?C.get($(c.name))??K:K},f=l=>{let{cleanedNames:C,pitchCycleByCleanedName:c}=s(),p=$(l),y=c.get(p);if(!y&&p.length>0){let F=C.find(x=>x.includes(p));F&&(y=c.get(F))}return y??K},h=T(({oppositeSideCardIdentifiers:l})=>l),M=T(({referencedCards:l})=>l),A=l=>(t||(t=He(e,({referencedCards:C})=>C)),t.get(l)??K),I=T(({createdExtras:l})=>l);return{cards:e,getCard:n,getPitchCycle:g,getCardsByName:f,getOppositeSide:h,getReferences:M,getReferencedBy:A,getCreates:I,getCreatedBy:l=>(a||(a=He(e,({createdExtras:C})=>C)),a.get(l)??K),getCreatedClosure:l=>{let C=new Map,c=new Set,p=[...l];for(let y of p)if(!c.has(y)){c.add(y);for(let F of I(y))C.set(F.cardIdentifier,F),p.push(F.cardIdentifier)}return o([...C.values()])},getByRole:l=>(i||(i=Vr(e)),i.get(l)??K),getCardsInCorpusOrder:o}},Me=e=>{let r=Oe.get(e);return r||(r=Gr(e),Oe.set(e,r)),r},Fe=(e,r)=>e.getPitchCycle(r.cardIdentifier),ie=(e,r)=>e.getCardsByName(r),Ve=(e,r)=>{let t=new Map;for(let a of r)for(let i of Fe(e,a))t.set(i.cardIdentifier,i);return e.getCardsInCorpusOrder([...t.values()])},se=(e,r)=>{let t=[];for(let a of Fe(e,r))t.push(...e.getReferencedBy(a.cardIdentifier));return Ve(e,t)},oe=(e,r)=>{let t=[];for(let a of Fe(e,r))t.push(...e.getReferences(a.cardIdentifier));return Ve(e,t)};var cr=[">=",">","<=","<"],pr=["!","-"],Wr={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},ve={property:"artists",isArray:!0,partialMatch:!0},Ge={property:"n/a",isMeta:!0},We={property:"bonds",isArray:!0},Ur={property:"cardIdentifier",isString:!0,isNormalized:!0},Ue=(e,{isAnd:r,isExcluded:t,isOptional:a,modifier:i})=>({filterToPropertyMapping:Ur,values:[...e],valuesSet:e,isAnd:r,isOr:!0,modifier:i,isExcluded:t,isOptional:a}),zr={property:"n/a"},ze={property:"classes",isArray:!0,partialMatch:!0},Ke={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},J={property:"defense",specialProperty:"specialDefense",isNumber:!0},je={property:"flows",isArray:!0},qe={nestedProperty:"foiling",property:"printings",isArray:!0},_e={property:"fusions",isArray:!0},$e={property:"intellect",isNumber:!0},Ye={property:"keywords",isArray:!0},Ae={property:"n/a",isMeta:!0},Je={property:"life",specialProperty:"specialLife",isNumber:!0},we={property:"meta",isArray:!0},Qe={property:"name",isString:!0,partialMatch:!0},xe={property:"pitch",isNumber:!0},Xe={property:"firstReleaseDate",isDate:!0},ne={property:"power",specialProperty:"specialPower",isNumber:!0},Kr={property:"setIdentifiers",isArray:!0,partialMatch:!0},Ze={property:"n/a",isMeta:!0},jr={property:"n/a"},qr={property:"n/a"},er={property:"sets",isArray:!0,partialMatch:!0},Se={property:"shorthands",isArray:!0,partialMatch:!0},le={property:"specializations",isArray:!0,partialMatch:!0},rr={property:"subtypes",isArray:!0},tr={property:"types",isArray:!0},ar={property:"talents",isArray:!0},_r={property:"functionalText",hasMarkup:!0,isString:!0,partialMatch:!0},$r={property:"traits",isArray:!0,partialMatch:!0},Yr={property:"typeText",isString:!0,partialMatch:!0},de={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},Jr={property:"firstReleaseDate",isString:!0,partialMatch:!0},Ie={arcane:Wr,a:ve,artist:ve,art:ve,attack:ne,b:J,block:J,banned:Ge,bond:We,bonds:We,c:ze,class:ze,chain:zr,co:Ke,cost:Ke,color:xe,d:J,def:J,defense:J,flow:je,flows:je,f:_e,fusion:_e,foil:qe,foiling:qe,i:$e,intellect:$e,is:we,k:Ye,keyword:Ye,l:Ae,legal:Ae,hero:Ae,li:Je,life:Je,meta:we,n:Qe,name:Qe,p:xe,pitch:xe,pwr:ne,pow:ne,power:ne,print:Kr,r:Ze,rarity:Ze,referencedby:jr,references:qr,rf:Ge,s:er,set:er,short:Se,shorthand:Se,shorthands:Se,sp:le,spec:le,specialization:le,specializations:le,st:rr,subtype:rr,t:tr,type:tr,tal:ar,talent:ar,text:_r,trait:$r,treat:de,treatment:de,var:de,variation:de,x:Yr,year:Jr},Qr=[{text:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(m,"")}],Xr=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:s}of Qr)t.includes(i)&&(t=t.replace(i,s));if(Z(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},Zr=20,Re=(e,r,t=[],a=[],i=ot())=>{let s=e.trim().toLowerCase();for(let{expanded:P,shorthands:R}of me)for(let l of R)if(s.includes(l)){s=s.replace(l,P.join(" "));break}for(let[P,R]of Object.entries(d.setToSetIdentifierMappings))s.includes(P.toLowerCase())&&(s=s.replace(P.toLowerCase(),R[0]));let o=Xr(s),n=[];for(let P of o){let R=Te.find(({shorthands:l})=>l.includes(P));R&&!R.isCardProperty?n.push(...R.expanded):n.push(P)}let u=[],T=[],g=[],f=[],h=!1,M=[],A=[],I=[],H=[];for(let P of n)if(ft(P)){let[R,l]=P.split(":"),{modifier:C,values:c,isAnd:p,isOr:y}=pt(l),{filterKey:b,isExcluded:F,isOptional:x,isMeta:ue}=ut(R),U=!1;if(ue){if(["rarity","r"].includes(b)){let V=ct(c);F||(A=[...V]),c=V.map(S=>S.toLowerCase())}["legal","l","hero"].includes(b),u.push(...he(F,x,b,c,C,t))}else{if(["chain"].includes(b)){let S=new Set,B=[],N=new Set,D=w=>{S.add(w.cardIdentifier),N.has(w.name)||(N.add(w.name),B.push(w))},z=w=>{w.types.includes(d.Type.Hero)||D(w)};for(let w of c)if(w)for(let L of ie(r,w))D(L);let G=0;for(let w of B){if(G>Zr)break;for(let fe of oe(r,w))z(fe);if(G===0)for(let fe of se(r,w))z(fe);G++}u.push(Ue(S,{isAnd:p,isExcluded:F,isOptional:x,modifier:C})),U=!0}else if(["referencedby","references"].includes(b)){let S=["referencedby"].includes(b),B=new Set;for(let N of c)if(N)for(let D of ie(r,N)){let z=S?oe(r,D):se(r,D);for(let G of z)B.add(G.cardIdentifier)}u.push(Ue(B,{isAnd:p,isExcluded:F,isOptional:x,modifier:C})),U=!0}else if(["art","artist"].includes(b))T=c;else if(["print","prints","printing","printings"].includes(b))M=c;else if(["is","meta"].includes(b)){let S=[],B=[],N=[],D=[];for(let L of c)at.includes(L)?S.push(L):it.includes(L)?B.push(L):st.includes(L)?N.push(L):D.push(L);S.length>0&&(u.push({filterToPropertyMapping:we,values:[d.Meta.Reprint.toLowerCase().replaceAll(m,"")],isAnd:p,isOr:y,isExcluded:!F,isOptional:x}),U=D.length===0);let z=B.length>0;z&&u.push({filterToPropertyMapping:Xe,values:[i],isAnd:p,isOr:y,isExcluded:F,isOptional:x});let G=N.length>0;G&&u.push({filterToPropertyMapping:Xe,values:[i],isAnd:p,isOr:y,isExcluded:!F,isOptional:x}),(z||G)&&(U=D.length===0);let w=nt(D);c=w.map(L=>L.toLowerCase().replaceAll(m,"")),w.includes(d.Meta.Expansion)&&!F&&(h=!0)}else["foiling","foil"].includes(b)?(f=lt(c),c=f.map(S=>S.toLowerCase())):["treat","treatment","var","variation"].includes(b)?(H=dt(c),c=H.map(S=>S.toLowerCase())):["set","s"].includes(b)?(I=et(c,a),c=I.map(S=>S.toLowerCase().replaceAll(m,""))):["pitch","p","color"].includes(b)&&(c=tt(c));let V=Ie[b];V&&!U&&u.push({filterToPropertyMapping:V,values:V.hasMarkup?c.map(S=>_(S)):c,isAnd:p,isOr:y,modifier:C,isExcluded:F,isOptional:x})}}else if(P){let R=Z(P)?.card,l=Ce(P);R?g.push(`"${R.toLowerCase().replace(m,"")}"`):l&&l.length>0?u.push(...l):g.push(P.replace(m,""))}return{appliedFilters:u,attributes:{artists:T,foilings:f,isExpansionSlot:h,prints:M,rarities:A,releases:I,treatments:H},keywords:g}},et=(e,r=[])=>{let t=[];for(let a of e)t.push(...rt(a,r));return t},rt=(e,r=[])=>{let t=[],a=Object.values(d.Release).find(i=>i.toLowerCase().replaceAll(m,"")===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(m,"")===e);i&&t.push(i)}return t},Pe={purple:4,blue:3,yellow:2,red:1,white:0},tt=e=>{let r=[];for(let t of e)Pe[t]||Pe[t]===0?r.push(Pe[t].toString()):r.push(t);return r},at=["unique"],it=["preview","spoiler","unreleased"],st=["released"],ot=()=>{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},nt=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},lt=e=>{let r=[];for(let t of e)sr[t]&&r.push(sr[t]);return r},or={...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},dt=e=>{let r=[];for(let t of e)or[t]?r.push(or[t]):d.Treatment[t.toUpperCase()]&&r.push(d.Treatment[t.toUpperCase()]);return r},ke={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},ct=e=>{let r=[];for(let t of e)ke[t]?r.push(ke[t]):r.push(t);return r},pt=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(m,"")))):lr(s)?(a=!0,r.push(...s.trim().split(",").map(o=>o.replace(m,"")))):r.push(s.trim().replace(m,""))}else nr(e)?(t=!0,r.push(...e.trim().split("+").map(s=>s.replace(m,"")))):lr(e)?(a=!0,r.push(...e.trim().split(",").map(s=>s.replace(m,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(m,"")):r.push(e.trim().replace(m,""));return{modifier:i,values:r,isAnd:t,isOr:a}},ut=e=>{let r=gt(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)}},ft=e=>e.indexOf(":")>=0,nr=e=>e.indexOf("+")>=0,lr=e=>e.indexOf(",")>=0,dr=e=>!!Ie[e]?.isMeta,gt=e=>pr.find(r=>e.includes(r))?.slice(0,1);var v=require("@flesh-and-blood/types"),ur={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"},fr=[{keyword:ur.name.toLowerCase(),card:ur}];var yt={getFn:(e,r)=>{let t=Le.default.config.getFn(e,r),a=t;if(Array.isArray(t))a=t.map(i=>Y(i.replace(m,"")));else if(t){let i=Y(t).replace(m,"");a=r.includes("functionalText")?_(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},Be=class{constructor(r,t=[],a=[],i=!1){this.getFuse=()=>(this.fuse||(this.fuse=new Le.default(this.cards,yt)),this.fuse);this.log=(r,...t)=>{this.debug&&console.log(r,...t)};this.search=(r,t)=>{let a,{appliedFilters:i,attributes:s,keywords:o}=Re(r,this.index,this.additionalHeroes,this.additionalSets),n=o.join(" "),u=t?fr.filter(l=>l.keyword===n):[];if(u.length>0?a=u.map(({card:l})=>l):o.length?a=this.getFuse().search(n).map(l=>l.item):a=[...this.cards],i.length&&(a=a.filter(l=>l&&yr(l,i))),o.length===0){let l="";if(s.releases.length===1)try{let p=s.releases[0];l=ce.setToSetIdentifierMappings[p][0].toUpperCase()}catch(p){console.error("Error getting set identifier from search",p)}if(!l&&s.prints.length===1)try{let p=s.prints[0];ce.setIdentifierToSetMappings[p]&&(l=p.toUpperCase())}catch(p){console.error("Error getting set identifier from search",p)}l?a.sort((p,y)=>{let b=p.setIdentifiers.find(x=>x.includes(l))?.replace(l,""),F=y.setIdentifiers.find(x=>x.includes(l))?.replace(l,"");return b&&F?b.localeCompare(F):-1}):a.sort((p,y)=>p.name===y.name?`${p.pitch}`.localeCompare(`${y.pitch}`):p.name.localeCompare(y.name))}else{let l=[],C=[],c=o.map(p=>p.toLowerCase().replace(m,"")).join(" ");for(let p of a)p.name.toLowerCase().replace(m,"")===c?l.push(p):C.push(p);a=[...l,...C]}let T,{artists:g,isExpansionSlot:f,foilings:h,prints:M,rarities:A,releases:I,treatments:H}=s;(g.length>0||f||h.length>0||M.length>0||A.length>0||I.length>0||H.length>0)&&(T=a.map(l=>{let C=l.printings.filter(c=>{let p=!!c.image,y=g.length===0||g.some(B=>c.artists.find(N=>N.replace(m,"").toLowerCase().includes(B))),b=!f||f===c.isExpansionSlot,F=h.length===0||h.includes(c.foiling),x=M.length===0||M.some(B=>c.identifier.includes(B.toUpperCase())),ue=A.length===0||A.includes(c.rarity),U=I.length===0||I.includes(c.set),V=H.length===0||c.treatments?.some(B=>H.includes(B));return p&&y&&b&&F&&x&&ue&&U&&V});return{...l,matchingPrintings:C}}));let R=T?.length>0?T:a;return{appliedFilters:i,attributes:s,keywords:o,searchResults:R}};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||Me(r)}},gr=Be,yr=(e,r)=>{let t=!0,a=!1;for(let i of r){let s=i.isOptional,{isNumber:o,isString:n,isArray:u,isBoolean:T,isDate:g}=i.filterToPropertyMapping;if(o){let f=ht(e,i);s?f&&(a=!0):t=t&&f}else if(n){let f=Ct(e,i);s?f&&(a=!0):t=t&&f}else if(u){let f=bt(e,i,r);s?f&&(a=!0):t=t&&f}else if(T){let f=mt(e,i);s?f&&(a=!0):t=t&&f}else if(g){let f=Tt(e,i);s?f&&(a=!0):t=t&&f}}return t},ht=(e,r)=>{if(Q(r,e)){let{values:t,modifier:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=pe(e,r);if(o!=null&&!isNaN(o))if(o=parseInt(o),a)switch(a){case">=":{let n=t?.some(u=>o>=parseInt(u));return i?!n:n}case">":{let n=t?.some(u=>o>parseInt(u));return i?!n:n}case"<=":{let n=t?.some(u=>o<=parseInt(u));return i?!n:n}case"<":{let n=t?.some(u=>o<parseInt(u));return i?!n:n}default:return!1}else{let n=t?.some(u=>o===parseInt(u));return i?!n:n}else{let n=Ft(e,r)?.toLowerCase(),u=s?t?.some(T=>n?.includes(T)):t?.some(T=>n===T);return i?!u:u}}else return!0},Ct=(e,r)=>{if(Q(r,e)){let{values:t,valuesSet:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{hasMarkup:o,isNormalized:n,partialMatch:u}}=r,T=pe(e,r),g=n?T:T?.replaceAll(m,"").toLowerCase(),f=o&&g?_(g):g;if(u){let h=i?t?.every(M=>f?.includes(M)):t?.some(M=>f?.includes(M));return s?!h:h}else{let h;return i?h=t?.every(M=>f===M):a?h=a.has(f):h=t?.some(M=>f===M),s?!h:h}}else return!0},bt=(e,r,t)=>{if(Q(r,e)){let{values:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{partialMatch:o}}=r,n=Mt(e,r,t).map(u=>u?.replaceAll(m,""));if(o){let u=i?a.every(g=>n?.some(f=>f?.toLowerCase().includes(g))):a.some(g=>n?.some(f=>f?.toLowerCase().includes(g))),T=n.length===0;return s?!u||T:u}else{let u=i?a.every(T=>n?.some(g=>g?.toLowerCase()===T)):a.some(T=>n?.some(g=>g?.toLowerCase()===T));return s?!u:u}}else return!0},mt=(e,r)=>{if(Q(r,e)){let{isExcluded:t}=r,a=pe(e,r);return t?!a:a}else return!0},Tt=(e,r)=>{if(Q(r,e)){let{values:t,isExcluded:a}=r,i=pe(e,r),s=t?.some(o=>i>o);return a?!s:s}else return!0},pe=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.property]},Mt=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i,property:s}}=r,o=e[s]||[],n=[],u=Object.keys(e.legalOverrides||{}).length>0,T=r.filterToPropertyMapping.property==="legalHeroes",g=t.find(({filterToPropertyMapping:h})=>h.property==="legalFormats");if(u&&T&&!!g){let h=new Set;for(let{format:M,heroes:A}of e.legalOverrides||[])if(g.values.includes(M.toLowerCase()))for(let I of A)h.add(I);n=Array.from(h)}if(n.length===0)if(i){let h=new Set;for(let M of o)if(a){let A=M[i]||[];for(let I of A)h.add(I)}else{let A=M[i];A&&h.add(A)}n=Array.from(h)}else n=o;return n},Ft=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.specialProperty]},Q=({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 vt=(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},At=(e,r)=>{let t=new Set(e?.referencedCards),a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a},xt=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},St=(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,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
+ var hr=Object.create;var Z=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var br=Object.getOwnPropertyNames;var mr=Object.getPrototypeOf,Tr=Object.prototype.hasOwnProperty;var Mr=(e,r)=>{for(var t in r)Z(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))!Tr.call(e,i)&&i!==t&&Z(e,i,{get:()=>r[i],enumerable:!(a=Cr(r,i))||a.enumerable});return e};var Fr=(e,r,t)=>(t=e!=null?hr(mr(e)):{},Ee(r||!e||!e.__esModule?Z(t,"default",{value:e,enumerable:!0}):t,e)),vr=e=>Ee(Z({},"__esModule",{value:!0}),e);var Pt={};Mr(Pt,{FilterProperty:()=>Ne,MARKUP:()=>ge,PUNCTUATION:()=>T,RARITY_VALUES_MAPPING:()=>ke,abbreviations:()=>ye,availableExclusions:()=>pr,availableModifiers:()=>cr,default:()=>gr,filterCard:()=>yr,filtersToCardPropertyMappings:()=>Ie,getAbbreviation:()=>ee,getAbbreviationByCard:()=>Ar,getCardsByName:()=>se,getCardsByReferencedCardIdentifier:()=>xt,getCardsReferencedBy:()=>ne,getCardsReferencing:()=>oe,getCatalogueIndex:()=>Me,getCleanText:()=>$,getExcludedMetaFilters:()=>Ce,getKeywordsAndAppliedFiltersFromText:()=>Be,getMetaFilters:()=>he,getNormalizedText:()=>J,getOtherPitches:()=>vt,getReferencedCards:()=>At,getTextWithoutMarkup:()=>Y,getTokensReferencedByCards:()=>St,multiWordShorthands:()=>me,shorthands:()=>be,singleWordShorthands:()=>Te});module.exports=vr(Pt);var pe=require("@flesh-and-blood/types"),Le=Fr(require("fuse.js"),1);var T=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g,ge=/\*/g;var d=require("@flesh-and-blood/types");var ee=e=>ye.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),Ar=e=>ye.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),ye=[{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 I=require("@flesh-and-blood/types");var Ne=(a=>(a.BannedFormats="bannedFormats",a.LegalFormats="legalFormats",a.LegalHeroes="legalHeroes",a))(Ne||{}),ie=Array.from(Array(50).keys()).map(e=>`${e}`),xr=[{format:I.Format.ClassicConstructed,nicknames:["cc","classic"]},{format:I.Format.LivingLegend,nicknames:["cc ll","classic constructed ll","ll cc","ll","living legend"]},{format:I.Format.SilverAge,nicknames:["sage"]},{format:I.Format.GoldenAge,nicknames:["gage"]},{format:I.Format.UltimatePitFight,nicknames:["upf"]}],Sr=Object.values(I.Format).map(e=>{let r=xr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(T,"");return r?{...r,format:t}:{format:t}}),Pr=[{hero:I.Hero.DataDoll,nicknames:["data","datadoll"]},{hero:I.Hero.Dorinthea,nicknames:["dori"]},{hero:I.Hero.Genis,nicknames:["genis"]},{hero:I.Hero.GravyBones,nicknames:["gravy"]},{hero:I.Hero.Iyslander,nicknames:["islander"]}],wr=Object.values(I.Hero).map(e=>{let r=Pr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(T,"");return r?{...r,hero:t}:{hero:t}}),re=["common","rare","super rare","majestic","legendary","fabled"],kr=(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 re)o?i.push(n):n===s&&(o=!0,i.push(n));break}case">":{let o=!1;for(let n of re)o?i.push(n):n===s&&(o=!0);break}case"<=":{let o=!1;for(let n of re.slice().reverse())o?i.push(n):n===s&&(o=!0,i.push(n));break}case"<":{let o=!1;for(let n of re.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(g=>({hero:g.toLowerCase().replaceAll(T,"")})),o=[],n=[],c=[];for(let g of e){let f=Sr.find(({format:m,nicknames:M})=>m===g||!!M&&M.includes(g));if(f)n.push(f.format);else{let m=wr.find(({hero:M,nicknames:x})=>M===g||!!x&&x.includes(g))||s.find(({hero:M})=>M===g);m&&c.push(m.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:"legalHeroes",isArray:!0},values:c,isOr:!0,isExcluded:r,isOptional:t}),o},Ir=(e,r,t,a)=>De(e,r,t,a,"bannedFormats"),he=(e,r,t,a,i,s)=>{let o=[];return Lr(t)?o.push(...De(a,e,r,s)):Nr(t)?o.push(...Ir(a,e,r,s)):Or(t)&&o.push(kr(a,i,e,r)),o},_=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:ie},{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:ie},{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"]}],te=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:ie},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],z=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:ie},{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"]}],ae=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(I.Talent).map(e=>e.toLowerCase())}],Br={"!co":_,"-co":_,"!cost":_,"-cost":_,"!color":_,"-color":_,"!b":G,"-b":G,"!block":G,"-block":G,"!d":G,"-d":G,"!def":G,"-def":G,"!defense":G,"-defense":G,"!pitch":te,"-pitch":te,"!p":te,"-p":te,"!attack":z,"-attack":z,"!power":z,"-power":z,"!pwr":z,"-pwr":z,"!pow":z,"-pow":z,"!talents":ae,"-talents":ae,"!tal":ae,"-tal":ae},Ce=e=>{let r=[],t=Br[e];return t&&r.push(...t),r},Rr=["l","legal","hero"],Lr=e=>Rr.includes(e),Er=["banned"],Nr=e=>Er.includes(e),Dr=["r","rarity"],Or=e=>Dr.includes(e);var O=require("@flesh-and-blood/types"),be=[{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"]}],me=be.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)})),Te=be.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=>J(e.toLowerCase().trim().replace(T,"")),J=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,""),Y=e=>e.replace(ge,"");var q=require("@flesh-and-blood/types");var Oe=new WeakMap,K=Object.freeze([]),Hr=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},Vr=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},Gr=e=>{let r,t,a,i,s,o=()=>{if(!r){let l=new Map,u=new Map,p=[],y=new Map,b=0;for(let B of e){l.set(B.cardIdentifier,B),u.set(B.cardIdentifier,b),b++;let A=$(B.name),E=y.get(A);E?E.push(B):(y.set(A,[B]),p.push(A))}r={cardByCardIdentifier:l,corpusPositionByCardIdentifier:u,cleanedNames:p,pitchCycleByCleanedName:y}}return r},n=l=>{let{corpusPositionByCardIdentifier:u}=o(),p=({cardIdentifier:y})=>u.get(y)??Hr;return[...l].sort((y,b)=>p(y)-p(b))},c=l=>o().cardByCardIdentifier.get(l),F=l=>{let{cardByCardIdentifier:u}=o(),p=[];for(let y of l||[]){let b=u.get(y);b&&p.push(b)}return n(p)},g=l=>{let u=new Map;return p=>{let y=u.get(p);if(!y){let b=c(p),B=F(b&&l(b)),A=B.length>0;y=A?B:K,A&&u.set(p,y)}return y}},f=l=>{let{pitchCycleByCleanedName:u}=o(),p=c(l);return p?u.get($(p.name))??K:K},m=l=>{let{cleanedNames:u,pitchCycleByCleanedName:p}=o(),y=$(l),b=p.get(y);if(!b&&y.length>0){let A=u.find(E=>E.includes(y));A&&(b=p.get(A))}return b??K},M=l=>{let{pitchCycleByCleanedName:u}=o();return u.get($(l))??K},x=()=>{if(!s){let l=new Set;for(let u of e)for(let p of u.artists)l.add(p);s=[...l].sort((u,p)=>u.localeCompare(p,"en",{sensitivity:"base"}))}return s},R=g(({oppositeSideCardIdentifiers:l})=>l),W=g(({referencedCards:l})=>l),P=l=>(t||(t=He(e,({referencedCards:u})=>u)),t.get(l)??K),w=g(({createdExtras:l})=>l);return{cards:e,getCard:c,getPitchCycle:f,getCardsByName:m,getCardsByExactName:M,getArtists:x,getOppositeSide:R,getReferences:W,getReferencedBy:P,getCreates:w,getCreatedBy:l=>(a||(a=He(e,({createdExtras:u})=>u)),a.get(l)??K),getCreatedClosure:l=>{let u=new Map,p=new Set,y=[...l];for(let b of y)if(!p.has(b)){p.add(b);for(let A of w(b))u.set(A.cardIdentifier,A),y.push(A.cardIdentifier)}return n([...u.values()])},getByRole:l=>(i||(i=Vr(e)),i.get(l)??K),getCardsInCorpusOrder:n}},Me=e=>{let r=Oe.get(e);return r||(r=Gr(e),Oe.set(e,r)),r},Fe=(e,r)=>e.getPitchCycle(r.cardIdentifier),se=(e,r)=>e.getCardsByName(r),Ve=(e,r)=>{let t=new Map;for(let a of r)for(let i of Fe(e,a))t.set(i.cardIdentifier,i);return e.getCardsInCorpusOrder([...t.values()])},oe=(e,r)=>{let t=[];for(let a of Fe(e,r))t.push(...e.getReferencedBy(a.cardIdentifier));return Ve(e,t)},ne=(e,r)=>{let t=[];for(let a of Fe(e,r))t.push(...e.getReferences(a.cardIdentifier));return Ve(e,t)};var cr=[">=",">","<=","<"],pr=["!","-"],Wr={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},ve={property:"artists",isArray:!0,partialMatch:!0},Ge={property:"n/a",isMeta:!0},We={property:"bonds",isArray:!0},Ur={property:"cardIdentifier",isString:!0,isNormalized:!0},Ue=(e,{isAnd:r,isExcluded:t,isOptional:a,modifier:i})=>({filterToPropertyMapping:Ur,values:[...e],valuesSet:e,isAnd:r,isOr:!0,modifier:i,isExcluded:t,isOptional:a}),zr={property:"n/a"},ze={property:"classes",isArray:!0,partialMatch:!0},Ke={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},Q={property:"defense",specialProperty:"specialDefense",isNumber:!0},je={property:"flows",isArray:!0},qe={nestedProperty:"foiling",property:"printings",isArray:!0},_e={property:"fusions",isArray:!0},$e={property:"intellect",isNumber:!0},Ye={property:"keywords",isArray:!0},Ae={property:"n/a",isMeta:!0},Je={property:"life",specialProperty:"specialLife",isNumber:!0},we={property:"meta",isArray:!0},Qe={property:"name",isString:!0,partialMatch:!0},xe={property:"pitch",isNumber:!0},Xe={property:"firstReleaseDate",isDate:!0},le={property:"power",specialProperty:"specialPower",isNumber:!0},Kr={property:"setIdentifiers",isArray:!0,partialMatch:!0},Ze={property:"n/a",isMeta:!0},jr={property:"n/a"},qr={property:"n/a"},er={property:"sets",isArray:!0,partialMatch:!0},Se={property:"shorthands",isArray:!0,partialMatch:!0},de={property:"specializations",isArray:!0,partialMatch:!0},rr={property:"subtypes",isArray:!0},tr={property:"types",isArray:!0},ar={property:"talents",isArray:!0},_r={property:"functionalText",hasMarkup:!0,isString:!0,partialMatch:!0},$r={property:"traits",isArray:!0,partialMatch:!0},Yr={property:"typeText",isString:!0,partialMatch:!0},ce={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},Jr={property:"firstReleaseDate",isString:!0,partialMatch:!0},Ie={arcane:Wr,a:ve,artist:ve,art:ve,attack:le,b:Q,block:Q,banned:Ge,bond:We,bonds:We,c:ze,class:ze,chain:zr,co:Ke,cost:Ke,color:xe,d:Q,def:Q,defense:Q,flow:je,flows:je,f:_e,fusion:_e,foil:qe,foiling:qe,i:$e,intellect:$e,is:we,k:Ye,keyword:Ye,l:Ae,legal:Ae,hero:Ae,li:Je,life:Je,meta:we,n:Qe,name:Qe,p:xe,pitch:xe,pwr:le,pow:le,power:le,print:Kr,r:Ze,rarity:Ze,referencedby:jr,references:qr,rf:Ge,s:er,set:er,short:Se,shorthand:Se,shorthands:Se,sp:de,spec:de,specialization:de,specializations:de,st:rr,subtype:rr,t:tr,type:tr,tal:ar,talent:ar,text:_r,trait:$r,treat:ce,treatment:ce,var:ce,variation:ce,x:Yr,year:Jr},Qr=[{text:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(T,"")}],Xr=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:s}of Qr)t.includes(i)&&(t=t.replace(i,s));if(ee(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},Zr=20,Be=(e,r,t=[],a=[],i=ot())=>{let s=e.trim().toLowerCase();for(let{expanded:P,shorthands:w}of me)for(let h of w)if(s.includes(h)){s=s.replace(h,P.join(" "));break}for(let[P,w]of Object.entries(d.setToSetIdentifierMappings))s.includes(P.toLowerCase())&&(s=s.replace(P.toLowerCase(),w[0]));let o=Xr(s),n=[];for(let P of o){let w=Te.find(({shorthands:h})=>h.includes(P));w&&!w.isCardProperty?n.push(...w.expanded):n.push(P)}let c=[],F=[],g=[],f=[],m=!1,M=[],x=[],R=[],W=[];for(let P of n)if(ft(P)){let[w,h]=P.split(":"),{modifier:D,values:C,isAnd:l,isOr:u}=pt(h),{filterKey:p,isExcluded:y,isOptional:b,isMeta:B}=ut(w),A=!1;if(B){if(["rarity","r"].includes(p)){let E=ct(C);y||(x=[...E]),C=E.map(S=>S.toLowerCase())}["legal","l","hero"].includes(p),c.push(...he(y,b,p,C,D,t))}else{if(["chain"].includes(p)){let S=new Set,L=[],H=new Set,V=k=>{S.add(k.cardIdentifier),H.has(k.name)||(H.add(k.name),L.push(k))},j=k=>{k.types.includes(d.Type.Hero)||V(k)};for(let k of C)if(k)for(let N of se(r,k))V(N);let U=0;for(let k of L){if(U>Zr)break;for(let fe of ne(r,k))j(fe);if(U===0)for(let fe of oe(r,k))j(fe);U++}c.push(Ue(S,{isAnd:l,isExcluded:y,isOptional:b,modifier:D})),A=!0}else if(["referencedby","references"].includes(p)){let S=["referencedby"].includes(p),L=new Set;for(let H of C)if(H)for(let V of se(r,H)){let j=S?ne(r,V):oe(r,V);for(let U of j)L.add(U.cardIdentifier)}c.push(Ue(L,{isAnd:l,isExcluded:y,isOptional:b,modifier:D})),A=!0}else if(["art","artist"].includes(p))F=C;else if(["print","prints","printing","printings"].includes(p))M=C;else if(["is","meta"].includes(p)){let S=[],L=[],H=[],V=[];for(let N of C)at.includes(N)?S.push(N):it.includes(N)?L.push(N):st.includes(N)?H.push(N):V.push(N);S.length>0&&(c.push({filterToPropertyMapping:we,values:[d.Meta.Reprint.toLowerCase().replaceAll(T,"")],isAnd:l,isOr:u,isExcluded:!y,isOptional:b}),A=V.length===0);let j=L.length>0;j&&c.push({filterToPropertyMapping:Xe,values:[i],isAnd:l,isOr:u,isExcluded:y,isOptional:b});let U=H.length>0;U&&c.push({filterToPropertyMapping:Xe,values:[i],isAnd:l,isOr:u,isExcluded:!y,isOptional:b}),(j||U)&&(A=V.length===0);let k=nt(V);C=k.map(N=>N.toLowerCase().replaceAll(T,"")),k.includes(d.Meta.Expansion)&&!y&&(m=!0)}else["foiling","foil"].includes(p)?(f=lt(C),C=f.map(S=>S.toLowerCase())):["treat","treatment","var","variation"].includes(p)?(W=dt(C),C=W.map(S=>S.toLowerCase())):["set","s"].includes(p)?(R=et(C,a),C=R.map(S=>S.toLowerCase().replaceAll(T,""))):["pitch","p","color"].includes(p)&&(C=tt(C));let E=Ie[p];E&&!A&&c.push({filterToPropertyMapping:E,values:E.hasMarkup?C.map(S=>Y(S)):C,isAnd:l,isOr:u,modifier:D,isExcluded:y,isOptional:b})}}else if(P){let w=ee(P)?.card,h=Ce(P);w?g.push(`"${w.toLowerCase().replace(T,"")}"`):h&&h.length>0?c.push(...h):g.push(P.replace(T,""))}return{appliedFilters:c,attributes:{artists:F,foilings:f,isExpansionSlot:m,prints:M,rarities:x,releases:R,treatments:W},keywords:g}},et=(e,r=[])=>{let t=[];for(let a of e)t.push(...rt(a,r));return t},rt=(e,r=[])=>{let t=[],a=Object.values(d.Release).find(i=>i.toLowerCase().replaceAll(T,"")===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(T,"")===e);i&&t.push(i)}return t},Pe={purple:4,blue:3,yellow:2,red:1,white:0},tt=e=>{let r=[];for(let t of e)Pe[t]||Pe[t]===0?r.push(Pe[t].toString()):r.push(t);return r},at=["unique"],it=["preview","spoiler","unreleased"],st=["released"],ot=()=>{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},nt=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},lt=e=>{let r=[];for(let t of e)sr[t]&&r.push(sr[t]);return r},or={...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},dt=e=>{let r=[];for(let t of e)or[t]?r.push(or[t]):d.Treatment[t.toUpperCase()]&&r.push(d.Treatment[t.toUpperCase()]);return r},ke={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},ct=e=>{let r=[];for(let t of e)ke[t]?r.push(ke[t]):r.push(t);return r},pt=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(T,"")))):lr(s)?(a=!0,r.push(...s.trim().split(",").map(o=>o.replace(T,"")))):r.push(s.trim().replace(T,""))}else nr(e)?(t=!0,r.push(...e.trim().split("+").map(s=>s.replace(T,"")))):lr(e)?(a=!0,r.push(...e.trim().split(",").map(s=>s.replace(T,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(T,"")):r.push(e.trim().replace(T,""));return{modifier:i,values:r,isAnd:t,isOr:a}},ut=e=>{let r=gt(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)}},ft=e=>e.indexOf(":")>=0,nr=e=>e.indexOf("+")>=0,lr=e=>e.indexOf(",")>=0,dr=e=>!!Ie[e]?.isMeta,gt=e=>pr.find(r=>e.includes(r))?.slice(0,1);var v=require("@flesh-and-blood/types"),ur={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"},fr=[{keyword:ur.name.toLowerCase(),card:ur}];var yt={getFn:(e,r)=>{let t=Le.default.config.getFn(e,r),a=t;if(Array.isArray(t))a=t.map(i=>J(i.replace(T,"")));else if(t){let i=J(t).replace(T,"");a=r.includes("functionalText")?Y(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},Re=class{constructor(r,t=[],a=[],i=!1){this.getFuse=()=>(this.fuse||(this.fuse=new Le.default(this.cards,yt)),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?fr.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&&yr(h,i))),o.length===0){let h="";if(s.releases.length===1)try{let l=s.releases[0];h=pe.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];pe.setIdentifierToSetMappings[l]&&(h=l.toUpperCase())}catch(l){console.error("Error getting set identifier from search",l)}h?a.sort((l,u)=>{let p=l.setIdentifiers.find(b=>b.includes(h))?.replace(h,""),y=u.setIdentifiers.find(b=>b.includes(h))?.replace(h,"");return p&&y?p.localeCompare(y):-1}):a.sort((l,u)=>l.name===u.name?`${l.pitch}`.localeCompare(`${u.pitch}`):l.name.localeCompare(u.name))}else{let h=[],D=[],C=o.map(l=>l.toLowerCase().replace(T,"")).join(" ");for(let l of a)l.name.toLowerCase().replace(T,"")===C?h.push(l):D.push(l);a=[...h,...D]}let F,{artists:g,isExpansionSlot:f,foilings:m,prints:M,rarities:x,releases:R,treatments:W}=s;(g.length>0||f||m.length>0||M.length>0||x.length>0||R.length>0||W.length>0)&&(F=a.map(h=>{let D=h.printings.filter(C=>{let l=!!C.image,u=g.length===0||g.some(L=>C.artists.find(H=>H.replace(T,"").toLowerCase().includes(L))),p=!f||f===C.isExpansionSlot,y=m.length===0||m.includes(C.foiling),b=M.length===0||M.some(L=>C.identifier.includes(L.toUpperCase())),B=x.length===0||x.includes(C.rarity),A=R.length===0||R.includes(C.set),E=W.length===0||C.treatments?.some(L=>W.includes(L));return l&&u&&p&&y&&b&&B&&A&&E});return{...h,matchingPrintings:D}}));let w=F?.length>0?F:a;return{appliedFilters:i,attributes:s,keywords:o,searchResults:w}};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||Me(r)}},gr=Re,yr=(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:g}=i.filterToPropertyMapping;if(o){let f=ht(e,i);s?f&&(a=!0):t=t&&f}else if(n){let f=Ct(e,i);s?f&&(a=!0):t=t&&f}else if(c){let f=bt(e,i,r);s?f&&(a=!0):t=t&&f}else if(F){let f=mt(e,i);s?f&&(a=!0):t=t&&f}else if(g){let f=Tt(e,i);s?f&&(a=!0):t=t&&f}}return t},ht=(e,r)=>{if(X(r,e)){let{values:t,modifier:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=ue(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=Ft(e,r)?.toLowerCase(),c=s?t?.some(F=>n?.includes(F)):t?.some(F=>n===F);return i?!c:c}}else return!0},Ct=(e,r)=>{if(X(r,e)){let{values:t,valuesSet:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{hasMarkup:o,isNormalized:n,partialMatch:c}}=r,F=ue(e,r),g=n?F:F?.replaceAll(T,"").toLowerCase(),f=o&&g?Y(g):g;if(c){let m=i?t?.every(M=>f?.includes(M)):t?.some(M=>f?.includes(M));return s?!m:m}else{let m;return i?m=t?.every(M=>f===M):a?m=a.has(f):m=t?.some(M=>f===M),s?!m:m}}else return!0},bt=(e,r,t)=>{if(X(r,e)){let{values:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{partialMatch:o}}=r,n=Mt(e,r,t).map(c=>c?.replaceAll(T,""));if(o){let c=i?a.every(g=>n?.some(f=>f?.toLowerCase().includes(g))):a.some(g=>n?.some(f=>f?.toLowerCase().includes(g))),F=n.length===0;return s?!c||F:c}else{let c=i?a.every(F=>n?.some(g=>g?.toLowerCase()===F)):a.some(F=>n?.some(g=>g?.toLowerCase()===F));return s?!c:c}}else return!0},mt=(e,r)=>{if(X(r,e)){let{isExcluded:t}=r,a=ue(e,r);return t?!a:a}else return!0},Tt=(e,r)=>{if(X(r,e)){let{values:t,isExcluded:a}=r,i=ue(e,r),s=t?.some(o=>i>o);return a?!s:s}else return!0},ue=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.property]},Mt=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i,property:s}}=r,o=e[s]||[],n=[],c=Object.keys(e.legalOverrides||{}).length>0,F=r.filterToPropertyMapping.property==="legalHeroes",g=t.find(({filterToPropertyMapping:m})=>m.property==="legalFormats");if(c&&F&&!!g){let m=new Set;for(let{format:M,heroes:x}of e.legalOverrides||[])if(g.values.includes(M.toLowerCase()))for(let R of x)m.add(R);n=Array.from(m)}if(n.length===0)if(i){let m=new Set;for(let M of o)if(a){let x=M[i]||[];for(let R of x)m.add(R)}else{let x=M[i];x&&m.add(x)}n=Array.from(m)}else n=o;return n},Ft=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.specialProperty]},X=({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 vt=(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},At=(e,r)=>{let t=new Set(e?.referencedCards),a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a},xt=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},St=(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,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});
@@ -20,6 +20,17 @@ export interface CatalogueIndex<CardType extends DoubleSidedCard = DoubleSidedCa
20
20
  * resolves to one card.
21
21
  */
22
22
  getCardsByName: (name: string) => readonly CardType[];
23
+ /**
24
+ * Every pitch of the named card, the name matched whole. Answers "resolve
25
+ * this exact name" where `getCardsByName` answers "search for this name", so
26
+ * a fragment of a name the corpus carries finds nothing.
27
+ */
28
+ getCardsByExactName: (name: string) => readonly CardType[];
29
+ /**
30
+ * Every artist the corpus credits, each once, ordered by the `en` locale
31
+ * ignoring case and diacritics so a browser and a server agree on the list.
32
+ */
33
+ getArtists: () => readonly string[];
23
34
  /** The cards the card is printed on the back of. */
24
35
  getOppositeSide: (cardIdentifier: string) => readonly CardType[];
25
36
  /** The cards the card names. */
@@ -43,6 +43,7 @@ const getNewCatalogueIndex = (cards) => {
43
43
  let referencingCardsByCardIdentifier;
44
44
  let creatingCardsByCardIdentifier;
45
45
  let cardsByRole;
46
+ let artists;
46
47
  const getCardLookups = () => {
47
48
  if (!cardLookups) {
48
49
  const cardByCardIdentifier = /* @__PURE__ */ new Map();
@@ -127,6 +128,24 @@ const getNewCatalogueIndex = (cards) => {
127
128
  }
128
129
  return pitchCycle ?? noCards;
129
130
  };
131
+ const getCardsByExactName = (name) => {
132
+ const { pitchCycleByCleanedName } = getCardLookups();
133
+ return pitchCycleByCleanedName.get(getCleanText(name)) ?? noCards;
134
+ };
135
+ const getArtists = () => {
136
+ if (!artists) {
137
+ const creditedArtists = /* @__PURE__ */ new Set();
138
+ for (const card of cards) {
139
+ for (const artist of card.artists) {
140
+ creditedArtists.add(artist);
141
+ }
142
+ }
143
+ artists = [...creditedArtists].sort(
144
+ (first, second) => first.localeCompare(second, "en", { sensitivity: "base" })
145
+ );
146
+ }
147
+ return artists;
148
+ };
130
149
  const getOppositeSide = getNamedCardsReader(
131
150
  ({ oppositeSideCardIdentifiers }) => oppositeSideCardIdentifiers
132
151
  );
@@ -182,6 +201,8 @@ const getNewCatalogueIndex = (cards) => {
182
201
  getCard,
183
202
  getPitchCycle,
184
203
  getCardsByName: getCardsByName2,
204
+ getCardsByExactName,
205
+ getArtists,
185
206
  getOppositeSide,
186
207
  getReferences,
187
208
  getReferencedBy,
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.1",
4
+ "version": "5.0.2",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "dist/index.cjs",
@@ -46,7 +46,7 @@
46
46
  "@flesh-and-blood/types": "^5.0.0"
47
47
  },
48
48
  "devDependencies": {
49
- "@flesh-and-blood/cards": "^5.0.1",
49
+ "@flesh-and-blood/cards": "^5.0.2",
50
50
  "@flesh-and-blood/types": "^5.0.0",
51
51
  "@types/jest": "^29.5.11",
52
52
  "@types/node": "^20.10.5",
@@ -77,5 +77,5 @@
77
77
  "FAB",
78
78
  "FABTCG"
79
79
  ],
80
- "gitHead": "7cc77e876fc187163ab15640b2452557d6a571c2"
80
+ "gitHead": "1c9dd1609d17840a90328f199a3d2129ab1438ee"
81
81
  }