@flesh-and-blood/search 4.0.11 → 4.0.13

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
@@ -321,9 +321,9 @@ const getKeywordsAndAppliedFiltersFromText = (text, cards, additionalHeroes = []
321
321
  searchCriteria.push(criteria);
322
322
  }
323
323
  }
324
- let appliedFilters = [];
324
+ const appliedFilters = [];
325
325
  let artists = [];
326
- let keywords = [];
326
+ const keywords = [];
327
327
  let foilings = [];
328
328
  let isExpansionSlot = false;
329
329
  let prints = [];
@@ -362,7 +362,7 @@ const getKeywordsAndAppliedFiltersFromText = (text, cards, additionalHeroes = []
362
362
  const names = new Set(relatedCardNames);
363
363
  filterKey = "name";
364
364
  isOr = true;
365
- let limit = 20;
365
+ const limit = 20;
366
366
  let counter = 0;
367
367
  const addToSetAndRelated = (card) => {
368
368
  if (!card.types.includes(Type.Hero)) {
@@ -545,7 +545,7 @@ const getMetaValuesFromText = (rawValues) => {
545
545
  for (const rawValue of rawValues) {
546
546
  if (metaValuesMapping[rawValue]) {
547
547
  values.push(metaValuesMapping[rawValue]);
548
- } else if (!!Meta[rawValue]) {
548
+ } else if (Meta[rawValue]) {
549
549
  values.push(Meta[rawValue]);
550
550
  }
551
551
  }
@@ -609,7 +609,7 @@ const getTreatmentValuesFromText = (rawValues) => {
609
609
  for (const rawValue of rawValues) {
610
610
  if (treatmentValuesMapping[rawValue]) {
611
611
  values.push(treatmentValuesMapping[rawValue]);
612
- } else if (!!Treatment[rawValue.toUpperCase()]) {
612
+ } else if (Treatment[rawValue.toUpperCase()]) {
613
613
  values.push(Treatment[rawValue.toUpperCase()]);
614
614
  }
615
615
  }
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var pr=Object.create;var _=Object.defineProperty;var dr=Object.getOwnPropertyDescriptor;var ur=Object.getOwnPropertyNames;var fr=Object.getPrototypeOf,gr=Object.prototype.hasOwnProperty;var hr=(e,r)=>{for(var t in r)_(e,t,{get:r[t],enumerable:!0})},we=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of ur(r))!gr.call(e,i)&&i!==t&&_(e,i,{get:()=>r[i],enumerable:!(a=dr(r,i))||a.enumerable});return e};var mr=(e,r,t)=>(t=e!=null?pr(fr(e)):{},we(r||!e||!e.__esModule?_(t,"default",{value:e,enumerable:!0}):t,e)),br=e=>we(_({},"__esModule",{value:!0}),e);var pt={};hr(pt,{FilterProperty:()=>ke,PUNCTUATION:()=>f,RARITY_VALUES_MAPPING:()=>ve,abbreviations:()=>le,availableExclusions:()=>tr,availableModifiers:()=>rr,default:()=>sr,filterCard:()=>or,filtersToCardPropertyMappings:()=>ie,getAbbreviation:()=>Y,getAbbreviationByCard:()=>yr,getCardByName:()=>he,getCleanText:()=>ge,getExcludedMetaFilters:()=>pe,getKeywordsAndAppliedFiltersFromText:()=>Te,getMetaFilters:()=>ce,getNormalizedText:()=>j,getRelatedCards:()=>me,getRelatedCardsByName:()=>X,getTokensReferencedByCards:()=>Or,multiWordShorthands:()=>ue,shorthands:()=>de,singleWordShorthands:()=>fe});module.exports=br(pt);var ae=require("@flesh-and-blood/types"),Ae=mr(require("fuse.js"),1);var f=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g;var l=require("@flesh-and-blood/types");var Y=e=>le.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),yr=e=>le.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),le=[{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 A=require("@flesh-and-blood/types");var ke=(a=>(a.BannedFormats="bannedFormats",a.LegalFormats="legalFormats",a.LegalHeroes="legalHeroes",a))(ke||{}),Z=Array.from(Array(50).keys()).map(e=>`${e}`),Cr=[{format:A.Format.ClassicConstructed,nicknames:["cc","classic"]},{format:A.Format.LivingLegend,nicknames:["cc ll","classic constructed ll","ll cc","ll","living legend"]},{format:A.Format.SilverAge,nicknames:["sage"]},{format:A.Format.GoldenAge,nicknames:["gage"]},{format:A.Format.UltimatePitFight,nicknames:["upf"]}],Fr=Object.values(A.Format).map(e=>{let r=Cr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(f,"");return r?{...r,format:t}:{format:t}}),Mr=[{hero:A.Hero.DataDoll,nicknames:["data","datadoll"]},{hero:A.Hero.Dorinthea,nicknames:["dori"]},{hero:A.Hero.Genis,nicknames:["genis"]},{hero:A.Hero.GravyBones,nicknames:["gravy"]},{hero:A.Hero.Iyslander,nicknames:["islander"]}],vr=Object.values(A.Hero).map(e=>{let r=Mr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(f,"");return r?{...r,hero:t}:{hero:t}}),$=["common","rare","super rare","majestic","legendary","fabled"],Tr=(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 $)o?i.push(n):n===s&&(o=!0,i.push(n));break;case">":let c=!1;for(let n of $)c?i.push(n):n===s&&(c=!0);break;case"<=":let p=!1;for(let n of $.slice().reverse())p?i.push(n):n===s&&(p=!0,i.push(n));break;case"<":let u=!1;for(let n of $.slice().reverse())u?i.push(n):n===s&&(u=!0);break;default:break}return{filterToPropertyMapping:{nestedProperty:"rarity",property:"printings",isArray:!0},isExcluded:t,isOptional:a,isOr:!0,values:i}},Se=(e,r,t,a,i)=>{let s=a.map(n=>({hero:n.toLowerCase().replaceAll(f,"")})),o=[],c=[],p=[];for(let n of e){let d=Fr.find(({format:h,nicknames:C})=>h===n||!!C&&C.includes(n));if(d)c.push(d.format);else{let h=vr.find(({hero:C,nicknames:F})=>C===n||!!F&&F.includes(n))||s.find(({hero:C})=>C===n);h&&p.push(h.hero)}}let u=i||"legalFormats";return c.length>0&&o.push({filterToPropertyMapping:{property:u,isArray:!0},values:c,isOr:!0,isExcluded:r,isOptional:t}),p.length>0&&o.push({filterToPropertyMapping:{property:"legalHeroes",isArray:!0},values:p,isOr:!0,isExcluded:r,isOptional:t}),o},Ar=(e,r,t,a)=>Se(e,r,t,a,"bannedFormats"),ce=(e,r,t,a,i,s)=>{let o=[];return wr(t)?o.push(...Se(a,e,r,s)):Sr(t)?o.push(...Ar(a,e,r,s)):Rr(t)&&o.push(Tr(a,i,e,r)),o},U=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:Z},{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"]}],I=[{filterToPropertyMapping:{property:"defense",isNumber:!0},isExcluded:!0,values:Z},{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"]}],J=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],G=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:Z},{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"]}],Q=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(A.Talent).map(e=>e.toLowerCase())}],xr={"!co":U,"-co":U,"!cost":U,"-cost":U,"!color":U,"-color":U,"!b":I,"-b":I,"!block":I,"-block":I,"!d":I,"-d":I,"!def":I,"-def":I,"!defense":I,"-defense":I,"!pitch":J,"-pitch":J,"!p":J,"-p":J,"!attack":G,"-attack":G,"!power":G,"-power":G,"!pwr":G,"-pwr":G,"!pow":G,"-pow":G,"!talents":Q,"-talents":Q,"!tal":Q,"-tal":Q},pe=e=>{let r=[],t=xr[e];return t&&r.push(...t),r},Pr=["l","legal","hero"],wr=e=>Pr.includes(e),kr=["banned"],Sr=e=>kr.includes(e),Lr=["r","rarity"],Rr=e=>Lr.includes(e);var N=require("@flesh-and-blood/types"),de=[{description:"Attack actions",expanded:["st:attack"],filters:{subtypes:[N.Subtype.Attack]},isCardProperty:!1,shorthands:["AA"]},{description:"Arcane barrier",expanded:['k:"arcane barrier"'],filters:{keywords:[N.Keyword.ArcaneBarrier]},isCardProperty:!1,shorthands:["AB"]},{description:"Attack reactions",expanded:['t:"attack reaction"'],filters:{types:[N.Type.AttackReaction]},isCardProperty:!1,shorthands:["AR"]},{description:"Defense reactions",expanded:['t:"defense reaction"'],filters:{types:[N.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:[N.Keyword.GoAgain]},isCardProperty:!1,shorthands:["GA"]},{description:"Non-attack actions",expanded:["t:action","st:non-attack"],filters:{subtypes:[N.Subtype.NonAttack],types:[N.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:[N.Keyword.Spellvoid]},isCardProperty:!1,shorthands:["SV"]}],ue=de.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=de.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 he=(e,r)=>{let t=r.find(a=>ge(a.name)===e);return t||(t=r.find(a=>ge(a.name).includes(e))),t},ge=e=>j(e.toLowerCase().trim().replace(f,"")),j=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,"");var K=require("@flesh-and-blood/types");var z=require("@flesh-and-blood/types"),Br={"Dawnblade, Resplendent":"Dawnblade"},Le=e=>Br[e.name]||e.name,Re=e=>e.functionalText?.replaceAll(e.name,""),X=(e,r)=>{let t=r.find(a=>a.name.toLowerCase().replace(f,"")===e);return t||(t=r.find(a=>a.name.toLowerCase().replace(f,"").includes(e))),me(t,r)},me=(e,r)=>{let t={},a={},i={};if(e){let p=[],u=[],n=Le(e);for(let d of r){let h=Le(d),C=n===h,F=e.cardIdentifier!==d.cardIdentifier,w=e.pitch!==d.pitch;if(C&&F&&w)t[d.cardIdentifier]=d;else if(!C){let T=e.name==="Seismic Surge",x=d.keywords?.includes(z.Keyword.Heave),k=T&&x,y=e.name==="Marked",g=d.keywords?.includes(z.Keyword.Mark),P=y&&g,m=Re(d),b=m?.includes(n)||e.traits?.some(ne=>m?.includes(ne)),S=Re(e);(b||k||P)&&p.push(d);let H=new RegExp(h,"g"),D=new RegExp(`\\*\\*${h}\\*\\*`,"g"),v=S?.match(H)||[],L=S?.match(D)||[],E=v.length===L.length,W=S?.includes(h)&&!E,O=(d.traits||[]).some(ne=>S?.includes(ne)),B=W||O,V=d.name==="Seismic Surge",oe=e.keywords?.includes(z.Keyword.Heave),nr=V&&oe,lr=d.name==="Marked",cr=e.keywords?.includes(z.Keyword.Mark);(B||nr||lr&&cr)&&u.push(d)}}for(let d of p)a[d.cardIdentifier]=d;for(let d of u){let h=d.name;n!==h&&!u.some(C=>{let F=C.name;return F!==h&&F?.includes(h)})&&(i[d.cardIdentifier]=d)}}let s=Object.values(t),o=Object.values(a),c=Object.values(i);return{otherPitches:s,referencedBy:o,references:c}},Nr=["cash-in-yellow"],Er={[K.Hero.Crackni]:{traits:[K.Trait.AgentOfChaos]},[K.Hero.Maxx]:{tokens:["hyper-driver"]}},Or=(e,r,t)=>{let a=new Set;for(let i of e.filter(({cardIdentifier:s})=>!Nr.includes(s))){let{references:s}=me(i,r);for(let o of s.filter(c=>{let p=c.name==="Hyper Driver",u=t===K.Hero.Maxx;return!p||u}))a.add(o)}if(t){let i=Er[t];if(i){if(i.cards)for(let s of e)i.cards?.includes(s.cardIdentifier)&&a.add(s);if(i.tokens)for(let s of r)i.tokens?.includes(s.cardIdentifier)&&a.add(s)}}return Array.from(a)};var rr=[">=",">","<=","<"],tr=["!","-"],Ir={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},be={property:"artists",isArray:!0,partialMatch:!0},Be={property:"n/a",isMeta:!0},Ne={property:"bonds",isArray:!0},Hr={property:"n/a"},Ee={property:"classes",isArray:!0,partialMatch:!0},Oe={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},q={property:"defense",specialProperty:"specialDefense",isNumber:!0},Ie={property:"flows",isArray:!0},He={nestedProperty:"foiling",property:"printings",isArray:!0},De={property:"fusions",isArray:!0},Ge={property:"intellect",isNumber:!0},Ve={property:"keywords",isArray:!0},ye={property:"n/a",isMeta:!0},We={property:"life",specialProperty:"specialLife",isNumber:!0},Ue={property:"meta",isArray:!0},Ke={property:"name",isString:!0,partialMatch:!0},Ce={property:"pitch",isNumber:!0},ee={property:"power",specialProperty:"specialPower",isNumber:!0},Dr={property:"setIdentifiers",isArray:!0,partialMatch:!0},je={property:"n/a",isMeta:!0},Gr={property:"n/a"},Vr={property:"n/a"},ze={property:"sets",isArray:!0,partialMatch:!0},Fe={property:"shorthands",isArray:!0,partialMatch:!0},re={property:"specializations",isArray:!0,partialMatch:!0},qe={property:"subtypes",isArray:!0},_e={property:"types",isArray:!0},Ye={property:"talents",isArray:!0},Wr={property:"functionalText",isString:!0,partialMatch:!0},Ur={property:"traits",isArray:!0,partialMatch:!0},Kr={property:"typeText",isString:!0,partialMatch:!0},te={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},jr={property:"firstReleaseDate",isString:!0,partialMatch:!0},ie={arcane:Ir,a:be,artist:be,art:be,attack:ee,b:q,block:q,banned:Be,bond:Ne,bonds:Ne,c:Ee,class:Ee,chain:Hr,co:Oe,cost:Oe,color:Ce,d:q,def:q,defense:q,flow:Ie,flows:Ie,f:De,fusion:De,foil:He,foiling:He,i:Ge,intellect:Ge,is:Ue,k:Ve,keyword:Ve,l:ye,legal:ye,hero:ye,li:We,life:We,meta:Ue,n:Ke,name:Ke,p:Ce,pitch:Ce,pwr:ee,pow:ee,power:ee,print:Dr,r:je,rarity:je,referencedby:Gr,references:Vr,rf:Be,s:ze,set:ze,short:Fe,shorthand:Fe,shorthands:Fe,sp:re,spec:re,specialization:re,specializations:re,st:qe,subtype:qe,t:_e,type:_e,tal:Ye,talent:Ye,text:Wr,trait:Ur,treat:te,treatment:te,var:te,variation:te,x:Kr,year:jr},zr=[{text:l.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:l.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(f,"")}],qr=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:s}of zr)t.includes(i)&&(t=t.replace(i,s));if(Y(t)?.card)r.push(t);else{let i=t.split(/[ ]+/),s="",o=0;for(let c of i)o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0),o<2&&c.split('"').length===2?(s+=" "+c,o++):o===0&&s===""?r.push(c):o===1&&(s+=" "+c);o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0)}return r},Te=(e,r,t=[],a=[])=>{let i=e.trim().toLowerCase();for(let{expanded:T,shorthands:x}of ue)for(let k of x)if(i.includes(k)){i=i.replace(k,T.join(" "));break}for(let[T,x]of Object.entries(l.setToSetIdentifierMappings))i.includes(T.toLowerCase())&&(i=i.replace(T.toLowerCase(),x[0]));let s=qr(i),o=[];for(let T of s){let x=fe.find(({shorthands:k})=>k.includes(T));x&&!x.isCardProperty?o.push(...x.expanded):o.push(T)}let c=[],p=[],u=[],n=[],d=!1,h=[],C=[],F=[],w=[];for(let T of o)if(tt(T)){let[x,k]=T.split(":"),{modifier:y,values:g,isAnd:P,isOr:m}=et(k),{filterKey:b,isExcluded:S,isOptional:H,isMeta:D}=rt(x);if(D){if(["rarity","r"].includes(b)){let v=Xr(g);S||(C=[...v]),g=v.map(L=>L.toLowerCase())}["legal","l","hero"].includes(b),c.push(...ce(S,H,b,g,y,t))}else{if(["chain"].includes(b)){let v=B=>B.name.toLowerCase().replaceAll(f,""),L=g.map(B=>he(B,r)).filter(B=>!!B).map(v),E=new Set(L);b="name",m=!0;let W=20,R=0,O=B=>{if(!B.types.includes(l.Type.Hero)){let V=v(B);E.add(V),L.includes(V)||L.push(V)}};for(let B of L){if(R>W)break;let{referencedBy:V,references:oe}=X(B,r);oe.forEach(O),R===0&&V.forEach(O),R++}g=Array.from(E)}else if(["referencedby","references"].includes(b)){let v=b,L=[...g].filter(E=>!!E);g=[],b="name",m=!0;for(let E of L){let{referencedBy:W,references:R}=X(E,r);["referencedby"].includes(v)?g.push(...R.map(({name:O})=>O.toLowerCase().replaceAll(f,""))):["references"].includes(v)&&g.push(...W.map(({name:O})=>O.toLowerCase().replaceAll(f,"")))}}else if(["art","artist"].includes(b))p=g;else if(["print","prints","printing","printings"].includes(b))h=g;else if(["is","meta"].includes(b)){let v=Jr(g);g=v.map(L=>L.toLowerCase().replaceAll(f,"")),v.includes(l.Meta.Expansion)&&!S&&(d=!0)}else["foiling","foil"].includes(b)?(n=Qr(g),g=n.map(v=>v.toLowerCase())):["treat","treatment","var","variation"].includes(b)?(w=Zr(g),g=w.map(v=>v.toLowerCase())):["set","s"].includes(b)?(F=_r(g,a),g=F.map(v=>v.toLowerCase().replaceAll(f,""))):["pitch","p","color"].includes(b)&&(g=$r(g));ie[b]&&c.push({filterToPropertyMapping:ie[b],values:g,isAnd:P,isOr:m,modifier:y,isExcluded:S,isOptional:H})}}else if(T){let x=Y(T)?.card,k=pe(T);x?u.push(`"${x.toLowerCase().replace(f,"")}"`):k&&k.length>0?c.push(...k):u.push(T.replace(f,""))}return{appliedFilters:c,attributes:{artists:p,foilings:n,isExpansionSlot:d,prints:h,rarities:C,releases:F,treatments:w},keywords:u}},_r=(e,r=[])=>{let t=[];for(let a of e)t.push(...Yr(a,r));return t},Yr=(e,r=[])=>{let t=[],a=Object.values(l.Release).find(i=>i.toLowerCase().replaceAll(f,"")===e);if(a&&t.push(a),t.length===0){let i=l.setIdentifierToSetMappings[e];i&&t.push(i)}if(t.length===0){let i=Object.values(l.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(f,"")===e);i&&t.push(i)}return t},Me={blue:3,yellow:2,red:1,white:0},$r=e=>{let r=[];for(let t of e)Me[t]||Me[t]===0?r.push(Me[t].toString()):r.push(t);return r},$e={dual:l.Meta.DualClass,exp:l.Meta.Expansion,expansion:l.Meta.Expansion,expansionSlot:l.Meta.Expansion,rainbow:l.Meta.Rainbow},Jr=e=>{let r=[];for(let t of e)$e[t]?r.push($e[t]):l.Meta[t]&&r.push(l.Meta[t]);if(e.length>0&&r.length===0){for(let t of Object.values(l.Meta))for(let a of e)if(t.toLowerCase().includes(a)){r.push(t);break}}return r},Je={r:l.Foiling.Rainbow,rf:l.Foiling.Rainbow,rainbow:l.Foiling.Rainbow,c:l.Foiling.Cold,cf:l.Foiling.Cold,cold:l.Foiling.Cold,g:l.Foiling.Gold,gf:l.Foiling.Gold,gold:l.Foiling.Gold},Qr=e=>{let r=[];for(let t of e)Je[t]&&r.push(Je[t]);return r},Qe={...Object.values(l.Treatment).reduce((e,r)=>(e[r.toLowerCase()]=r,e),{}),aa:l.Treatment.AA,alt:l.Treatment.AA,"alt art":l.Treatment.AA,ab:l.Treatment.AB,"alt border":l.Treatment.AB,at:l.Treatment.AT,"alt text":l.Treatment.AT,ea:l.Treatment.EA,extended:l.Treatment.EA,"extended art":l.Treatment.EA,fa:l.Treatment.FA,full:l.Treatment.FA,"full art":l.Treatment.FA},Zr=e=>{let r=[];for(let t of e)Qe[t]?r.push(Qe[t]):l.Treatment[t.toUpperCase()]&&r.push(l.Treatment[t.toUpperCase()]);return r},ve={b:l.Rarity.Basic,c:l.Rarity.Common,f:l.Rarity.Fabled,l:l.Rarity.Legendary,m:l.Rarity.Majestic,p:l.Rarity.Promo,r:l.Rarity.Rare,s:l.Rarity.SuperRare,t:l.Rarity.Token,v:l.Rarity.Marvel},Xr=e=>{let r=[];for(let t of e)ve[t]?r.push(ve[t]):r.push(t);return r},et=e=>{let r=[],t,a,i=rr.find(s=>e.includes(s));if(i){let[,s]=e.split(i);Ze(s)?(t=!0,r.push(...s.trim().split("+").map(o=>o.replace(f,"")))):Xe(s)?(a=!0,r.push(...s.trim().split(",").map(o=>o.replace(f,"")))):r.push(s.trim().replace(f,""))}else Ze(e)?(t=!0,r.push(...e.trim().split("+").map(s=>s.replace(f,"")))):Xe(e)?(a=!0,r.push(...e.trim().split(",").map(s=>s.replace(f,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(f,"")):r.push(e.trim().replace(f,""));return{modifier:i,values:r,isAnd:t,isOr:a}},rt=e=>{let r=it(e);if(r){let[,t]=e.split(r);return{filterKey:t,isExcluded:!0,isOptional:!1,isMeta:er(t)}}else return{filterKey:e,isExcluded:!1,isOptional:!1,isMeta:er(e)}},tt=e=>e.indexOf(":")>=0,Ze=e=>e.indexOf("+")>=0,Xe=e=>e.indexOf(",")>=0,er=e=>!!ie[e]?.isMeta,it=e=>tr.find(r=>e.includes(r))?.slice(0,1);var M=require("@flesh-and-blood/types"),ir={artists:["Hoodwill"],cardIdentifier:"fangs-a-lot-blue",classes:[M.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:[M.Hero.Kayo,M.Hero.Levia,M.Hero.Rhinar],printings:[{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000",print:"FNG000",rarity:M.Rarity.Rare,set:M.Release.Promos},{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000_Marvel",print:`FNG000-${M.Treatment.FA}`,rarity:M.Rarity.Marvel,set:M.Release.Promos,treatment:M.Treatment.FA}],name:"Fangs A Lot",rarities:[M.Rarity.Rare,M.Rarity.Marvel],rarity:M.Rarity.Rare,sets:[M.Release.Promos],setIdentifiers:["FNG000"],specialImage:"FNG000_Marvel",subtypes:[M.Subtype.Attack],types:[M.Type.Action],typeText:"Generic Action - Attack"},ar=[{keyword:ir.name.toLowerCase(),card:ir}];var xe=class{constructor(r,t=[],a=[],i=!1){this.log=(r,...t)=>{this.debug&&console.log(r,...t)};this.search=(r,t)=>{let a,{appliedFilters:i,attributes:s,keywords:o}=Te(r,this.cards,this.additionalHeroes,this.additionalSets),c=o.join(" "),p=t?ar.filter(y=>y.keyword===c):[];if(p.length>0?a=p.map(({card:y})=>y):o.length?a=this.fuse.search(c).map(y=>y.item):a=[...this.cards],i.length&&(a=a.filter(y=>y&&or(y,i))),o.length===0){let y="";if(s.releases.length===1)try{let m=s.releases[0];y=ae.setToSetIdentifierMappings[m][0].toUpperCase()}catch(m){console.error("Error getting set identifier from search",m)}if(!y&&s.prints.length===1)try{let m=s.prints[0];ae.setIdentifierToSetMappings[m]&&(y=m.toUpperCase())}catch(m){console.error("Error getting set identifier from search",m)}y?a.sort((m,b)=>{let S=m.setIdentifiers.find(D=>D.includes(y))?.replace(y,""),H=b.setIdentifiers.find(D=>D.includes(y))?.replace(y,"");return S&&H?S.localeCompare(H):-1}):a.sort((m,b)=>m.name===b.name?`${m.pitch}`.localeCompare(`${b.pitch}`):m.name.localeCompare(b.name))}else{let y=[],g=[],P=o.map(m=>m.toLowerCase().replace(f,"")).join(" ");for(let m of a)m.name.toLowerCase().replace(f,"")===P?y.push(m):g.push(m);a=[...y,...g]}let u,{artists:n,isExpansionSlot:d,foilings:h,prints:C,rarities:F,releases:w,treatments:T}=s;(n.length>0||d||h.length>0||C.length>0||F.length>0||w.length>0||T.length>0)&&(u=a.map(y=>{let g=y.printings.filter(P=>{let m=!!P.image,b=n.length===0||n.some(R=>P.artists.find(O=>O.replace(f,"").toLowerCase().includes(R))),S=!d||d===P.isExpansionSlot,H=h.length===0||h.includes(P.foiling),D=C.length===0||C.some(R=>P.identifier.includes(R.toUpperCase())),v=F.length===0||F.includes(P.rarity),L=w.length===0||w.includes(P.set),E=T.length===0||P.treatments?.some(R=>T.includes(R));return m&&b&&S&&H&&D&&v&&L&&E});return{...y,matchingPrintings:g}}));let k=u?.length>0?u:a;return{appliedFilters:i,attributes:s,keywords:o,searchResults:k}};let s={getFn:(o,c)=>{let p=Ae.default.config.getFn(o,c);return p&&(Array.isArray(p)?p.map(u=>j(u.replace(f,""))):j(p).replace(f,""))},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};this.additionalHeroes=t,this.additionalSets=a,this.cards=[...r],this.debug=i,this.fuse=new Ae.default([...r],s)}},sr=xe,or=(e,r)=>{let t=!0,a=!1;for(let i of r){let s=i.isOptional,{isNumber:o,isString:c,isArray:p,isBoolean:u}=i.filterToPropertyMapping;if(o){let n=at(e,i);s?n&&(a=!0):t=t&&n}else if(c){let n=st(e,i);s?n&&(a=!0):t=t&&n}else if(p){let n=ot(e,i,r);s?n&&(a=!0):t=t&&n}else if(u){let n=nt(e,i);s?n&&(a=!0):t=t&&n}}return t},at=(e,r)=>{if(se(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 c=t?.some(d=>o>=parseInt(d));return i?!c:c;case">":let p=t?.some(d=>o>parseInt(d));return i?!p:p;case"<=":let u=t?.some(d=>o<=parseInt(d));return i?!u:u;case"<":let n=t?.some(d=>o<parseInt(d));return i?!n:n;default:return!1}else{let c=t?.some(p=>o===parseInt(p));return i?!c:c}else{let c=ct(e,r)?.toLowerCase(),p=s?t?.some(u=>c?.includes(u)):t?.some(u=>c===u);return i?!p:p}}else return!0},st=(e,r)=>{if(se(r,e)){let{values:t,isAnd:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=Pe(e,r)?.replaceAll(f,"");if(s){let c=a?t?.every(p=>o?.toLowerCase().includes(p)):t?.some(p=>o?.toLowerCase().includes(p));return i?!c:c}else{let c=a?t?.every(p=>o?.toLowerCase()===p):t?.some(p=>o?.toLowerCase()===p);return i?!c:c}}else return!0},ot=(e,r,t)=>{if(se(r,e)){let{values:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{partialMatch:o}}=r,c=lt(e,r,t).map(p=>p?.replaceAll(f,""));if(o){let p=i?a.every(n=>c?.some(d=>d?.toLowerCase().includes(n))):a.some(n=>c?.some(d=>d?.toLowerCase().includes(n))),u=c.length===0;return s?!p||u:p}else{let p=i?a.every(u=>c?.some(n=>n?.toLowerCase()===u)):a.some(u=>c?.some(n=>n?.toLowerCase()===u));return s?!p:p}}else return!0},nt=(e,r)=>{if(se(r,e)){let{isExcluded:t}=r,a=Pe(e,r);return t?!a:a}else return!0},Pe=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.property]},lt=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i,property:s}}=r,o=e[s]||[],c=[],p=Object.keys(e.legalOverrides||{}).length>0,u=r.filterToPropertyMapping.property==="legalHeroes",n=t.find(({filterToPropertyMapping:h})=>h.property==="legalFormats");if(p&&u&&!!n){let h=new Set;for(let{format:C,heroes:F}of e.legalOverrides||[])if(n.values.includes(C.toLowerCase()))for(let w of F)h.add(w);c=Array.from(h)}if(c.length===0)if(i){let h=new Set;for(let C of o)if(a){let F=C[i]||[];for(let w of F)h.add(w)}else{let F=C[i];F&&h.add(F)}c=Array.from(h)}else c=o;return c},ct=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.specialProperty]},se=({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()));0&&(module.exports={FilterProperty,PUNCTUATION,RARITY_VALUES_MAPPING,abbreviations,availableExclusions,availableModifiers,filterCard,filtersToCardPropertyMappings,getAbbreviation,getAbbreviationByCard,getCardByName,getCleanText,getExcludedMetaFilters,getKeywordsAndAppliedFiltersFromText,getMetaFilters,getNormalizedText,getRelatedCards,getRelatedCardsByName,getTokensReferencedByCards,multiWordShorthands,shorthands,singleWordShorthands});
1
+ var pr=Object.create;var _=Object.defineProperty;var dr=Object.getOwnPropertyDescriptor;var ur=Object.getOwnPropertyNames;var fr=Object.getPrototypeOf,gr=Object.prototype.hasOwnProperty;var hr=(e,r)=>{for(var t in r)_(e,t,{get:r[t],enumerable:!0})},we=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of ur(r))!gr.call(e,i)&&i!==t&&_(e,i,{get:()=>r[i],enumerable:!(a=dr(r,i))||a.enumerable});return e};var mr=(e,r,t)=>(t=e!=null?pr(fr(e)):{},we(r||!e||!e.__esModule?_(t,"default",{value:e,enumerable:!0}):t,e)),br=e=>we(_({},"__esModule",{value:!0}),e);var pt={};hr(pt,{FilterProperty:()=>ke,PUNCTUATION:()=>d,RARITY_VALUES_MAPPING:()=>ve,abbreviations:()=>le,availableExclusions:()=>tr,availableModifiers:()=>rr,default:()=>sr,filterCard:()=>or,filtersToCardPropertyMappings:()=>ie,getAbbreviation:()=>Y,getAbbreviationByCard:()=>yr,getCardByName:()=>he,getCleanText:()=>ge,getExcludedMetaFilters:()=>pe,getKeywordsAndAppliedFiltersFromText:()=>Te,getMetaFilters:()=>ce,getNormalizedText:()=>j,getRelatedCards:()=>me,getRelatedCardsByName:()=>X,getTokensReferencedByCards:()=>Or,multiWordShorthands:()=>ue,shorthands:()=>de,singleWordShorthands:()=>fe});module.exports=br(pt);var ae=require("@flesh-and-blood/types"),Ae=mr(require("fuse.js"),1);var d=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g;var l=require("@flesh-and-blood/types");var Y=e=>le.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),yr=e=>le.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),le=[{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 A=require("@flesh-and-blood/types");var ke=(a=>(a.BannedFormats="bannedFormats",a.LegalFormats="legalFormats",a.LegalHeroes="legalHeroes",a))(ke||{}),Z=Array.from(Array(50).keys()).map(e=>`${e}`),Cr=[{format:A.Format.ClassicConstructed,nicknames:["cc","classic"]},{format:A.Format.LivingLegend,nicknames:["cc ll","classic constructed ll","ll cc","ll","living legend"]},{format:A.Format.SilverAge,nicknames:["sage"]},{format:A.Format.GoldenAge,nicknames:["gage"]},{format:A.Format.UltimatePitFight,nicknames:["upf"]}],Fr=Object.values(A.Format).map(e=>{let r=Cr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(d,"");return r?{...r,format:t}:{format:t}}),Mr=[{hero:A.Hero.DataDoll,nicknames:["data","datadoll"]},{hero:A.Hero.Dorinthea,nicknames:["dori"]},{hero:A.Hero.Genis,nicknames:["genis"]},{hero:A.Hero.GravyBones,nicknames:["gravy"]},{hero:A.Hero.Iyslander,nicknames:["islander"]}],vr=Object.values(A.Hero).map(e=>{let r=Mr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(d,"");return r?{...r,hero:t}:{hero:t}}),$=["common","rare","super rare","majestic","legendary","fabled"],Tr=(e,r,t,a)=>{let i=[];if(!r)i.push(...e);else for(let o of e)switch(r){case">=":{let n=!1;for(let s of $)n?i.push(s):s===o&&(n=!0,i.push(s));break}case">":{let n=!1;for(let s of $)n?i.push(s):s===o&&(n=!0);break}case"<=":{let n=!1;for(let s of $.slice().reverse())n?i.push(s):s===o&&(n=!0,i.push(s));break}case"<":{let n=!1;for(let s of $.slice().reverse())n?i.push(s):s===o&&(n=!0);break}default:break}return{filterToPropertyMapping:{nestedProperty:"rarity",property:"printings",isArray:!0},isExcluded:t,isOptional:a,isOr:!0,values:i}},Se=(e,r,t,a,i)=>{let o=a.map(p=>({hero:p.toLowerCase().replaceAll(d,"")})),n=[],s=[],c=[];for(let p of e){let u=Fr.find(({format:h,nicknames:C})=>h===p||!!C&&C.includes(p));if(u)s.push(u.format);else{let h=vr.find(({hero:C,nicknames:F})=>C===p||!!F&&F.includes(p))||o.find(({hero:C})=>C===p);h&&c.push(h.hero)}}let f=i||"legalFormats";return s.length>0&&n.push({filterToPropertyMapping:{property:f,isArray:!0},values:s,isOr:!0,isExcluded:r,isOptional:t}),c.length>0&&n.push({filterToPropertyMapping:{property:"legalHeroes",isArray:!0},values:c,isOr:!0,isExcluded:r,isOptional:t}),n},Ar=(e,r,t,a)=>Se(e,r,t,a,"bannedFormats"),ce=(e,r,t,a,i,o)=>{let n=[];return wr(t)?n.push(...Se(a,e,r,o)):Sr(t)?n.push(...Ar(a,e,r,o)):Rr(t)&&n.push(Tr(a,i,e,r)),n},U=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:Z},{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"]}],I=[{filterToPropertyMapping:{property:"defense",isNumber:!0},isExcluded:!0,values:Z},{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"]}],J=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],G=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:Z},{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"]}],Q=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(A.Talent).map(e=>e.toLowerCase())}],xr={"!co":U,"-co":U,"!cost":U,"-cost":U,"!color":U,"-color":U,"!b":I,"-b":I,"!block":I,"-block":I,"!d":I,"-d":I,"!def":I,"-def":I,"!defense":I,"-defense":I,"!pitch":J,"-pitch":J,"!p":J,"-p":J,"!attack":G,"-attack":G,"!power":G,"-power":G,"!pwr":G,"-pwr":G,"!pow":G,"-pow":G,"!talents":Q,"-talents":Q,"!tal":Q,"-tal":Q},pe=e=>{let r=[],t=xr[e];return t&&r.push(...t),r},Pr=["l","legal","hero"],wr=e=>Pr.includes(e),kr=["banned"],Sr=e=>kr.includes(e),Lr=["r","rarity"],Rr=e=>Lr.includes(e);var N=require("@flesh-and-blood/types"),de=[{description:"Attack actions",expanded:["st:attack"],filters:{subtypes:[N.Subtype.Attack]},isCardProperty:!1,shorthands:["AA"]},{description:"Arcane barrier",expanded:['k:"arcane barrier"'],filters:{keywords:[N.Keyword.ArcaneBarrier]},isCardProperty:!1,shorthands:["AB"]},{description:"Attack reactions",expanded:['t:"attack reaction"'],filters:{types:[N.Type.AttackReaction]},isCardProperty:!1,shorthands:["AR"]},{description:"Defense reactions",expanded:['t:"defense reaction"'],filters:{types:[N.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:[N.Keyword.GoAgain]},isCardProperty:!1,shorthands:["GA"]},{description:"Non-attack actions",expanded:["t:action","st:non-attack"],filters:{subtypes:[N.Subtype.NonAttack],types:[N.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:[N.Keyword.Spellvoid]},isCardProperty:!1,shorthands:["SV"]}],ue=de.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=de.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 he=(e,r)=>{let t=r.find(a=>ge(a.name)===e);return t||(t=r.find(a=>ge(a.name).includes(e))),t},ge=e=>j(e.toLowerCase().trim().replace(d,"")),j=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,"");var K=require("@flesh-and-blood/types");var z=require("@flesh-and-blood/types"),Br={"Dawnblade, Resplendent":"Dawnblade"},Le=e=>Br[e.name]||e.name,Re=e=>e.functionalText?.replaceAll(e.name,""),X=(e,r)=>{let t=r.find(a=>a.name.toLowerCase().replace(d,"")===e);return t||(t=r.find(a=>a.name.toLowerCase().replace(d,"").includes(e))),me(t,r)},me=(e,r)=>{let t={},a={},i={};if(e){let c=[],f=[],p=Le(e);for(let u of r){let h=Le(u),C=p===h,F=e.cardIdentifier!==u.cardIdentifier,w=e.pitch!==u.pitch;if(C&&F&&w)t[u.cardIdentifier]=u;else if(!C){let T=e.name==="Seismic Surge",x=u.keywords?.includes(z.Keyword.Heave),k=T&&x,y=e.name==="Marked",g=u.keywords?.includes(z.Keyword.Mark),P=y&&g,m=Re(u),b=m?.includes(p)||e.traits?.some(ne=>m?.includes(ne)),S=Re(e);(b||k||P)&&c.push(u);let H=new RegExp(h,"g"),D=new RegExp(`\\*\\*${h}\\*\\*`,"g"),v=S?.match(H)||[],L=S?.match(D)||[],E=v.length===L.length,W=S?.includes(h)&&!E,O=(u.traits||[]).some(ne=>S?.includes(ne)),B=W||O,V=u.name==="Seismic Surge",oe=e.keywords?.includes(z.Keyword.Heave),nr=V&&oe,lr=u.name==="Marked",cr=e.keywords?.includes(z.Keyword.Mark);(B||nr||lr&&cr)&&f.push(u)}}for(let u of c)a[u.cardIdentifier]=u;for(let u of f){let h=u.name;p!==h&&!f.some(C=>{let F=C.name;return F!==h&&F?.includes(h)})&&(i[u.cardIdentifier]=u)}}let o=Object.values(t),n=Object.values(a),s=Object.values(i);return{otherPitches:o,referencedBy:n,references:s}},Nr=["cash-in-yellow"],Er={[K.Hero.Crackni]:{traits:[K.Trait.AgentOfChaos]},[K.Hero.Maxx]:{tokens:["hyper-driver"]}},Or=(e,r,t)=>{let a=new Set;for(let i of e.filter(({cardIdentifier:o})=>!Nr.includes(o))){let{references:o}=me(i,r);for(let n of o.filter(s=>{let c=s.name==="Hyper Driver",f=t===K.Hero.Maxx;return!c||f}))a.add(n)}if(t){let i=Er[t];if(i){if(i.cards)for(let o of e)i.cards?.includes(o.cardIdentifier)&&a.add(o);if(i.tokens)for(let o of r)i.tokens?.includes(o.cardIdentifier)&&a.add(o)}}return Array.from(a)};var rr=[">=",">","<=","<"],tr=["!","-"],Ir={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},be={property:"artists",isArray:!0,partialMatch:!0},Be={property:"n/a",isMeta:!0},Ne={property:"bonds",isArray:!0},Hr={property:"n/a"},Ee={property:"classes",isArray:!0,partialMatch:!0},Oe={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},q={property:"defense",specialProperty:"specialDefense",isNumber:!0},Ie={property:"flows",isArray:!0},He={nestedProperty:"foiling",property:"printings",isArray:!0},De={property:"fusions",isArray:!0},Ge={property:"intellect",isNumber:!0},Ve={property:"keywords",isArray:!0},ye={property:"n/a",isMeta:!0},We={property:"life",specialProperty:"specialLife",isNumber:!0},Ue={property:"meta",isArray:!0},Ke={property:"name",isString:!0,partialMatch:!0},Ce={property:"pitch",isNumber:!0},ee={property:"power",specialProperty:"specialPower",isNumber:!0},Dr={property:"setIdentifiers",isArray:!0,partialMatch:!0},je={property:"n/a",isMeta:!0},Gr={property:"n/a"},Vr={property:"n/a"},ze={property:"sets",isArray:!0,partialMatch:!0},Fe={property:"shorthands",isArray:!0,partialMatch:!0},re={property:"specializations",isArray:!0,partialMatch:!0},qe={property:"subtypes",isArray:!0},_e={property:"types",isArray:!0},Ye={property:"talents",isArray:!0},Wr={property:"functionalText",isString:!0,partialMatch:!0},Ur={property:"traits",isArray:!0,partialMatch:!0},Kr={property:"typeText",isString:!0,partialMatch:!0},te={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},jr={property:"firstReleaseDate",isString:!0,partialMatch:!0},ie={arcane:Ir,a:be,artist:be,art:be,attack:ee,b:q,block:q,banned:Be,bond:Ne,bonds:Ne,c:Ee,class:Ee,chain:Hr,co:Oe,cost:Oe,color:Ce,d:q,def:q,defense:q,flow:Ie,flows:Ie,f:De,fusion:De,foil:He,foiling:He,i:Ge,intellect:Ge,is:Ue,k:Ve,keyword:Ve,l:ye,legal:ye,hero:ye,li:We,life:We,meta:Ue,n:Ke,name:Ke,p:Ce,pitch:Ce,pwr:ee,pow:ee,power:ee,print:Dr,r:je,rarity:je,referencedby:Gr,references:Vr,rf:Be,s:ze,set:ze,short:Fe,shorthand:Fe,shorthands:Fe,sp:re,spec:re,specialization:re,specializations:re,st:qe,subtype:qe,t:_e,type:_e,tal:Ye,talent:Ye,text:Wr,trait:Ur,treat:te,treatment:te,var:te,variation:te,x:Kr,year:jr},zr=[{text:l.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:l.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(d,"")}],qr=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:o}of zr)t.includes(i)&&(t=t.replace(i,o));if(Y(t)?.card)r.push(t);else{let i=t.split(/[ ]+/),o="",n=0;for(let s of i)n===2&&(r.push(o.trim().replaceAll('"',"")),o="",n=0),n<2&&s.split('"').length===2?(o+=" "+s,n++):n===0&&o===""?r.push(s):n===1&&(o+=" "+s);n===2&&(r.push(o.trim().replaceAll('"',"")),o="",n=0)}return r},Te=(e,r,t=[],a=[])=>{let i=e.trim().toLowerCase();for(let{expanded:T,shorthands:x}of ue)for(let k of x)if(i.includes(k)){i=i.replace(k,T.join(" "));break}for(let[T,x]of Object.entries(l.setToSetIdentifierMappings))i.includes(T.toLowerCase())&&(i=i.replace(T.toLowerCase(),x[0]));let o=qr(i),n=[];for(let T of o){let x=fe.find(({shorthands:k})=>k.includes(T));x&&!x.isCardProperty?n.push(...x.expanded):n.push(T)}let s=[],c=[],f=[],p=[],u=!1,h=[],C=[],F=[],w=[];for(let T of n)if(tt(T)){let[x,k]=T.split(":"),{modifier:y,values:g,isAnd:P,isOr:m}=et(k),{filterKey:b,isExcluded:S,isOptional:H,isMeta:D}=rt(x);if(D){if(["rarity","r"].includes(b)){let v=Xr(g);S||(C=[...v]),g=v.map(L=>L.toLowerCase())}["legal","l","hero"].includes(b),s.push(...ce(S,H,b,g,y,t))}else{if(["chain"].includes(b)){let v=B=>B.name.toLowerCase().replaceAll(d,""),L=g.map(B=>he(B,r)).filter(B=>!!B).map(v),E=new Set(L);b="name",m=!0;let W=20,R=0,O=B=>{if(!B.types.includes(l.Type.Hero)){let V=v(B);E.add(V),L.includes(V)||L.push(V)}};for(let B of L){if(R>W)break;let{referencedBy:V,references:oe}=X(B,r);oe.forEach(O),R===0&&V.forEach(O),R++}g=Array.from(E)}else if(["referencedby","references"].includes(b)){let v=b,L=[...g].filter(E=>!!E);g=[],b="name",m=!0;for(let E of L){let{referencedBy:W,references:R}=X(E,r);["referencedby"].includes(v)?g.push(...R.map(({name:O})=>O.toLowerCase().replaceAll(d,""))):["references"].includes(v)&&g.push(...W.map(({name:O})=>O.toLowerCase().replaceAll(d,"")))}}else if(["art","artist"].includes(b))c=g;else if(["print","prints","printing","printings"].includes(b))h=g;else if(["is","meta"].includes(b)){let v=Jr(g);g=v.map(L=>L.toLowerCase().replaceAll(d,"")),v.includes(l.Meta.Expansion)&&!S&&(u=!0)}else["foiling","foil"].includes(b)?(p=Qr(g),g=p.map(v=>v.toLowerCase())):["treat","treatment","var","variation"].includes(b)?(w=Zr(g),g=w.map(v=>v.toLowerCase())):["set","s"].includes(b)?(F=_r(g,a),g=F.map(v=>v.toLowerCase().replaceAll(d,""))):["pitch","p","color"].includes(b)&&(g=$r(g));ie[b]&&s.push({filterToPropertyMapping:ie[b],values:g,isAnd:P,isOr:m,modifier:y,isExcluded:S,isOptional:H})}}else if(T){let x=Y(T)?.card,k=pe(T);x?f.push(`"${x.toLowerCase().replace(d,"")}"`):k&&k.length>0?s.push(...k):f.push(T.replace(d,""))}return{appliedFilters:s,attributes:{artists:c,foilings:p,isExpansionSlot:u,prints:h,rarities:C,releases:F,treatments:w},keywords:f}},_r=(e,r=[])=>{let t=[];for(let a of e)t.push(...Yr(a,r));return t},Yr=(e,r=[])=>{let t=[],a=Object.values(l.Release).find(i=>i.toLowerCase().replaceAll(d,"")===e);if(a&&t.push(a),t.length===0){let i=l.setIdentifierToSetMappings[e];i&&t.push(i)}if(t.length===0){let i=Object.values(l.Release).filter(o=>o.toLowerCase().includes(e));i.length>0&&t.push(...i)}if(t.length===0){let i=r.find(o=>o.toLowerCase().replaceAll(d,"")===e);i&&t.push(i)}return t},Me={blue:3,yellow:2,red:1,white:0},$r=e=>{let r=[];for(let t of e)Me[t]||Me[t]===0?r.push(Me[t].toString()):r.push(t);return r},$e={dual:l.Meta.DualClass,exp:l.Meta.Expansion,expansion:l.Meta.Expansion,expansionSlot:l.Meta.Expansion,rainbow:l.Meta.Rainbow},Jr=e=>{let r=[];for(let t of e)$e[t]?r.push($e[t]):l.Meta[t]&&r.push(l.Meta[t]);if(e.length>0&&r.length===0){for(let t of Object.values(l.Meta))for(let a of e)if(t.toLowerCase().includes(a)){r.push(t);break}}return r},Je={r:l.Foiling.Rainbow,rf:l.Foiling.Rainbow,rainbow:l.Foiling.Rainbow,c:l.Foiling.Cold,cf:l.Foiling.Cold,cold:l.Foiling.Cold,g:l.Foiling.Gold,gf:l.Foiling.Gold,gold:l.Foiling.Gold},Qr=e=>{let r=[];for(let t of e)Je[t]&&r.push(Je[t]);return r},Qe={...Object.values(l.Treatment).reduce((e,r)=>(e[r.toLowerCase()]=r,e),{}),aa:l.Treatment.AA,alt:l.Treatment.AA,"alt art":l.Treatment.AA,ab:l.Treatment.AB,"alt border":l.Treatment.AB,at:l.Treatment.AT,"alt text":l.Treatment.AT,ea:l.Treatment.EA,extended:l.Treatment.EA,"extended art":l.Treatment.EA,fa:l.Treatment.FA,full:l.Treatment.FA,"full art":l.Treatment.FA},Zr=e=>{let r=[];for(let t of e)Qe[t]?r.push(Qe[t]):l.Treatment[t.toUpperCase()]&&r.push(l.Treatment[t.toUpperCase()]);return r},ve={b:l.Rarity.Basic,c:l.Rarity.Common,f:l.Rarity.Fabled,l:l.Rarity.Legendary,m:l.Rarity.Majestic,p:l.Rarity.Promo,r:l.Rarity.Rare,s:l.Rarity.SuperRare,t:l.Rarity.Token,v:l.Rarity.Marvel},Xr=e=>{let r=[];for(let t of e)ve[t]?r.push(ve[t]):r.push(t);return r},et=e=>{let r=[],t,a,i=rr.find(o=>e.includes(o));if(i){let[,o]=e.split(i);Ze(o)?(t=!0,r.push(...o.trim().split("+").map(n=>n.replace(d,"")))):Xe(o)?(a=!0,r.push(...o.trim().split(",").map(n=>n.replace(d,"")))):r.push(o.trim().replace(d,""))}else Ze(e)?(t=!0,r.push(...e.trim().split("+").map(o=>o.replace(d,"")))):Xe(e)?(a=!0,r.push(...e.trim().split(",").map(o=>o.replace(d,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(d,"")):r.push(e.trim().replace(d,""));return{modifier:i,values:r,isAnd:t,isOr:a}},rt=e=>{let r=it(e);if(r){let[,t]=e.split(r);return{filterKey:t,isExcluded:!0,isOptional:!1,isMeta:er(t)}}else return{filterKey:e,isExcluded:!1,isOptional:!1,isMeta:er(e)}},tt=e=>e.indexOf(":")>=0,Ze=e=>e.indexOf("+")>=0,Xe=e=>e.indexOf(",")>=0,er=e=>!!ie[e]?.isMeta,it=e=>tr.find(r=>e.includes(r))?.slice(0,1);var M=require("@flesh-and-blood/types"),ir={artists:["Hoodwill"],cardIdentifier:"fangs-a-lot-blue",classes:[M.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:[M.Hero.Kayo,M.Hero.Levia,M.Hero.Rhinar],printings:[{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000",print:"FNG000",rarity:M.Rarity.Rare,set:M.Release.Promos},{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000_Marvel",print:`FNG000-${M.Treatment.FA}`,rarity:M.Rarity.Marvel,set:M.Release.Promos,treatment:M.Treatment.FA}],name:"Fangs A Lot",rarities:[M.Rarity.Rare,M.Rarity.Marvel],rarity:M.Rarity.Rare,sets:[M.Release.Promos],setIdentifiers:["FNG000"],specialImage:"FNG000_Marvel",subtypes:[M.Subtype.Attack],types:[M.Type.Action],typeText:"Generic Action - Attack"},ar=[{keyword:ir.name.toLowerCase(),card:ir}];var xe=class{constructor(r,t=[],a=[],i=!1){this.log=(r,...t)=>{this.debug&&console.log(r,...t)};this.search=(r,t)=>{let a,{appliedFilters:i,attributes:o,keywords:n}=Te(r,this.cards,this.additionalHeroes,this.additionalSets),s=n.join(" "),c=t?ar.filter(y=>y.keyword===s):[];if(c.length>0?a=c.map(({card:y})=>y):n.length?a=this.fuse.search(s).map(y=>y.item):a=[...this.cards],i.length&&(a=a.filter(y=>y&&or(y,i))),n.length===0){let y="";if(o.releases.length===1)try{let m=o.releases[0];y=ae.setToSetIdentifierMappings[m][0].toUpperCase()}catch(m){console.error("Error getting set identifier from search",m)}if(!y&&o.prints.length===1)try{let m=o.prints[0];ae.setIdentifierToSetMappings[m]&&(y=m.toUpperCase())}catch(m){console.error("Error getting set identifier from search",m)}y?a.sort((m,b)=>{let S=m.setIdentifiers.find(D=>D.includes(y))?.replace(y,""),H=b.setIdentifiers.find(D=>D.includes(y))?.replace(y,"");return S&&H?S.localeCompare(H):-1}):a.sort((m,b)=>m.name===b.name?`${m.pitch}`.localeCompare(`${b.pitch}`):m.name.localeCompare(b.name))}else{let y=[],g=[],P=n.map(m=>m.toLowerCase().replace(d,"")).join(" ");for(let m of a)m.name.toLowerCase().replace(d,"")===P?y.push(m):g.push(m);a=[...y,...g]}let f,{artists:p,isExpansionSlot:u,foilings:h,prints:C,rarities:F,releases:w,treatments:T}=o;(p.length>0||u||h.length>0||C.length>0||F.length>0||w.length>0||T.length>0)&&(f=a.map(y=>{let g=y.printings.filter(P=>{let m=!!P.image,b=p.length===0||p.some(R=>P.artists.find(O=>O.replace(d,"").toLowerCase().includes(R))),S=!u||u===P.isExpansionSlot,H=h.length===0||h.includes(P.foiling),D=C.length===0||C.some(R=>P.identifier.includes(R.toUpperCase())),v=F.length===0||F.includes(P.rarity),L=w.length===0||w.includes(P.set),E=T.length===0||P.treatments?.some(R=>T.includes(R));return m&&b&&S&&H&&D&&v&&L&&E});return{...y,matchingPrintings:g}}));let k=f?.length>0?f:a;return{appliedFilters:i,attributes:o,keywords:n,searchResults:k}};let o={getFn:(n,s)=>{let c=Ae.default.config.getFn(n,s);return c&&(Array.isArray(c)?c.map(f=>j(f.replace(d,""))):j(c).replace(d,""))},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};this.additionalHeroes=t,this.additionalSets=a,this.cards=[...r],this.debug=i,this.fuse=new Ae.default([...r],o)}},sr=xe,or=(e,r)=>{let t=!0,a=!1;for(let i of r){let o=i.isOptional,{isNumber:n,isString:s,isArray:c,isBoolean:f}=i.filterToPropertyMapping;if(n){let p=at(e,i);o?p&&(a=!0):t=t&&p}else if(s){let p=st(e,i);o?p&&(a=!0):t=t&&p}else if(c){let p=ot(e,i,r);o?p&&(a=!0):t=t&&p}else if(f){let p=nt(e,i);o?p&&(a=!0):t=t&&p}}return t},at=(e,r)=>{if(se(r,e)){let{values:t,modifier:a,isExcluded:i,filterToPropertyMapping:{partialMatch:o}}=r,n=Pe(e,r);if(n!=null&&!isNaN(n))if(n=parseInt(n),a)switch(a){case">=":{let s=t?.some(c=>n>=parseInt(c));return i?!s:s}case">":{let s=t?.some(c=>n>parseInt(c));return i?!s:s}case"<=":{let s=t?.some(c=>n<=parseInt(c));return i?!s:s}case"<":{let s=t?.some(c=>n<parseInt(c));return i?!s:s}default:return!1}else{let s=t?.some(c=>n===parseInt(c));return i?!s:s}else{let s=ct(e,r)?.toLowerCase(),c=o?t?.some(f=>s?.includes(f)):t?.some(f=>s===f);return i?!c:c}}else return!0},st=(e,r)=>{if(se(r,e)){let{values:t,isAnd:a,isExcluded:i,filterToPropertyMapping:{partialMatch:o}}=r,n=Pe(e,r)?.replaceAll(d,"");if(o){let s=a?t?.every(c=>n?.toLowerCase().includes(c)):t?.some(c=>n?.toLowerCase().includes(c));return i?!s:s}else{let s=a?t?.every(c=>n?.toLowerCase()===c):t?.some(c=>n?.toLowerCase()===c);return i?!s:s}}else return!0},ot=(e,r,t)=>{if(se(r,e)){let{values:a,isAnd:i,isExcluded:o,filterToPropertyMapping:{partialMatch:n}}=r,s=lt(e,r,t).map(c=>c?.replaceAll(d,""));if(n){let c=i?a.every(p=>s?.some(u=>u?.toLowerCase().includes(p))):a.some(p=>s?.some(u=>u?.toLowerCase().includes(p))),f=s.length===0;return o?!c||f:c}else{let c=i?a.every(f=>s?.some(p=>p?.toLowerCase()===f)):a.some(f=>s?.some(p=>p?.toLowerCase()===f));return o?!c:c}}else return!0},nt=(e,r)=>{if(se(r,e)){let{isExcluded:t}=r,a=Pe(e,r);return t?!a:a}else return!0},Pe=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.property]},lt=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i,property:o}}=r,n=e[o]||[],s=[],c=Object.keys(e.legalOverrides||{}).length>0,f=r.filterToPropertyMapping.property==="legalHeroes",p=t.find(({filterToPropertyMapping:h})=>h.property==="legalFormats");if(c&&f&&!!p){let h=new Set;for(let{format:C,heroes:F}of e.legalOverrides||[])if(p.values.includes(C.toLowerCase()))for(let w of F)h.add(w);s=Array.from(h)}if(s.length===0)if(i){let h=new Set;for(let C of n)if(a){let F=C[i]||[];for(let w of F)h.add(w)}else{let F=C[i];F&&h.add(F)}s=Array.from(h)}else s=n;return s},ct=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.specialProperty]},se=({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()));0&&(module.exports={FilterProperty,PUNCTUATION,RARITY_VALUES_MAPPING,abbreviations,availableExclusions,availableModifiers,filterCard,filtersToCardPropertyMappings,getAbbreviation,getAbbreviationByCard,getCardByName,getCleanText,getExcludedMetaFilters,getKeywordsAndAppliedFiltersFromText,getMetaFilters,getNormalizedText,getRelatedCards,getRelatedCardsByName,getTokensReferencedByCards,multiWordShorthands,shorthands,singleWordShorthands});
@@ -88,7 +88,7 @@ const getRarityFilter = (values, modifier, isExcluded, isOptional) => {
88
88
  } else {
89
89
  for (const value of values) {
90
90
  switch (modifier) {
91
- case ">=":
91
+ case ">=": {
92
92
  let start = false;
93
93
  for (const rarity of rankedRarity) {
94
94
  if (start) {
@@ -99,7 +99,8 @@ const getRarityFilter = (values, modifier, isExcluded, isOptional) => {
99
99
  }
100
100
  }
101
101
  break;
102
- case ">":
102
+ }
103
+ case ">": {
103
104
  let start2 = false;
104
105
  for (const rarity of rankedRarity) {
105
106
  if (start2) {
@@ -109,7 +110,8 @@ const getRarityFilter = (values, modifier, isExcluded, isOptional) => {
109
110
  }
110
111
  }
111
112
  break;
112
- case "<=":
113
+ }
114
+ case "<=": {
113
115
  let start3 = false;
114
116
  for (const rarity of rankedRarity.slice().reverse()) {
115
117
  if (start3) {
@@ -120,7 +122,8 @@ const getRarityFilter = (values, modifier, isExcluded, isOptional) => {
120
122
  }
121
123
  }
122
124
  break;
123
- case "<":
125
+ }
126
+ case "<": {
124
127
  let start4 = false;
125
128
  for (const rarity of rankedRarity.slice().reverse()) {
126
129
  if (start4) {
@@ -130,6 +133,7 @@ const getRarityFilter = (values, modifier, isExcluded, isOptional) => {
130
133
  }
131
134
  }
132
135
  break;
136
+ }
133
137
  default:
134
138
  break;
135
139
  }
package/dist/search.js CHANGED
@@ -4,7 +4,9 @@ import {
4
4
  } from "@flesh-and-blood/types";
5
5
  import Fuse from "fuse.js";
6
6
  import { PUNCTUATION } from "./constants.js";
7
- import { getKeywordsAndAppliedFiltersFromText } from "./filters.js";
7
+ import {
8
+ getKeywordsAndAppliedFiltersFromText
9
+ } from "./filters.js";
8
10
  import { memes } from "./memes.js";
9
11
  import { getNormalizedText } from "./helpers.js";
10
12
  import { FilterProperty } from "./metaFilters.js";
@@ -168,7 +170,7 @@ class Search {
168
170
  var search_default = Search;
169
171
  const filterCard = (card, appliedFilters) => {
170
172
  let doesCardMatchAllRequiredFilters = true;
171
- let doesCardMatchAnyOptionalFilters = false;
173
+ let _doesCardMatchAnyOptionalFilters = false;
172
174
  for (const appliedFilter of appliedFilters) {
173
175
  const isOptional = appliedFilter.isOptional;
174
176
  const { isNumber, isString, isArray, isBoolean } = appliedFilter.filterToPropertyMapping;
@@ -179,7 +181,7 @@ const filterCard = (card, appliedFilters) => {
179
181
  );
180
182
  if (isOptional) {
181
183
  if (cardMatchesNumericFilter) {
182
- doesCardMatchAnyOptionalFilters = true;
184
+ _doesCardMatchAnyOptionalFilters = true;
183
185
  }
184
186
  } else {
185
187
  doesCardMatchAllRequiredFilters = doesCardMatchAllRequiredFilters && cardMatchesNumericFilter;
@@ -191,7 +193,7 @@ const filterCard = (card, appliedFilters) => {
191
193
  );
192
194
  if (isOptional) {
193
195
  if (cardMatchesStringFilter) {
194
- doesCardMatchAnyOptionalFilters = true;
196
+ _doesCardMatchAnyOptionalFilters = true;
195
197
  }
196
198
  } else {
197
199
  doesCardMatchAllRequiredFilters = doesCardMatchAllRequiredFilters && cardMatchesStringFilter;
@@ -204,7 +206,7 @@ const filterCard = (card, appliedFilters) => {
204
206
  );
205
207
  if (isOptional) {
206
208
  if (cardMatchesArrayFilter) {
207
- doesCardMatchAnyOptionalFilters = true;
209
+ _doesCardMatchAnyOptionalFilters = true;
208
210
  }
209
211
  } else {
210
212
  doesCardMatchAllRequiredFilters = doesCardMatchAllRequiredFilters && cardMatchesArrayFilter;
@@ -216,7 +218,7 @@ const filterCard = (card, appliedFilters) => {
216
218
  );
217
219
  if (isOptional) {
218
220
  if (cardMatchesBooleanFilter) {
219
- doesCardMatchAnyOptionalFilters = true;
221
+ _doesCardMatchAnyOptionalFilters = true;
220
222
  }
221
223
  } else {
222
224
  doesCardMatchAllRequiredFilters = doesCardMatchAllRequiredFilters && cardMatchesBooleanFilter;
@@ -240,26 +242,30 @@ const getDoesCardMatchNumericFilter = (card, filter) => {
240
242
  cardValue = parseInt(cardValue);
241
243
  if (modifier) {
242
244
  switch (modifier) {
243
- case ">=":
245
+ case ">=": {
244
246
  const isGreatherThanOrEqualTo = values?.some(
245
247
  (filterValue) => cardValue >= parseInt(filterValue)
246
248
  );
247
249
  return excluded ? !isGreatherThanOrEqualTo : isGreatherThanOrEqualTo;
248
- case ">":
250
+ }
251
+ case ">": {
249
252
  const isGreatherThan = values?.some(
250
253
  (filterValue) => cardValue > parseInt(filterValue)
251
254
  );
252
255
  return excluded ? !isGreatherThan : isGreatherThan;
253
- case "<=":
256
+ }
257
+ case "<=": {
254
258
  const isLessThanOrEqualTo = values?.some(
255
259
  (filterValue) => cardValue <= parseInt(filterValue)
256
260
  );
257
261
  return excluded ? !isLessThanOrEqualTo : isLessThanOrEqualTo;
258
- case "<":
262
+ }
263
+ case "<": {
259
264
  const isLessThan = values?.some(
260
265
  (filterValue) => cardValue < parseInt(filterValue)
261
266
  );
262
267
  return excluded ? !isLessThan : isLessThan;
268
+ }
263
269
  default:
264
270
  return false;
265
271
  }
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": "4.0.11",
4
+ "version": "4.0.13",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "dist/index.cjs",
@@ -34,6 +34,7 @@
34
34
  "postbuild": "tsc --declaration && npm test",
35
35
  "test": "jest",
36
36
  "test:specific": "jest -t 'Matching printing from treatment'",
37
+ "typecheck": "tsc -p tsconfig.typecheck.json",
37
38
  "full": "npm i && npm run build"
38
39
  },
39
40
  "dependencies": {
@@ -43,8 +44,8 @@
43
44
  "@flesh-and-blood/types": "^4.0.0"
44
45
  },
45
46
  "devDependencies": {
46
- "@flesh-and-blood/cards": "^4.0.11",
47
- "@flesh-and-blood/types": "^4.0.9",
47
+ "@flesh-and-blood/cards": "^4.0.13",
48
+ "@flesh-and-blood/types": "^4.0.13",
48
49
  "@types/jest": "^29.5.11",
49
50
  "@types/node": "^20.10.5",
50
51
  "esbuild": "^0.19.10",
@@ -74,5 +75,5 @@
74
75
  "FAB",
75
76
  "FABTCG"
76
77
  ],
77
- "gitHead": "c1485fe98fd2add87536e67c34fa0add7eccad6c"
78
+ "gitHead": "1dca52ed778458fff070ade316e70655e8bc4071"
78
79
  }