@flesh-and-blood/search 4.0.3 → 4.0.5
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/README.md +32 -10
- package/dist/filters.d.ts +1 -0
- package/dist/filters.js +7 -1
- package/dist/index.cjs +1 -1
- package/dist/memes.js +1 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,25 +1,47 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @flesh-and-blood/search
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A [fuse.js](https://www.fusejs.io/)-based search engine for **Flesh and Blood** cards.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
npm install @flesh-and-blood/search @flesh-and-blood/types
|
|
7
|
+
```bash
|
|
8
|
+
npm i @flesh-and-blood/search @flesh-and-blood/types
|
|
12
9
|
```
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
tree-shake. Use a bundler (Vite, webpack, esbuild, Rollup) or a modern ESM-capable Node runtime.
|
|
11
|
+
`@flesh-and-blood/types` is a **peer dependency** — install it alongside this package
|
|
16
12
|
|
|
17
13
|
## Usage
|
|
18
14
|
|
|
19
15
|
```ts
|
|
20
16
|
import Searcher from "@flesh-and-blood/search";
|
|
17
|
+
import { cards } from "@flesh-and-blood/cards";
|
|
18
|
+
|
|
19
|
+
const searcher = new Searcher(cards);
|
|
20
|
+
const { searchResults } = searcher.search("rhinar go again");
|
|
21
|
+
```
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
- `new Searcher(cards, additionalHeroes?, additionalSets?, debug?)`
|
|
24
|
+
- `.search(text)` → `SearchResults` — `{ searchResults: SearchCard[], appliedFilters, keywords, attributes }`
|
|
25
|
+
|
|
26
|
+
Data-only modules are available as subpath imports (handy for lazy-loaded UI like a search-bar dropdown):
|
|
27
|
+
|
|
28
|
+
```ts
|
|
23
29
|
import { abbreviations } from "@flesh-and-blood/search/abbreviations";
|
|
24
30
|
import { shorthands } from "@flesh-and-blood/search/shorthands";
|
|
25
31
|
```
|
|
32
|
+
|
|
33
|
+
## What's included
|
|
34
|
+
|
|
35
|
+
- Default export: **`Searcher`** — the search engine
|
|
36
|
+
- Types: `SearchResults`, `SearchCard`
|
|
37
|
+
- Data modules (subpath imports): `abbreviations`, `shorthands`, `memes`
|
|
38
|
+
- Filter / meta-filter / helper utilities (`filters`, `metaFilters`, `helpers`, `constants`, `related`)
|
|
39
|
+
|
|
40
|
+
## Working with this project
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm run build # build:esm (per-file ESM) + build:cjs (bundled) + tsc declarations + jest
|
|
44
|
+
npm test # jest
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Uses `@flesh-and-blood/cards` (`file:../cards`) as a dev dependency for tests.
|
package/dist/filters.d.ts
CHANGED
|
@@ -100,6 +100,7 @@ export declare const filtersToCardPropertyMappings: {
|
|
|
100
100
|
var: FilterToPropertyMapping;
|
|
101
101
|
variation: FilterToPropertyMapping;
|
|
102
102
|
x: FilterToPropertyMapping;
|
|
103
|
+
year: FilterToPropertyMapping;
|
|
103
104
|
};
|
|
104
105
|
export declare const getKeywordsAndAppliedFiltersFromText: (text: string, cards: Card[], additionalHeroes?: Hero[], additionalSets?: Release[]) => {
|
|
105
106
|
appliedFilters: AppliedFilter[];
|
package/dist/filters.js
CHANGED
|
@@ -166,6 +166,11 @@ const treatmentFilter = {
|
|
|
166
166
|
isArray: true,
|
|
167
167
|
isNestedPropertyArray: true
|
|
168
168
|
};
|
|
169
|
+
const yearFilter = {
|
|
170
|
+
property: "firstReleaseDate",
|
|
171
|
+
isString: true,
|
|
172
|
+
partialMatch: true
|
|
173
|
+
};
|
|
169
174
|
const filtersToCardPropertyMappings = {
|
|
170
175
|
arcane: arcaneFilter,
|
|
171
176
|
a: artistFilter,
|
|
@@ -237,7 +242,8 @@ const filtersToCardPropertyMappings = {
|
|
|
237
242
|
treatment: treatmentFilter,
|
|
238
243
|
var: treatmentFilter,
|
|
239
244
|
variation: treatmentFilter,
|
|
240
|
-
x: typeTextFilter
|
|
245
|
+
x: typeTextFilter,
|
|
246
|
+
year: yearFilter
|
|
241
247
|
};
|
|
242
248
|
const punctuationOverrides = [
|
|
243
249
|
{
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var pr=Object.create;var _=Object.defineProperty;var dr=Object.getOwnPropertyDescriptor;var ur=Object.getOwnPropertyNames;var fr=Object.getPrototypeOf,gr=Object.prototype.hasOwnProperty;var hr=(e,r)=>{for(var t in r)_(e,t,{get:r[t],enumerable:!0})},we=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of ur(r))!gr.call(e,i)&&i!==t&&_(e,i,{get:()=>r[i],enumerable:!(a=dr(r,i))||a.enumerable});return e};var mr=(e,r,t)=>(t=e!=null?pr(fr(e)):{},we(r||!e||!e.__esModule?_(t,"default",{value:e,enumerable:!0}):t,e)),br=e=>we(_({},"__esModule",{value:!0}),e);var ct={};hr(ct,{FilterProperty:()=>ke,PUNCTUATION:()=>f,RARITY_VALUES_MAPPING:()=>ve,abbreviations:()=>le,availableExclusions:()=>tr,availableModifiers:()=>rr,default:()=>sr,filterCard:()=>or,filtersToCardPropertyMappings:()=>ie,getAbbreviation:()=>Y,getAbbreviationByCard:()=>yr,getCardByName:()=>he,getCleanText:()=>ge,getExcludedMetaFilters:()=>pe,getKeywordsAndAppliedFiltersFromText:()=>Te,getMetaFilters:()=>ce,getNormalizedText:()=>j,getRelatedCards:()=>me,getRelatedCardsByName:()=>X,getTokensReferencedByCards:()=>Or,multiWordShorthands:()=>ue,shorthands:()=>de,singleWordShorthands:()=>fe});module.exports=br(ct);var ae=require("@flesh-and-blood/types"),Ae=mr(require("fuse.js"),1);var f=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g;var l=require("@flesh-and-blood/types");var Y=e=>le.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),yr=e=>le.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),le=[{abbreviations:["10k"],card:"10,000 Year Reunion"},{abbreviations:["Pajamas","PJs"],card:"Alluvion Constellas"},{abbreviations:["Slippy","Arakni Slipped Through the Cracks","Arakni, Slipped Through the Cracks"],card:"Arakni, 5L!p3d 7hRu 7h3 cR4X"},{abbreviations:["Dullcap"],card:"Arcanite Skullcap"},{abbreviations:["ALS"],card:"Arc Light Sentinel"},{abbreviations:["AoW"],card:"Art of War"},{abbreviations:["BBD"],card:"Barraging Beatdown"},{abbreviations:["BBS"],card:"Big Blue Sky"},{abbreviations:["Starvo"],card:"Bravo, Star of the Show"},{abbreviations:["BEB"],card:"Bull's Eye Bracers"},{abbreviations:["BLW"],card:"Be Like Water"},{abbreviations:["BoJ"],card:"Balance of Justice"},{abbreviations:["BOHH"],card:"Blood on Her Hands"},{abbreviations:["BRB"],card:"Bloodrush Bellow"},{abbreviations:["Breezies"],card:"Breeze Rider Boots"},{abbreviations:["BTA"],card:"Burn Them All"},{abbreviations:["CStrike","C-Strike","C Strike"],card:"Celestial Cataclysm"},{abbreviations:["CBelly"],card:"Cerebellum Processor"},{abbreviations:["CLF"],card:"Channel Lake Frigid"},{abbreviations:["CLV"],card:"Channel Lightning Valley"},{abbreviations:["CMH"],card:"Channel Mount Heroic"},{abbreviations:["CMI"],card:"Channel Mount Isen"},{abbreviations:["CMT"],card:"Channel the Millennium Tree"},{abbreviations:["CnC","C&C"],card:"Command and Conquer"},{abbreviations:["Sea and Sea"],card:"Conqueror of the High Seas"},{abbreviations:["CYB"],card:"Count Your Blessings"},{abbreviations:["Cat","Kitty"],card:"Crouching Tiger"},{abbreviations:["CoD"],card:"Crown of Dominion"},{abbreviations:["CoP"],card:"Crown of Providence"},{abbreviations:["CtW"],card:"Crush the Weak"},{abbreviations:["DD"],card:"Death Dealer"},{abbreviations:["DnD"],card:"Devotion Never Dies"},{abbreviations:["DIO"],card:"Dash I/O"},{abbreviations:["EBTT"],card:"Even Bigger Than That!"},{abbreviations:["NewNigma"],card:"Enigma, New Moon"},{abbreviations:["EPot","E Pot"],card:"Energy Potion"},{abbreviations:["EStrike","E-Strike","E Strike"],card:"Enlightened Strike"},{abbreviations:["FFS"],card:"Fyendal's Fighting Spirit"},{abbreviations:["FoN"],card:"Force of Nature"},{abbreviations:["Frosty","\u{1F976}","\u{1F9CA}","\u2744\uFE0F"],card:"Frostbite"},{abbreviations:["Yum yum"],card:"Fruits of the Forest"},{abbreviations:["GnT"],card:"Give and Take"},{abbreviations:["Habibi"],card:"Hanabi Blaster"},{abbreviations:["HMH"],card:"Hope Merchant's Hood"},{abbreviations:["HoI"],card:"Heart of Ice"},{abbreviations:["Pumpkin"],card:"Jack-o'-lantern"},{abbreviations:["RKO","Cheato"],card:"Kayo, Underhanded Cheat"},{abbreviations:["KKBB"],card:"Knick Knack Bric-a-brac"},{abbreviations:["BStrike"],card:"Levels of Enlightenment"},{abbreviations:["LAG","Twominaris"],card:"Luminaris, Angel's Glow"},{abbreviations:["LCF","Newminaris"],card:"Luminaris, Celestial Fury"},{abbreviations:["LDE"],card:"Last Ditch Effort"},{abbreviations:["LtC"],card:"Lead the Charge"},{abbreviations:["LNW"],card:"Leave No Witnesses"},{abbreviations:["LFaL","L4aL"],card:"Life for a Life"},{abbreviations:["LiT"],card:"Lost in Thought"},{abbreviations:["MMB"],card:"Mage Master Boots"},{abbreviations:["MaxV"],card:"Maximum Velocity"},{abbreviations:["MoM"],card:"Mask of Momentum"},{abbreviations:["MoPL"],card:"Mask of the Pouncing Lynx"},{abbreviations:["MnG"],card:"Meat and Greet"},{abbreviations:["Cake","\u{1F382}"],card:"Ninth Blade of the Blood Oath"},{abbreviations:["PoM"],card:"Peace of Mind"},{abbreviations:["P-Bone"],card:"Performance Bonus"},{abbreviations:["PF","\u{1F525}"],card:"Phoenix Flame"},{abbreviations:["PtW"],card:"Poison the Well"},{abbreviations:["Thanos","Infinity Gauntlet"],card:"Polarity Reversal Script"},{abbreviations:["DPot","D Pot"],card:"Potion of D\xE9j\xE0 Vu"},{abbreviations:["Ponder Run"],card:"Premeditate"},{abbreviations:["Qi Unbound"],card:"Qi Unleashed"},{abbreviations:["RitL"],card:"Red in the Ledger"},{abbreviations:["Cats","Ghost cat","Ghost cats"],card:"Restless Coalescence"},{abbreviations:["Eugene"],card:"Rhinar, Reckless Rampage",isHidden:!0},{abbreviations:["SSGB"],card:"Sandscour Greatbow"},{abbreviations:["SSP"],card:"Sand Sketched Plan"},{abbreviations:["SFaS","S4aS"],card:"Scar for a Scar"},{abbreviations:["Tyler"],card:"Scurv, Stowaway",isHidden:!0},{abbreviations:["SWOMB"],card:"Shifting Winds of the Mystic Beast"},{abbreviations:["Snaps"],card:"Snapdragon Scalers"},{abbreviations:["SWK"],card:"Spinning Wheel Kick"},{abbreviations:["SFTL"],card:"Swing Fist, Think Later"},{abbreviations:["TTT"],card:"Take the Tempo"},{abbreviations:["Ultron"],card:"Teklovossen, the Mechropotent"},{abbreviations:["ToS"],card:"Test of Strength"},{abbreviations:["TAYG"],card:"That All You Got?"},{abbreviations:["TROM"],card:"This Round's on Me"},{abbreviations:["3oak"],card:"Three of a Kind"},{abbreviations:["Pox Malone","Post Malone"],card:"Virulent Touch"},{abbreviations:["Cast Homes"],card:"Visit Goldmane Estate"},{abbreviations:["Frosty Hammer"],card:"Winter's Wail"},{abbreviations:["Wreckless Wing"],card:"War Cry of Bellona"},{abbreviations:["ZTS"],card:"Zero to Sixty"}];var A=require("@flesh-and-blood/types");var ke=(a=>(a.BannedFormats="bannedFormats",a.LegalFormats="legalFormats",a.LegalHeroes="legalHeroes",a))(ke||{}),Z=Array.from(Array(50).keys()).map(e=>`${e}`),Cr=[{format:A.Format.ClassicConstructed,nicknames:["cc","classic"]},{format:A.Format.LivingLegend,nicknames:["cc ll","classic constructed ll","ll cc","ll","living legend"]},{format:A.Format.SilverAge,nicknames:["sage"]},{format:A.Format.GoldenAge,nicknames:["gage"]},{format:A.Format.UltimatePitFight,nicknames:["upf"]}],Fr=Object.values(A.Format).map(e=>{let r=Cr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(f,"");return r?{...r,format:t}:{format:t}}),Mr=[{hero:A.Hero.DataDoll,nicknames:["data","datadoll"]},{hero:A.Hero.Dorinthea,nicknames:["dori"]},{hero:A.Hero.Genis,nicknames:["genis"]},{hero:A.Hero.GravyBones,nicknames:["gravy"]},{hero:A.Hero.Iyslander,nicknames:["islander"]}],vr=Object.values(A.Hero).map(e=>{let r=Mr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(f,"");return r?{...r,hero:t}:{hero:t}}),$=["common","rare","super rare","majestic","legendary","fabled"],Tr=(e,r,t,a)=>{let i=[];if(!r)i.push(...e);else for(let s of e)switch(r){case">=":let o=!1;for(let n of $)o?i.push(n):n===s&&(o=!0,i.push(n));break;case">":let c=!1;for(let n of $)c?i.push(n):n===s&&(c=!0);break;case"<=":let p=!1;for(let n of $.slice().reverse())p?i.push(n):n===s&&(p=!0,i.push(n));break;case"<":let u=!1;for(let n of $.slice().reverse())u?i.push(n):n===s&&(u=!0);break;default:break}return{filterToPropertyMapping:{nestedProperty:"rarity",property:"printings",isArray:!0},isExcluded:t,isOptional:a,isOr:!0,values:i}},Se=(e,r,t,a,i)=>{let s=a.map(n=>({hero:n.toLowerCase().replaceAll(f,"")})),o=[],c=[],p=[];for(let n of e){let d=Fr.find(({format:h,nicknames:C})=>h===n||!!C&&C.includes(n));if(d)c.push(d.format);else{let h=vr.find(({hero:C,nicknames:F})=>C===n||!!F&&F.includes(n))||s.find(({hero:C})=>C===n);h&&p.push(h.hero)}}let u=i||"legalFormats";return c.length>0&&o.push({filterToPropertyMapping:{property:u,isArray:!0},values:c,isOr:!0,isExcluded:r,isOptional:t}),p.length>0&&o.push({filterToPropertyMapping:{property:"legalHeroes",isArray:!0},values:p,isOr:!0,isExcluded:r,isOptional:t}),o},Ar=(e,r,t,a)=>Se(e,r,t,a,"bannedFormats"),ce=(e,r,t,a,i,s)=>{let o=[];return wr(t)?o.push(...Se(a,e,r,s)):Sr(t)?o.push(...Ar(a,e,r,s)):Rr(t)&&o.push(Tr(a,i,e,r)),o},U=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"specialCost",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]}],I=[{filterToPropertyMapping:{property:"defense",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"specialDefense",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["hero","placeholder","token","weapon"]}],J=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],G=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"specialPower",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token"]}],Q=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(A.Talent).map(e=>e.toLowerCase())}],xr={"!co":U,"-co":U,"!cost":U,"-cost":U,"!color":U,"-color":U,"!b":I,"-b":I,"!block":I,"-block":I,"!d":I,"-d":I,"!def":I,"-def":I,"!defense":I,"-defense":I,"!pitch":J,"-pitch":J,"!p":J,"-p":J,"!attack":G,"-attack":G,"!power":G,"-power":G,"!pwr":G,"-pwr":G,"!pow":G,"-pow":G,"!talents":Q,"-talents":Q,"!tal":Q,"-tal":Q},pe=e=>{let r=[],t=xr[e];return t&&r.push(...t),r},Pr=["l","legal","hero"],wr=e=>Pr.includes(e),kr=["banned"],Sr=e=>kr.includes(e),Lr=["r","rarity"],Rr=e=>Lr.includes(e);var N=require("@flesh-and-blood/types"),de=[{description:"Attack actions",expanded:["st:attack"],filters:{subtypes:[N.Subtype.Attack]},isCardProperty:!1,shorthands:["AA"]},{description:"Arcane barrier",expanded:['k:"arcane barrier"'],filters:{keywords:[N.Keyword.ArcaneBarrier]},isCardProperty:!1,shorthands:["AB"]},{description:"Attack reactions",expanded:['t:"attack reaction"'],filters:{types:[N.Type.AttackReaction]},isCardProperty:!1,shorthands:["AR"]},{description:"Defense reactions",expanded:['t:"defense reaction"'],filters:{types:[N.Type.DefenseReaction]},isCardProperty:!1,shorthands:["DR"]},{description:"Gain life",expanded:["gain {h}"],filters:{functionalText:"gain {h}"},isCardProperty:!1,shorthands:["Gain life","Gains life"]},{description:"Go again",expanded:['k:"go again"'],filters:{keywords:[N.Keyword.GoAgain]},isCardProperty:!1,shorthands:["GA"]},{description:"Non-attack actions",expanded:["t:action","st:non-attack"],filters:{subtypes:[N.Subtype.NonAttack],types:[N.Type.Action]},isCardProperty:!1,shorthands:["NAA"]},{description:"Plus defense",expanded:["+ {d}"],filters:{functionalText:"+ {d}"},isCardProperty:!1,shorthands:["Pump defense","Pumps defense","Buff defense","Buffs defense"]},{description:"Spellvoid",expanded:['k:"spellvoid"'],filters:{keywords:[N.Keyword.Spellvoid]},isCardProperty:!1,shorthands:["SV"]}],ue=de.filter(({shorthands:e})=>e.some(r=>r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)})),fe=de.filter(({shorthands:e})=>e.some(r=>!r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>!r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)}));var he=(e,r)=>{let t=r.find(a=>ge(a.name)===e);return t||(t=r.find(a=>ge(a.name).includes(e))),t},ge=e=>j(e.toLowerCase().trim().replace(f,"")),j=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,"");var K=require("@flesh-and-blood/types");var z=require("@flesh-and-blood/types"),Br={"Dawnblade, Resplendent":"Dawnblade"},Le=e=>Br[e.name]||e.name,Re=e=>e.functionalText?.replaceAll(e.name,""),X=(e,r)=>{let t=r.find(a=>a.name.toLowerCase().replace(f,"")===e);return t||(t=r.find(a=>a.name.toLowerCase().replace(f,"").includes(e))),me(t,r)},me=(e,r)=>{let t={},a={},i={};if(e){let p=[],u=[],n=Le(e);for(let d of r){let h=Le(d),C=n===h,F=e.cardIdentifier!==d.cardIdentifier,w=e.pitch!==d.pitch;if(C&&F&&w)t[d.cardIdentifier]=d;else if(!C){let T=e.name==="Seismic Surge",x=d.keywords?.includes(z.Keyword.Heave),k=T&&x,y=e.name==="Marked",g=d.keywords?.includes(z.Keyword.Mark),P=y&&g,m=Re(d),b=m?.includes(n)||e.traits?.some(ne=>m?.includes(ne)),S=Re(e);(b||k||P)&&p.push(d);let H=new RegExp(h,"g"),D=new RegExp(`\\*\\*${h}\\*\\*`,"g"),v=S?.match(H)||[],L=S?.match(D)||[],E=v.length===L.length,W=S?.includes(h)&&!E,O=(d.traits||[]).some(ne=>S?.includes(ne)),B=W||O,V=d.name==="Seismic Surge",oe=e.keywords?.includes(z.Keyword.Heave),nr=V&&oe,lr=d.name==="Marked",cr=e.keywords?.includes(z.Keyword.Mark);(B||nr||lr&&cr)&&u.push(d)}}for(let d of p)a[d.cardIdentifier]=d;for(let d of u){let h=d.name;n!==h&&!u.some(C=>{let F=C.name;return F!==h&&F?.includes(h)})&&(i[d.cardIdentifier]=d)}}let s=Object.values(t),o=Object.values(a),c=Object.values(i);return{otherPitches:s,referencedBy:o,references:c}},Nr=["cash-in-yellow"],Er={[K.Hero.Crackni]:{traits:[K.Trait.AgentOfChaos]},[K.Hero.Maxx]:{tokens:["hyper-driver"]}},Or=(e,r,t)=>{let a=new Set;for(let i of e.filter(({cardIdentifier:s})=>!Nr.includes(s))){let{references:s}=me(i,r);for(let o of s.filter(c=>{let p=c.name==="Hyper Driver",u=t===K.Hero.Maxx;return!p||u}))a.add(o)}if(t){let i=Er[t];if(i){if(i.cards)for(let s of e)i.cards?.includes(s.cardIdentifier)&&a.add(s);if(i.tokens)for(let s of r)i.tokens?.includes(s.cardIdentifier)&&a.add(s)}}return Array.from(a)};var rr=[">=",">","<=","<"],tr=["!","-"],Ir={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},be={property:"artists",isArray:!0,partialMatch:!0},Be={property:"n/a",isMeta:!0},Ne={property:"bonds",isArray:!0},Hr={property:"n/a"},Ee={property:"classes",isArray:!0,partialMatch:!0},Oe={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},q={property:"defense",specialProperty:"specialDefense",isNumber:!0},Ie={property:"flows",isArray:!0},He={nestedProperty:"foiling",property:"printings",isArray:!0},De={property:"fusions",isArray:!0},Ge={property:"intellect",isNumber:!0},Ve={property:"keywords",isArray:!0},ye={property:"n/a",isMeta:!0},We={property:"life",specialProperty:"specialLife",isNumber:!0},Ue={property:"meta",isArray:!0},Ke={property:"name",isString:!0,partialMatch:!0},Ce={property:"pitch",isNumber:!0},ee={property:"power",specialProperty:"specialPower",isNumber:!0},Dr={property:"setIdentifiers",isArray:!0,partialMatch:!0},je={property:"n/a",isMeta:!0},Gr={property:"n/a"},Vr={property:"n/a"},ze={property:"sets",isArray:!0,partialMatch:!0},Fe={property:"shorthands",isArray:!0,partialMatch:!0},re={property:"specializations",isArray:!0,partialMatch:!0},qe={property:"subtypes",isArray:!0},_e={property:"types",isArray:!0},Ye={property:"talents",isArray:!0},Wr={property:"functionalText",isString:!0,partialMatch:!0},Ur={property:"traits",isArray:!0,partialMatch:!0},Kr={property:"typeText",isString:!0,partialMatch:!0},te={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},ie={arcane:Ir,a:be,artist:be,art:be,attack:ee,b:q,block:q,banned:Be,bond:Ne,bonds:Ne,c:Ee,class:Ee,chain:Hr,co:Oe,cost:Oe,color:Ce,d:q,def:q,defense:q,flow:Ie,flows:Ie,f:De,fusion:De,foil:He,foiling:He,i:Ge,intellect:Ge,is:Ue,k:Ve,keyword:Ve,l:ye,legal:ye,hero:ye,li:We,life:We,meta:Ue,n:Ke,name:Ke,p:Ce,pitch:Ce,pwr:ee,pow:ee,power:ee,print:Dr,r:je,rarity:je,referencedby:Gr,references:Vr,rf:Be,s:ze,set:ze,short:Fe,shorthand:Fe,shorthands:Fe,sp:re,spec:re,specialization:re,specializations:re,st:qe,subtype:qe,t:_e,type:_e,tal:Ye,talent:Ye,text:Wr,trait:Ur,treat:te,treatment:te,var:te,variation:te,x:Kr},jr=[{text:l.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:l.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(f,"")}],zr=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:s}of jr)t.includes(i)&&(t=t.replace(i,s));if(Y(t)?.card)r.push(t);else{let i=t.split(/[ ]+/),s="",o=0;for(let c of i)o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0),o<2&&c.split('"').length===2?(s+=" "+c,o++):o===0&&s===""?r.push(c):o===1&&(s+=" "+c);o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0)}return r},Te=(e,r,t=[],a=[])=>{let i=e.trim().toLowerCase();for(let{expanded:T,shorthands:x}of ue)for(let k of x)if(i.includes(k)){i=i.replace(k,T.join(" "));break}for(let[T,x]of Object.entries(l.setToSetIdentifierMappings))i.includes(T.toLowerCase())&&(i=i.replace(T.toLowerCase(),x[0]));let s=zr(i),o=[];for(let T of s){let x=fe.find(({shorthands:k})=>k.includes(T));x&&!x.isCardProperty?o.push(...x.expanded):o.push(T)}let c=[],p=[],u=[],n=[],d=!1,h=[],C=[],F=[],w=[];for(let T of o)if(rt(T)){let[x,k]=T.split(":"),{modifier:y,values:g,isAnd:P,isOr:m}=Xr(k),{filterKey:b,isExcluded:S,isOptional:H,isMeta:D}=et(x);if(D){if(["rarity","r"].includes(b)){let v=Zr(g);S||(C=[...v]),g=v.map(L=>L.toLowerCase())}["legal","l","hero"].includes(b),c.push(...ce(S,H,b,g,y,t))}else{if(["chain"].includes(b)){let v=B=>B.name.toLowerCase().replaceAll(f,""),L=g.map(B=>he(B,r)).filter(B=>!!B).map(v),E=new Set(L);b="name",m=!0;let W=20,R=0,O=B=>{if(!B.types.includes(l.Type.Hero)){let V=v(B);E.add(V),L.includes(V)||L.push(V)}};for(let B of L){if(R>W)break;let{referencedBy:V,references:oe}=X(B,r);oe.forEach(O),R===0&&V.forEach(O),R++}g=Array.from(E)}else if(["referencedby","references"].includes(b)){let v=b,L=[...g].filter(E=>!!E);g=[],b="name",m=!0;for(let E of L){let{referencedBy:W,references:R}=X(E,r);["referencedby"].includes(v)?g.push(...R.map(({name:O})=>O.toLowerCase().replaceAll(f,""))):["references"].includes(v)&&g.push(...W.map(({name:O})=>O.toLowerCase().replaceAll(f,"")))}}else if(["art","artist"].includes(b))p=g;else if(["print","prints","printing","printings"].includes(b))h=g;else if(["is","meta"].includes(b)){let v=$r(g);g=v.map(L=>L.toLowerCase().replaceAll(f,"")),v.includes(l.Meta.Expansion)&&!S&&(d=!0)}else["foiling","foil"].includes(b)?(n=Jr(g),g=n.map(v=>v.toLowerCase())):["treat","treatment","var","variation"].includes(b)?(w=Qr(g),g=w.map(v=>v.toLowerCase())):["set","s"].includes(b)?(F=qr(g,a),g=F.map(v=>v.toLowerCase().replaceAll(f,""))):["pitch","p","color"].includes(b)&&(g=Yr(g));ie[b]&&c.push({filterToPropertyMapping:ie[b],values:g,isAnd:P,isOr:m,modifier:y,isExcluded:S,isOptional:H})}}else if(T){let x=Y(T)?.card,k=pe(T);x?u.push(`"${x.toLowerCase().replace(f,"")}"`):k&&k.length>0?c.push(...k):u.push(T.replace(f,""))}return{appliedFilters:c,attributes:{artists:p,foilings:n,isExpansionSlot:d,prints:h,rarities:C,releases:F,treatments:w},keywords:u}},qr=(e,r=[])=>{let t=[];for(let a of e)t.push(..._r(a,r));return t},_r=(e,r=[])=>{let t=[],a=Object.values(l.Release).find(i=>i.toLowerCase().replaceAll(f,"")===e);if(a&&t.push(a),t.length===0){let i=l.setIdentifierToSetMappings[e];i&&t.push(i)}if(t.length===0){let i=Object.values(l.Release).filter(s=>s.toLowerCase().includes(e));i.length>0&&t.push(...i)}if(t.length===0){let i=r.find(s=>s.toLowerCase().replaceAll(f,"")===e);i&&t.push(i)}return t},Me={blue:3,yellow:2,red:1,white:0},Yr=e=>{let r=[];for(let t of e)Me[t]||Me[t]===0?r.push(Me[t].toString()):r.push(t);return r},$e={exp:l.Meta.Expansion,expansion:l.Meta.Expansion,expansionSlot:l.Meta.Expansion,rainbow:l.Meta.Rainbow},$r=e=>{let r=[];for(let t of e)$e[t]&&r.push($e[t]);return r},Je={r:l.Foiling.Rainbow,rf:l.Foiling.Rainbow,rainbow:l.Foiling.Rainbow,c:l.Foiling.Cold,cf:l.Foiling.Cold,cold:l.Foiling.Cold,g:l.Foiling.Gold,gf:l.Foiling.Gold,gold:l.Foiling.Gold},Jr=e=>{let r=[];for(let t of e)Je[t]&&r.push(Je[t]);return r},Qe={...Object.values(l.Treatment).reduce((e,r)=>(e[r.toLowerCase()]=r,e),{}),aa:l.Treatment.AA,alt:l.Treatment.AA,"alt art":l.Treatment.AA,ab:l.Treatment.AB,"alt border":l.Treatment.AB,at:l.Treatment.AT,"alt text":l.Treatment.AT,ea:l.Treatment.EA,extended:l.Treatment.EA,"extended art":l.Treatment.EA,fa:l.Treatment.FA,full:l.Treatment.FA,"full art":l.Treatment.FA},Qr=e=>{let r=[];for(let t of e)Qe[t]?r.push(Qe[t]):l.Treatment[t.toUpperCase()]&&r.push(l.Treatment[t.toUpperCase()]);return r},ve={b:l.Rarity.Basic,c:l.Rarity.Common,f:l.Rarity.Fabled,l:l.Rarity.Legendary,m:l.Rarity.Majestic,p:l.Rarity.Promo,r:l.Rarity.Rare,s:l.Rarity.SuperRare,t:l.Rarity.Token,v:l.Rarity.Marvel},Zr=e=>{let r=[];for(let t of e)ve[t]?r.push(ve[t]):r.push(t);return r},Xr=e=>{let r=[],t,a,i=rr.find(s=>e.includes(s));if(i){let[,s]=e.split(i);Ze(s)?(t=!0,r.push(...s.trim().split("+").map(o=>o.replace(f,"")))):Xe(s)?(a=!0,r.push(...s.trim().split(",").map(o=>o.replace(f,"")))):r.push(s.trim().replace(f,""))}else Ze(e)?(t=!0,r.push(...e.trim().split("+").map(s=>s.replace(f,"")))):Xe(e)?(a=!0,r.push(...e.trim().split(",").map(s=>s.replace(f,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(f,"")):r.push(e.trim().replace(f,""));return{modifier:i,values:r,isAnd:t,isOr:a}},et=e=>{let r=tt(e);if(r){let[,t]=e.split(r);return{filterKey:t,isExcluded:!0,isOptional:!1,isMeta:er(t)}}else return{filterKey:e,isExcluded:!1,isOptional:!1,isMeta:er(e)}},rt=e=>e.indexOf(":")>=0,Ze=e=>e.indexOf("+")>=0,Xe=e=>e.indexOf(",")>=0,er=e=>!!ie[e]?.isMeta,tt=e=>tr.find(r=>e.includes(r))?.slice(0,1);var M=require("@flesh-and-blood/types"),ir={artists:["Hoodwill"],cardIdentifier:"fangs-a-lot-blue",classes:[M.Class.Generic],defaultImage:"FNG000",functionalText:"If Fangs A Lot is put into your banished zone from your graveyard, instead put it into your hand.",legalFormats:[],legalHeroes:[M.Hero.Kayo,M.Hero.Levia,M.Hero.Rhinar],printings:[{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000",print:"FNG000",rarity:M.Rarity.Rare,set:M.Release.Promos},{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000_Marvel",print:`FNG000-${M.Treatment.FA}`,rarity:M.Rarity.Marvel,set:M.Release.Promos,treatment:M.Treatment.FA}],name:"Fangs A Lot",rarities:[M.Rarity.Rare,M.Rarity.Marvel],rarity:M.Rarity.Rare,sets:[M.Release.Promos],setIdentifiers:["FNG000"],specialImage:"FNG000_Marvel",subtypes:[M.Subtype.Attack],types:[M.Type.Action],typeText:"Generic Action - Attack"},ar=[{keyword:ir.name.toLowerCase(),card:ir}];var xe=class{constructor(r,t=[],a=[],i=!1){this.log=(r,...t)=>{this.debug&&console.log(r,...t)};this.search=(r,t)=>{let a,{appliedFilters:i,attributes:s,keywords:o}=Te(r,this.cards,this.additionalHeroes,this.additionalSets),c=o.join(" "),p=t?ar.filter(y=>y.keyword===c):[];if(p.length>0?a=p.map(({card:y})=>y):o.length?a=this.fuse.search(c).map(y=>y.item):a=[...this.cards],i.length&&(a=a.filter(y=>y&&or(y,i))),o.length===0){let y="";if(s.releases.length===1)try{let m=s.releases[0];y=ae.setToSetIdentifierMappings[m][0].toUpperCase()}catch(m){console.error("Error getting set identifier from search",m)}if(!y&&s.prints.length===1)try{let m=s.prints[0];ae.setIdentifierToSetMappings[m]&&(y=m.toUpperCase())}catch(m){console.error("Error getting set identifier from search",m)}y?a.sort((m,b)=>{let S=m.setIdentifiers.find(D=>D.includes(y))?.replace(y,""),H=b.setIdentifiers.find(D=>D.includes(y))?.replace(y,"");return S&&H?S.localeCompare(H):-1}):a.sort((m,b)=>m.name===b.name?`${m.pitch}`.localeCompare(`${b.pitch}`):m.name.localeCompare(b.name))}else{let y=[],g=[],P=o.map(m=>m.toLowerCase().replace(f,"")).join(" ");for(let m of a)m.name.toLowerCase().replace(f,"")===P?y.push(m):g.push(m);a=[...y,...g]}let u,{artists:n,isExpansionSlot:d,foilings:h,prints:C,rarities:F,releases:w,treatments:T}=s;(n.length>0||d||h.length>0||C.length>0||F.length>0||w.length>0||T.length>0)&&(u=a.map(y=>{let g=y.printings.filter(P=>{let m=!!P.image,b=n.length===0||n.some(R=>P.artists.find(O=>O.replace(f,"").toLowerCase().includes(R))),S=!d||d===P.isExpansionSlot,H=h.length===0||h.includes(P.foiling),D=C.length===0||C.some(R=>P.identifier.includes(R.toUpperCase())),v=F.length===0||F.includes(P.rarity),L=w.length===0||w.includes(P.set),E=T.length===0||P.treatments?.some(R=>T.includes(R));return m&&b&&S&&H&&D&&v&&L&&E});return{...y,matchingPrintings:g}}));let k=u?.length>0?u:a;return{appliedFilters:i,attributes:s,keywords:o,searchResults:k}};let s={getFn:(o,c)=>{let p=Ae.default.config.getFn(o,c);return p&&(Array.isArray(p)?p.map(u=>j(u.replace(f,""))):j(p).replace(f,""))},ignoreLocation:!0,includeScore:!0,keys:[{name:"name",weight:10},{name:"functionalText",weight:6},{name:"shorthands",weight:4},{name:"setIdentifiers",weight:2},{name:"traits",weight:4},{name:"typeText",weight:6}],threshold:.15,useExtendedSearch:!0};this.additionalHeroes=t,this.additionalSets=a,this.cards=[...r],this.debug=i,this.fuse=new Ae.default([...r],s)}},sr=xe,or=(e,r)=>{let t=!0,a=!1;for(let i of r){let s=i.isOptional,{isNumber:o,isString:c,isArray:p,isBoolean:u}=i.filterToPropertyMapping;if(o){let n=it(e,i);s?n&&(a=!0):t=t&&n}else if(c){let n=at(e,i);s?n&&(a=!0):t=t&&n}else if(p){let n=st(e,i,r);s?n&&(a=!0):t=t&&n}else if(u){let n=ot(e,i);s?n&&(a=!0):t=t&&n}}return t},it=(e,r)=>{if(se(r,e)){let{values:t,modifier:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=Pe(e,r);if(o!=null&&!isNaN(o))if(o=parseInt(o),a)switch(a){case">=":let c=t?.some(d=>o>=parseInt(d));return i?!c:c;case">":let p=t?.some(d=>o>parseInt(d));return i?!p:p;case"<=":let u=t?.some(d=>o<=parseInt(d));return i?!u:u;case"<":let n=t?.some(d=>o<parseInt(d));return i?!n:n;default:return!1}else{let c=t?.some(p=>o===parseInt(p));return i?!c:c}else{let c=lt(e,r)?.toLowerCase(),p=s?t?.some(u=>c?.includes(u)):t?.some(u=>c===u);return i?!p:p}}else return!0},at=(e,r)=>{if(se(r,e)){let{values:t,isAnd:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=Pe(e,r)?.replaceAll(f,"");if(s){let c=a?t?.every(p=>o?.toLowerCase().includes(p)):t?.some(p=>o?.toLowerCase().includes(p));return i?!c:c}else{let c=a?t?.every(p=>o?.toLowerCase()===p):t?.some(p=>o?.toLowerCase()===p);return i?!c:c}}else return!0},st=(e,r,t)=>{if(se(r,e)){let{values:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{partialMatch:o}}=r,c=nt(e,r,t).map(p=>p?.replaceAll(f,""));if(o){let p=i?a.every(n=>c?.some(d=>d?.toLowerCase().includes(n))):a.some(n=>c?.some(d=>d?.toLowerCase().includes(n))),u=c.length===0;return s?!p||u:p}else{let p=i?a.every(u=>c?.some(n=>n?.toLowerCase()===u)):a.some(u=>c?.some(n=>n?.toLowerCase()===u));return s?!p:p}}else return!0},ot=(e,r)=>{if(se(r,e)){let{isExcluded:t}=r,a=Pe(e,r);return t?!a:a}else return!0},Pe=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.property]},nt=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i,property:s}}=r,o=e[s]||[],c=[],p=Object.keys(e.legalOverrides||{}).length>0,u=r.filterToPropertyMapping.property==="legalHeroes",n=t.find(({filterToPropertyMapping:h})=>h.property==="legalFormats");if(p&&u&&!!n){let h=new Set;for(let{format:C,heroes:F}of e.legalOverrides||[])if(n.values.includes(C.toLowerCase()))for(let w of F)h.add(w);c=Array.from(h)}if(c.length===0)if(i){let h=new Set;for(let C of o)if(a){let F=C[i]||[];for(let w of F)h.add(w)}else{let F=C[i];F&&h.add(F)}c=Array.from(h)}else c=o;return c},lt=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.specialProperty]},se=({cardTypes:e},{types:r,subtypes:t})=>!e||e?.some(a=>r.map(i=>i.toLowerCase()).includes(a.toLowerCase())||t.map(i=>i.toLowerCase()).includes(a.toLowerCase()));0&&(module.exports={FilterProperty,PUNCTUATION,RARITY_VALUES_MAPPING,abbreviations,availableExclusions,availableModifiers,filterCard,filtersToCardPropertyMappings,getAbbreviation,getAbbreviationByCard,getCardByName,getCleanText,getExcludedMetaFilters,getKeywordsAndAppliedFiltersFromText,getMetaFilters,getNormalizedText,getRelatedCards,getRelatedCardsByName,getTokensReferencedByCards,multiWordShorthands,shorthands,singleWordShorthands});
|
|
1
|
+
var pr=Object.create;var _=Object.defineProperty;var dr=Object.getOwnPropertyDescriptor;var ur=Object.getOwnPropertyNames;var fr=Object.getPrototypeOf,gr=Object.prototype.hasOwnProperty;var hr=(e,r)=>{for(var t in r)_(e,t,{get:r[t],enumerable:!0})},we=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of ur(r))!gr.call(e,i)&&i!==t&&_(e,i,{get:()=>r[i],enumerable:!(a=dr(r,i))||a.enumerable});return e};var mr=(e,r,t)=>(t=e!=null?pr(fr(e)):{},we(r||!e||!e.__esModule?_(t,"default",{value:e,enumerable:!0}):t,e)),br=e=>we(_({},"__esModule",{value:!0}),e);var pt={};hr(pt,{FilterProperty:()=>Se,PUNCTUATION:()=>f,RARITY_VALUES_MAPPING:()=>ve,abbreviations:()=>le,availableExclusions:()=>tr,availableModifiers:()=>rr,default:()=>sr,filterCard:()=>or,filtersToCardPropertyMappings:()=>ie,getAbbreviation:()=>Y,getAbbreviationByCard:()=>yr,getCardByName:()=>he,getCleanText:()=>ge,getExcludedMetaFilters:()=>pe,getKeywordsAndAppliedFiltersFromText:()=>Te,getMetaFilters:()=>ce,getNormalizedText:()=>j,getRelatedCards:()=>me,getRelatedCardsByName:()=>X,getTokensReferencedByCards:()=>Or,multiWordShorthands:()=>ue,shorthands:()=>de,singleWordShorthands:()=>fe});module.exports=br(pt);var ae=require("@flesh-and-blood/types"),Ae=mr(require("fuse.js"),1);var f=/[!"#$%&'’(),./:;<=>?@[\]^_`|~]/g;var l=require("@flesh-and-blood/types");var Y=e=>le.find(({abbreviations:r})=>r.find(t=>t.toLowerCase()===e)),yr=e=>le.find(({card:r})=>r.toLowerCase()===e.name.toLowerCase()),le=[{abbreviations:["10k"],card:"10,000 Year Reunion"},{abbreviations:["Pajamas","PJs"],card:"Alluvion Constellas"},{abbreviations:["Slippy","Arakni Slipped Through the Cracks","Arakni, Slipped Through the Cracks"],card:"Arakni, 5L!p3d 7hRu 7h3 cR4X"},{abbreviations:["Dullcap"],card:"Arcanite Skullcap"},{abbreviations:["ALS"],card:"Arc Light Sentinel"},{abbreviations:["AoW"],card:"Art of War"},{abbreviations:["BBD"],card:"Barraging Beatdown"},{abbreviations:["BBS"],card:"Big Blue Sky"},{abbreviations:["Starvo"],card:"Bravo, Star of the Show"},{abbreviations:["BEB"],card:"Bull's Eye Bracers"},{abbreviations:["BLW"],card:"Be Like Water"},{abbreviations:["BoJ"],card:"Balance of Justice"},{abbreviations:["BOHH"],card:"Blood on Her Hands"},{abbreviations:["BRB"],card:"Bloodrush Bellow"},{abbreviations:["Breezies"],card:"Breeze Rider Boots"},{abbreviations:["BTA"],card:"Burn Them All"},{abbreviations:["CStrike","C-Strike","C Strike"],card:"Celestial Cataclysm"},{abbreviations:["CBelly"],card:"Cerebellum Processor"},{abbreviations:["CLF"],card:"Channel Lake Frigid"},{abbreviations:["CLV"],card:"Channel Lightning Valley"},{abbreviations:["CMH"],card:"Channel Mount Heroic"},{abbreviations:["CMI"],card:"Channel Mount Isen"},{abbreviations:["CMT"],card:"Channel the Millennium Tree"},{abbreviations:["CnC","C&C"],card:"Command and Conquer"},{abbreviations:["Sea and Sea"],card:"Conqueror of the High Seas"},{abbreviations:["CYB"],card:"Count Your Blessings"},{abbreviations:["Cat","Kitty"],card:"Crouching Tiger"},{abbreviations:["CoD"],card:"Crown of Dominion"},{abbreviations:["CoP"],card:"Crown of Providence"},{abbreviations:["CtW"],card:"Crush the Weak"},{abbreviations:["DD"],card:"Death Dealer"},{abbreviations:["DnD"],card:"Devotion Never Dies"},{abbreviations:["DIO"],card:"Dash I/O"},{abbreviations:["EBTT"],card:"Even Bigger Than That!"},{abbreviations:["NewNigma"],card:"Enigma, New Moon"},{abbreviations:["EPot","E Pot"],card:"Energy Potion"},{abbreviations:["EStrike","E-Strike","E Strike"],card:"Enlightened Strike"},{abbreviations:["FFS"],card:"Fyendal's Fighting Spirit"},{abbreviations:["FoN"],card:"Force of Nature"},{abbreviations:["Frosty","\u{1F976}","\u{1F9CA}","\u2744\uFE0F"],card:"Frostbite"},{abbreviations:["Yum yum"],card:"Fruits of the Forest"},{abbreviations:["GnT"],card:"Give and Take"},{abbreviations:["Habibi"],card:"Hanabi Blaster"},{abbreviations:["HMH"],card:"Hope Merchant's Hood"},{abbreviations:["HoI"],card:"Heart of Ice"},{abbreviations:["Pumpkin"],card:"Jack-o'-lantern"},{abbreviations:["RKO","Cheato"],card:"Kayo, Underhanded Cheat"},{abbreviations:["KKBB"],card:"Knick Knack Bric-a-brac"},{abbreviations:["BStrike"],card:"Levels of Enlightenment"},{abbreviations:["LAG","Twominaris"],card:"Luminaris, Angel's Glow"},{abbreviations:["LCF","Newminaris"],card:"Luminaris, Celestial Fury"},{abbreviations:["LDE"],card:"Last Ditch Effort"},{abbreviations:["LtC"],card:"Lead the Charge"},{abbreviations:["LNW"],card:"Leave No Witnesses"},{abbreviations:["LFaL","L4aL"],card:"Life for a Life"},{abbreviations:["LiT"],card:"Lost in Thought"},{abbreviations:["MMB"],card:"Mage Master Boots"},{abbreviations:["MaxV"],card:"Maximum Velocity"},{abbreviations:["MoM"],card:"Mask of Momentum"},{abbreviations:["MoPL"],card:"Mask of the Pouncing Lynx"},{abbreviations:["MnG"],card:"Meat and Greet"},{abbreviations:["Cake","\u{1F382}"],card:"Ninth Blade of the Blood Oath"},{abbreviations:["PoM"],card:"Peace of Mind"},{abbreviations:["P-Bone"],card:"Performance Bonus"},{abbreviations:["PF","\u{1F525}"],card:"Phoenix Flame"},{abbreviations:["PtW"],card:"Poison the Well"},{abbreviations:["Thanos","Infinity Gauntlet"],card:"Polarity Reversal Script"},{abbreviations:["DPot","D Pot"],card:"Potion of D\xE9j\xE0 Vu"},{abbreviations:["Ponder Run"],card:"Premeditate"},{abbreviations:["Qi Unbound"],card:"Qi Unleashed"},{abbreviations:["RitL"],card:"Red in the Ledger"},{abbreviations:["Cats","Ghost cat","Ghost cats"],card:"Restless Coalescence"},{abbreviations:["Eugene"],card:"Rhinar, Reckless Rampage",isHidden:!0},{abbreviations:["SSGB"],card:"Sandscour Greatbow"},{abbreviations:["SSP"],card:"Sand Sketched Plan"},{abbreviations:["SFaS","S4aS"],card:"Scar for a Scar"},{abbreviations:["Tyler"],card:"Scurv, Stowaway",isHidden:!0},{abbreviations:["SWOMB"],card:"Shifting Winds of the Mystic Beast"},{abbreviations:["Snaps"],card:"Snapdragon Scalers"},{abbreviations:["SWK"],card:"Spinning Wheel Kick"},{abbreviations:["SFTL"],card:"Swing Fist, Think Later"},{abbreviations:["TTT"],card:"Take the Tempo"},{abbreviations:["Ultron"],card:"Teklovossen, the Mechropotent"},{abbreviations:["ToS"],card:"Test of Strength"},{abbreviations:["TAYG"],card:"That All You Got?"},{abbreviations:["TROM"],card:"This Round's on Me"},{abbreviations:["3oak"],card:"Three of a Kind"},{abbreviations:["Pox Malone","Post Malone"],card:"Virulent Touch"},{abbreviations:["Cast Homes"],card:"Visit Goldmane Estate"},{abbreviations:["Frosty Hammer"],card:"Winter's Wail"},{abbreviations:["Wreckless Wing"],card:"War Cry of Bellona"},{abbreviations:["ZTS"],card:"Zero to Sixty"}];var A=require("@flesh-and-blood/types");var Se=(a=>(a.BannedFormats="bannedFormats",a.LegalFormats="legalFormats",a.LegalHeroes="legalHeroes",a))(Se||{}),Z=Array.from(Array(50).keys()).map(e=>`${e}`),Cr=[{format:A.Format.ClassicConstructed,nicknames:["cc","classic"]},{format:A.Format.LivingLegend,nicknames:["cc ll","classic constructed ll","ll cc","ll","living legend"]},{format:A.Format.SilverAge,nicknames:["sage"]},{format:A.Format.GoldenAge,nicknames:["gage"]},{format:A.Format.UltimatePitFight,nicknames:["upf"]}],Fr=Object.values(A.Format).map(e=>{let r=Cr.find(({format:a})=>a===e),t=e.toLowerCase().replaceAll(f,"");return r?{...r,format:t}:{format:t}}),Mr=[{hero:A.Hero.DataDoll,nicknames:["data","datadoll"]},{hero:A.Hero.Dorinthea,nicknames:["dori"]},{hero:A.Hero.Genis,nicknames:["genis"]},{hero:A.Hero.GravyBones,nicknames:["gravy"]},{hero:A.Hero.Iyslander,nicknames:["islander"]}],vr=Object.values(A.Hero).map(e=>{let r=Mr.find(({hero:a})=>a===e),t=e.toLowerCase().replaceAll(f,"");return r?{...r,hero:t}:{hero:t}}),$=["common","rare","super rare","majestic","legendary","fabled"],Tr=(e,r,t,a)=>{let i=[];if(!r)i.push(...e);else for(let s of e)switch(r){case">=":let o=!1;for(let n of $)o?i.push(n):n===s&&(o=!0,i.push(n));break;case">":let c=!1;for(let n of $)c?i.push(n):n===s&&(c=!0);break;case"<=":let p=!1;for(let n of $.slice().reverse())p?i.push(n):n===s&&(p=!0,i.push(n));break;case"<":let u=!1;for(let n of $.slice().reverse())u?i.push(n):n===s&&(u=!0);break;default:break}return{filterToPropertyMapping:{nestedProperty:"rarity",property:"printings",isArray:!0},isExcluded:t,isOptional:a,isOr:!0,values:i}},ke=(e,r,t,a,i)=>{let s=a.map(n=>({hero:n.toLowerCase().replaceAll(f,"")})),o=[],c=[],p=[];for(let n of e){let d=Fr.find(({format:h,nicknames:C})=>h===n||!!C&&C.includes(n));if(d)c.push(d.format);else{let h=vr.find(({hero:C,nicknames:F})=>C===n||!!F&&F.includes(n))||s.find(({hero:C})=>C===n);h&&p.push(h.hero)}}let u=i||"legalFormats";return c.length>0&&o.push({filterToPropertyMapping:{property:u,isArray:!0},values:c,isOr:!0,isExcluded:r,isOptional:t}),p.length>0&&o.push({filterToPropertyMapping:{property:"legalHeroes",isArray:!0},values:p,isOr:!0,isExcluded:r,isOptional:t}),o},Ar=(e,r,t,a)=>ke(e,r,t,a,"bannedFormats"),ce=(e,r,t,a,i,s)=>{let o=[];return wr(t)?o.push(...ke(a,e,r,s)):kr(t)?o.push(...Ar(a,e,r,s)):Rr(t)&&o.push(Tr(a,i,e,r)),o},U=[{filterToPropertyMapping:{property:"cost",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"specialCost",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]}],I=[{filterToPropertyMapping:{property:"defense",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"specialDefense",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["hero","placeholder","token","weapon"]}],J=[{filterToPropertyMapping:{property:"pitch",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token","weapon"]},{filterToPropertyMapping:{property:"isCardBack",isBoolean:!0},isExcluded:!0,values:["true"]}],G=[{filterToPropertyMapping:{property:"power",isNumber:!0},isExcluded:!0,values:Z},{filterToPropertyMapping:{property:"specialPower",isString:!0,partialMatch:!0},isExcluded:!0,values:["*","x"]},{filterToPropertyMapping:{property:"types",isArray:!0,partialMatch:!0},isExcluded:!0,values:["equipment","hero","placeholder","token"]}],Q=[{filterToPropertyMapping:{property:"talents",isArray:!0},isExcluded:!0,values:Object.values(A.Talent).map(e=>e.toLowerCase())}],xr={"!co":U,"-co":U,"!cost":U,"-cost":U,"!color":U,"-color":U,"!b":I,"-b":I,"!block":I,"-block":I,"!d":I,"-d":I,"!def":I,"-def":I,"!defense":I,"-defense":I,"!pitch":J,"-pitch":J,"!p":J,"-p":J,"!attack":G,"-attack":G,"!power":G,"-power":G,"!pwr":G,"-pwr":G,"!pow":G,"-pow":G,"!talents":Q,"-talents":Q,"!tal":Q,"-tal":Q},pe=e=>{let r=[],t=xr[e];return t&&r.push(...t),r},Pr=["l","legal","hero"],wr=e=>Pr.includes(e),Sr=["banned"],kr=e=>Sr.includes(e),Lr=["r","rarity"],Rr=e=>Lr.includes(e);var N=require("@flesh-and-blood/types"),de=[{description:"Attack actions",expanded:["st:attack"],filters:{subtypes:[N.Subtype.Attack]},isCardProperty:!1,shorthands:["AA"]},{description:"Arcane barrier",expanded:['k:"arcane barrier"'],filters:{keywords:[N.Keyword.ArcaneBarrier]},isCardProperty:!1,shorthands:["AB"]},{description:"Attack reactions",expanded:['t:"attack reaction"'],filters:{types:[N.Type.AttackReaction]},isCardProperty:!1,shorthands:["AR"]},{description:"Defense reactions",expanded:['t:"defense reaction"'],filters:{types:[N.Type.DefenseReaction]},isCardProperty:!1,shorthands:["DR"]},{description:"Gain life",expanded:["gain {h}"],filters:{functionalText:"gain {h}"},isCardProperty:!1,shorthands:["Gain life","Gains life"]},{description:"Go again",expanded:['k:"go again"'],filters:{keywords:[N.Keyword.GoAgain]},isCardProperty:!1,shorthands:["GA"]},{description:"Non-attack actions",expanded:["t:action","st:non-attack"],filters:{subtypes:[N.Subtype.NonAttack],types:[N.Type.Action]},isCardProperty:!1,shorthands:["NAA"]},{description:"Plus defense",expanded:["+ {d}"],filters:{functionalText:"+ {d}"},isCardProperty:!1,shorthands:["Pump defense","Pumps defense","Buff defense","Buffs defense"]},{description:"Spellvoid",expanded:['k:"spellvoid"'],filters:{keywords:[N.Keyword.Spellvoid]},isCardProperty:!1,shorthands:["SV"]}],ue=de.filter(({shorthands:e})=>e.some(r=>r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)})),fe=de.filter(({shorthands:e})=>e.some(r=>!r.includes(" "))).map(e=>({...e,shorthands:e.shorthands.filter(r=>!r.includes(" ")).map(r=>r.toLowerCase()).sort((r,t)=>t.length-r.length)}));var he=(e,r)=>{let t=r.find(a=>ge(a.name)===e);return t||(t=r.find(a=>ge(a.name).includes(e))),t},ge=e=>j(e.toLowerCase().trim().replace(f,"")),j=e=>e.normalize("NFD").replace(/\p{Diacritic}/gu,"");var K=require("@flesh-and-blood/types");var z=require("@flesh-and-blood/types"),Br={"Dawnblade, Resplendent":"Dawnblade"},Le=e=>Br[e.name]||e.name,Re=e=>e.functionalText?.replaceAll(e.name,""),X=(e,r)=>{let t=r.find(a=>a.name.toLowerCase().replace(f,"")===e);return t||(t=r.find(a=>a.name.toLowerCase().replace(f,"").includes(e))),me(t,r)},me=(e,r)=>{let t={},a={},i={};if(e){let p=[],u=[],n=Le(e);for(let d of r){let h=Le(d),C=n===h,F=e.cardIdentifier!==d.cardIdentifier,w=e.pitch!==d.pitch;if(C&&F&&w)t[d.cardIdentifier]=d;else if(!C){let T=e.name==="Seismic Surge",x=d.keywords?.includes(z.Keyword.Heave),S=T&&x,y=e.name==="Marked",g=d.keywords?.includes(z.Keyword.Mark),P=y&&g,m=Re(d),b=m?.includes(n)||e.traits?.some(ne=>m?.includes(ne)),k=Re(e);(b||S||P)&&p.push(d);let H=new RegExp(h,"g"),D=new RegExp(`\\*\\*${h}\\*\\*`,"g"),v=k?.match(H)||[],L=k?.match(D)||[],E=v.length===L.length,W=k?.includes(h)&&!E,O=(d.traits||[]).some(ne=>k?.includes(ne)),B=W||O,V=d.name==="Seismic Surge",oe=e.keywords?.includes(z.Keyword.Heave),nr=V&&oe,lr=d.name==="Marked",cr=e.keywords?.includes(z.Keyword.Mark);(B||nr||lr&&cr)&&u.push(d)}}for(let d of p)a[d.cardIdentifier]=d;for(let d of u){let h=d.name;n!==h&&!u.some(C=>{let F=C.name;return F!==h&&F?.includes(h)})&&(i[d.cardIdentifier]=d)}}let s=Object.values(t),o=Object.values(a),c=Object.values(i);return{otherPitches:s,referencedBy:o,references:c}},Nr=["cash-in-yellow"],Er={[K.Hero.Crackni]:{traits:[K.Trait.AgentOfChaos]},[K.Hero.Maxx]:{tokens:["hyper-driver"]}},Or=(e,r,t)=>{let a=new Set;for(let i of e.filter(({cardIdentifier:s})=>!Nr.includes(s))){let{references:s}=me(i,r);for(let o of s.filter(c=>{let p=c.name==="Hyper Driver",u=t===K.Hero.Maxx;return!p||u}))a.add(o)}if(t){let i=Er[t];if(i){if(i.cards)for(let s of e)i.cards?.includes(s.cardIdentifier)&&a.add(s);if(i.tokens)for(let s of r)i.tokens?.includes(s.cardIdentifier)&&a.add(s)}}return Array.from(a)};var rr=[">=",">","<=","<"],tr=["!","-"],Ir={property:"arcane",specialProperty:"specialArcane",isNumber:!0,partialMatch:!0},be={property:"artists",isArray:!0,partialMatch:!0},Be={property:"n/a",isMeta:!0},Ne={property:"bonds",isArray:!0},Hr={property:"n/a"},Ee={property:"classes",isArray:!0,partialMatch:!0},Oe={property:"cost",specialProperty:"specialCost",isNumber:!0,partialMatch:!0},q={property:"defense",specialProperty:"specialDefense",isNumber:!0},Ie={property:"flows",isArray:!0},He={nestedProperty:"foiling",property:"printings",isArray:!0},De={property:"fusions",isArray:!0},Ge={property:"intellect",isNumber:!0},Ve={property:"keywords",isArray:!0},ye={property:"n/a",isMeta:!0},We={property:"life",specialProperty:"specialLife",isNumber:!0},Ue={property:"meta",isArray:!0},Ke={property:"name",isString:!0,partialMatch:!0},Ce={property:"pitch",isNumber:!0},ee={property:"power",specialProperty:"specialPower",isNumber:!0},Dr={property:"setIdentifiers",isArray:!0,partialMatch:!0},je={property:"n/a",isMeta:!0},Gr={property:"n/a"},Vr={property:"n/a"},ze={property:"sets",isArray:!0,partialMatch:!0},Fe={property:"shorthands",isArray:!0,partialMatch:!0},re={property:"specializations",isArray:!0,partialMatch:!0},qe={property:"subtypes",isArray:!0},_e={property:"types",isArray:!0},Ye={property:"talents",isArray:!0},Wr={property:"functionalText",isString:!0,partialMatch:!0},Ur={property:"traits",isArray:!0,partialMatch:!0},Kr={property:"typeText",isString:!0,partialMatch:!0},te={nestedProperty:"treatments",property:"printings",isArray:!0,isNestedPropertyArray:!0},jr={property:"firstReleaseDate",isString:!0,partialMatch:!0},ie={arcane:Ir,a:be,artist:be,art:be,attack:ee,b:q,block:q,banned:Be,bond:Ne,bonds:Ne,c:Ee,class:Ee,chain:Hr,co:Oe,cost:Oe,color:Ce,d:q,def:q,defense:q,flow:Ie,flows:Ie,f:De,fusion:De,foil:He,foiling:He,i:Ge,intellect:Ge,is:Ue,k:Ve,keyword:Ve,l:ye,legal:ye,hero:ye,li:We,life:We,meta:Ue,n:Ke,name:Ke,p:Ce,pitch:Ce,pwr:ee,pow:ee,power:ee,print:Dr,r:je,rarity:je,referencedby:Gr,references:Vr,rf:Be,s:ze,set:ze,short:Fe,shorthand:Fe,shorthands:Fe,sp:re,spec:re,specialization:re,specializations:re,st:qe,subtype:qe,t:_e,type:_e,tal:Ye,talent:Ye,text:Wr,trait:Ur,treat:te,treatment:te,var:te,variation:te,x:Kr,year:jr},zr=[{text:l.Release.ClassicBattlesRhinarDorinthea.toLowerCase(),override:l.Release.ClassicBattlesRhinarDorinthea.toLowerCase().replaceAll(f,"")}],qr=e=>{let r=[],t=e.replaceAll("\u201D",'"');for(let{text:i,override:s}of zr)t.includes(i)&&(t=t.replace(i,s));if(Y(t)?.card)r.push(t);else{let i=t.split(/[ ]+/),s="",o=0;for(let c of i)o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0),o<2&&c.split('"').length===2?(s+=" "+c,o++):o===0&&s===""?r.push(c):o===1&&(s+=" "+c);o===2&&(r.push(s.trim().replaceAll('"',"")),s="",o=0)}return r},Te=(e,r,t=[],a=[])=>{let i=e.trim().toLowerCase();for(let{expanded:T,shorthands:x}of ue)for(let S of x)if(i.includes(S)){i=i.replace(S,T.join(" "));break}for(let[T,x]of Object.entries(l.setToSetIdentifierMappings))i.includes(T.toLowerCase())&&(i=i.replace(T.toLowerCase(),x[0]));let s=qr(i),o=[];for(let T of s){let x=fe.find(({shorthands:S})=>S.includes(T));x&&!x.isCardProperty?o.push(...x.expanded):o.push(T)}let c=[],p=[],u=[],n=[],d=!1,h=[],C=[],F=[],w=[];for(let T of o)if(tt(T)){let[x,S]=T.split(":"),{modifier:y,values:g,isAnd:P,isOr:m}=et(S),{filterKey:b,isExcluded:k,isOptional:H,isMeta:D}=rt(x);if(D){if(["rarity","r"].includes(b)){let v=Xr(g);k||(C=[...v]),g=v.map(L=>L.toLowerCase())}["legal","l","hero"].includes(b),c.push(...ce(k,H,b,g,y,t))}else{if(["chain"].includes(b)){let v=B=>B.name.toLowerCase().replaceAll(f,""),L=g.map(B=>he(B,r)).filter(B=>!!B).map(v),E=new Set(L);b="name",m=!0;let W=20,R=0,O=B=>{if(!B.types.includes(l.Type.Hero)){let V=v(B);E.add(V),L.includes(V)||L.push(V)}};for(let B of L){if(R>W)break;let{referencedBy:V,references:oe}=X(B,r);oe.forEach(O),R===0&&V.forEach(O),R++}g=Array.from(E)}else if(["referencedby","references"].includes(b)){let v=b,L=[...g].filter(E=>!!E);g=[],b="name",m=!0;for(let E of L){let{referencedBy:W,references:R}=X(E,r);["referencedby"].includes(v)?g.push(...R.map(({name:O})=>O.toLowerCase().replaceAll(f,""))):["references"].includes(v)&&g.push(...W.map(({name:O})=>O.toLowerCase().replaceAll(f,"")))}}else if(["art","artist"].includes(b))p=g;else if(["print","prints","printing","printings"].includes(b))h=g;else if(["is","meta"].includes(b)){let v=Jr(g);g=v.map(L=>L.toLowerCase().replaceAll(f,"")),v.includes(l.Meta.Expansion)&&!k&&(d=!0)}else["foiling","foil"].includes(b)?(n=Qr(g),g=n.map(v=>v.toLowerCase())):["treat","treatment","var","variation"].includes(b)?(w=Zr(g),g=w.map(v=>v.toLowerCase())):["set","s"].includes(b)?(F=_r(g,a),g=F.map(v=>v.toLowerCase().replaceAll(f,""))):["pitch","p","color"].includes(b)&&(g=$r(g));ie[b]&&c.push({filterToPropertyMapping:ie[b],values:g,isAnd:P,isOr:m,modifier:y,isExcluded:k,isOptional:H})}}else if(T){let x=Y(T)?.card,S=pe(T);x?u.push(`"${x.toLowerCase().replace(f,"")}"`):S&&S.length>0?c.push(...S):u.push(T.replace(f,""))}return{appliedFilters:c,attributes:{artists:p,foilings:n,isExpansionSlot:d,prints:h,rarities:C,releases:F,treatments:w},keywords:u}},_r=(e,r=[])=>{let t=[];for(let a of e)t.push(...Yr(a,r));return t},Yr=(e,r=[])=>{let t=[],a=Object.values(l.Release).find(i=>i.toLowerCase().replaceAll(f,"")===e);if(a&&t.push(a),t.length===0){let i=l.setIdentifierToSetMappings[e];i&&t.push(i)}if(t.length===0){let i=Object.values(l.Release).filter(s=>s.toLowerCase().includes(e));i.length>0&&t.push(...i)}if(t.length===0){let i=r.find(s=>s.toLowerCase().replaceAll(f,"")===e);i&&t.push(i)}return t},Me={blue:3,yellow:2,red:1,white:0},$r=e=>{let r=[];for(let t of e)Me[t]||Me[t]===0?r.push(Me[t].toString()):r.push(t);return r},$e={exp:l.Meta.Expansion,expansion:l.Meta.Expansion,expansionSlot:l.Meta.Expansion,rainbow:l.Meta.Rainbow},Jr=e=>{let r=[];for(let t of e)$e[t]&&r.push($e[t]);return r},Je={r:l.Foiling.Rainbow,rf:l.Foiling.Rainbow,rainbow:l.Foiling.Rainbow,c:l.Foiling.Cold,cf:l.Foiling.Cold,cold:l.Foiling.Cold,g:l.Foiling.Gold,gf:l.Foiling.Gold,gold:l.Foiling.Gold},Qr=e=>{let r=[];for(let t of e)Je[t]&&r.push(Je[t]);return r},Qe={...Object.values(l.Treatment).reduce((e,r)=>(e[r.toLowerCase()]=r,e),{}),aa:l.Treatment.AA,alt:l.Treatment.AA,"alt art":l.Treatment.AA,ab:l.Treatment.AB,"alt border":l.Treatment.AB,at:l.Treatment.AT,"alt text":l.Treatment.AT,ea:l.Treatment.EA,extended:l.Treatment.EA,"extended art":l.Treatment.EA,fa:l.Treatment.FA,full:l.Treatment.FA,"full art":l.Treatment.FA},Zr=e=>{let r=[];for(let t of e)Qe[t]?r.push(Qe[t]):l.Treatment[t.toUpperCase()]&&r.push(l.Treatment[t.toUpperCase()]);return r},ve={b:l.Rarity.Basic,c:l.Rarity.Common,f:l.Rarity.Fabled,l:l.Rarity.Legendary,m:l.Rarity.Majestic,p:l.Rarity.Promo,r:l.Rarity.Rare,s:l.Rarity.SuperRare,t:l.Rarity.Token,v:l.Rarity.Marvel},Xr=e=>{let r=[];for(let t of e)ve[t]?r.push(ve[t]):r.push(t);return r},et=e=>{let r=[],t,a,i=rr.find(s=>e.includes(s));if(i){let[,s]=e.split(i);Ze(s)?(t=!0,r.push(...s.trim().split("+").map(o=>o.replace(f,"")))):Xe(s)?(a=!0,r.push(...s.trim().split(",").map(o=>o.replace(f,"")))):r.push(s.trim().replace(f,""))}else Ze(e)?(t=!0,r.push(...e.trim().split("+").map(s=>s.replace(f,"")))):Xe(e)?(a=!0,r.push(...e.trim().split(",").map(s=>s.replace(f,"")))):e.startsWith('"')&&e.endsWith('"')?r.push(e.trim().replaceAll('"',"").replace(f,"")):r.push(e.trim().replace(f,""));return{modifier:i,values:r,isAnd:t,isOr:a}},rt=e=>{let r=it(e);if(r){let[,t]=e.split(r);return{filterKey:t,isExcluded:!0,isOptional:!1,isMeta:er(t)}}else return{filterKey:e,isExcluded:!1,isOptional:!1,isMeta:er(e)}},tt=e=>e.indexOf(":")>=0,Ze=e=>e.indexOf("+")>=0,Xe=e=>e.indexOf(",")>=0,er=e=>!!ie[e]?.isMeta,it=e=>tr.find(r=>e.includes(r))?.slice(0,1);var M=require("@flesh-and-blood/types"),ir={artists:["Hoodwill"],cardIdentifier:"fangs-a-lot-blue",classes:[M.Class.Generic],defaultImage:"FNG000",firstReleaseDate:"2022-06-02",functionalText:"If Fangs A Lot is put into your banished zone from your graveyard, instead put it into your hand.",legalFormats:[],legalHeroes:[M.Hero.Kayo,M.Hero.Levia,M.Hero.Rhinar],printings:[{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000",print:"FNG000",rarity:M.Rarity.Rare,set:M.Release.Promos},{artists:["Hoodwill"],identifier:"FNG000",image:"FNG000_Marvel",print:`FNG000-${M.Treatment.FA}`,rarity:M.Rarity.Marvel,set:M.Release.Promos,treatment:M.Treatment.FA}],name:"Fangs A Lot",rarities:[M.Rarity.Rare,M.Rarity.Marvel],rarity:M.Rarity.Rare,sets:[M.Release.Promos],setIdentifiers:["FNG000"],specialImage:"FNG000_Marvel",subtypes:[M.Subtype.Attack],types:[M.Type.Action],typeText:"Generic Action - Attack"},ar=[{keyword:ir.name.toLowerCase(),card:ir}];var xe=class{constructor(r,t=[],a=[],i=!1){this.log=(r,...t)=>{this.debug&&console.log(r,...t)};this.search=(r,t)=>{let a,{appliedFilters:i,attributes:s,keywords:o}=Te(r,this.cards,this.additionalHeroes,this.additionalSets),c=o.join(" "),p=t?ar.filter(y=>y.keyword===c):[];if(p.length>0?a=p.map(({card:y})=>y):o.length?a=this.fuse.search(c).map(y=>y.item):a=[...this.cards],i.length&&(a=a.filter(y=>y&&or(y,i))),o.length===0){let y="";if(s.releases.length===1)try{let m=s.releases[0];y=ae.setToSetIdentifierMappings[m][0].toUpperCase()}catch(m){console.error("Error getting set identifier from search",m)}if(!y&&s.prints.length===1)try{let m=s.prints[0];ae.setIdentifierToSetMappings[m]&&(y=m.toUpperCase())}catch(m){console.error("Error getting set identifier from search",m)}y?a.sort((m,b)=>{let k=m.setIdentifiers.find(D=>D.includes(y))?.replace(y,""),H=b.setIdentifiers.find(D=>D.includes(y))?.replace(y,"");return k&&H?k.localeCompare(H):-1}):a.sort((m,b)=>m.name===b.name?`${m.pitch}`.localeCompare(`${b.pitch}`):m.name.localeCompare(b.name))}else{let y=[],g=[],P=o.map(m=>m.toLowerCase().replace(f,"")).join(" ");for(let m of a)m.name.toLowerCase().replace(f,"")===P?y.push(m):g.push(m);a=[...y,...g]}let u,{artists:n,isExpansionSlot:d,foilings:h,prints:C,rarities:F,releases:w,treatments:T}=s;(n.length>0||d||h.length>0||C.length>0||F.length>0||w.length>0||T.length>0)&&(u=a.map(y=>{let g=y.printings.filter(P=>{let m=!!P.image,b=n.length===0||n.some(R=>P.artists.find(O=>O.replace(f,"").toLowerCase().includes(R))),k=!d||d===P.isExpansionSlot,H=h.length===0||h.includes(P.foiling),D=C.length===0||C.some(R=>P.identifier.includes(R.toUpperCase())),v=F.length===0||F.includes(P.rarity),L=w.length===0||w.includes(P.set),E=T.length===0||P.treatments?.some(R=>T.includes(R));return m&&b&&k&&H&&D&&v&&L&&E});return{...y,matchingPrintings:g}}));let S=u?.length>0?u:a;return{appliedFilters:i,attributes:s,keywords:o,searchResults:S}};let s={getFn:(o,c)=>{let p=Ae.default.config.getFn(o,c);return p&&(Array.isArray(p)?p.map(u=>j(u.replace(f,""))):j(p).replace(f,""))},ignoreLocation:!0,includeScore:!0,keys:[{name:"name",weight:10},{name:"functionalText",weight:6},{name:"shorthands",weight:4},{name:"setIdentifiers",weight:2},{name:"traits",weight:4},{name:"typeText",weight:6}],threshold:.15,useExtendedSearch:!0};this.additionalHeroes=t,this.additionalSets=a,this.cards=[...r],this.debug=i,this.fuse=new Ae.default([...r],s)}},sr=xe,or=(e,r)=>{let t=!0,a=!1;for(let i of r){let s=i.isOptional,{isNumber:o,isString:c,isArray:p,isBoolean:u}=i.filterToPropertyMapping;if(o){let n=at(e,i);s?n&&(a=!0):t=t&&n}else if(c){let n=st(e,i);s?n&&(a=!0):t=t&&n}else if(p){let n=ot(e,i,r);s?n&&(a=!0):t=t&&n}else if(u){let n=nt(e,i);s?n&&(a=!0):t=t&&n}}return t},at=(e,r)=>{if(se(r,e)){let{values:t,modifier:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=Pe(e,r);if(o!=null&&!isNaN(o))if(o=parseInt(o),a)switch(a){case">=":let c=t?.some(d=>o>=parseInt(d));return i?!c:c;case">":let p=t?.some(d=>o>parseInt(d));return i?!p:p;case"<=":let u=t?.some(d=>o<=parseInt(d));return i?!u:u;case"<":let n=t?.some(d=>o<parseInt(d));return i?!n:n;default:return!1}else{let c=t?.some(p=>o===parseInt(p));return i?!c:c}else{let c=ct(e,r)?.toLowerCase(),p=s?t?.some(u=>c?.includes(u)):t?.some(u=>c===u);return i?!p:p}}else return!0},st=(e,r)=>{if(se(r,e)){let{values:t,isAnd:a,isExcluded:i,filterToPropertyMapping:{partialMatch:s}}=r,o=Pe(e,r)?.replaceAll(f,"");if(s){let c=a?t?.every(p=>o?.toLowerCase().includes(p)):t?.some(p=>o?.toLowerCase().includes(p));return i?!c:c}else{let c=a?t?.every(p=>o?.toLowerCase()===p):t?.some(p=>o?.toLowerCase()===p);return i?!c:c}}else return!0},ot=(e,r,t)=>{if(se(r,e)){let{values:a,isAnd:i,isExcluded:s,filterToPropertyMapping:{partialMatch:o}}=r,c=lt(e,r,t).map(p=>p?.replaceAll(f,""));if(o){let p=i?a.every(n=>c?.some(d=>d?.toLowerCase().includes(n))):a.some(n=>c?.some(d=>d?.toLowerCase().includes(n))),u=c.length===0;return s?!p||u:p}else{let p=i?a.every(u=>c?.some(n=>n?.toLowerCase()===u)):a.some(u=>c?.some(n=>n?.toLowerCase()===u));return s?!p:p}}else return!0},nt=(e,r)=>{if(se(r,e)){let{isExcluded:t}=r,a=Pe(e,r);return t?!a:a}else return!0},Pe=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.property]},lt=(e,r,t)=>{let{filterToPropertyMapping:{isNestedPropertyArray:a,nestedProperty:i,property:s}}=r,o=e[s]||[],c=[],p=Object.keys(e.legalOverrides||{}).length>0,u=r.filterToPropertyMapping.property==="legalHeroes",n=t.find(({filterToPropertyMapping:h})=>h.property==="legalFormats");if(p&&u&&!!n){let h=new Set;for(let{format:C,heroes:F}of e.legalOverrides||[])if(n.values.includes(C.toLowerCase()))for(let w of F)h.add(w);c=Array.from(h)}if(c.length===0)if(i){let h=new Set;for(let C of o)if(a){let F=C[i]||[];for(let w of F)h.add(w)}else{let F=C[i];F&&h.add(F)}c=Array.from(h)}else c=o;return c},ct=(e,r)=>{let{filterToPropertyMapping:t}=r;return e[t.specialProperty]},se=({cardTypes:e},{types:r,subtypes:t})=>!e||e?.some(a=>r.map(i=>i.toLowerCase()).includes(a.toLowerCase())||t.map(i=>i.toLowerCase()).includes(a.toLowerCase()));0&&(module.exports={FilterProperty,PUNCTUATION,RARITY_VALUES_MAPPING,abbreviations,availableExclusions,availableModifiers,filterCard,filtersToCardPropertyMappings,getAbbreviation,getAbbreviationByCard,getCardByName,getCleanText,getExcludedMetaFilters,getKeywordsAndAppliedFiltersFromText,getMetaFilters,getNormalizedText,getRelatedCards,getRelatedCardsByName,getTokensReferencedByCards,multiWordShorthands,shorthands,singleWordShorthands});
|
package/dist/memes.js
CHANGED
|
@@ -12,6 +12,7 @@ const fangsALot = {
|
|
|
12
12
|
cardIdentifier: "fangs-a-lot-blue",
|
|
13
13
|
classes: [Class.Generic],
|
|
14
14
|
defaultImage: "FNG000",
|
|
15
|
+
firstReleaseDate: "2022-06-02",
|
|
15
16
|
functionalText: `If Fangs A Lot is put into your banished zone from your graveyard, instead put it into your hand.`,
|
|
16
17
|
legalFormats: [],
|
|
17
18
|
legalHeroes: [Hero.Kayo, Hero.Levia, Hero.Rhinar],
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flesh-and-blood/search",
|
|
3
3
|
"description": "TypeScript search engine for Flesh and Blood cards",
|
|
4
|
-
"version": "4.0.
|
|
4
|
+
"version": "4.0.5",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"main": "dist/index.cjs",
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"@flesh-and-blood/types": "^4.0.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@flesh-and-blood/cards": "^4.0.
|
|
47
|
-
"@flesh-and-blood/types": "^4.0.
|
|
46
|
+
"@flesh-and-blood/cards": "^4.0.5",
|
|
47
|
+
"@flesh-and-blood/types": "^4.0.4",
|
|
48
48
|
"@types/jest": "^29.5.11",
|
|
49
49
|
"@types/node": "^20.10.5",
|
|
50
50
|
"esbuild": "^0.19.10",
|
|
@@ -74,5 +74,5 @@
|
|
|
74
74
|
"FAB",
|
|
75
75
|
"FABTCG"
|
|
76
76
|
],
|
|
77
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "843f7f1e853b97788179038edea3b35e1b84344e"
|
|
78
78
|
}
|