@flesh-and-blood/search 4.0.12 → 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 +5 -5
- package/dist/index.cjs +1 -1
- package/dist/metaFilters.js +8 -4
- package/dist/search.js +16 -10
- package/package.json +5 -4
package/dist/filters.js
CHANGED
|
@@ -321,9 +321,9 @@ const getKeywordsAndAppliedFiltersFromText = (text, cards, additionalHeroes = []
|
|
|
321
321
|
searchCriteria.push(criteria);
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
|
-
|
|
324
|
+
const appliedFilters = [];
|
|
325
325
|
let artists = [];
|
|
326
|
-
|
|
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
|
-
|
|
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 (
|
|
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 (
|
|
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});
|
package/dist/metaFilters.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
250
|
+
}
|
|
251
|
+
case ">": {
|
|
249
252
|
const isGreatherThan = values?.some(
|
|
250
253
|
(filterValue) => cardValue > parseInt(filterValue)
|
|
251
254
|
);
|
|
252
255
|
return excluded ? !isGreatherThan : isGreatherThan;
|
|
253
|
-
|
|
256
|
+
}
|
|
257
|
+
case "<=": {
|
|
254
258
|
const isLessThanOrEqualTo = values?.some(
|
|
255
259
|
(filterValue) => cardValue <= parseInt(filterValue)
|
|
256
260
|
);
|
|
257
261
|
return excluded ? !isLessThanOrEqualTo : isLessThanOrEqualTo;
|
|
258
|
-
|
|
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.
|
|
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.
|
|
47
|
-
"@flesh-and-blood/types": "^4.0.
|
|
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": "
|
|
78
|
+
"gitHead": "1dca52ed778458fff070ade316e70655e8bc4071"
|
|
78
79
|
}
|