@flesh-and-blood/search 5.0.2 → 5.0.4

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.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Foiling, Hero, Rarity, Release, Treatment } from "@flesh-and-blood/types";
1
+ import { Card, Foiling, Hero, Printing, Rarity, Release, Treatment } from "@flesh-and-blood/types";
2
2
  import { CatalogueIndex } from "./searchIndex.js";
3
3
  export interface AppliedFilter {
4
4
  filterToPropertyMapping: FilterToPropertyMapping;
@@ -21,9 +21,22 @@ export type Modifier = ">=" | ">" | "<=" | "<";
21
21
  export declare const availableModifiers: Modifier[];
22
22
  export type Exclusion = "!" | "-";
23
23
  export declare const availableExclusions: Exclusion[];
24
+ /** The card field a mapping reads. */
25
+ export type CardPropertyName = keyof Card;
26
+ /**
27
+ * The property of a mapping that reads no card field: a meta filter expands
28
+ * into other filters before any card is read, and a relation filter matches
29
+ * the identifiers the parser resolved.
30
+ */
31
+ export declare const NO_CARD_PROPERTY = "n/a";
32
+ /**
33
+ * The field holding the value a card prints where a number would be, which a
34
+ * numeric filter falls back to for a card carrying no number.
35
+ */
36
+ export type CardSpecialPropertyName = "specialArcane" | "specialCost" | "specialDefense" | "specialLife" | "specialPower";
24
37
  export interface FilterToPropertyMapping {
25
- nestedProperty?: string;
26
- property: string;
38
+ nestedProperty?: keyof Printing;
39
+ property: CardPropertyName | typeof NO_CARD_PROPERTY;
27
40
  exclusion?: Exclusion;
28
41
  isArray?: boolean;
29
42
  isNestedPropertyArray?: boolean;
@@ -47,7 +60,7 @@ export interface FilterToPropertyMapping {
47
60
  isNormalized?: boolean;
48
61
  modifier?: Modifier;
49
62
  partialMatch?: boolean;
50
- specialProperty?: string;
63
+ specialProperty?: CardSpecialPropertyName;
51
64
  }
52
65
  export declare const filtersToCardPropertyMappings: {
53
66
  arcane: FilterToPropertyMapping;
package/dist/filters.js CHANGED
@@ -20,6 +20,7 @@ import {
20
20
  } from "./searchIndex.js";
21
21
  const availableModifiers = [">=", ">", "<=", "<"];
22
22
  const availableExclusions = ["!", "-"];
23
+ const NO_CARD_PROPERTY = "n/a";
23
24
  const arcaneFilter = {
24
25
  property: "arcane",
25
26
  specialProperty: "specialArcane",
@@ -32,7 +33,7 @@ const artistFilter = {
32
33
  partialMatch: true
33
34
  };
34
35
  const bannedFilter = {
35
- property: "n/a",
36
+ property: NO_CARD_PROPERTY,
36
37
  isMeta: true
37
38
  };
38
39
  const bondFilter = {
@@ -60,7 +61,7 @@ const getRelationAppliedFilter = (cardIdentifiers, {
60
61
  isOptional
61
62
  });
62
63
  const chainFilter = {
63
- property: "n/a"
64
+ property: NO_CARD_PROPERTY
64
65
  };
65
66
  const classFilter = {
66
67
  property: "classes",
@@ -101,7 +102,7 @@ const keywordFilter = {
101
102
  // partialMatch: true,
102
103
  };
103
104
  const legalFilter = {
104
- property: "n/a",
105
+ property: NO_CARD_PROPERTY,
105
106
  isMeta: true
106
107
  };
107
108
  const lifeFilter = {
@@ -137,14 +138,14 @@ const setIdentifiersFilter = {
137
138
  partialMatch: true
138
139
  };
139
140
  const rarityFilter = {
140
- property: "n/a",
141
+ property: NO_CARD_PROPERTY,
141
142
  isMeta: true
142
143
  };
143
144
  const referencedByFilter = {
144
- property: "n/a"
145
+ property: NO_CARD_PROPERTY
145
146
  };
146
147
  const referencesFilter = {
147
- property: "n/a"
148
+ property: NO_CARD_PROPERTY
148
149
  };
149
150
  const setFilter = {
150
151
  property: "sets",
@@ -274,6 +275,7 @@ const filtersToCardPropertyMappings = {
274
275
  x: typeTextFilter,
275
276
  year: yearFilter
276
277
  };
278
+ const filtersToCardPropertyMappingsByKey = filtersToCardPropertyMappings;
277
279
  const punctuationOverrides = [
278
280
  {
279
281
  text: Release.ClassicBattlesRhinarDorinthea.toLowerCase(),
@@ -540,7 +542,7 @@ const getKeywordsAndAppliedFiltersFromText = (text, index, additionalHeroes = []
540
542
  } else if (["pitch", "p", "color"].includes(filterKey)) {
541
543
  values = getPitchValuesFromText(values);
542
544
  }
543
- const filterToPropertyMapping = filtersToCardPropertyMappings[filterKey];
545
+ const filterToPropertyMapping = filtersToCardPropertyMappingsByKey[filterKey];
544
546
  if (filterToPropertyMapping && !areValuesAlreadyApplied) {
545
547
  appliedFilters.push({
546
548
  filterToPropertyMapping,
@@ -696,10 +698,13 @@ const getFoilingValuesFromText = (rawValues) => {
696
698
  return values;
697
699
  };
698
700
  const treatmentValuesMapping = {
699
- ...Object.values(Treatment).reduce((obj, treatment) => {
700
- obj[treatment.toLowerCase()] = treatment;
701
- return obj;
702
- }, {}),
701
+ ...Object.values(Treatment).reduce(
702
+ (treatmentsByLowercasedName, treatment) => {
703
+ treatmentsByLowercasedName[treatment.toLowerCase()] = treatment;
704
+ return treatmentsByLowercasedName;
705
+ },
706
+ {}
707
+ ),
703
708
  ...{
704
709
  aa: Treatment.AA,
705
710
  alt: Treatment.AA,
@@ -718,13 +723,16 @@ const treatmentValuesMapping = {
718
723
  "full art": Treatment.FA
719
724
  }
720
725
  };
726
+ const treatmentsByAbbreviation = Treatment;
721
727
  const getTreatmentValuesFromText = (rawValues) => {
722
728
  const values = [];
723
729
  for (const rawValue of rawValues) {
724
- if (treatmentValuesMapping[rawValue]) {
725
- values.push(treatmentValuesMapping[rawValue]);
726
- } else if (Treatment[rawValue.toUpperCase()]) {
727
- values.push(Treatment[rawValue.toUpperCase()]);
730
+ const treatmentFromMapping = treatmentValuesMapping[rawValue];
731
+ const treatmentFromAbbreviation = treatmentsByAbbreviation[rawValue.toUpperCase()];
732
+ if (treatmentFromMapping) {
733
+ values.push(treatmentFromMapping);
734
+ } else if (treatmentFromAbbreviation) {
735
+ values.push(treatmentFromAbbreviation);
728
736
  }
729
737
  }
730
738
  return values;
@@ -818,9 +826,10 @@ const getFilterKeyAndExcludedOrOptional = (unparsedFilterKey) => {
818
826
  const hasFilter = (text) => text.indexOf(":") >= 0;
819
827
  const filterIsAnd = (text) => text.indexOf("+") >= 0;
820
828
  const filterIsOr = (text) => text.indexOf(",") >= 0;
821
- const filterIsMeta = (filterKey) => !!filtersToCardPropertyMappings[filterKey]?.isMeta;
829
+ const filterIsMeta = (filterKey) => !!filtersToCardPropertyMappingsByKey[filterKey]?.isMeta;
822
830
  const getExclusion = (text) => availableExclusions.find((exclusion) => text.includes(exclusion))?.slice(0, 1);
823
831
  export {
832
+ NO_CARD_PROPERTY,
824
833
  RARITY_VALUES_MAPPING,
825
834
  availableExclusions,
826
835
  availableModifiers,
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var hr=Object.create;var Z=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var br=Object.getOwnPropertyNames;var mr=Object.getPrototypeOf,Tr=Object.prototype.hasOwnProperty;var Mr=(e,r)=>{for(var t in r)Z(e,t,{get:r[t],enumerable:!0})},Ee=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of br(r))!Tr.call(e,i)&&i!==t&&Z(e,i,{get:()=>r[i],enumerable:!(a=Cr(r,i))||a.enumerable});return e};var Fr=(e,r,t)=>(t=e!=null?hr(mr(e)):{},Ee(r||!e||!e.__esModule?Z(t,"default",{value:e,enumerable:!0}):t,e)),vr=e=>Ee(Z({},"__esModule",{value:!0}),e);var Pt={};Mr(Pt,{FilterProperty:()=>Ne,MARKUP:()=>ge,PUNCTUATION:()=>T,RARITY_VALUES_MAPPING:()=>ke,abbreviations:()=>ye,availableExclusions:()=>pr,availableModifiers:()=>cr,default:()=>gr,filterCard:()=>yr,filtersToCardPropertyMappings:()=>Ie,getAbbreviation:()=>ee,getAbbreviationByCard:()=>Ar,getCardsByName:()=>se,getCardsByReferencedCardIdentifier:()=>xt,getCardsReferencedBy:()=>ne,getCardsReferencing:()=>oe,getCatalogueIndex:()=>Me,getCleanText:()=>$,getExcludedMetaFilters:()=>Ce,getKeywordsAndAppliedFiltersFromText:()=>Be,getMetaFilters:()=>he,getNormalizedText:()=>J,getOtherPitches:()=>vt,getReferencedCards:()=>At,getTextWithoutMarkup:()=>Y,getTokensReferencedByCards:()=>St,multiWordShorthands:()=>me,shorthands:()=>be,singleWordShorthands:()=>Te});module.exports=vr(Pt);var pe=require("@flesh-and-blood/types"),Le=Fr(require("fuse.js"),1);var T=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g,ge=/\*/g;var d=require("@flesh-and-blood/types");var ee=e=>ye.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),Ar=e=>ye.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),ye=[{abbreviations:["10k"],card:"10,000 Year Reunion"},{abbreviations:["Pajamas","PJs"],card:"Alluvion Constellas"},{abbreviations:["Slippy","Arakni Slipped Through the Cracks","Arakni, Slipped Through the Cracks"],card:"Arakni, 5L!p3d 7hRu 7h3 cR4X"},{abbreviations:["Dullcap"],card:"Arcanite Skullcap"},{abbreviations:["ALS"],card:"Arc Light Sentinel"},{abbreviations:["AoW"],card:"Art of War"},{abbreviations:["BBD"],card:"Barraging Beatdown"},{abbreviations:["BBS"],card:"Big Blue Sky"},{abbreviations:["Starvo"],card:"Bravo, Star of the Show"},{abbreviations:["BEB"],card:"Bull's Eye Bracers"},{abbreviations:["BLW"],card:"Be Like Water"},{abbreviations:["BoJ"],card:"Balance of Justice"},{abbreviations:["BOHH"],card:"Blood on Her Hands"},{abbreviations:["BRB"],card:"Bloodrush Bellow"},{abbreviations:["Breezies"],card:"Breeze Rider Boots"},{abbreviations:["BTA"],card:"Burn Them All"},{abbreviations:["CStrike","C-Strike","C Strike"],card:"Celestial Cataclysm"},{abbreviations:["CBelly"],card:"Cerebellum Processor"},{abbreviations:["CLF"],card:"Channel Lake Frigid"},{abbreviations:["CLV"],card:"Channel Lightning Valley"},{abbreviations:["CMH"],card:"Channel Mount Heroic"},{abbreviations:["CMI"],card:"Channel Mount Isen"},{abbreviations:["CMT"],card:"Channel the Millennium Tree"},{abbreviations:["CnC","C&C"],card:"Command and Conquer"},{abbreviations:["Sea and Sea"],card:"Conqueror of the High Seas"},{abbreviations:["CYB"],card:"Count Your Blessings"},{abbreviations:["Cat","Kitty"],card:"Crouching Tiger"},{abbreviations:["CoD"],card:"Crown of Dominion"},{abbreviations:["CoP"],card:"Crown of Providence"},{abbreviations:["CtW"],card:"Crush the Weak"},{abbreviations:["DD"],card:"Death Dealer"},{abbreviations:["DnD"],card:"Devotion Never Dies"},{abbreviations:["DIO"],card:"Dash I/O"},{abbreviations:["EBTT"],card:"Even Bigger Than That!"},{abbreviations:["NewNigma"],card:"Enigma, New Moon"},{abbreviations:["EPot","E Pot"],card:"Energy Potion"},{abbreviations:["EStrike","E-Strike","E Strike"],card:"Enlightened Strike"},{abbreviations:["FFS"],card:"Fyendal's Fighting Spirit"},{abbreviations:["FoN"],card:"Force of Nature"},{abbreviations:["Frosty","\u{1F976}","\u{1F9CA}","\u2744\uFE0F"],card:"Frostbite"},{abbreviations:["Yum yum"],card:"Fruits of the Forest"},{abbreviations:["GnT"],card:"Give and Take"},{abbreviations:["Habibi"],card:"Hanabi Blaster"},{abbreviations:["HMH"],card:"Hope Merchant's Hood"},{abbreviations:["HoI"],card:"Heart of Ice"},{abbreviations:["Pumpkin"],card:"Jack-o'-lantern"},{abbreviations:["RKO","Cheato"],card:"Kayo, Underhanded Cheat"},{abbreviations:["KKBB"],card:"Knick Knack Bric-a-brac"},{abbreviations:["BStrike"],card:"Levels of Enlightenment"},{abbreviations:["LAG","Twominaris"],card:"Luminaris, Angel's Glow"},{abbreviations:["LCF","Newminaris"],card:"Luminaris, Celestial Fury"},{abbreviations:["LDE"],card:"Last Ditch Effort"},{abbreviations:["LtC"],card:"Lead the Charge"},{abbreviations:["LNW"],card:"Leave No Witnesses"},{abbreviations:["LFaL","L4aL"],card:"Life for a Life"},{abbreviations:["LiT"],card:"Lost in Thought"},{abbreviations:["MMB"],card:"Mage Master Boots"},{abbreviations:["MaxV"],card:"Maximum Velocity"},{abbreviations:["MoM"],card:"Mask of Momentum"},{abbreviations:["MoPL"],card:"Mask of the Pouncing Lynx"},{abbreviations:["MnG"],card:"Meat and Greet"},{abbreviations:["Cake","\u{1F382}"],card:"Ninth Blade of the Blood Oath"},{abbreviations:["PoM"],card:"Peace of Mind"},{abbreviations:["P-Bone"],card:"Performance Bonus"},{abbreviations:["PF","\u{1F525}"],card:"Phoenix Flame"},{abbreviations:["PtW"],card:"Poison the Well"},{abbreviations:["Thanos","Infinity Gauntlet"],card:"Polarity Reversal Script"},{abbreviations:["DPot","D Pot"],card:"Potion of D\xE9j\xE0 Vu"},{abbreviations:["Ponder Run"],card:"Premeditate"},{abbreviations:["Qi Unbound"],card:"Qi Unleashed"},{abbreviations:["RitL"],card:"Red in the Ledger"},{abbreviations:["Cats","Ghost cat","Ghost cats"],card:"Restless Coalescence"},{abbreviations:["Eugene"],card:"Rhinar, Reckless Rampage",isHidden:!0},{abbreviations:["SSGB"],card:"Sandscour Greatbow"},{abbreviations:["SSP"],card:"Sand Sketched Plan"},{abbreviations:["SFaS","S4aS"],card:"Scar for a Scar"},{abbreviations:["Tyler"],card:"Scurv, Stowaway",isHidden:!0},{abbreviations:["SWOMB"],card:"Shifting Winds of the Mystic Beast"},{abbreviations:["Snaps"],card:"Snapdragon Scalers"},{abbreviations:["SWK"],card:"Spinning Wheel Kick"},{abbreviations:["SFTL"],card:"Swing Fist, Think Later"},{abbreviations:["TTT"],card:"Take the Tempo"},{abbreviations:["Ultron"],card:"Teklovossen, the Mechropotent"},{abbreviations:["ToS"],card:"Test of Strength"},{abbreviations:["TAYG"],card:"That All You Got?"},{abbreviations:["TROM"],card:"This Round's on Me"},{abbreviations:["3oak"],card:"Three of a Kind"},{abbreviations:["Pox Malone","Post Malone"],card:"Virulent Touch"},{abbreviations:["Cast Homes"],card:"Visit Goldmane Estate"},{abbreviations:["Frosty Hammer"],card:"Winter's Wail"},{abbreviations:["Wreckless Wing"],card:"War Cry of Bellona"},{abbreviations:["ZTS"],card:"Zero to Sixty"}];var I=require("@flesh-and-blood/types");var Ne=(a=>(a.BannedFormats="bannedFormats",a.LegalFormats="legalFormats",a.LegalHeroes="legalHeroes",a))(Ne||{}),ie=Array.from(Array(50).keys()).map(e=>`${e}`),xr=[{format:I.Format.ClassicConstructed,nicknames:["cc","classic"]},{format:I.Format.LivingLegend,nicknames:["cc ll","classic constructed ll","ll cc","ll","living legend"]},{format:I.Format.SilverAge,nicknames:["sage"]},{format:I.Format.GoldenAge,nicknames:["gage"]},{format:I.Format.UltimatePitFight,nicknames:["upf"]}],Sr=Object.values(I.Format).map(e=>{let r=xr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(T,"");return r?{...r,format:t}:{format:t}}),Pr=[{hero:I.Hero.DataDoll,nicknames:["data","datadoll"]},{hero:I.Hero.Dorinthea,nicknames:["dori"]},{hero:I.Hero.Genis,nicknames:["genis"]},{hero:I.Hero.GravyBones,nicknames:["gravy"]},{hero:I.Hero.Iyslander,nicknames:["islander"]}],wr=Object.values(I.Hero).map(e=>{let r=Pr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(T,"");return r?{...r,hero:t}:{hero:t}}),re=["common","rare","super rare","majestic","legendary","fabled"],kr=(e,r,t,a)=>{let i=[];if(!r)i.push(...e);else for(let s of e)switch(r){case">=":{let o=!1;for(let n of re)o?i.push(n):n===s&&(o=!0,i.push(n));break}case">":{let o=!1;for(let n of re)o?i.push(n):n===s&&(o=!0);break}case"<=":{let o=!1;for(let n of re.slice().reverse())o?i.push(n):n===s&&(o=!0,i.push(n));break}case"<":{let o=!1;for(let n of re.slice().reverse())o?i.push(n):n===s&&(o=!0);break}default:break}return{filterToPropertyMapping:{nestedProperty:"rarity",property:"printings",isArray:!0},isExcluded:t,isOptional:a,isOr:!0,values:i}},De=(e,r,t,a,i)=>{let s=a.map(g=>({hero:g.toLowerCase().replaceAll(T,"")})),o=[],n=[],c=[];for(let g of e){let f=Sr.find(({format:m,nicknames:M})=>m===g||!!M&&M.includes(g));if(f)n.push(f.format);else{let m=wr.find(({hero:M,nicknames:x})=>M===g||!!x&&x.includes(g))||s.find(({hero:M})=>M===g);m&&c.push(m.hero)}}let F=i||"legalFormats";return n.length>0&&o.push({filterToPropertyMapping:{property:F,isArray:!0},values:n,isOr:!0,isExcluded:r,isOptional:t}),c.length>0&&o.push({filterToPropertyMapping:{property:"legalHeroes",isArray:!0},values:c,isOr:!0,isExcluded:r,isOptional:t}),o},Ir=(e,r,t,a)=>De(e,r,t,a,"bannedFormats"),he=(e,r,t,a,i,s)=>{let o=[];return Lr(t)?o.push(...De(a,e,r,s)):Nr(t)?o.push(...Ir(a,e,r,s)):Or(t)&&o.push(kr(a,i,e,r)),o},_=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:ie},{filterToPropertyMapping:{property:"specialCost",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]}],G=[{filterToPropertyMapping:{property:"defense",isNumber:!0},isExcluded:!0,values:ie},{filterToPropertyMapping:{property:"specialDefense",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["hero","placeholder","token","weapon"]}],te=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:ie},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],z=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:ie},{filterToPropertyMapping:{property:"specialPower",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token"]}],ae=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(I.Talent).map(e=>e.toLowerCase())}],Br={"!co":_,"-co":_,"!cost":_,"-cost":_,"!color":_,"-color":_,"!b":G,"-b":G,"!block":G,"-block":G,"!d":G,"-d":G,"!def":G,"-def":G,"!defense":G,"-defense":G,"!pitch":te,"-pitch":te,"!p":te,"-p":te,"!attack":z,"-attack":z,"!power":z,"-power":z,"!pwr":z,"-pwr":z,"!pow":z,"-pow":z,"!talents":ae,"-talents":ae,"!tal":ae,"-tal":ae},Ce=e=>{let r=[],t=Br[e];return t&&r.push(...t),r},Rr=["l","legal","hero"],Lr=e=>Rr.includes(e),Er=["banned"],Nr=e=>Er.includes(e),Dr=["r","rarity"],Or=e=>Dr.includes(e);var O=require("@flesh-and-blood/types"),be=[{description:"Attack actions",expanded:["st:attack"],filters:{subtypes:[O.Subtype.Attack]},isCardProperty:!1,shorthands:["AA"]},{description:"Arcane barrier",expanded:['k:"arcane barrier"'],filters:{keywords:[O.Keyword.ArcaneBarrier]},isCardProperty:!1,shorthands:["AB"]},{description:"Attack reactions",expanded:['t:"attack reaction"'],filters:{types:[O.Type.AttackReaction]},isCardProperty:!1,shorthands:["AR"]},{description:"Defense reactions",expanded:['t:"defense reaction"'],filters:{types:[O.Type.DefenseReaction]},isCardProperty:!1,shorthands:["DR"]},{description:"Gain life",expanded:["gain {h}"],filters:{functionalText:"gain {h}"},isCardProperty:!1,shorthands:["Gain life","Gains life"]},{description:"Go again",expanded:['k:"go again"'],filters:{keywords:[O.Keyword.GoAgain]},isCardProperty:!1,shorthands:["GA"]},{description:"Non-attack actions",expanded:["t:action","st:non-attack"],filters:{subtypes:[O.Subtype.NonAttack],types:[O.Type.Action]},isCardProperty:!1,shorthands:["NAA"]},{description:"Plus defense",expanded:["+ {d}"],filters:{functionalText:"+ {d}"},isCardProperty:!1,shorthands:["Pump defense","Pumps defense","Buff defense","Buffs defense"]},{description:"Spellvoid",expanded:['k:"spellvoid"'],filters:{keywords:[O.Keyword.Spellvoid]},isCardProperty:!1,shorthands:["SV"]}],me=be.filter(({shorthands:e})=>e.some(r=>r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)})),Te=be.filter(({shorthands:e})=>e.some(r=>!r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>!r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)}));var $=e=>J(e.toLowerCase().trim().replace(T,"")),J=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,""),Y=e=>e.replace(ge,"");var q=require("@flesh-and-blood/types");var Oe=new WeakMap,K=Object.freeze([]),Hr=Number.MAX_SAFE_INTEGER,He=(e,r)=>{let t=new Map;for(let a of e)for(let i of r(a)||[]){let s=t.get(i);s?s.push(a):t.set(i,[a])}return t},Vr=e=>{let r=new Map;for(let t of e){let a=t.types.includes(q.Type.Hero)&&!t.isCardBack,i=a?q.CardRole.Hero:(0,q.getCardRole)(t);if(a||i!==q.CardRole.Hero){let o=r.get(i);o?o.push(t):r.set(i,[t])}}return r},Gr=e=>{let r,t,a,i,s,o=()=>{if(!r){let l=new Map,u=new Map,p=[],y=new Map,b=0;for(let B of e){l.set(B.cardIdentifier,B),u.set(B.cardIdentifier,b),b++;let A=$(B.name),E=y.get(A);E?E.push(B):(y.set(A,[B]),p.push(A))}r={cardByCardIdentifier:l,corpusPositionByCardIdentifier:u,cleanedNames:p,pitchCycleByCleanedName:y}}return r},n=l=>{let{corpusPositionByCardIdentifier:u}=o(),p=({cardIdentifier:y})=>u.get(y)??Hr;return[...l].sort((y,b)=>p(y)-p(b))},c=l=>o().cardByCardIdentifier.get(l),F=l=>{let{cardByCardIdentifier:u}=o(),p=[];for(let y of l||[]){let b=u.get(y);b&&p.push(b)}return n(p)},g=l=>{let u=new Map;return p=>{let y=u.get(p);if(!y){let b=c(p),B=F(b&&l(b)),A=B.length>0;y=A?B:K,A&&u.set(p,y)}return y}},f=l=>{let{pitchCycleByCleanedName:u}=o(),p=c(l);return p?u.get($(p.name))??K:K},m=l=>{let{cleanedNames:u,pitchCycleByCleanedName:p}=o(),y=$(l),b=p.get(y);if(!b&&y.length>0){let A=u.find(E=>E.includes(y));A&&(b=p.get(A))}return b??K},M=l=>{let{pitchCycleByCleanedName:u}=o();return u.get($(l))??K},x=()=>{if(!s){let l=new Set;for(let u of e)for(let p of u.artists)l.add(p);s=[...l].sort((u,p)=>u.localeCompare(p,"en",{sensitivity:"base"}))}return s},R=g(({oppositeSideCardIdentifiers:l})=>l),W=g(({referencedCards:l})=>l),P=l=>(t||(t=He(e,({referencedCards:u})=>u)),t.get(l)??K),w=g(({createdExtras:l})=>l);return{cards:e,getCard:c,getPitchCycle:f,getCardsByName:m,getCardsByExactName:M,getArtists:x,getOppositeSide:R,getReferences:W,getReferencedBy:P,getCreates:w,getCreatedBy:l=>(a||(a=He(e,({createdExtras:u})=>u)),a.get(l)??K),getCreatedClosure:l=>{let u=new Map,p=new Set,y=[...l];for(let b of y)if(!p.has(b)){p.add(b);for(let A of w(b))u.set(A.cardIdentifier,A),y.push(A.cardIdentifier)}return n([...u.values()])},getByRole:l=>(i||(i=Vr(e)),i.get(l)??K),getCardsInCorpusOrder:n}},Me=e=>{let r=Oe.get(e);return r||(r=Gr(e),Oe.set(e,r)),r},Fe=(e,r)=>e.getPitchCycle(r.cardIdentifier),se=(e,r)=>e.getCardsByName(r),Ve=(e,r)=>{let t=new Map;for(let a of r)for(let i of Fe(e,a))t.set(i.cardIdentifier,i);return e.getCardsInCorpusOrder([...t.values()])},oe=(e,r)=>{let t=[];for(let a of Fe(e,r))t.push(...e.getReferencedBy(a.cardIdentifier));return Ve(e,t)},ne=(e,r)=>{let t=[];for(let a of Fe(e,r))t.push(...e.getReferences(a.cardIdentifier));return Ve(e,t)};var cr=[">=",">","<=","<"],pr=["!","-"],Wr={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},ve={property:"artists",isArray:!0,partialMatch:!0},Ge={property:"n/a",isMeta:!0},We={property:"bonds",isArray:!0},Ur={property:"cardIdentifier",isString:!0,isNormalized:!0},Ue=(e,{isAnd:r,isExcluded:t,isOptional:a,modifier:i})=>({filterToPropertyMapping:Ur,values:[...e],valuesSet:e,isAnd:r,isOr:!0,modifier:i,isExcluded:t,isOptional:a}),zr={property:"n/a"},ze={property:"classes",isArray:!0,partialMatch:!0},Ke={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},Q={property:"defense",specialProperty:"specialDefense",isNumber:!0},je={property:"flows",isArray:!0},qe={nestedProperty:"foiling",property:"printings",isArray:!0},_e={property:"fusions",isArray:!0},$e={property:"intellect",isNumber:!0},Ye={property:"keywords",isArray:!0},Ae={property:"n/a",isMeta:!0},Je={property:"life",specialProperty:"specialLife",isNumber:!0},we={property:"meta",isArray:!0},Qe={property:"name",isString:!0,partialMatch:!0},xe={property:"pitch",isNumber:!0},Xe={property:"firstReleaseDate",isDate:!0},le={property:"power",specialProperty:"specialPower",isNumber:!0},Kr={property:"setIdentifiers",isArray:!0,partialMatch:!0},Ze={property:"n/a",isMeta:!0},jr={property:"n/a"},qr={property:"n/a"},er={property:"sets",isArray:!0,partialMatch:!0},Se={property:"shorthands",isArray:!0,partialMatch:!0},de={property:"specializations",isArray:!0,partialMatch:!0},rr={property:"subtypes",isArray:!0},tr={property:"types",isArray:!0},ar={property:"talents",isArray:!0},_r={property:"functionalText",hasMarkup:!0,isString:!0,partialMatch:!0},$r={property:"traits",isArray:!0,partialMatch:!0},Yr={property:"typeText",isString:!0,partialMatch:!0},ce={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},Jr={property:"firstReleaseDate",isString:!0,partialMatch:!0},Ie={arcane:Wr,a:ve,artist:ve,art:ve,attack:le,b:Q,block:Q,banned:Ge,bond:We,bonds:We,c:ze,class:ze,chain:zr,co:Ke,cost:Ke,color:xe,d:Q,def:Q,defense:Q,flow:je,flows:je,f:_e,fusion:_e,foil:qe,foiling:qe,i:$e,intellect:$e,is:we,k:Ye,keyword:Ye,l:Ae,legal:Ae,hero:Ae,li:Je,life:Je,meta:we,n:Qe,name:Qe,p:xe,pitch:xe,pwr:le,pow:le,power:le,print:Kr,r:Ze,rarity:Ze,referencedby:jr,references:qr,rf:Ge,s:er,set:er,short:Se,shorthand:Se,shorthands:Se,sp:de,spec:de,specialization:de,specializations:de,st:rr,subtype:rr,t:tr,type:tr,tal:ar,talent:ar,text:_r,trait:$r,treat:ce,treatment:ce,var:ce,variation:ce,x:Yr,year:Jr},Qr=[{text:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(T,"")}],Xr=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:s}of Qr)t.includes(i)&&(t=t.replace(i,s));if(ee(t)?.card)r.push(t);else{let i=t.split(/[ ]+/),s="",o=0;for(let n of i)o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0),o<2&&n.split('"').length===2?(s+=" "+n,o++):o===0&&s===""?r.push(n):o===1&&(s+=" "+n);o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0)}return r},Zr=20,Be=(e,r,t=[],a=[],i=ot())=>{let s=e.trim().toLowerCase();for(let{expanded:P,shorthands:w}of me)for(let h of w)if(s.includes(h)){s=s.replace(h,P.join(" "));break}for(let[P,w]of Object.entries(d.setToSetIdentifierMappings))s.includes(P.toLowerCase())&&(s=s.replace(P.toLowerCase(),w[0]));let o=Xr(s),n=[];for(let P of o){let w=Te.find(({shorthands:h})=>h.includes(P));w&&!w.isCardProperty?n.push(...w.expanded):n.push(P)}let c=[],F=[],g=[],f=[],m=!1,M=[],x=[],R=[],W=[];for(let P of n)if(ft(P)){let[w,h]=P.split(":"),{modifier:D,values:C,isAnd:l,isOr:u}=pt(h),{filterKey:p,isExcluded:y,isOptional:b,isMeta:B}=ut(w),A=!1;if(B){if(["rarity","r"].includes(p)){let E=ct(C);y||(x=[...E]),C=E.map(S=>S.toLowerCase())}["legal","l","hero"].includes(p),c.push(...he(y,b,p,C,D,t))}else{if(["chain"].includes(p)){let S=new Set,L=[],H=new Set,V=k=>{S.add(k.cardIdentifier),H.has(k.name)||(H.add(k.name),L.push(k))},j=k=>{k.types.includes(d.Type.Hero)||V(k)};for(let k of C)if(k)for(let N of se(r,k))V(N);let U=0;for(let k of L){if(U>Zr)break;for(let fe of ne(r,k))j(fe);if(U===0)for(let fe of oe(r,k))j(fe);U++}c.push(Ue(S,{isAnd:l,isExcluded:y,isOptional:b,modifier:D})),A=!0}else if(["referencedby","references"].includes(p)){let S=["referencedby"].includes(p),L=new Set;for(let H of C)if(H)for(let V of se(r,H)){let j=S?ne(r,V):oe(r,V);for(let U of j)L.add(U.cardIdentifier)}c.push(Ue(L,{isAnd:l,isExcluded:y,isOptional:b,modifier:D})),A=!0}else if(["art","artist"].includes(p))F=C;else if(["print","prints","printing","printings"].includes(p))M=C;else if(["is","meta"].includes(p)){let S=[],L=[],H=[],V=[];for(let N of C)at.includes(N)?S.push(N):it.includes(N)?L.push(N):st.includes(N)?H.push(N):V.push(N);S.length>0&&(c.push({filterToPropertyMapping:we,values:[d.Meta.Reprint.toLowerCase().replaceAll(T,"")],isAnd:l,isOr:u,isExcluded:!y,isOptional:b}),A=V.length===0);let j=L.length>0;j&&c.push({filterToPropertyMapping:Xe,values:[i],isAnd:l,isOr:u,isExcluded:y,isOptional:b});let U=H.length>0;U&&c.push({filterToPropertyMapping:Xe,values:[i],isAnd:l,isOr:u,isExcluded:!y,isOptional:b}),(j||U)&&(A=V.length===0);let k=nt(V);C=k.map(N=>N.toLowerCase().replaceAll(T,"")),k.includes(d.Meta.Expansion)&&!y&&(m=!0)}else["foiling","foil"].includes(p)?(f=lt(C),C=f.map(S=>S.toLowerCase())):["treat","treatment","var","variation"].includes(p)?(W=dt(C),C=W.map(S=>S.toLowerCase())):["set","s"].includes(p)?(R=et(C,a),C=R.map(S=>S.toLowerCase().replaceAll(T,""))):["pitch","p","color"].includes(p)&&(C=tt(C));let E=Ie[p];E&&!A&&c.push({filterToPropertyMapping:E,values:E.hasMarkup?C.map(S=>Y(S)):C,isAnd:l,isOr:u,modifier:D,isExcluded:y,isOptional:b})}}else if(P){let w=ee(P)?.card,h=Ce(P);w?g.push(`"${w.toLowerCase().replace(T,"")}"`):h&&h.length>0?c.push(...h):g.push(P.replace(T,""))}return{appliedFilters:c,attributes:{artists:F,foilings:f,isExpansionSlot:m,prints:M,rarities:x,releases:R,treatments:W},keywords:g}},et=(e,r=[])=>{let t=[];for(let a of e)t.push(...rt(a,r));return t},rt=(e,r=[])=>{let t=[],a=Object.values(d.Release).find(i=>i.toLowerCase().replaceAll(T,"")===e);if(a&&t.push(a),t.length===0){let i=d.setIdentifierToSetMappings[e];i&&t.push(i)}if(t.length===0){let i=Object.values(d.Release).filter(s=>s.toLowerCase().includes(e));i.length>0&&t.push(...i)}if(t.length===0){let i=r.find(s=>s.toLowerCase().replaceAll(T,"")===e);i&&t.push(i)}return t},Pe={purple:4,blue:3,yellow:2,red:1,white:0},tt=e=>{let r=[];for(let t of e)Pe[t]||Pe[t]===0?r.push(Pe[t].toString()):r.push(t);return r},at=["unique"],it=["preview","spoiler","unreleased"],st=["released"],ot=()=>{let e=new Date,r=`${e.getMonth()+1}`.padStart(2,"0"),t=`${e.getDate()}`.padStart(2,"0");return`${e.getFullYear()}-${r}-${t}`},ir={dual:d.Meta.DualClass,exp:d.Meta.Expansion,expansion:d.Meta.Expansion,expansionSlot:d.Meta.Expansion,rainbow:d.Meta.Rainbow,reprint:d.Meta.Reprint,reprints:d.Meta.Reprint},nt=e=>{let r=[];for(let t of e)ir[t]?r.push(ir[t]):d.Meta[t]&&r.push(d.Meta[t]);if(e.length>0&&r.length===0){for(let t of Object.values(d.Meta))for(let a of e)if(t.toLowerCase().includes(a)){r.push(t);break}}return r},sr={r:d.Foiling.Rainbow,rf:d.Foiling.Rainbow,rainbow:d.Foiling.Rainbow,c:d.Foiling.Cold,cf:d.Foiling.Cold,cold:d.Foiling.Cold,g:d.Foiling.Gold,gf:d.Foiling.Gold,gold:d.Foiling.Gold},lt=e=>{let r=[];for(let t of e)sr[t]&&r.push(sr[t]);return r},or={...Object.values(d.Treatment).reduce((e,r)=>(e[r.toLowerCase()]=r,e),{}),aa:d.Treatment.AA,alt:d.Treatment.AA,"alt art":d.Treatment.AA,ab:d.Treatment.AB,"alt border":d.Treatment.AB,at:d.Treatment.AT,"alt text":d.Treatment.AT,ea:d.Treatment.EA,extended:d.Treatment.EA,"extended art":d.Treatment.EA,fa:d.Treatment.FA,full:d.Treatment.FA,"full art":d.Treatment.FA},dt=e=>{let r=[];for(let t of e)or[t]?r.push(or[t]):d.Treatment[t.toUpperCase()]&&r.push(d.Treatment[t.toUpperCase()]);return r},ke={b:d.Rarity.Basic,c:d.Rarity.Common,f:d.Rarity.Fabled,l:d.Rarity.Legendary,m:d.Rarity.Majestic,p:d.Rarity.Promo,r:d.Rarity.Rare,s:d.Rarity.SuperRare,t:d.Rarity.Token,v:d.Rarity.Marvel},ct=e=>{let r=[];for(let t of e)ke[t]?r.push(ke[t]):r.push(t);return r},pt=e=>{let r=[],t,a,i=cr.find(s=>e.includes(s));if(i){let[,s]=e.split(i);nr(s)?(t=!0,r.push(...s.trim().split("+").map(o=>o.replace(T,"")))):lr(s)?(a=!0,r.push(...s.trim().split(",").map(o=>o.replace(T,"")))):r.push(s.trim().replace(T,""))}else nr(e)?(t=!0,r.push(...e.trim().split("+").map(s=>s.replace(T,"")))):lr(e)?(a=!0,r.push(...e.trim().split(",").map(s=>s.replace(T,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(T,"")):r.push(e.trim().replace(T,""));return{modifier:i,values:r,isAnd:t,isOr:a}},ut=e=>{let r=gt(e);if(r){let[,t]=e.split(r);return{filterKey:t,isExcluded:!0,isOptional:!1,isMeta:dr(t)}}else return{filterKey:e,isExcluded:!1,isOptional:!1,isMeta:dr(e)}},ft=e=>e.indexOf(":")>=0,nr=e=>e.indexOf("+")>=0,lr=e=>e.indexOf(",")>=0,dr=e=>!!Ie[e]?.isMeta,gt=e=>pr.find(r=>e.includes(r))?.slice(0,1);var v=require("@flesh-and-blood/types"),ur={artists:["Hoodwill"],cardIdentifier:"fangs-a-lot-blue",classes:[v.Class.Generic],defaultImage:"FNG000",firstReleaseDate:"2022-06-02",functionalText:"If Fangs A Lot is put into your banished zone from your graveyard, instead put it into your hand.",legalFormats:[],legalHeroes:[v.Hero.Kayo,v.Hero.Levia,v.Hero.Rhinar],printings:[{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000",print:"FNG000",rarity:v.Rarity.Rare,set:v.Release.Promos},{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000_Marvel",print:`FNG000-${v.Treatment.FA}`,rarity:v.Rarity.Marvel,set:v.Release.Promos,treatment:v.Treatment.FA}],name:"Fangs A Lot",rarities:[v.Rarity.Rare,v.Rarity.Marvel],rarity:v.Rarity.Rare,sets:[v.Release.Promos],setIdentifiers:["FNG000"],specialImage:"FNG000_Marvel",subtypes:[v.Subtype.Attack],types:[v.Type.Action],typeText:"Generic Action - Attack"},fr=[{keyword:ur.name.toLowerCase(),card:ur}];var yt={getFn:(e,r)=>{let t=Le.default.config.getFn(e,r),a=t;if(Array.isArray(t))a=t.map(i=>J(i.replace(T,"")));else if(t){let i=J(t).replace(T,"");a=r.includes("functionalText")?Y(i):i}return a},ignoreLocation:!0,includeScore:!0,keys:[{name:"name",weight:10},{name:"functionalText",weight:6},{name:"shorthands",weight:4},{name:"setIdentifiers",weight:2},{name:"traits",weight:4},{name:"typeText",weight:6}],threshold:.15,useExtendedSearch:!0},Re=class{constructor(r,t=[],a=[],i=!1){this.getFuse=()=>(this.fuse||(this.fuse=new Le.default(this.cards,yt)),this.fuse);this.log=(r,...t)=>{this.debug&&console.log(r,...t)};this.search=(r,t)=>{let a,{appliedFilters:i,attributes:s,keywords:o}=Be(r,this.index,this.additionalHeroes,this.additionalSets),n=o.join(" "),c=t?fr.filter(h=>h.keyword===n):[];if(c.length>0?a=c.map(({card:h})=>h):o.length?a=this.getFuse().search(n).map(h=>h.item):a=[...this.cards],i.length&&(a=a.filter(h=>h&&yr(h,i))),o.length===0){let h="";if(s.releases.length===1)try{let l=s.releases[0];h=pe.setToSetIdentifierMappings[l][0].toUpperCase()}catch(l){console.error("Error getting set identifier from search",l)}if(!h&&s.prints.length===1)try{let l=s.prints[0];pe.setIdentifierToSetMappings[l]&&(h=l.toUpperCase())}catch(l){console.error("Error getting set identifier from search",l)}h?a.sort((l,u)=>{let p=l.setIdentifiers.find(b=>b.includes(h))?.replace(h,""),y=u.setIdentifiers.find(b=>b.includes(h))?.replace(h,"");return p&&y?p.localeCompare(y):-1}):a.sort((l,u)=>l.name===u.name?`${l.pitch}`.localeCompare(`${u.pitch}`):l.name.localeCompare(u.name))}else{let h=[],D=[],C=o.map(l=>l.toLowerCase().replace(T,"")).join(" ");for(let l of a)l.name.toLowerCase().replace(T,"")===C?h.push(l):D.push(l);a=[...h,...D]}let F,{artists:g,isExpansionSlot:f,foilings:m,prints:M,rarities:x,releases:R,treatments:W}=s;(g.length>0||f||m.length>0||M.length>0||x.length>0||R.length>0||W.length>0)&&(F=a.map(h=>{let D=h.printings.filter(C=>{let l=!!C.image,u=g.length===0||g.some(L=>C.artists.find(H=>H.replace(T,"").toLowerCase().includes(L))),p=!f||f===C.isExpansionSlot,y=m.length===0||m.includes(C.foiling),b=M.length===0||M.some(L=>C.identifier.includes(L.toUpperCase())),B=x.length===0||x.includes(C.rarity),A=R.length===0||R.includes(C.set),E=W.length===0||C.treatments?.some(L=>W.includes(L));return l&&u&&p&&y&&b&&B&&A&&E});return{...h,matchingPrintings:D}}));let w=F?.length>0?F:a;return{appliedFilters:i,attributes:s,keywords:o,searchResults:w}};let s=Array.isArray(t)?{additionalHeroes:t,additionalSets:a,debug:i}:t;this.additionalHeroes=s.additionalHeroes||[],this.additionalSets=s.additionalSets||[],this.cards=[...r],this.debug=s.debug||!1,this.index=s.index||Me(r)}},gr=Re,yr=(e,r)=>{let t=!0,a=!1;for(let i of r){let s=i.isOptional,{isNumber:o,isString:n,isArray:c,isBoolean:F,isDate:g}=i.filterToPropertyMapping;if(o){let f=ht(e,i);s?f&&(a=!0):t=t&&f}else if(n){let f=Ct(e,i);s?f&&(a=!0):t=t&&f}else if(c){let f=bt(e,i,r);s?f&&(a=!0):t=t&&f}else if(F){let f=mt(e,i);s?f&&(a=!0):t=t&&f}else if(g){let f=Tt(e,i);s?f&&(a=!0):t=t&&f}}return t},ht=(e,r)=>{if(X(r,e)){let{values:t,modifier:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=ue(e,r);if(o!=null&&!isNaN(o))if(o=parseInt(o),a)switch(a){case">=":{let n=t?.some(c=>o>=parseInt(c));return i?!n:n}case">":{let n=t?.some(c=>o>parseInt(c));return i?!n:n}case"<=":{let n=t?.some(c=>o<=parseInt(c));return i?!n:n}case"<":{let n=t?.some(c=>o<parseInt(c));return i?!n:n}default:return!1}else{let n=t?.some(c=>o===parseInt(c));return i?!n:n}else{let n=Ft(e,r)?.toLowerCase(),c=s?t?.some(F=>n?.includes(F)):t?.some(F=>n===F);return i?!c:c}}else return!0},Ct=(e,r)=>{if(X(r,e)){let{values:t,valuesSet:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{hasMarkup:o,isNormalized:n,partialMatch:c}}=r,F=ue(e,r),g=n?F:F?.replaceAll(T,"").toLowerCase(),f=o&&g?Y(g):g;if(c){let m=i?t?.every(M=>f?.includes(M)):t?.some(M=>f?.includes(M));return s?!m:m}else{let m;return i?m=t?.every(M=>f===M):a?m=a.has(f):m=t?.some(M=>f===M),s?!m:m}}else return!0},bt=(e,r,t)=>{if(X(r,e)){let{values:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{partialMatch:o}}=r,n=Mt(e,r,t).map(c=>c?.replaceAll(T,""));if(o){let c=i?a.every(g=>n?.some(f=>f?.toLowerCase().includes(g))):a.some(g=>n?.some(f=>f?.toLowerCase().includes(g))),F=n.length===0;return s?!c||F:c}else{let c=i?a.every(F=>n?.some(g=>g?.toLowerCase()===F)):a.some(F=>n?.some(g=>g?.toLowerCase()===F));return s?!c:c}}else return!0},mt=(e,r)=>{if(X(r,e)){let{isExcluded:t}=r,a=ue(e,r);return t?!a:a}else return!0},Tt=(e,r)=>{if(X(r,e)){let{values:t,isExcluded:a}=r,i=ue(e,r),s=t?.some(o=>i>o);return a?!s:s}else return!0},ue=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.property]},Mt=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i,property:s}}=r,o=e[s]||[],n=[],c=Object.keys(e.legalOverrides||{}).length>0,F=r.filterToPropertyMapping.property==="legalHeroes",g=t.find(({filterToPropertyMapping:m})=>m.property==="legalFormats");if(c&&F&&!!g){let m=new Set;for(let{format:M,heroes:x}of e.legalOverrides||[])if(g.values.includes(M.toLowerCase()))for(let R of x)m.add(R);n=Array.from(m)}if(n.length===0)if(i){let m=new Set;for(let M of o)if(a){let x=M[i]||[];for(let R of x)m.add(R)}else{let x=M[i];x&&m.add(x)}n=Array.from(m)}else n=o;return n},Ft=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.specialProperty]},X=({cardTypes:e},{types:r,subtypes:t})=>!e||e?.some(a=>r.map(i=>i.toLowerCase()).includes(a.toLowerCase())||t.map(i=>i.toLowerCase()).includes(a.toLowerCase()));var vt=(e,r)=>{let t=[];if(e)for(let a of r){let i=a.name===e.name,s=a.cardIdentifier!==e.cardIdentifier,o=a.pitch!==e.pitch;i&&s&&o&&t.push(a)}return t},At=(e,r)=>{let t=new Set(e?.referencedCards),a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a},xt=e=>{let r=new Map;for(let t of e)for(let a of t.referencedCards||[]){let i=r.get(a);i?i.push(t):r.set(a,[t])}return r},St=(e,r)=>{let t=new Set;for(let i of e)for(let s of i.createdExtras||[])t.add(s);let a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a};0&&(module.exports={FilterProperty,MARKUP,PUNCTUATION,RARITY_VALUES_MAPPING,abbreviations,availableExclusions,availableModifiers,filterCard,filtersToCardPropertyMappings,getAbbreviation,getAbbreviationByCard,getCardsByName,getCardsByReferencedCardIdentifier,getCardsReferencedBy,getCardsReferencing,getCatalogueIndex,getCleanText,getExcludedMetaFilters,getKeywordsAndAppliedFiltersFromText,getMetaFilters,getNormalizedText,getOtherPitches,getReferencedCards,getTextWithoutMarkup,getTokensReferencedByCards,multiWordShorthands,shorthands,singleWordShorthands});
1
+ "use strict";var Cr=Object.create;var te=Object.defineProperty;var mr=Object.getOwnPropertyDescriptor;var br=Object.getOwnPropertyNames;var Tr=Object.getPrototypeOf,Mr=Object.prototype.hasOwnProperty;var Fr=(e,r)=>{for(var t in r)te(e,t,{get:r[t],enumerable:!0})},Ee=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of br(r))!Mr.call(e,i)&&i!==t&&te(e,i,{get:()=>r[i],enumerable:!(a=mr(r,i))||a.enumerable});return e};var vr=(e,r,t)=>(t=e!=null?Cr(Tr(e)):{},Ee(r||!e||!e.__esModule?te(t,"default",{value:e,enumerable:!0}):t,e)),Ar=e=>Ee(te({},"__esModule",{value:!0}),e);var Rt={};Fr(Rt,{FilterProperty:()=>Q,MARKUP:()=>he,NO_CARD_PROPERTY:()=>U,PUNCTUATION:()=>b,RARITY_VALUES_MAPPING:()=>Ie,abbreviations:()=>Ce,availableExclusions:()=>cr,availableModifiers:()=>dr,default:()=>yr,filterCard:()=>hr,filtersToCardPropertyMappings:()=>pr,getAbbreviation:()=>ae,getAbbreviationByCard:()=>xr,getCardsByName:()=>le,getCardsByReferencedCardIdentifier:()=>wt,getCardsReferencedBy:()=>ce,getCardsReferencing:()=>de,getCatalogueIndex:()=>ve,getCleanText:()=>$,getExcludedMetaFilters:()=>be,getKeywordsAndAppliedFiltersFromText:()=>Be,getMetaFilters:()=>me,getNormalizedText:()=>X,getOtherPitches:()=>Pt,getReferencedCards:()=>St,getTextWithoutMarkup:()=>J,getTokensReferencedByCards:()=>kt,multiWordShorthands:()=>Me,shorthands:()=>Te,singleWordShorthands:()=>Fe});module.exports=Ar(Rt);var ge=require("@flesh-and-blood/types"),Ne=vr(require("fuse.js"),1);var b=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g,he=/\*/g;var d=require("@flesh-and-blood/types");var ae=e=>Ce.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),xr=e=>Ce.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),Ce=[{abbreviations:["10k"],card:"10,000 Year Reunion"},{abbreviations:["Pajamas","PJs"],card:"Alluvion Constellas"},{abbreviations:["Slippy","Arakni Slipped Through the Cracks","Arakni, Slipped Through the Cracks"],card:"Arakni, 5L!p3d 7hRu 7h3 cR4X"},{abbreviations:["Dullcap"],card:"Arcanite Skullcap"},{abbreviations:["ALS"],card:"Arc Light Sentinel"},{abbreviations:["AoW"],card:"Art of War"},{abbreviations:["BBD"],card:"Barraging Beatdown"},{abbreviations:["BBS"],card:"Big Blue Sky"},{abbreviations:["Starvo"],card:"Bravo, Star of the Show"},{abbreviations:["BEB"],card:"Bull's Eye Bracers"},{abbreviations:["BLW"],card:"Be Like Water"},{abbreviations:["BoJ"],card:"Balance of Justice"},{abbreviations:["BOHH"],card:"Blood on Her Hands"},{abbreviations:["BRB"],card:"Bloodrush Bellow"},{abbreviations:["Breezies"],card:"Breeze Rider Boots"},{abbreviations:["BTA"],card:"Burn Them All"},{abbreviations:["CStrike","C-Strike","C Strike"],card:"Celestial Cataclysm"},{abbreviations:["CBelly"],card:"Cerebellum Processor"},{abbreviations:["CLF"],card:"Channel Lake Frigid"},{abbreviations:["CLV"],card:"Channel Lightning Valley"},{abbreviations:["CMH"],card:"Channel Mount Heroic"},{abbreviations:["CMI"],card:"Channel Mount Isen"},{abbreviations:["CMT"],card:"Channel the Millennium Tree"},{abbreviations:["CnC","C&C"],card:"Command and Conquer"},{abbreviations:["Sea and Sea"],card:"Conqueror of the High Seas"},{abbreviations:["CYB"],card:"Count Your Blessings"},{abbreviations:["Cat","Kitty"],card:"Crouching Tiger"},{abbreviations:["CoD"],card:"Crown of Dominion"},{abbreviations:["CoP"],card:"Crown of Providence"},{abbreviations:["CtW"],card:"Crush the Weak"},{abbreviations:["DD"],card:"Death Dealer"},{abbreviations:["DnD"],card:"Devotion Never Dies"},{abbreviations:["DIO"],card:"Dash I/O"},{abbreviations:["EBTT"],card:"Even Bigger Than That!"},{abbreviations:["NewNigma"],card:"Enigma, New Moon"},{abbreviations:["EPot","E Pot"],card:"Energy Potion"},{abbreviations:["EStrike","E-Strike","E Strike"],card:"Enlightened Strike"},{abbreviations:["FFS"],card:"Fyendal's Fighting Spirit"},{abbreviations:["FoN"],card:"Force of Nature"},{abbreviations:["Frosty","\u{1F976}","\u{1F9CA}","\u2744\uFE0F"],card:"Frostbite"},{abbreviations:["Yum yum"],card:"Fruits of the Forest"},{abbreviations:["GnT"],card:"Give and Take"},{abbreviations:["Habibi"],card:"Hanabi Blaster"},{abbreviations:["HMH"],card:"Hope Merchant's Hood"},{abbreviations:["HoI"],card:"Heart of Ice"},{abbreviations:["Pumpkin"],card:"Jack-o'-lantern"},{abbreviations:["RKO","Cheato"],card:"Kayo, Underhanded Cheat"},{abbreviations:["KKBB"],card:"Knick Knack Bric-a-brac"},{abbreviations:["BStrike"],card:"Levels of Enlightenment"},{abbreviations:["LAG","Twominaris"],card:"Luminaris, Angel's Glow"},{abbreviations:["LCF","Newminaris"],card:"Luminaris, Celestial Fury"},{abbreviations:["LDE"],card:"Last Ditch Effort"},{abbreviations:["LtC"],card:"Lead the Charge"},{abbreviations:["LNW"],card:"Leave No Witnesses"},{abbreviations:["LFaL","L4aL"],card:"Life for a Life"},{abbreviations:["LiT"],card:"Lost in Thought"},{abbreviations:["MMB"],card:"Mage Master Boots"},{abbreviations:["MaxV"],card:"Maximum Velocity"},{abbreviations:["MoM"],card:"Mask of Momentum"},{abbreviations:["MoPL"],card:"Mask of the Pouncing Lynx"},{abbreviations:["MnG"],card:"Meat and Greet"},{abbreviations:["Cake","\u{1F382}"],card:"Ninth Blade of the Blood Oath"},{abbreviations:["PoM"],card:"Peace of Mind"},{abbreviations:["P-Bone"],card:"Performance Bonus"},{abbreviations:["PF","\u{1F525}"],card:"Phoenix Flame"},{abbreviations:["PtW"],card:"Poison the Well"},{abbreviations:["Thanos","Infinity Gauntlet"],card:"Polarity Reversal Script"},{abbreviations:["DPot","D Pot"],card:"Potion of D\xE9j\xE0 Vu"},{abbreviations:["Ponder Run"],card:"Premeditate"},{abbreviations:["Qi Unbound"],card:"Qi Unleashed"},{abbreviations:["RitL"],card:"Red in the Ledger"},{abbreviations:["Cats","Ghost cat","Ghost cats"],card:"Restless Coalescence"},{abbreviations:["Eugene"],card:"Rhinar, Reckless Rampage",isHidden:!0},{abbreviations:["SSGB"],card:"Sandscour Greatbow"},{abbreviations:["SSP"],card:"Sand Sketched Plan"},{abbreviations:["SFaS","S4aS"],card:"Scar for a Scar"},{abbreviations:["Tyler"],card:"Scurv, Stowaway",isHidden:!0},{abbreviations:["SWOMB"],card:"Shifting Winds of the Mystic Beast"},{abbreviations:["Snaps"],card:"Snapdragon Scalers"},{abbreviations:["SWK"],card:"Spinning Wheel Kick"},{abbreviations:["SFTL"],card:"Swing Fist, Think Later"},{abbreviations:["TTT"],card:"Take the Tempo"},{abbreviations:["Ultron"],card:"Teklovossen, the Mechropotent"},{abbreviations:["ToS"],card:"Test of Strength"},{abbreviations:["TAYG"],card:"That All You Got?"},{abbreviations:["TROM"],card:"This Round's on Me"},{abbreviations:["3oak"],card:"Three of a Kind"},{abbreviations:["Pox Malone","Post Malone"],card:"Virulent Touch"},{abbreviations:["Cast Homes"],card:"Visit Goldmane Estate"},{abbreviations:["Frosty Hammer"],card:"Winter's Wail"},{abbreviations:["Wreckless Wing"],card:"War Cry of Bellona"},{abbreviations:["ZTS"],card:"Zero to Sixty"}];var k=require("@flesh-and-blood/types");var Q={BannedFormats:"bannedFormats",LegalFormats:"legalFormats",LegalHeroes:"legalHeroes"},ne=Array.from(Array(50).keys()).map(e=>`${e}`),Pr=[{format:k.Format.ClassicConstructed,nicknames:["cc","classic"]},{format:k.Format.LivingLegend,nicknames:["cc ll","classic constructed ll","ll cc","ll","living legend"]},{format:k.Format.SilverAge,nicknames:["sage"]},{format:k.Format.GoldenAge,nicknames:["gage"]},{format:k.Format.UltimatePitFight,nicknames:["upf"]}],Sr=Object.values(k.Format).map(e=>{let r=Pr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(b,"");return r?{...r,format:t}:{format:t}}),wr=[{hero:k.Hero.DataDoll,nicknames:["data","datadoll"]},{hero:k.Hero.Dorinthea,nicknames:["dori"]},{hero:k.Hero.Genis,nicknames:["genis"]},{hero:k.Hero.GravyBones,nicknames:["gravy"]},{hero:k.Hero.Iyslander,nicknames:["islander"]}],kr=Object.values(k.Hero).map(e=>{let r=wr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(b,"");return r?{...r,hero:t}:{hero:t}}),ie=["common","rare","super rare","majestic","legendary","fabled"],Rr=(e,r,t,a)=>{let i=[];if(!r)i.push(...e);else for(let s of e)switch(r){case">=":{let o=!1;for(let n of ie)o?i.push(n):n===s&&(o=!0,i.push(n));break}case">":{let o=!1;for(let n of ie)o?i.push(n):n===s&&(o=!0);break}case"<=":{let o=!1;for(let n of ie.slice().reverse())o?i.push(n):n===s&&(o=!0,i.push(n));break}case"<":{let o=!1;for(let n of ie.slice().reverse())o?i.push(n):n===s&&(o=!0);break}default:break}return{filterToPropertyMapping:{nestedProperty:"rarity",property:"printings",isArray:!0},isExcluded:t,isOptional:a,isOr:!0,values:i}},De=(e,r,t,a,i)=>{let s=a.map(p=>({hero:p.toLowerCase().replaceAll(b,"")})),o=[],n=[],c=[];for(let p of e){let f=Sr.find(({format:T,nicknames:M})=>T===p||!!M&&M.includes(p));if(f)n.push(f.format);else{let T=kr.find(({hero:M,nicknames:L})=>M===p||!!L&&L.includes(p))||s.find(({hero:M})=>M===p);T&&c.push(T.hero)}}let F=i||"legalFormats";return n.length>0&&o.push({filterToPropertyMapping:{property:F,isArray:!0},values:n,isOr:!0,isExcluded:r,isOptional:t}),c.length>0&&o.push({filterToPropertyMapping:{property:Q.LegalHeroes,isArray:!0},values:c,isOr:!0,isExcluded:r,isOptional:t}),o},Ir=(e,r,t,a)=>De(e,r,t,a,"bannedFormats"),me=(e,r,t,a,i,s)=>{let o=[];return Nr(t)?o.push(...De(a,e,r,s)):Dr(t)?o.push(...Ir(a,e,r,s)):Hr(t)&&o.push(Rr(a,i,e,r)),o},Y=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:ne},{filterToPropertyMapping:{property:"specialCost",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]}],G=[{filterToPropertyMapping:{property:"defense",isNumber:!0},isExcluded:!0,values:ne},{filterToPropertyMapping:{property:"specialDefense",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["hero","placeholder","token","weapon"]}],se=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:ne},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],_=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:ne},{filterToPropertyMapping:{property:"specialPower",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token"]}],oe=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(k.Talent).map(e=>e.toLowerCase())}],Br={"!co":Y,"-co":Y,"!cost":Y,"-cost":Y,"!color":Y,"-color":Y,"!b":G,"-b":G,"!block":G,"-block":G,"!d":G,"-d":G,"!def":G,"-def":G,"!defense":G,"-defense":G,"!pitch":se,"-pitch":se,"!p":se,"-p":se,"!attack":_,"-attack":_,"!power":_,"-power":_,"!pwr":_,"-pwr":_,"!pow":_,"-pow":_,"!talents":oe,"-talents":oe,"!tal":oe,"-tal":oe},be=e=>{let r=[],t=Br[e];return t&&r.push(...t),r},Lr=["l","legal","hero"],Nr=e=>Lr.includes(e),Er=["banned"],Dr=e=>Er.includes(e),Or=["r","rarity"],Hr=e=>Or.includes(e);var D=require("@flesh-and-blood/types"),Te=[{description:"Attack actions",expanded:["st:attack"],filters:{subtypes:[D.Subtype.Attack]},isCardProperty:!1,shorthands:["AA"]},{description:"Arcane barrier",expanded:['k:"arcane barrier"'],filters:{keywords:[D.Keyword.ArcaneBarrier]},isCardProperty:!1,shorthands:["AB"]},{description:"Attack reactions",expanded:['t:"attack reaction"'],filters:{types:[D.Type.AttackReaction]},isCardProperty:!1,shorthands:["AR"]},{description:"Defense reactions",expanded:['t:"defense reaction"'],filters:{types:[D.Type.DefenseReaction]},isCardProperty:!1,shorthands:["DR"]},{description:"Gain life",expanded:["gain {h}"],filters:{functionalText:"gain {h}"},isCardProperty:!1,shorthands:["Gain life","Gains life"]},{description:"Go again",expanded:['k:"go again"'],filters:{keywords:[D.Keyword.GoAgain]},isCardProperty:!1,shorthands:["GA"]},{description:"Non-attack actions",expanded:["t:action","st:non-attack"],filters:{subtypes:[D.Subtype.NonAttack],types:[D.Type.Action]},isCardProperty:!1,shorthands:["NAA"]},{description:"Plus defense",expanded:["+ {d}"],filters:{functionalText:"+ {d}"},isCardProperty:!1,shorthands:["Pump defense","Pumps defense","Buff defense","Buffs defense"]},{description:"Spellvoid",expanded:['k:"spellvoid"'],filters:{keywords:[D.Keyword.Spellvoid]},isCardProperty:!1,shorthands:["SV"]}],Me=Te.filter(({shorthands:e})=>e.some(r=>r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)})),Fe=Te.filter(({shorthands:e})=>e.some(r=>!r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>!r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)}));var $=e=>X(e.toLowerCase().trim().replace(b,"")),X=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,""),J=e=>e.replace(he,"");var q=require("@flesh-and-blood/types");var Oe=new WeakMap,j=Object.freeze([]),Vr=Number.MAX_SAFE_INTEGER,He=(e,r)=>{let t=new Map;for(let a of e)for(let i of r(a)||[]){let s=t.get(i);s?s.push(a):t.set(i,[a])}return t},Gr=e=>{let r=new Map;for(let t of e){let a=t.types.includes(q.Type.Hero)&&!t.isCardBack,i=a?q.CardRole.Hero:(0,q.getCardRole)(t);if(a||i!==q.CardRole.Hero){let o=r.get(i);o?o.push(t):r.set(i,[t])}}return r},Wr=e=>{let r,t,a,i,s,o=()=>{if(!r){let l=new Map,g=new Map,u=[],y=new Map,m=0;for(let R of e){l.set(R.cardIdentifier,R),g.set(R.cardIdentifier,m),m++;let A=$(R.name),B=y.get(A);B?B.push(R):(y.set(A,[R]),u.push(A))}r={cardByCardIdentifier:l,corpusPositionByCardIdentifier:g,cleanedNames:u,pitchCycleByCleanedName:y}}return r},n=l=>{let{corpusPositionByCardIdentifier:g}=o(),u=({cardIdentifier:y})=>g.get(y)??Vr;return[...l].sort((y,m)=>u(y)-u(m))},c=l=>o().cardByCardIdentifier.get(l),F=l=>{let{cardByCardIdentifier:g}=o(),u=[];for(let y of l||[]){let m=g.get(y);m&&u.push(m)}return n(u)},p=l=>{let g=new Map;return u=>{let y=g.get(u);if(!y){let m=c(u),R=F(m&&l(m)),A=R.length>0;y=A?R:j,A&&g.set(u,y)}return y}},f=l=>{let{pitchCycleByCleanedName:g}=o(),u=c(l);return u?g.get($(u.name))??j:j},T=l=>{let{cleanedNames:g,pitchCycleByCleanedName:u}=o(),y=$(l),m=u.get(y);if(!m&&y.length>0){let A=g.find(B=>B.includes(y));A&&(m=u.get(A))}return m??j},M=l=>{let{pitchCycleByCleanedName:g}=o();return g.get($(l))??j},L=()=>{if(!s){let l=new Set;for(let g of e)for(let u of g.artists)l.add(u);s=[...l].sort((g,u)=>g.localeCompare(u,"en",{sensitivity:"base"}))}return s},O=p(({oppositeSideCardIdentifiers:l})=>l),W=p(({referencedCards:l})=>l),P=l=>(t||(t=He(e,({referencedCards:g})=>g)),t.get(l)??j),S=p(({createdExtras:l})=>l);return{cards:e,getCard:c,getPitchCycle:f,getCardsByName:T,getCardsByExactName:M,getArtists:L,getOppositeSide:O,getReferences:W,getReferencedBy:P,getCreates:S,getCreatedBy:l=>(a||(a=He(e,({createdExtras:g})=>g)),a.get(l)??j),getCreatedClosure:l=>{let g=new Map,u=new Set,y=[...l];for(let m of y)if(!u.has(m)){u.add(m);for(let A of S(m))g.set(A.cardIdentifier,A),y.push(A.cardIdentifier)}return n([...g.values()])},getByRole:l=>(i||(i=Gr(e)),i.get(l)??j),getCardsInCorpusOrder:n}},ve=e=>{let r=Oe.get(e);return r||(r=Wr(e),Oe.set(e,r)),r},Ae=(e,r)=>e.getPitchCycle(r.cardIdentifier),le=(e,r)=>e.getCardsByName(r),Ve=(e,r)=>{let t=new Map;for(let a of r)for(let i of Ae(e,a))t.set(i.cardIdentifier,i);return e.getCardsInCorpusOrder([...t.values()])},de=(e,r)=>{let t=[];for(let a of Ae(e,r))t.push(...e.getReferencedBy(a.cardIdentifier));return Ve(e,t)},ce=(e,r)=>{let t=[];for(let a of Ae(e,r))t.push(...e.getReferences(a.cardIdentifier));return Ve(e,t)};var dr=[">=",">","<=","<"],cr=["!","-"],U="n/a",Ur={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},xe={property:"artists",isArray:!0,partialMatch:!0},Ge={property:U,isMeta:!0},We={property:"bonds",isArray:!0},Kr={property:"cardIdentifier",isString:!0,isNormalized:!0},Ue=(e,{isAnd:r,isExcluded:t,isOptional:a,modifier:i})=>({filterToPropertyMapping:Kr,values:[...e],valuesSet:e,isAnd:r,isOr:!0,modifier:i,isExcluded:t,isOptional:a}),_r={property:U},Ke={property:"classes",isArray:!0,partialMatch:!0},_e={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},Z={property:"defense",specialProperty:"specialDefense",isNumber:!0},je={property:"flows",isArray:!0},ze={nestedProperty:"foiling",property:"printings",isArray:!0},qe={property:"fusions",isArray:!0},Ye={property:"intellect",isNumber:!0},$e={property:"keywords",isArray:!0},Pe={property:U,isMeta:!0},Je={property:"life",specialProperty:"specialLife",isNumber:!0},Re={property:"meta",isArray:!0},Qe={property:"name",isString:!0,partialMatch:!0},Se={property:"pitch",isNumber:!0},Xe={property:"firstReleaseDate",isDate:!0},pe={property:"power",specialProperty:"specialPower",isNumber:!0},jr={property:"setIdentifiers",isArray:!0,partialMatch:!0},Ze={property:U,isMeta:!0},zr={property:U},qr={property:U},er={property:"sets",isArray:!0,partialMatch:!0},we={property:"shorthands",isArray:!0,partialMatch:!0},ue={property:"specializations",isArray:!0,partialMatch:!0},rr={property:"subtypes",isArray:!0},tr={property:"types",isArray:!0},ar={property:"talents",isArray:!0},Yr={property:"functionalText",hasMarkup:!0,isString:!0,partialMatch:!0},$r={property:"traits",isArray:!0,partialMatch:!0},Jr={property:"typeText",isString:!0,partialMatch:!0},fe={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},Qr={property:"firstReleaseDate",isString:!0,partialMatch:!0},pr={arcane:Ur,a:xe,artist:xe,art:xe,attack:pe,b:Z,block:Z,banned:Ge,bond:We,bonds:We,c:Ke,class:Ke,chain:_r,co:_e,cost:_e,color:Se,d:Z,def:Z,defense:Z,flow:je,flows:je,f:qe,fusion:qe,foil:ze,foiling:ze,i:Ye,intellect:Ye,is:Re,k:$e,keyword:$e,l:Pe,legal:Pe,hero:Pe,li:Je,life:Je,meta:Re,n:Qe,name:Qe,p:Se,pitch:Se,pwr:pe,pow:pe,power:pe,print:jr,r:Ze,rarity:Ze,referencedby:zr,references:qr,rf:Ge,s:er,set:er,short:we,shorthand:we,shorthands:we,sp:ue,spec:ue,specialization:ue,specializations:ue,st:rr,subtype:rr,t:tr,type:tr,tal:ar,talent:ar,text:Yr,trait:$r,treat:fe,treatment:fe,var:fe,variation:fe,x:Jr,year:Qr},ur=pr,Xr=[{text:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:d.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(b,"")}],Zr=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:s}of Xr)t.includes(i)&&(t=t.replace(i,s));if(ae(t)?.card)r.push(t);else{let i=t.split(/[ ]+/),s="",o=0;for(let n of i)o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0),o<2&&n.split('"').length===2?(s+=" "+n,o++):o===0&&s===""?r.push(n):o===1&&(s+=" "+n);o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0)}return r},et=20,Be=(e,r,t=[],a=[],i=nt())=>{let s=e.trim().toLowerCase();for(let{expanded:P,shorthands:S}of Me)for(let h of S)if(s.includes(h)){s=s.replace(h,P.join(" "));break}for(let[P,S]of Object.entries(d.setToSetIdentifierMappings))s.includes(P.toLowerCase())&&(s=s.replace(P.toLowerCase(),S[0]));let o=Zr(s),n=[];for(let P of o){let S=Fe.find(({shorthands:h})=>h.includes(P));S&&!S.isCardProperty?n.push(...S.expanded):n.push(P)}let c=[],F=[],p=[],f=[],T=!1,M=[],L=[],O=[],W=[];for(let P of n)if(ht(P)){let[S,h]=P.split(":"),{modifier:E,values:C,isAnd:l,isOr:g}=gt(h),{filterKey:u,isExcluded:y,isOptional:m,isMeta:R}=yt(S),A=!1;if(R){if(["rarity","r"].includes(u)){let B=ft(C);y||(L=[...B]),C=B.map(x=>x.toLowerCase())}["legal","l","hero"].includes(u),c.push(...me(y,m,u,C,E,t))}else{if(["chain"].includes(u)){let x=new Set,I=[],H=new Set,V=w=>{x.add(w.cardIdentifier),H.has(w.name)||(H.add(w.name),I.push(w))},z=w=>{w.types.includes(d.Type.Hero)||V(w)};for(let w of C)if(w)for(let N of le(r,w))V(N);let K=0;for(let w of I){if(K>et)break;for(let ye of ce(r,w))z(ye);if(K===0)for(let ye of de(r,w))z(ye);K++}c.push(Ue(x,{isAnd:l,isExcluded:y,isOptional:m,modifier:E})),A=!0}else if(["referencedby","references"].includes(u)){let x=["referencedby"].includes(u),I=new Set;for(let H of C)if(H)for(let V of le(r,H)){let z=x?ce(r,V):de(r,V);for(let K of z)I.add(K.cardIdentifier)}c.push(Ue(I,{isAnd:l,isExcluded:y,isOptional:m,modifier:E})),A=!0}else if(["art","artist"].includes(u))F=C;else if(["print","prints","printing","printings"].includes(u))M=C;else if(["is","meta"].includes(u)){let x=[],I=[],H=[],V=[];for(let N of C)it.includes(N)?x.push(N):st.includes(N)?I.push(N):ot.includes(N)?H.push(N):V.push(N);x.length>0&&(c.push({filterToPropertyMapping:Re,values:[d.Meta.Reprint.toLowerCase().replaceAll(b,"")],isAnd:l,isOr:g,isExcluded:!y,isOptional:m}),A=V.length===0);let z=I.length>0;z&&c.push({filterToPropertyMapping:Xe,values:[i],isAnd:l,isOr:g,isExcluded:y,isOptional:m});let K=H.length>0;K&&c.push({filterToPropertyMapping:Xe,values:[i],isAnd:l,isOr:g,isExcluded:!y,isOptional:m}),(z||K)&&(A=V.length===0);let w=lt(V);C=w.map(N=>N.toLowerCase().replaceAll(b,"")),w.includes(d.Meta.Expansion)&&!y&&(T=!0)}else["foiling","foil"].includes(u)?(f=dt(C),C=f.map(x=>x.toLowerCase())):["treat","treatment","var","variation"].includes(u)?(W=ut(C),C=W.map(x=>x.toLowerCase())):["set","s"].includes(u)?(O=rt(C,a),C=O.map(x=>x.toLowerCase().replaceAll(b,""))):["pitch","p","color"].includes(u)&&(C=at(C));let B=ur[u];B&&!A&&c.push({filterToPropertyMapping:B,values:B.hasMarkup?C.map(x=>J(x)):C,isAnd:l,isOr:g,modifier:E,isExcluded:y,isOptional:m})}}else if(P){let S=ae(P)?.card,h=be(P);S?p.push(`"${S.toLowerCase().replace(b,"")}"`):h&&h.length>0?c.push(...h):p.push(P.replace(b,""))}return{appliedFilters:c,attributes:{artists:F,foilings:f,isExpansionSlot:T,prints:M,rarities:L,releases:O,treatments:W},keywords:p}},rt=(e,r=[])=>{let t=[];for(let a of e)t.push(...tt(a,r));return t},tt=(e,r=[])=>{let t=[],a=Object.values(d.Release).find(i=>i.toLowerCase().replaceAll(b,"")===e);if(a&&t.push(a),t.length===0){let i=d.setIdentifierToSetMappings[e];i&&t.push(i)}if(t.length===0){let i=Object.values(d.Release).filter(s=>s.toLowerCase().includes(e));i.length>0&&t.push(...i)}if(t.length===0){let i=r.find(s=>s.toLowerCase().replaceAll(b,"")===e);i&&t.push(i)}return t},ke={purple:4,blue:3,yellow:2,red:1,white:0},at=e=>{let r=[];for(let t of e)ke[t]||ke[t]===0?r.push(ke[t].toString()):r.push(t);return r},it=["unique"],st=["preview","spoiler","unreleased"],ot=["released"],nt=()=>{let e=new Date,r=`${e.getMonth()+1}`.padStart(2,"0"),t=`${e.getDate()}`.padStart(2,"0");return`${e.getFullYear()}-${r}-${t}`},ir={dual:d.Meta.DualClass,exp:d.Meta.Expansion,expansion:d.Meta.Expansion,expansionSlot:d.Meta.Expansion,rainbow:d.Meta.Rainbow,reprint:d.Meta.Reprint,reprints:d.Meta.Reprint},lt=e=>{let r=[];for(let t of e)ir[t]?r.push(ir[t]):d.Meta[t]&&r.push(d.Meta[t]);if(e.length>0&&r.length===0){for(let t of Object.values(d.Meta))for(let a of e)if(t.toLowerCase().includes(a)){r.push(t);break}}return r},sr={r:d.Foiling.Rainbow,rf:d.Foiling.Rainbow,rainbow:d.Foiling.Rainbow,c:d.Foiling.Cold,cf:d.Foiling.Cold,cold:d.Foiling.Cold,g:d.Foiling.Gold,gf:d.Foiling.Gold,gold:d.Foiling.Gold},dt=e=>{let r=[];for(let t of e)sr[t]&&r.push(sr[t]);return r},ct={...Object.values(d.Treatment).reduce((e,r)=>(e[r.toLowerCase()]=r,e),{}),aa:d.Treatment.AA,alt:d.Treatment.AA,"alt art":d.Treatment.AA,ab:d.Treatment.AB,"alt border":d.Treatment.AB,at:d.Treatment.AT,"alt text":d.Treatment.AT,ea:d.Treatment.EA,extended:d.Treatment.EA,"extended art":d.Treatment.EA,fa:d.Treatment.FA,full:d.Treatment.FA,"full art":d.Treatment.FA},pt=d.Treatment,ut=e=>{let r=[];for(let t of e){let a=ct[t],i=pt[t.toUpperCase()];a?r.push(a):i&&r.push(i)}return r},Ie={b:d.Rarity.Basic,c:d.Rarity.Common,f:d.Rarity.Fabled,l:d.Rarity.Legendary,m:d.Rarity.Majestic,p:d.Rarity.Promo,r:d.Rarity.Rare,s:d.Rarity.SuperRare,t:d.Rarity.Token,v:d.Rarity.Marvel},ft=e=>{let r=[];for(let t of e)Ie[t]?r.push(Ie[t]):r.push(t);return r},gt=e=>{let r=[],t,a,i=dr.find(s=>e.includes(s));if(i){let[,s]=e.split(i);or(s)?(t=!0,r.push(...s.trim().split("+").map(o=>o.replace(b,"")))):nr(s)?(a=!0,r.push(...s.trim().split(",").map(o=>o.replace(b,"")))):r.push(s.trim().replace(b,""))}else or(e)?(t=!0,r.push(...e.trim().split("+").map(s=>s.replace(b,"")))):nr(e)?(a=!0,r.push(...e.trim().split(",").map(s=>s.replace(b,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(b,"")):r.push(e.trim().replace(b,""));return{modifier:i,values:r,isAnd:t,isOr:a}},yt=e=>{let r=Ct(e);if(r){let[,t]=e.split(r);return{filterKey:t,isExcluded:!0,isOptional:!1,isMeta:lr(t)}}else return{filterKey:e,isExcluded:!1,isOptional:!1,isMeta:lr(e)}},ht=e=>e.indexOf(":")>=0,or=e=>e.indexOf("+")>=0,nr=e=>e.indexOf(",")>=0,lr=e=>!!ur[e]?.isMeta,Ct=e=>cr.find(r=>e.includes(r))?.slice(0,1);var v=require("@flesh-and-blood/types"),fr={artists:["Hoodwill"],cardIdentifier:"fangs-a-lot-blue",classes:[v.Class.Generic],defaultImage:"FNG000",firstReleaseDate:"2022-06-02",functionalText:"If Fangs A Lot is put into your banished zone from your graveyard, instead put it into your hand.",legalFormats:[],legalHeroes:[v.Hero.Kayo,v.Hero.Levia,v.Hero.Rhinar],printings:[{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000",print:"FNG000",rarity:v.Rarity.Rare,set:v.Release.Promos},{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000_Marvel",print:`FNG000-${v.Treatment.FA}`,rarity:v.Rarity.Marvel,set:v.Release.Promos,treatment:v.Treatment.FA}],name:"Fangs A Lot",rarities:[v.Rarity.Rare,v.Rarity.Marvel],rarity:v.Rarity.Rare,sets:[v.Release.Promos],setIdentifiers:["FNG000"],specialImage:"FNG000_Marvel",subtypes:[v.Subtype.Attack],types:[v.Type.Action],typeText:"Generic Action - Attack"},gr=[{keyword:fr.name.toLowerCase(),card:fr}];var mt={getFn:(e,r)=>{let t=Ne.default.config.getFn(e,r),a=t;if(Array.isArray(t))a=t.map(i=>X(i.replace(b,"")));else if(t){let i=X(t).replace(b,"");a=r.includes("functionalText")?J(i):i}return a},ignoreLocation:!0,includeScore:!0,keys:[{name:"name",weight:10},{name:"functionalText",weight:6},{name:"shorthands",weight:4},{name:"setIdentifiers",weight:2},{name:"traits",weight:4},{name:"typeText",weight:6}],threshold:.15,useExtendedSearch:!0},Le=class{constructor(r,t=[],a=[],i=!1){this.getFuse=()=>(this.fuse||(this.fuse=new Ne.default(this.cards,mt)),this.fuse);this.log=(r,...t)=>{this.debug&&console.log(r,...t)};this.search=(r,t)=>{let a,{appliedFilters:i,attributes:s,keywords:o}=Be(r,this.index,this.additionalHeroes,this.additionalSets),n=o.join(" "),c=t?gr.filter(h=>h.keyword===n):[];if(c.length>0?a=c.map(({card:h})=>h):o.length?a=this.getFuse().search(n).map(h=>h.item):a=[...this.cards],i.length&&(a=a.filter(h=>h&&hr(h,i))),o.length===0){let h="";if(s.releases.length===1)try{let l=s.releases[0];h=ge.setToSetIdentifierMappings[l][0].toUpperCase()}catch(l){console.error("Error getting set identifier from search",l)}if(!h&&s.prints.length===1)try{let l=s.prints[0];ge.setIdentifierToSetMappings[l]&&(h=l.toUpperCase())}catch(l){console.error("Error getting set identifier from search",l)}h?a.sort((l,g)=>{let u=l.setIdentifiers.find(m=>m.includes(h))?.replace(h,""),y=g.setIdentifiers.find(m=>m.includes(h))?.replace(h,"");return u&&y?u.localeCompare(y):-1}):a.sort((l,g)=>l.name===g.name?`${l.pitch}`.localeCompare(`${g.pitch}`):l.name.localeCompare(g.name))}else{let h=[],E=[],C=o.map(l=>l.toLowerCase().replace(b,"")).join(" ");for(let l of a)l.name.toLowerCase().replace(b,"")===C?h.push(l):E.push(l);a=[...h,...E]}let F=[],{artists:p,isExpansionSlot:f,foilings:T,prints:M,rarities:L,releases:O,treatments:W}=s;(p.length>0||f||T.length>0||M.length>0||L.length>0||O.length>0||W.length>0)&&(F=a.map(h=>{let E=h.printings.filter(C=>{let l=!!C.image,g=p.length===0||p.some(I=>C.artists.find(H=>H.replace(b,"").toLowerCase().includes(I))),u=!f||f===C.isExpansionSlot,y=T.length===0||!!C.foiling&&T.includes(C.foiling),m=M.length===0||M.some(I=>C.identifier.includes(I.toUpperCase())),R=L.length===0||L.includes(C.rarity),A=O.length===0||O.includes(C.set),B=W.length===0||C.treatments?.some(I=>W.includes(I));return l&&g&&u&&y&&m&&R&&A&&B});return{...h,matchingPrintings:E}}));let S=F.length>0?F:a;return{appliedFilters:i,attributes:s,keywords:o,searchResults:S}};let s=Array.isArray(t)?{additionalHeroes:t,additionalSets:a,debug:i}:t;this.additionalHeroes=s.additionalHeroes||[],this.additionalSets=s.additionalSets||[],this.cards=[...r],this.debug=s.debug||!1,this.index=s.index||ve(r)}},yr=Le,hr=(e,r)=>{let t=!0,a=!1;for(let i of r){let s=i.isOptional,{isNumber:o,isString:n,isArray:c,isBoolean:F,isDate:p}=i.filterToPropertyMapping;if(o){let f=bt(e,i);s?f&&(a=!0):t=t&&f}else if(n){let f=Tt(e,i);s?f&&(a=!0):t=t&&f}else if(c){let f=Mt(e,i,r);s?f&&(a=!0):t=t&&f}else if(F){let f=Ft(e,i);s?f&&(a=!0):t=t&&f}else if(p){let f=vt(e,i);s?f&&(a=!0):t=t&&f}}return t},bt=(e,r)=>{if(re(r,e)){let{values:t,modifier:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=ee(e,r);if(o!=null&&!isNaN(o))if(o=parseInt(o),a)switch(a){case">=":{let n=t?.some(c=>o>=parseInt(c));return i?!n:n}case">":{let n=t?.some(c=>o>parseInt(c));return i?!n:n}case"<=":{let n=t?.some(c=>o<=parseInt(c));return i?!n:n}case"<":{let n=t?.some(c=>o<parseInt(c));return i?!n:n}default:return!1}else{let n=t?.some(c=>o===parseInt(c));return i?!n:n}else{let n=xt(e,r)?.toLowerCase(),c=s?t?.some(F=>n?.includes(F)):t?.some(F=>n===F);return i?!c:c}}else return!0},Tt=(e,r)=>{if(re(r,e)){let{values:t,valuesSet:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{hasMarkup:o,isNormalized:n,partialMatch:c}}=r,F=ee(e,r),p=n?F:F?.replaceAll(b,"").toLowerCase(),f=o&&p?J(p):p;if(c){let T=i?t?.every(M=>f?.includes(M)):t?.some(M=>f?.includes(M));return s?!T:T}else{let T;return i?T=t?.every(M=>f===M):a?T=a.has(f):T=t?.some(M=>f===M),s?!T:T}}else return!0},Mt=(e,r,t)=>{if(re(r,e)){let{values:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{partialMatch:o}}=r,n=At(e,r,t).map(c=>c?.replaceAll(b,""));if(o){let c=i?a.every(p=>n?.some(f=>f?.toLowerCase().includes(p))):a.some(p=>n?.some(f=>f?.toLowerCase().includes(p))),F=n.length===0;return s?!c||F:c}else{let c=i?a.every(F=>n?.some(p=>p?.toLowerCase()===F)):a.some(F=>n?.some(p=>p?.toLowerCase()===F));return s?!c:c}}else return!0},Ft=(e,r)=>{if(re(r,e)){let{isExcluded:t}=r,a=ee(e,r);return t?!a:a}else return!0},vt=(e,r)=>{if(re(r,e)){let{values:t,isExcluded:a}=r,i=ee(e,r),s=t?.some(o=>i>o);return a?!s:s}else return!0},ee=(e,r)=>{let{filterToPropertyMapping:{property:t}}=r,a;return t!==U&&(a=e[t]),a},At=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i}}=r,s=[],o=Object.keys(e.legalOverrides||{}).length>0,n=r.filterToPropertyMapping.property===Q.LegalHeroes,c=t.find(({filterToPropertyMapping:p})=>p.property===Q.LegalFormats);if(o&&n&&!!c){let p=new Set;for(let{format:f,heroes:T}of e.legalOverrides||[])if(c.values.includes(f.toLowerCase()))for(let M of T)p.add(M);s=Array.from(p)}if(s.length===0)if(i){let p=new Set;for(let f of e.printings){let T=f[i];if(a){if(Array.isArray(T))for(let M of T)p.add(M)}else T&&typeof T=="string"&&p.add(T)}s=Array.from(p)}else{let p=ee(e,r);if(Array.isArray(p))for(let f of p)typeof f=="string"&&s.push(f)}return s},xt=(e,r)=>{let{filterToPropertyMapping:{specialProperty:t}}=r,a;return t&&(a=e[t]),a},re=({cardTypes:e},{types:r,subtypes:t})=>!e||e?.some(a=>r.map(i=>i.toLowerCase()).includes(a.toLowerCase())||t.map(i=>i.toLowerCase()).includes(a.toLowerCase()));var Pt=(e,r)=>{let t=[];if(e)for(let a of r){let i=a.name===e.name,s=a.cardIdentifier!==e.cardIdentifier,o=a.pitch!==e.pitch;i&&s&&o&&t.push(a)}return t},St=(e,r)=>{let t=new Set(e?.referencedCards),a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a},wt=e=>{let r=new Map;for(let t of e)for(let a of t.referencedCards||[]){let i=r.get(a);i?i.push(t):r.set(a,[t])}return r},kt=(e,r)=>{let t=new Set;for(let i of e)for(let s of i.createdExtras||[])t.add(s);let a=[];for(let i of r)t.has(i.cardIdentifier)&&a.push(i);return a};0&&(module.exports={FilterProperty,MARKUP,NO_CARD_PROPERTY,PUNCTUATION,RARITY_VALUES_MAPPING,abbreviations,availableExclusions,availableModifiers,filterCard,filtersToCardPropertyMappings,getAbbreviation,getAbbreviationByCard,getCardsByName,getCardsByReferencedCardIdentifier,getCardsReferencedBy,getCardsReferencing,getCatalogueIndex,getCleanText,getExcludedMetaFilters,getKeywordsAndAppliedFiltersFromText,getMetaFilters,getNormalizedText,getOtherPitches,getReferencedCards,getTextWithoutMarkup,getTokensReferencedByCards,multiWordShorthands,shorthands,singleWordShorthands});
@@ -1,9 +1,10 @@
1
1
  import { Hero } from "@flesh-and-blood/types";
2
- export declare enum FilterProperty {
3
- BannedFormats = "bannedFormats",
4
- LegalFormats = "legalFormats",
5
- LegalHeroes = "legalHeroes"
6
- }
2
+ import type { FilterToPropertyMapping, Modifier } from "./filters.js";
3
+ export declare const FilterProperty: {
4
+ readonly BannedFormats: "bannedFormats";
5
+ readonly LegalFormats: "legalFormats";
6
+ readonly LegalHeroes: "legalHeroes";
7
+ };
7
8
  interface AppliedFilter {
8
9
  filterToPropertyMapping: FilterToPropertyMapping;
9
10
  values: string[];
@@ -15,21 +16,6 @@ interface AppliedFilter {
15
16
  modifier?: Modifier;
16
17
  cardTypes?: string[];
17
18
  }
18
- interface FilterToPropertyMapping {
19
- nestedProperty?: string;
20
- property: string;
21
- exclusion?: Exclusion;
22
- isArray?: boolean;
23
- isNumber?: boolean;
24
- isString?: boolean;
25
- isBoolean?: boolean;
26
- isMeta?: boolean;
27
- modifier?: Modifier;
28
- partialMatch?: boolean;
29
- specialProperty?: string;
30
- }
31
- type Exclusion = "!" | "-";
32
- type Modifier = ">=" | ">" | "<=" | "<";
33
19
  export declare const getMetaFilters: (isExcluded: boolean, isOptional: boolean, filterKey: string, values: string[], modifier: string, additionalHeroes: Hero[]) => AppliedFilter[];
34
20
  export declare const getExcludedMetaFilters: (filterKey: string) => AppliedFilter[];
35
21
  export {};
@@ -1,11 +1,10 @@
1
1
  import { Format, Hero, Talent } from "@flesh-and-blood/types";
2
2
  import { PUNCTUATION } from "./constants.js";
3
- var FilterProperty = /* @__PURE__ */ ((FilterProperty2) => {
4
- FilterProperty2["BannedFormats"] = "bannedFormats";
5
- FilterProperty2["LegalFormats"] = "legalFormats";
6
- FilterProperty2["LegalHeroes"] = "legalHeroes";
7
- return FilterProperty2;
8
- })(FilterProperty || {});
3
+ const FilterProperty = {
4
+ BannedFormats: "bannedFormats",
5
+ LegalFormats: "legalFormats",
6
+ LegalHeroes: "legalHeroes"
7
+ };
9
8
  const oneToFifty = Array.from(Array(50).keys()).map((value) => `${value}`);
10
9
  const nicknameFormatMappings = [
11
10
  {
@@ -188,7 +187,7 @@ const getLegalFilters = (values, isExcluded, isOptional, additionalHeroes, filte
188
187
  if (heroes.length > 0) {
189
188
  filters.push({
190
189
  filterToPropertyMapping: {
191
- property: "legalHeroes" /* LegalHeroes */,
190
+ property: FilterProperty.LegalHeroes,
192
191
  isArray: true
193
192
  },
194
193
  values: heroes,
package/dist/search.d.ts CHANGED
@@ -40,7 +40,7 @@ declare class Search {
40
40
  constructor(cards: DoubleSidedCard[], options?: SearchOptions);
41
41
  constructor(cards: DoubleSidedCard[], additionalHeroes?: Hero[], additionalSets?: Release[], debug?: boolean);
42
42
  private getFuse;
43
- log: (message?: any, ...optionalParams: any[]) => void;
43
+ log: (message?: unknown, ...optionalParams: unknown[]) => void;
44
44
  search: (text: string, includeMemes?: boolean) => SearchResults;
45
45
  }
46
46
  export default Search;
package/dist/search.js CHANGED
@@ -5,7 +5,8 @@ import {
5
5
  import Fuse from "fuse.js";
6
6
  import { PUNCTUATION } from "./constants.js";
7
7
  import {
8
- getKeywordsAndAppliedFiltersFromText
8
+ getKeywordsAndAppliedFiltersFromText,
9
+ NO_CARD_PROPERTY
9
10
  } from "./filters.js";
10
11
  import { memes } from "./memes.js";
11
12
  import { getNormalizedText, getTextWithoutMarkup } from "./helpers.js";
@@ -123,7 +124,7 @@ class Search {
123
124
  }
124
125
  results = [...nameMatches, ...nonMatches];
125
126
  }
126
- let searchResultsWithMatchingPrinting;
127
+ let searchResultsWithMatchingPrinting = [];
127
128
  const {
128
129
  artists,
129
130
  isExpansionSlot,
@@ -144,7 +145,7 @@ class Search {
144
145
  )
145
146
  );
146
147
  const matchesExpansionSlot = !isExpansionSlot || isExpansionSlot === printing.isExpansionSlot;
147
- const matchesFoiling = foilings.length === 0 || foilings.includes(printing.foiling);
148
+ const matchesFoiling = foilings.length === 0 || !!printing.foiling && foilings.includes(printing.foiling);
148
149
  const matchesPrint = prints.length === 0 || prints.some(
149
150
  (print) => printing.identifier.includes(print.toUpperCase())
150
151
  );
@@ -162,7 +163,7 @@ class Search {
162
163
  };
163
164
  });
164
165
  }
165
- const searchResults = searchResultsWithMatchingPrinting?.length > 0 ? searchResultsWithMatchingPrinting : results;
166
+ const searchResults = searchResultsWithMatchingPrinting.length > 0 ? searchResultsWithMatchingPrinting : results;
166
167
  return {
167
168
  appliedFilters,
168
169
  attributes,
@@ -394,18 +395,19 @@ const getDoesCardMatchDateFilter = (card, filter) => {
394
395
  }
395
396
  };
396
397
  const getCardValue = (card, appliedFilter) => {
397
- const { filterToPropertyMapping } = appliedFilter;
398
- return card[filterToPropertyMapping.property];
398
+ const {
399
+ filterToPropertyMapping: { property }
400
+ } = appliedFilter;
401
+ let cardValue = void 0;
402
+ if (property !== NO_CARD_PROPERTY) {
403
+ cardValue = card[property];
404
+ }
405
+ return cardValue;
399
406
  };
400
407
  const getCardValues = (card, filter, filters) => {
401
408
  const {
402
- filterToPropertyMapping: {
403
- isNestedPropertyArray,
404
- nestedProperty,
405
- property
406
- }
409
+ filterToPropertyMapping: { isNestedPropertyArray, nestedProperty }
407
410
  } = filter;
408
- const propertyValues = card[property] || [];
409
411
  let values = [];
410
412
  const cardHasLegalOverrides = Object.keys(card.legalOverrides || {}).length > 0;
411
413
  const isCheckingForLegalHeroes = filter.filterToPropertyMapping.property === FilterProperty.LegalHeroes;
@@ -427,29 +429,41 @@ const getCardValues = (card, filter, filters) => {
427
429
  if (values.length === 0) {
428
430
  if (nestedProperty) {
429
431
  const valuesSet = /* @__PURE__ */ new Set();
430
- for (const rawValue of propertyValues) {
432
+ for (const printing of card.printings) {
433
+ const printingValue = printing[nestedProperty];
431
434
  if (isNestedPropertyArray) {
432
- const rawValues = rawValue[nestedProperty] || [];
433
- for (const value of rawValues) {
434
- valuesSet.add(value);
435
- }
436
- } else {
437
- const value = rawValue[nestedProperty];
438
- if (value) {
439
- valuesSet.add(value);
435
+ if (Array.isArray(printingValue)) {
436
+ for (const value of printingValue) {
437
+ valuesSet.add(value);
438
+ }
440
439
  }
440
+ } else if (printingValue && typeof printingValue === "string") {
441
+ valuesSet.add(printingValue);
441
442
  }
442
443
  }
443
444
  values = Array.from(valuesSet);
444
445
  } else {
445
- values = propertyValues;
446
+ const cardValue = getCardValue(card, filter);
447
+ if (Array.isArray(cardValue)) {
448
+ for (const value of cardValue) {
449
+ if (typeof value === "string") {
450
+ values.push(value);
451
+ }
452
+ }
453
+ }
446
454
  }
447
455
  }
448
456
  return values;
449
457
  };
450
458
  const getCardSpecialValue = (card, appliedFilter) => {
451
- const { filterToPropertyMapping } = appliedFilter;
452
- return card[filterToPropertyMapping.specialProperty];
459
+ const {
460
+ filterToPropertyMapping: { specialProperty }
461
+ } = appliedFilter;
462
+ let specialValue;
463
+ if (specialProperty) {
464
+ specialValue = card[specialProperty];
465
+ }
466
+ return specialValue;
453
467
  };
454
468
  const doesFilterMatchCardType = ({ cardTypes }, { types, subtypes }) => !cardTypes || cardTypes?.some(
455
469
  (cardType) => types.map((type) => type.toLowerCase()).includes(cardType.toLowerCase()) || subtypes.map((subtype) => subtype.toLowerCase()).includes(cardType.toLowerCase())
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@flesh-and-blood/search",
3
3
  "description": "TypeScript search engine for Flesh and Blood cards",
4
- "version": "5.0.2",
4
+ "version": "5.0.4",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "dist/index.cjs",
@@ -46,8 +46,8 @@
46
46
  "@flesh-and-blood/types": "^5.0.0"
47
47
  },
48
48
  "devDependencies": {
49
- "@flesh-and-blood/cards": "^5.0.2",
50
- "@flesh-and-blood/types": "^5.0.0",
49
+ "@flesh-and-blood/cards": "^5.0.4",
50
+ "@flesh-and-blood/types": "^5.0.4",
51
51
  "@types/jest": "^29.5.11",
52
52
  "@types/node": "^20.10.5",
53
53
  "esbuild": "^0.19.10",
@@ -77,5 +77,5 @@
77
77
  "FAB",
78
78
  "FABTCG"
79
79
  ],
80
- "gitHead": "1c9dd1609d17840a90328f199a3d2129ab1438ee"
80
+ "gitHead": "0079c17039ad1e1590e9ce119e79584bf5e30985"
81
81
  }