@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 +17 -4
- package/dist/filters.js +25 -16
- package/dist/index.cjs +1 -1
- package/dist/metaFilters.d.ts +6 -20
- package/dist/metaFilters.js +6 -7
- package/dist/search.d.ts +1 -1
- package/dist/search.js +38 -24
- package/package.json +4 -4
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?:
|
|
26
|
-
property:
|
|
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?:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
141
|
+
property: NO_CARD_PROPERTY,
|
|
141
142
|
isMeta: true
|
|
142
143
|
};
|
|
143
144
|
const referencedByFilter = {
|
|
144
|
-
property:
|
|
145
|
+
property: NO_CARD_PROPERTY
|
|
145
146
|
};
|
|
146
147
|
const referencesFilter = {
|
|
147
|
-
property:
|
|
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 =
|
|
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(
|
|
700
|
-
|
|
701
|
-
|
|
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
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
values.push(
|
|
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) => !!
|
|
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});
|
package/dist/metaFilters.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Hero } from "@flesh-and-blood/types";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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 {};
|
package/dist/metaFilters.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Format, Hero, Talent } from "@flesh-and-blood/types";
|
|
2
2
|
import { PUNCTUATION } from "./constants.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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:
|
|
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?:
|
|
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
|
|
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 {
|
|
398
|
-
|
|
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
|
|
432
|
+
for (const printing of card.printings) {
|
|
433
|
+
const printingValue = printing[nestedProperty];
|
|
431
434
|
if (isNestedPropertyArray) {
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
-
|
|
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 {
|
|
452
|
-
|
|
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.
|
|
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.
|
|
50
|
-
"@flesh-and-blood/types": "^5.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": "
|
|
80
|
+
"gitHead": "0079c17039ad1e1590e9ce119e79584bf5e30985"
|
|
81
81
|
}
|