1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708 |
- 'use strict';
- function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
- var fs = _interopDefault(require('fs'));
- var path = _interopDefault(require('path'));
- var util = _interopDefault(require('util'));
- var url = _interopDefault(require('url'));
- var assert = _interopDefault(require('assert'));
- var os = _interopDefault(require('os'));
- var thirdParty = require('./third-party');
- var thirdParty__default = thirdParty['default'];
- var name = "prettier";
- var version$1 = "1.12.1";
- var description = "Prettier is an opinionated code formatter";
- var bin = {"prettier":"./bin/prettier.js"};
- var repository = "prettier/prettier";
- var homepage = "https://prettier.io";
- var author = "James Long";
- var license = "MIT";
- var main = "./index.js";
- var engines = {"node":">=4"};
- var dependencies = {"@babel/code-frame":"7.0.0-beta.40","@glimmer/syntax":"0.30.3","babylon":"7.0.0-beta.34","camelcase":"4.1.0","chalk":"2.1.0","cjk-regex":"1.0.2","cosmiconfig":"3.1.0","dashify":"0.2.2","dedent":"0.7.0","diff":"3.2.0","editorconfig":"0.15.0","editorconfig-to-prettier":"0.0.6","emoji-regex":"6.5.1","escape-string-regexp":"1.0.5","esutils":"2.0.2","find-project-root":"1.1.1","flow-parser":"0.69","get-stream":"3.0.0","globby":"6.1.0","graphql":"0.13.2","gray-matter":"3.1.1","html-tag-names":"1.1.2","ignore":"3.3.7","jest-docblock":"22.2.2","json-stable-stringify":"1.0.1","leven":"2.1.0","mem":"1.1.0","minimatch":"3.0.4","minimist":"1.2.0","parse5":"3.0.3","postcss-less":"1.1.5","postcss-media-query-parser":"0.2.3","postcss-scss":"1.0.5","postcss-selector-parser":"2.2.3","postcss-values-parser":"1.5.0","read-pkg-up":"3.0.0","remark-frontmatter":"1.1.0","remark-parse":"5.0.0","resolve":"1.5.0","semver":"5.4.1","string-width":"2.1.1","typescript":"2.8.0-rc","typescript-eslint-parser":"14.0.0","unicode-regex":"1.0.1","unified":"6.1.6"};
- var devDependencies = {"babel-cli":"6.24.1","babel-preset-es2015":"6.24.1","codecov":"2.2.0","cross-env":"5.0.5","eslint":"4.18.2","eslint-config-prettier":"2.9.0","eslint-friendly-formatter":"3.0.0","eslint-plugin-import":"2.9.0","eslint-plugin-prettier":"2.6.0","eslint-plugin-react":"7.7.0","jest":"21.1.0","mkdirp":"0.5.1","prettier":"1.12.0","prettylint":"1.0.0","rimraf":"2.6.2","rollup":"0.47.6","rollup-plugin-commonjs":"8.2.6","rollup-plugin-json":"2.1.1","rollup-plugin-node-builtins":"2.0.0","rollup-plugin-node-globals":"1.1.0","rollup-plugin-node-resolve":"2.0.0","rollup-plugin-replace":"1.2.1","shelljs":"0.8.1","snapshot-diff":"0.2.2","strip-ansi":"4.0.0","tempy":"0.2.1","uglify-es":"3.3.9","webpack":"2.6.1"};
- var scripts = {"prepublishOnly":"echo \"Error: must publish from dist/\" && exit 1","prepare-release":"yarn && yarn build && yarn test:dist","test":"jest","test:dist":"node ./scripts/test-dist.js","test-integration":"jest tests_integration","lint":"cross-env EFF_NO_LINK_RULES=true eslint . --format node_modules/eslint-friendly-formatter","lint-docs":"prettylint {.,docs,website,website/blog}/*.md","build":"node ./scripts/build/build.js","build-docs":"node ./scripts/build/build-docs.js","check-deps":"node ./scripts/check-deps.js"};
- var _package = {
- name: name,
- version: version$1,
- description: description,
- bin: bin,
- repository: repository,
- homepage: homepage,
- author: author,
- license: license,
- main: main,
- engines: engines,
- dependencies: dependencies,
- devDependencies: devDependencies,
- scripts: scripts
- };
- var _package$1 = Object.freeze({
- name: name,
- version: version$1,
- description: description,
- bin: bin,
- repository: repository,
- homepage: homepage,
- author: author,
- license: license,
- main: main,
- engines: engines,
- dependencies: dependencies,
- devDependencies: devDependencies,
- scripts: scripts,
- default: _package
- });
- var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
- function commonjsRequire () {
- throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
- }
- function unwrapExports (x) {
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
- }
- function createCommonjsModule(fn, module) {
- return module = { exports: {} }, fn(module, module.exports), module.exports;
- }
- var ansiRegex = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = () => {
- const pattern = [
- '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)',
- '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))'
- ].join('|');
- return new RegExp(pattern, 'g');
- };
- });
- var stripAnsi = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input;
- var isFullwidthCodePoint = createCommonjsModule(function (module) {
- 'use strict';
- /* eslint-disable yoda */
- module.exports = x => {
- if (Number.isNaN(x)) {
- return false;
- }
- // code points are derived from:
- // http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
- if (
- x >= 0x1100 && (
- x <= 0x115f || // Hangul Jamo
- x === 0x2329 || // LEFT-POINTING ANGLE BRACKET
- x === 0x232a || // RIGHT-POINTING ANGLE BRACKET
- // CJK Radicals Supplement .. Enclosed CJK Letters and Months
- (0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
- // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
- (0x3250 <= x && x <= 0x4dbf) ||
- // CJK Unified Ideographs .. Yi Radicals
- (0x4e00 <= x && x <= 0xa4c6) ||
- // Hangul Jamo Extended-A
- (0xa960 <= x && x <= 0xa97c) ||
- // Hangul Syllables
- (0xac00 <= x && x <= 0xd7a3) ||
- // CJK Compatibility Ideographs
- (0xf900 <= x && x <= 0xfaff) ||
- // Vertical Forms
- (0xfe10 <= x && x <= 0xfe19) ||
- // CJK Compatibility Forms .. Small Form Variants
- (0xfe30 <= x && x <= 0xfe6b) ||
- // Halfwidth and Fullwidth Forms
- (0xff01 <= x && x <= 0xff60) ||
- (0xffe0 <= x && x <= 0xffe6) ||
- // Kana Supplement
- (0x1b000 <= x && x <= 0x1b001) ||
- // Enclosed Ideographic Supplement
- (0x1f200 <= x && x <= 0x1f251) ||
- // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
- (0x20000 <= x && x <= 0x3fffd)
- )
- ) {
- return true;
- }
- return false;
- };
- });
- var stringWidth = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = str => {
- if (typeof str !== 'string' || str.length === 0) {
- return 0;
- }
- str = stripAnsi(str);
- let width = 0;
- for (let i = 0; i < str.length; i++) {
- const code = str.codePointAt(i);
- // Ignore control characters
- if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {
- continue;
- }
- // Ignore combining characters
- if (code >= 0x300 && code <= 0x36F) {
- continue;
- }
- // Surrogates
- if (code > 0xFFFF) {
- i++;
- }
- width += isFullwidthCodePoint(code) ? 2 : 1;
- }
- return width;
- };
- });
- var emojiRegex$1 = function () {
- // https://mathiasbynens.be/notes/es-unicode-property-escapes#emoji
- return (/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74)\uDB40\uDC7F|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]\uFE0F|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]))|\uD83D\uDC69\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83D\uDC69\u200D[\u2695\u2696\u2708])\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC68(?:\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDD1-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])?|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF8]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4C\uDD50-\uDD6B\uDD80-\uDD97\uDDC0\uDDD0-\uDDE6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF8]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4C\uDD50-\uDD6B\uDD80-\uDD97\uDDC0\uDDD0-\uDDE6])\uFE0F/g
- );
- };
- var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
- var escapeStringRegexp = function (str) {
- if (typeof str !== 'string') {
- throw new TypeError('Expected a string');
- }
- return str.replace(matchOperatorsRe, '\\$&');
- };
- var punctuation_ranges = [
- // http://www.unicode.org/charts/PDF/U3000.pdf CJK Symbols and Punctuation
- [0x3000, 0x303f],
- // http://www.unicode.org/charts/PDF/UAC00.pdf Hangul Syllables
- [0xac00, 0xd7af],
- // http://www.unicode.org/charts/PDF/UFE10.pdf Vertical Forms
- [0xfe10, 0xfe1f],
- // http://www.unicode.org/charts/PDF/UFE30.pdf CJK Compatibility Forms
- // http://www.unicode.org/charts/PDF/UFE50.pdf Small Form Variants
- [0xfe30, 0xfe6f],
- // http://www.unicode.org/charts/PDF/UFF00.pdf Halfwidth and Fullwidth Forms
- [0xff00, 0xff60],
- [0xffe0, 0xffef],
- ];
- var character_ranges = [
- // http://www.unicode.org/charts/PDF/U1100.pdf Hangul Jamo
- [0x1100, 0x11ff],
- // http://www.unicode.org/charts/PDF/U2E80.pdf CJK Radicals Supplement
- // http://www.unicode.org/charts/PDF/U2F00.pdf Kangxi Radicals
- [0x2e80, 0x2fdf],
- // http://www.unicode.org/charts/PDF/U3040.pdf Hiragana
- // http://www.unicode.org/charts/PDF/U30A0.pdf Katakana
- // http://www.unicode.org/charts/PDF/U3100.pdf Bopomofo
- // http://www.unicode.org/charts/PDF/U3130.pdf Hangul Compatibility Jamo
- [0x3040, 0x318f],
- // http://www.unicode.org/charts/PDF/U3200.pdf Enclosed CJK Letters and Months
- // http://www.unicode.org/charts/PDF/U3300.pdf CJK Compatibility
- // http://www.unicode.org/charts/PDF/U3400.pdf CJK Unified Ideographs Extension A
- [0x3200, 0x4dbf],
- // http://www.unicode.org/charts/PDF/U4E00.pdf CJK Unified Ideographs (Han)
- [0x4e00, 0x9fff],
- // http://www.unicode.org/charts/PDF/UA960.pdf Hangul Jamo Extended-A
- [0xa960, 0xa97f],
- // http://www.unicode.org/charts/PDF/UF900.pdf CJK Compatibility Ideographs
- [0xf900, 0xfaff],
- ];
- function get_regex() {
- return create_regex(character_ranges.concat(punctuation_ranges));
- }
- // istanbul ignore next
- // tslint:disable-next-line:no-namespace
- (function (get_regex) {
- function punctuations() {
- return create_regex(punctuation_ranges);
- }
- get_regex.punctuations = punctuations;
- function characters() {
- return create_regex(character_ranges);
- }
- get_regex.characters = characters;
- })(get_regex || (get_regex = {}));
- function create_regex(ranges) {
- return new RegExp("[" + ranges.map(get_bracket_content).reduce(function (a, b) { return a + b; }) + "]", 'g');
- }
- function get_bracket_content(range) {
- return get_escaped_unicode(range[0]) + "-" + get_escaped_unicode(range[1]);
- }
- function get_escaped_unicode(num) {
- return "\\u" + num.toString(16);
- }
- var lib = get_regex;
- var data_generated = createCommonjsModule(function (module, exports) {
- "use strict";
- exports.__esModule = true;
- exports.get_data = function () { return ({ "Pc": [[95, 95], [8255, 8256], [8276, 8276], [65075, 65076], [65101, 65103], [65343, 65343]], "Pe": [[41, 41], [93, 93], [125, 125], [3899, 3899], [3901, 3901], [5788, 5788], [8262, 8262], [8318, 8318], [8334, 8334], [8969, 8969], [8971, 8971], [9002, 9002], [10089, 10089], [10091, 10091], [10093, 10093], [10095, 10095], [10097, 10097], [10099, 10099], [10101, 10101], [10182, 10182], [10215, 10215], [10217, 10217], [10219, 10219], [10221, 10221], [10223, 10223], [10628, 10628], [10630, 10630], [10632, 10632], [10634, 10634], [10636, 10636], [10638, 10638], [10640, 10640], [10642, 10642], [10644, 10644], [10646, 10646], [10648, 10648], [10713, 10713], [10715, 10715], [10749, 10749], [11811, 11811], [11813, 11813], [11815, 11815], [11817, 11817], [12297, 12297], [12299, 12299], [12301, 12301], [12303, 12303], [12305, 12305], [12309, 12309], [12311, 12311], [12313, 12313], [12315, 12315], [12318, 12319], [64830, 64830], [65048, 65048], [65078, 65078], [65080, 65080], [65082, 65082], [65084, 65084], [65086, 65086], [65088, 65088], [65090, 65090], [65092, 65092], [65096, 65096], [65114, 65114], [65116, 65116], [65118, 65118], [65289, 65289], [65341, 65341], [65373, 65373], [65376, 65376], [65379, 65379]], "Ps": [[40, 40], [91, 91], [123, 123], [3898, 3898], [3900, 3900], [5787, 5787], [8218, 8218], [8222, 8222], [8261, 8261], [8317, 8317], [8333, 8333], [8968, 8968], [8970, 8970], [9001, 9001], [10088, 10088], [10090, 10090], [10092, 10092], [10094, 10094], [10096, 10096], [10098, 10098], [10100, 10100], [10181, 10181], [10214, 10214], [10216, 10216], [10218, 10218], [10220, 10220], [10222, 10222], [10627, 10627], [10629, 10629], [10631, 10631], [10633, 10633], [10635, 10635], [10637, 10637], [10639, 10639], [10641, 10641], [10643, 10643], [10645, 10645], [10647, 10647], [10712, 10712], [10714, 10714], [10748, 10748], [11810, 11810], [11812, 11812], [11814, 11814], [11816, 11816], [11842, 11842], [12296, 12296], [12298, 12298], [12300, 12300], [12302, 12302], [12304, 12304], [12308, 12308], [12310, 12310], [12312, 12312], [12314, 12314], [12317, 12317], [64831, 64831], [65047, 65047], [65077, 65077], [65079, 65079], [65081, 65081], [65083, 65083], [65085, 65085], [65087, 65087], [65089, 65089], [65091, 65091], [65095, 65095], [65113, 65113], [65115, 65115], [65117, 65117], [65288, 65288], [65339, 65339], [65371, 65371], [65375, 65375], [65378, 65378]], "Lm": [[688, 705], [710, 721], [736, 740], [748, 748], [750, 750], [884, 884], [890, 890], [1369, 1369], [1600, 1600], [1765, 1766], [2036, 2037], [2042, 2042], [2074, 2074], [2084, 2084], [2088, 2088], [2417, 2417], [3654, 3654], [3782, 3782], [4348, 4348], [6103, 6103], [6211, 6211], [6823, 6823], [7288, 7293], [7468, 7530], [7544, 7544], [7579, 7615], [8305, 8305], [8319, 8319], [8336, 8348], [11388, 11389], [11631, 11631], [11823, 11823], [12293, 12293], [12337, 12341], [12347, 12347], [12445, 12446], [12540, 12542], [40981, 40981], [42232, 42237], [42508, 42508], [42623, 42623], [42652, 42653], [42775, 42783], [42864, 42864], [42888, 42888], [43000, 43001], [43471, 43471], [43494, 43494], [43632, 43632], [43741, 43741], [43763, 43764], [43868, 43871], [65392, 65392], [65438, 65439]], "Mc": [[2307, 2307], [2363, 2363], [2366, 2368], [2377, 2380], [2382, 2383], [2434, 2435], [2494, 2496], [2503, 2504], [2507, 2508], [2519, 2519], [2563, 2563], [2622, 2624], [2691, 2691], [2750, 2752], [2761, 2761], [2763, 2764], [2818, 2819], [2878, 2878], [2880, 2880], [2887, 2888], [2891, 2892], [2903, 2903], [3006, 3007], [3009, 3010], [3014, 3016], [3018, 3020], [3031, 3031], [3073, 3075], [3137, 3140], [3202, 3203], [3262, 3262], [3264, 3268], [3271, 3272], [3274, 3275], [3285, 3286], [3330, 3331], [3390, 3392], [3398, 3400], [3402, 3404], [3415, 3415], [3458, 3459], [3535, 3537], [3544, 3551], [3570, 3571], [3902, 3903], [3967, 3967], [4139, 4140], [4145, 4145], [4152, 4152], [4155, 4156], [4182, 4183], [4194, 4196], [4199, 4205], [4227, 4228], [4231, 4236], [4239, 4239], [4250, 4252], [6070, 6070], [6078, 6085], [6087, 6088], [6435, 6438], [6441, 6443], [6448, 6449], [6451, 6456], [6681, 6682], [6741, 6741], [6743, 6743], [6753, 6753], [6755, 6756], [6765, 6770], [6916, 6916], [6965, 6965], [6971, 6971], [6973, 6977], [6979, 6980], [7042, 7042], [7073, 7073], [7078, 7079], [7082, 7082], [7143, 7143], [7146, 7148], [7150, 7150], [7154, 7155], [7204, 7211], [7220, 7221], [7393, 7393], [7410, 7411], [7415, 7415], [12334, 12335], [43043, 43044], [43047, 43047], [43136, 43137], [43188, 43203], [43346, 43347], [43395, 43395], [43444, 43445], [43450, 43451], [43453, 43456], [43567, 43568], [43571, 43572], [43597, 43597], [43643, 43643], [43645, 43645], [43755, 43755], [43758, 43759], [43765, 43765], [44003, 44004], [44006, 44007], [44009, 44010], [44012, 44012]], "Zp": [[8233, 8233]], "Sc": [[36, 36], [162, 165], [1423, 1423], [1547, 1547], [2546, 2547], [2555, 2555], [2801, 2801], [3065, 3065], [3647, 3647], [6107, 6107], [8352, 8383], [43064, 43064], [65020, 65020], [65129, 65129], [65284, 65284], [65504, 65505], [65509, 65510]], "Me": [[1160, 1161], [6846, 6846], [8413, 8416], [8418, 8420], [42608, 42610]], "Sk": [[94, 94], [96, 96], [168, 168], [175, 175], [180, 180], [184, 184], [706, 709], [722, 735], [741, 747], [749, 749], [751, 767], [885, 885], [900, 901], [8125, 8125], [8127, 8129], [8141, 8143], [8157, 8159], [8173, 8175], [8189, 8190], [12443, 12444], [42752, 42774], [42784, 42785], [42889, 42890], [43867, 43867], [64434, 64449], [65342, 65342], [65344, 65344], [65507, 65507]], "Cs": [[55296, 55296], [56191, 56192], [56319, 56320], [57343, 57343]], "Nl": [[5870, 5872], [8544, 8578], [8581, 8584], [12295, 12295], [12321, 12329], [12344, 12346], [42726, 42735]], "So": [[166, 166], [169, 169], [174, 174], [176, 176], [1154, 1154], [1421, 1422], [1550, 1551], [1758, 1758], [1769, 1769], [1789, 1790], [2038, 2038], [2554, 2554], [2928, 2928], [3059, 3064], [3066, 3066], [3199, 3199], [3407, 3407], [3449, 3449], [3841, 3843], [3859, 3859], [3861, 3863], [3866, 3871], [3892, 3892], [3894, 3894], [3896, 3896], [4030, 4037], [4039, 4044], [4046, 4047], [4053, 4056], [4254, 4255], [5008, 5017], [6464, 6464], [6622, 6655], [7009, 7018], [7028, 7036], [8448, 8449], [8451, 8454], [8456, 8457], [8468, 8468], [8470, 8471], [8478, 8483], [8485, 8485], [8487, 8487], [8489, 8489], [8494, 8494], [8506, 8507], [8522, 8522], [8524, 8525], [8527, 8527], [8586, 8587], [8597, 8601], [8604, 8607], [8609, 8610], [8612, 8613], [8615, 8621], [8623, 8653], [8656, 8657], [8659, 8659], [8661, 8691], [8960, 8967], [8972, 8991], [8994, 9000], [9003, 9083], [9085, 9114], [9140, 9179], [9186, 9254], [9280, 9290], [9372, 9449], [9472, 9654], [9656, 9664], [9666, 9719], [9728, 9838], [9840, 10087], [10132, 10175], [10240, 10495], [11008, 11055], [11077, 11078], [11085, 11123], [11126, 11157], [11160, 11193], [11197, 11208], [11210, 11218], [11244, 11247], [11493, 11498], [11904, 11929], [11931, 12019], [12032, 12245], [12272, 12283], [12292, 12292], [12306, 12307], [12320, 12320], [12342, 12343], [12350, 12351], [12688, 12689], [12694, 12703], [12736, 12771], [12800, 12830], [12842, 12871], [12880, 12880], [12896, 12927], [12938, 12976], [12992, 13054], [13056, 13311], [19904, 19967], [42128, 42182], [43048, 43051], [43062, 43063], [43065, 43065], [43639, 43641], [65021, 65021], [65508, 65508], [65512, 65512], [65517, 65518], [65532, 65533]], "Lt": [[453, 453], [456, 456], [459, 459], [498, 498], [8072, 8079], [8088, 8095], [8104, 8111], [8124, 8124], [8140, 8140], [8188, 8188]], "Zl": [[8232, 8232]], "Lo": [[170, 170], [186, 186], [443, 443], [448, 451], [660, 660], [1488, 1514], [1520, 1522], [1568, 1599], [1601, 1610], [1646, 1647], [1649, 1747], [1749, 1749], [1774, 1775], [1786, 1788], [1791, 1791], [1808, 1808], [1810, 1839], [1869, 1957], [1969, 1969], [1994, 2026], [2048, 2069], [2112, 2136], [2144, 2154], [2208, 2228], [2230, 2237], [2308, 2361], [2365, 2365], [2384, 2384], [2392, 2401], [2418, 2432], [2437, 2444], [2447, 2448], [2451, 2472], [2474, 2480], [2482, 2482], [2486, 2489], [2493, 2493], [2510, 2510], [2524, 2525], [2527, 2529], [2544, 2545], [2556, 2556], [2565, 2570], [2575, 2576], [2579, 2600], [2602, 2608], [2610, 2611], [2613, 2614], [2616, 2617], [2649, 2652], [2654, 2654], [2674, 2676], [2693, 2701], [2703, 2705], [2707, 2728], [2730, 2736], [2738, 2739], [2741, 2745], [2749, 2749], [2768, 2768], [2784, 2785], [2809, 2809], [2821, 2828], [2831, 2832], [2835, 2856], [2858, 2864], [2866, 2867], [2869, 2873], [2877, 2877], [2908, 2909], [2911, 2913], [2929, 2929], [2947, 2947], [2949, 2954], [2958, 2960], [2962, 2965], [2969, 2970], [2972, 2972], [2974, 2975], [2979, 2980], [2984, 2986], [2990, 3001], [3024, 3024], [3077, 3084], [3086, 3088], [3090, 3112], [3114, 3129], [3133, 3133], [3160, 3162], [3168, 3169], [3200, 3200], [3205, 3212], [3214, 3216], [3218, 3240], [3242, 3251], [3253, 3257], [3261, 3261], [3294, 3294], [3296, 3297], [3313, 3314], [3333, 3340], [3342, 3344], [3346, 3386], [3389, 3389], [3406, 3406], [3412, 3414], [3423, 3425], [3450, 3455], [3461, 3478], [3482, 3505], [3507, 3515], [3517, 3517], [3520, 3526], [3585, 3632], [3634, 3635], [3648, 3653], [3713, 3714], [3716, 3716], [3719, 3720], [3722, 3722], [3725, 3725], [3732, 3735], [3737, 3743], [3745, 3747], [3749, 3749], [3751, 3751], [3754, 3755], [3757, 3760], [3762, 3763], [3773, 3773], [3776, 3780], [3804, 3807], [3840, 3840], [3904, 3911], [3913, 3948], [3976, 3980], [4096, 4138], [4159, 4159], [4176, 4181], [4186, 4189], [4193, 4193], [4197, 4198], [4206, 4208], [4213, 4225], [4238, 4238], [4304, 4346], [4349, 4680], [4682, 4685], [4688, 4694], [4696, 4696], [4698, 4701], [4704, 4744], [4746, 4749], [4752, 4784], [4786, 4789], [4792, 4798], [4800, 4800], [4802, 4805], [4808, 4822], [4824, 4880], [4882, 4885], [4888, 4954], [4992, 5007], [5121, 5740], [5743, 5759], [5761, 5786], [5792, 5866], [5873, 5880], [5888, 5900], [5902, 5905], [5920, 5937], [5952, 5969], [5984, 5996], [5998, 6000], [6016, 6067], [6108, 6108], [6176, 6210], [6212, 6263], [6272, 6276], [6279, 6312], [6314, 6314], [6320, 6389], [6400, 6430], [6480, 6509], [6512, 6516], [6528, 6571], [6576, 6601], [6656, 6678], [6688, 6740], [6917, 6963], [6981, 6987], [7043, 7072], [7086, 7087], [7098, 7141], [7168, 7203], [7245, 7247], [7258, 7287], [7401, 7404], [7406, 7409], [7413, 7414], [8501, 8504], [11568, 11623], [11648, 11670], [11680, 11686], [11688, 11694], [11696, 11702], [11704, 11710], [11712, 11718], [11720, 11726], [11728, 11734], [11736, 11742], [12294, 12294], [12348, 12348], [12353, 12438], [12447, 12447], [12449, 12538], [12543, 12543], [12549, 12590], [12593, 12686], [12704, 12730], [12784, 12799], [13312, 13312], [19893, 19893], [19968, 19968], [40938, 40938], [40960, 40980], [40982, 42124], [42192, 42231], [42240, 42507], [42512, 42527], [42538, 42539], [42606, 42606], [42656, 42725], [42895, 42895], [42999, 42999], [43003, 43009], [43011, 43013], [43015, 43018], [43020, 43042], [43072, 43123], [43138, 43187], [43250, 43255], [43259, 43259], [43261, 43261], [43274, 43301], [43312, 43334], [43360, 43388], [43396, 43442], [43488, 43492], [43495, 43503], [43514, 43518], [43520, 43560], [43584, 43586], [43588, 43595], [43616, 43631], [43633, 43638], [43642, 43642], [43646, 43695], [43697, 43697], [43701, 43702], [43705, 43709], [43712, 43712], [43714, 43714], [43739, 43740], [43744, 43754], [43762, 43762], [43777, 43782], [43785, 43790], [43793, 43798], [43808, 43814], [43816, 43822], [43968, 44002], [44032, 44032], [55203, 55203], [55216, 55238], [55243, 55291], [63744, 64109], [64112, 64217], [64285, 64285], [64287, 64296], [64298, 64310], [64312, 64316], [64318, 64318], [64320, 64321], [64323, 64324], [64326, 64433], [64467, 64829], [64848, 64911], [64914, 64967], [65008, 65019], [65136, 65140], [65142, 65276], [65382, 65391], [65393, 65437], [65440, 65470], [65474, 65479], [65482, 65487], [65490, 65495], [65498, 65500]], "Mn": [[768, 879], [1155, 1159], [1425, 1469], [1471, 1471], [1473, 1474], [1476, 1477], [1479, 1479], [1552, 1562], [1611, 1631], [1648, 1648], [1750, 1756], [1759, 1764], [1767, 1768], [1770, 1773], [1809, 1809], [1840, 1866], [1958, 1968], [2027, 2035], [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2093], [2137, 2139], [2260, 2273], [2275, 2306], [2362, 2362], [2364, 2364], [2369, 2376], [2381, 2381], [2385, 2391], [2402, 2403], [2433, 2433], [2492, 2492], [2497, 2500], [2509, 2509], [2530, 2531], [2561, 2562], [2620, 2620], [2625, 2626], [2631, 2632], [2635, 2637], [2641, 2641], [2672, 2673], [2677, 2677], [2689, 2690], [2748, 2748], [2753, 2757], [2759, 2760], [2765, 2765], [2786, 2787], [2810, 2815], [2817, 2817], [2876, 2876], [2879, 2879], [2881, 2884], [2893, 2893], [2902, 2902], [2914, 2915], [2946, 2946], [3008, 3008], [3021, 3021], [3072, 3072], [3134, 3136], [3142, 3144], [3146, 3149], [3157, 3158], [3170, 3171], [3201, 3201], [3260, 3260], [3263, 3263], [3270, 3270], [3276, 3277], [3298, 3299], [3328, 3329], [3387, 3388], [3393, 3396], [3405, 3405], [3426, 3427], [3530, 3530], [3538, 3540], [3542, 3542], [3633, 3633], [3636, 3642], [3655, 3662], [3761, 3761], [3764, 3769], [3771, 3772], [3784, 3789], [3864, 3865], [3893, 3893], [3895, 3895], [3897, 3897], [3953, 3966], [3968, 3972], [3974, 3975], [3981, 3991], [3993, 4028], [4038, 4038], [4141, 4144], [4146, 4151], [4153, 4154], [4157, 4158], [4184, 4185], [4190, 4192], [4209, 4212], [4226, 4226], [4229, 4230], [4237, 4237], [4253, 4253], [4957, 4959], [5906, 5908], [5938, 5940], [5970, 5971], [6002, 6003], [6068, 6069], [6071, 6077], [6086, 6086], [6089, 6099], [6109, 6109], [6155, 6157], [6277, 6278], [6313, 6313], [6432, 6434], [6439, 6440], [6450, 6450], [6457, 6459], [6679, 6680], [6683, 6683], [6742, 6742], [6744, 6750], [6752, 6752], [6754, 6754], [6757, 6764], [6771, 6780], [6783, 6783], [6832, 6845], [6912, 6915], [6964, 6964], [6966, 6970], [6972, 6972], [6978, 6978], [7019, 7027], [7040, 7041], [7074, 7077], [7080, 7081], [7083, 7085], [7142, 7142], [7144, 7145], [7149, 7149], [7151, 7153], [7212, 7219], [7222, 7223], [7376, 7378], [7380, 7392], [7394, 7400], [7405, 7405], [7412, 7412], [7416, 7417], [7616, 7673], [7675, 7679], [8400, 8412], [8417, 8417], [8421, 8432], [11503, 11505], [11647, 11647], [11744, 11775], [12330, 12333], [12441, 12442], [42607, 42607], [42612, 42621], [42654, 42655], [42736, 42737], [43010, 43010], [43014, 43014], [43019, 43019], [43045, 43046], [43204, 43205], [43232, 43249], [43302, 43309], [43335, 43345], [43392, 43394], [43443, 43443], [43446, 43449], [43452, 43452], [43493, 43493], [43561, 43566], [43569, 43570], [43573, 43574], [43587, 43587], [43596, 43596], [43644, 43644], [43696, 43696], [43698, 43700], [43703, 43704], [43710, 43711], [43713, 43713], [43756, 43757], [43766, 43766], [44005, 44005], [44008, 44008], [44013, 44013], [64286, 64286], [65024, 65039], [65056, 65071]], "Po": [[33, 35], [37, 39], [42, 42], [44, 44], [46, 47], [58, 59], [63, 64], [92, 92], [161, 161], [167, 167], [182, 183], [191, 191], [894, 894], [903, 903], [1370, 1375], [1417, 1417], [1472, 1472], [1475, 1475], [1478, 1478], [1523, 1524], [1545, 1546], [1548, 1549], [1563, 1563], [1566, 1567], [1642, 1645], [1748, 1748], [1792, 1805], [2039, 2041], [2096, 2110], [2142, 2142], [2404, 2405], [2416, 2416], [2557, 2557], [2800, 2800], [3572, 3572], [3663, 3663], [3674, 3675], [3844, 3858], [3860, 3860], [3973, 3973], [4048, 4052], [4057, 4058], [4170, 4175], [4347, 4347], [4960, 4968], [5741, 5742], [5867, 5869], [5941, 5942], [6100, 6102], [6104, 6106], [6144, 6149], [6151, 6154], [6468, 6469], [6686, 6687], [6816, 6822], [6824, 6829], [7002, 7008], [7164, 7167], [7227, 7231], [7294, 7295], [7360, 7367], [7379, 7379], [8214, 8215], [8224, 8231], [8240, 8248], [8251, 8254], [8257, 8259], [8263, 8273], [8275, 8275], [8277, 8286], [11513, 11516], [11518, 11519], [11632, 11632], [11776, 11777], [11782, 11784], [11787, 11787], [11790, 11798], [11800, 11801], [11803, 11803], [11806, 11807], [11818, 11822], [11824, 11833], [11836, 11839], [11841, 11841], [11843, 11849], [12289, 12291], [12349, 12349], [12539, 12539], [42238, 42239], [42509, 42511], [42611, 42611], [42622, 42622], [42738, 42743], [43124, 43127], [43214, 43215], [43256, 43258], [43260, 43260], [43310, 43311], [43359, 43359], [43457, 43469], [43486, 43487], [43612, 43615], [43742, 43743], [43760, 43761], [44011, 44011], [65040, 65046], [65049, 65049], [65072, 65072], [65093, 65094], [65097, 65100], [65104, 65106], [65108, 65111], [65119, 65121], [65128, 65128], [65130, 65131], [65281, 65283], [65285, 65287], [65290, 65290], [65292, 65292], [65294, 65295], [65306, 65307], [65311, 65312], [65340, 65340], [65377, 65377], [65380, 65381]], "Co": [[57344, 57344], [63743, 63743]], "Sm": [[43, 43], [60, 62], [124, 124], [126, 126], [172, 172], [177, 177], [215, 215], [247, 247], [1014, 1014], [1542, 1544], [8260, 8260], [8274, 8274], [8314, 8316], [8330, 8332], [8472, 8472], [8512, 8516], [8523, 8523], [8592, 8596], [8602, 8603], [8608, 8608], [8611, 8611], [8614, 8614], [8622, 8622], [8654, 8655], [8658, 8658], [8660, 8660], [8692, 8959], [8992, 8993], [9084, 9084], [9115, 9139], [9180, 9185], [9655, 9655], [9665, 9665], [9720, 9727], [9839, 9839], [10176, 10180], [10183, 10213], [10224, 10239], [10496, 10626], [10649, 10711], [10716, 10747], [10750, 11007], [11056, 11076], [11079, 11084], [64297, 64297], [65122, 65122], [65124, 65126], [65291, 65291], [65308, 65310], [65372, 65372], [65374, 65374], [65506, 65506], [65513, 65516]], "Pf": [[187, 187], [8217, 8217], [8221, 8221], [8250, 8250], [11779, 11779], [11781, 11781], [11786, 11786], [11789, 11789], [11805, 11805], [11809, 11809]], "Cc": [[0, 31], [127, 159]], "Pi": [[171, 171], [8216, 8216], [8219, 8220], [8223, 8223], [8249, 8249], [11778, 11778], [11780, 11780], [11785, 11785], [11788, 11788], [11804, 11804], [11808, 11808]], "Lu": [[65, 90], [192, 214], [216, 222], [256, 256], [258, 258], [260, 260], [262, 262], [264, 264], [266, 266], [268, 268], [270, 270], [272, 272], [274, 274], [276, 276], [278, 278], [280, 280], [282, 282], [284, 284], [286, 286], [288, 288], [290, 290], [292, 292], [294, 294], [296, 296], [298, 298], [300, 300], [302, 302], [304, 304], [306, 306], [308, 308], [310, 310], [313, 313], [315, 315], [317, 317], [319, 319], [321, 321], [323, 323], [325, 325], [327, 327], [330, 330], [332, 332], [334, 334], [336, 336], [338, 338], [340, 340], [342, 342], [344, 344], [346, 346], [348, 348], [350, 350], [352, 352], [354, 354], [356, 356], [358, 358], [360, 360], [362, 362], [364, 364], [366, 366], [368, 368], [370, 370], [372, 372], [374, 374], [376, 377], [379, 379], [381, 381], [385, 386], [388, 388], [390, 391], [393, 395], [398, 401], [403, 404], [406, 408], [412, 413], [415, 416], [418, 418], [420, 420], [422, 423], [425, 425], [428, 428], [430, 431], [433, 435], [437, 437], [439, 440], [444, 444], [452, 452], [455, 455], [458, 458], [461, 461], [463, 463], [465, 465], [467, 467], [469, 469], [471, 471], [473, 473], [475, 475], [478, 478], [480, 480], [482, 482], [484, 484], [486, 486], [488, 488], [490, 490], [492, 492], [494, 494], [497, 497], [500, 500], [502, 504], [506, 506], [508, 508], [510, 510], [512, 512], [514, 514], [516, 516], [518, 518], [520, 520], [522, 522], [524, 524], [526, 526], [528, 528], [530, 530], [532, 532], [534, 534], [536, 536], [538, 538], [540, 540], [542, 542], [544, 544], [546, 546], [548, 548], [550, 550], [552, 552], [554, 554], [556, 556], [558, 558], [560, 560], [562, 562], [570, 571], [573, 574], [577, 577], [579, 582], [584, 584], [586, 586], [588, 588], [590, 590], [880, 880], [882, 882], [886, 886], [895, 895], [902, 902], [904, 906], [908, 908], [910, 911], [913, 929], [931, 939], [975, 975], [978, 980], [984, 984], [986, 986], [988, 988], [990, 990], [992, 992], [994, 994], [996, 996], [998, 998], [1000, 1000], [1002, 1002], [1004, 1004], [1006, 1006], [1012, 1012], [1015, 1015], [1017, 1018], [1021, 1071], [1120, 1120], [1122, 1122], [1124, 1124], [1126, 1126], [1128, 1128], [1130, 1130], [1132, 1132], [1134, 1134], [1136, 1136], [1138, 1138], [1140, 1140], [1142, 1142], [1144, 1144], [1146, 1146], [1148, 1148], [1150, 1150], [1152, 1152], [1162, 1162], [1164, 1164], [1166, 1166], [1168, 1168], [1170, 1170], [1172, 1172], [1174, 1174], [1176, 1176], [1178, 1178], [1180, 1180], [1182, 1182], [1184, 1184], [1186, 1186], [1188, 1188], [1190, 1190], [1192, 1192], [1194, 1194], [1196, 1196], [1198, 1198], [1200, 1200], [1202, 1202], [1204, 1204], [1206, 1206], [1208, 1208], [1210, 1210], [1212, 1212], [1214, 1214], [1216, 1217], [1219, 1219], [1221, 1221], [1223, 1223], [1225, 1225], [1227, 1227], [1229, 1229], [1232, 1232], [1234, 1234], [1236, 1236], [1238, 1238], [1240, 1240], [1242, 1242], [1244, 1244], [1246, 1246], [1248, 1248], [1250, 1250], [1252, 1252], [1254, 1254], [1256, 1256], [1258, 1258], [1260, 1260], [1262, 1262], [1264, 1264], [1266, 1266], [1268, 1268], [1270, 1270], [1272, 1272], [1274, 1274], [1276, 1276], [1278, 1278], [1280, 1280], [1282, 1282], [1284, 1284], [1286, 1286], [1288, 1288], [1290, 1290], [1292, 1292], [1294, 1294], [1296, 1296], [1298, 1298], [1300, 1300], [1302, 1302], [1304, 1304], [1306, 1306], [1308, 1308], [1310, 1310], [1312, 1312], [1314, 1314], [1316, 1316], [1318, 1318], [1320, 1320], [1322, 1322], [1324, 1324], [1326, 1326], [1329, 1366], [4256, 4293], [4295, 4295], [4301, 4301], [5024, 5109], [7680, 7680], [7682, 7682], [7684, 7684], [7686, 7686], [7688, 7688], [7690, 7690], [7692, 7692], [7694, 7694], [7696, 7696], [7698, 7698], [7700, 7700], [7702, 7702], [7704, 7704], [7706, 7706], [7708, 7708], [7710, 7710], [7712, 7712], [7714, 7714], [7716, 7716], [7718, 7718], [7720, 7720], [7722, 7722], [7724, 7724], [7726, 7726], [7728, 7728], [7730, 7730], [7732, 7732], [7734, 7734], [7736, 7736], [7738, 7738], [7740, 7740], [7742, 7742], [7744, 7744], [7746, 7746], [7748, 7748], [7750, 7750], [7752, 7752], [7754, 7754], [7756, 7756], [7758, 7758], [7760, 7760], [7762, 7762], [7764, 7764], [7766, 7766], [7768, 7768], [7770, 7770], [7772, 7772], [7774, 7774], [7776, 7776], [7778, 7778], [7780, 7780], [7782, 7782], [7784, 7784], [7786, 7786], [7788, 7788], [7790, 7790], [7792, 7792], [7794, 7794], [7796, 7796], [7798, 7798], [7800, 7800], [7802, 7802], [7804, 7804], [7806, 7806], [7808, 7808], [7810, 7810], [7812, 7812], [7814, 7814], [7816, 7816], [7818, 7818], [7820, 7820], [7822, 7822], [7824, 7824], [7826, 7826], [7828, 7828], [7838, 7838], [7840, 7840], [7842, 7842], [7844, 7844], [7846, 7846], [7848, 7848], [7850, 7850], [7852, 7852], [7854, 7854], [7856, 7856], [7858, 7858], [7860, 7860], [7862, 7862], [7864, 7864], [7866, 7866], [7868, 7868], [7870, 7870], [7872, 7872], [7874, 7874], [7876, 7876], [7878, 7878], [7880, 7880], [7882, 7882], [7884, 7884], [7886, 7886], [7888, 7888], [7890, 7890], [7892, 7892], [7894, 7894], [7896, 7896], [7898, 7898], [7900, 7900], [7902, 7902], [7904, 7904], [7906, 7906], [7908, 7908], [7910, 7910], [7912, 7912], [7914, 7914], [7916, 7916], [7918, 7918], [7920, 7920], [7922, 7922], [7924, 7924], [7926, 7926], [7928, 7928], [7930, 7930], [7932, 7932], [7934, 7934], [7944, 7951], [7960, 7965], [7976, 7983], [7992, 7999], [8008, 8013], [8025, 8025], [8027, 8027], [8029, 8029], [8031, 8031], [8040, 8047], [8120, 8123], [8136, 8139], [8152, 8155], [8168, 8172], [8184, 8187], [8450, 8450], [8455, 8455], [8459, 8461], [8464, 8466], [8469, 8469], [8473, 8477], [8484, 8484], [8486, 8486], [8488, 8488], [8490, 8493], [8496, 8499], [8510, 8511], [8517, 8517], [8579, 8579], [11264, 11310], [11360, 11360], [11362, 11364], [11367, 11367], [11369, 11369], [11371, 11371], [11373, 11376], [11378, 11378], [11381, 11381], [11390, 11392], [11394, 11394], [11396, 11396], [11398, 11398], [11400, 11400], [11402, 11402], [11404, 11404], [11406, 11406], [11408, 11408], [11410, 11410], [11412, 11412], [11414, 11414], [11416, 11416], [11418, 11418], [11420, 11420], [11422, 11422], [11424, 11424], [11426, 11426], [11428, 11428], [11430, 11430], [11432, 11432], [11434, 11434], [11436, 11436], [11438, 11438], [11440, 11440], [11442, 11442], [11444, 11444], [11446, 11446], [11448, 11448], [11450, 11450], [11452, 11452], [11454, 11454], [11456, 11456], [11458, 11458], [11460, 11460], [11462, 11462], [11464, 11464], [11466, 11466], [11468, 11468], [11470, 11470], [11472, 11472], [11474, 11474], [11476, 11476], [11478, 11478], [11480, 11480], [11482, 11482], [11484, 11484], [11486, 11486], [11488, 11488], [11490, 11490], [11499, 11499], [11501, 11501], [11506, 11506], [42560, 42560], [42562, 42562], [42564, 42564], [42566, 42566], [42568, 42568], [42570, 42570], [42572, 42572], [42574, 42574], [42576, 42576], [42578, 42578], [42580, 42580], [42582, 42582], [42584, 42584], [42586, 42586], [42588, 42588], [42590, 42590], [42592, 42592], [42594, 42594], [42596, 42596], [42598, 42598], [42600, 42600], [42602, 42602], [42604, 42604], [42624, 42624], [42626, 42626], [42628, 42628], [42630, 42630], [42632, 42632], [42634, 42634], [42636, 42636], [42638, 42638], [42640, 42640], [42642, 42642], [42644, 42644], [42646, 42646], [42648, 42648], [42650, 42650], [42786, 42786], [42788, 42788], [42790, 42790], [42792, 42792], [42794, 42794], [42796, 42796], [42798, 42798], [42802, 42802], [42804, 42804], [42806, 42806], [42808, 42808], [42810, 42810], [42812, 42812], [42814, 42814], [42816, 42816], [42818, 42818], [42820, 42820], [42822, 42822], [42824, 42824], [42826, 42826], [42828, 42828], [42830, 42830], [42832, 42832], [42834, 42834], [42836, 42836], [42838, 42838], [42840, 42840], [42842, 42842], [42844, 42844], [42846, 42846], [42848, 42848], [42850, 42850], [42852, 42852], [42854, 42854], [42856, 42856], [42858, 42858], [42860, 42860], [42862, 42862], [42873, 42873], [42875, 42875], [42877, 42878], [42880, 42880], [42882, 42882], [42884, 42884], [42886, 42886], [42891, 42891], [42893, 42893], [42896, 42896], [42898, 42898], [42902, 42902], [42904, 42904], [42906, 42906], [42908, 42908], [42910, 42910], [42912, 42912], [42914, 42914], [42916, 42916], [42918, 42918], [42920, 42920], [42922, 42926], [42928, 42932], [42934, 42934], [65313, 65338]], "Pd": [[45, 45], [1418, 1418], [1470, 1470], [5120, 5120], [6150, 6150], [8208, 8213], [11799, 11799], [11802, 11802], [11834, 11835], [11840, 11840], [12316, 12316], [12336, 12336], [12448, 12448], [65073, 65074], [65112, 65112], [65123, 65123], [65293, 65293]], "Cf": [[173, 173], [1536, 1541], [1564, 1564], [1757, 1757], [1807, 1807], [2274, 2274], [6158, 6158], [8203, 8207], [8234, 8238], [8288, 8292], [8294, 8303], [65279, 65279], [65529, 65531]], "Nd": [[48, 57], [1632, 1641], [1776, 1785], [1984, 1993], [2406, 2415], [2534, 2543], [2662, 2671], [2790, 2799], [2918, 2927], [3046, 3055], [3174, 3183], [3302, 3311], [3430, 3439], [3558, 3567], [3664, 3673], [3792, 3801], [3872, 3881], [4160, 4169], [4240, 4249], [6112, 6121], [6160, 6169], [6470, 6479], [6608, 6617], [6784, 6793], [6800, 6809], [6992, 7001], [7088, 7097], [7232, 7241], [7248, 7257], [42528, 42537], [43216, 43225], [43264, 43273], [43472, 43481], [43504, 43513], [43600, 43609], [44016, 44025], [65296, 65305]], "Ll": [[97, 122], [181, 181], [223, 246], [248, 255], [257, 257], [259, 259], [261, 261], [263, 263], [265, 265], [267, 267], [269, 269], [271, 271], [273, 273], [275, 275], [277, 277], [279, 279], [281, 281], [283, 283], [285, 285], [287, 287], [289, 289], [291, 291], [293, 293], [295, 295], [297, 297], [299, 299], [301, 301], [303, 303], [305, 305], [307, 307], [309, 309], [311, 312], [314, 314], [316, 316], [318, 318], [320, 320], [322, 322], [324, 324], [326, 326], [328, 329], [331, 331], [333, 333], [335, 335], [337, 337], [339, 339], [341, 341], [343, 343], [345, 345], [347, 347], [349, 349], [351, 351], [353, 353], [355, 355], [357, 357], [359, 359], [361, 361], [363, 363], [365, 365], [367, 367], [369, 369], [371, 371], [373, 373], [375, 375], [378, 378], [380, 380], [382, 384], [387, 387], [389, 389], [392, 392], [396, 397], [402, 402], [405, 405], [409, 411], [414, 414], [417, 417], [419, 419], [421, 421], [424, 424], [426, 427], [429, 429], [432, 432], [436, 436], [438, 438], [441, 442], [445, 447], [454, 454], [457, 457], [460, 460], [462, 462], [464, 464], [466, 466], [468, 468], [470, 470], [472, 472], [474, 474], [476, 477], [479, 479], [481, 481], [483, 483], [485, 485], [487, 487], [489, 489], [491, 491], [493, 493], [495, 496], [499, 499], [501, 501], [505, 505], [507, 507], [509, 509], [511, 511], [513, 513], [515, 515], [517, 517], [519, 519], [521, 521], [523, 523], [525, 525], [527, 527], [529, 529], [531, 531], [533, 533], [535, 535], [537, 537], [539, 539], [541, 541], [543, 543], [545, 545], [547, 547], [549, 549], [551, 551], [553, 553], [555, 555], [557, 557], [559, 559], [561, 561], [563, 569], [572, 572], [575, 576], [578, 578], [583, 583], [585, 585], [587, 587], [589, 589], [591, 659], [661, 687], [881, 881], [883, 883], [887, 887], [891, 893], [912, 912], [940, 974], [976, 977], [981, 983], [985, 985], [987, 987], [989, 989], [991, 991], [993, 993], [995, 995], [997, 997], [999, 999], [1001, 1001], [1003, 1003], [1005, 1005], [1007, 1011], [1013, 1013], [1016, 1016], [1019, 1020], [1072, 1119], [1121, 1121], [1123, 1123], [1125, 1125], [1127, 1127], [1129, 1129], [1131, 1131], [1133, 1133], [1135, 1135], [1137, 1137], [1139, 1139], [1141, 1141], [1143, 1143], [1145, 1145], [1147, 1147], [1149, 1149], [1151, 1151], [1153, 1153], [1163, 1163], [1165, 1165], [1167, 1167], [1169, 1169], [1171, 1171], [1173, 1173], [1175, 1175], [1177, 1177], [1179, 1179], [1181, 1181], [1183, 1183], [1185, 1185], [1187, 1187], [1189, 1189], [1191, 1191], [1193, 1193], [1195, 1195], [1197, 1197], [1199, 1199], [1201, 1201], [1203, 1203], [1205, 1205], [1207, 1207], [1209, 1209], [1211, 1211], [1213, 1213], [1215, 1215], [1218, 1218], [1220, 1220], [1222, 1222], [1224, 1224], [1226, 1226], [1228, 1228], [1230, 1231], [1233, 1233], [1235, 1235], [1237, 1237], [1239, 1239], [1241, 1241], [1243, 1243], [1245, 1245], [1247, 1247], [1249, 1249], [1251, 1251], [1253, 1253], [1255, 1255], [1257, 1257], [1259, 1259], [1261, 1261], [1263, 1263], [1265, 1265], [1267, 1267], [1269, 1269], [1271, 1271], [1273, 1273], [1275, 1275], [1277, 1277], [1279, 1279], [1281, 1281], [1283, 1283], [1285, 1285], [1287, 1287], [1289, 1289], [1291, 1291], [1293, 1293], [1295, 1295], [1297, 1297], [1299, 1299], [1301, 1301], [1303, 1303], [1305, 1305], [1307, 1307], [1309, 1309], [1311, 1311], [1313, 1313], [1315, 1315], [1317, 1317], [1319, 1319], [1321, 1321], [1323, 1323], [1325, 1325], [1327, 1327], [1377, 1415], [5112, 5117], [7296, 7304], [7424, 7467], [7531, 7543], [7545, 7578], [7681, 7681], [7683, 7683], [7685, 7685], [7687, 7687], [7689, 7689], [7691, 7691], [7693, 7693], [7695, 7695], [7697, 7697], [7699, 7699], [7701, 7701], [7703, 7703], [7705, 7705], [7707, 7707], [7709, 7709], [7711, 7711], [7713, 7713], [7715, 7715], [7717, 7717], [7719, 7719], [7721, 7721], [7723, 7723], [7725, 7725], [7727, 7727], [7729, 7729], [7731, 7731], [7733, 7733], [7735, 7735], [7737, 7737], [7739, 7739], [7741, 7741], [7743, 7743], [7745, 7745], [7747, 7747], [7749, 7749], [7751, 7751], [7753, 7753], [7755, 7755], [7757, 7757], [7759, 7759], [7761, 7761], [7763, 7763], [7765, 7765], [7767, 7767], [7769, 7769], [7771, 7771], [7773, 7773], [7775, 7775], [7777, 7777], [7779, 7779], [7781, 7781], [7783, 7783], [7785, 7785], [7787, 7787], [7789, 7789], [7791, 7791], [7793, 7793], [7795, 7795], [7797, 7797], [7799, 7799], [7801, 7801], [7803, 7803], [7805, 7805], [7807, 7807], [7809, 7809], [7811, 7811], [7813, 7813], [7815, 7815], [7817, 7817], [7819, 7819], [7821, 7821], [7823, 7823], [7825, 7825], [7827, 7827], [7829, 7837], [7839, 7839], [7841, 7841], [7843, 7843], [7845, 7845], [7847, 7847], [7849, 7849], [7851, 7851], [7853, 7853], [7855, 7855], [7857, 7857], [7859, 7859], [7861, 7861], [7863, 7863], [7865, 7865], [7867, 7867], [7869, 7869], [7871, 7871], [7873, 7873], [7875, 7875], [7877, 7877], [7879, 7879], [7881, 7881], [7883, 7883], [7885, 7885], [7887, 7887], [7889, 7889], [7891, 7891], [7893, 7893], [7895, 7895], [7897, 7897], [7899, 7899], [7901, 7901], [7903, 7903], [7905, 7905], [7907, 7907], [7909, 7909], [7911, 7911], [7913, 7913], [7915, 7915], [7917, 7917], [7919, 7919], [7921, 7921], [7923, 7923], [7925, 7925], [7927, 7927], [7929, 7929], [7931, 7931], [7933, 7933], [7935, 7943], [7952, 7957], [7968, 7975], [7984, 7991], [8000, 8005], [8016, 8023], [8032, 8039], [8048, 8061], [8064, 8071], [8080, 8087], [8096, 8103], [8112, 8116], [8118, 8119], [8126, 8126], [8130, 8132], [8134, 8135], [8144, 8147], [8150, 8151], [8160, 8167], [8178, 8180], [8182, 8183], [8458, 8458], [8462, 8463], [8467, 8467], [8495, 8495], [8500, 8500], [8505, 8505], [8508, 8509], [8518, 8521], [8526, 8526], [8580, 8580], [11312, 11358], [11361, 11361], [11365, 11366], [11368, 11368], [11370, 11370], [11372, 11372], [11377, 11377], [11379, 11380], [11382, 11387], [11393, 11393], [11395, 11395], [11397, 11397], [11399, 11399], [11401, 11401], [11403, 11403], [11405, 11405], [11407, 11407], [11409, 11409], [11411, 11411], [11413, 11413], [11415, 11415], [11417, 11417], [11419, 11419], [11421, 11421], [11423, 11423], [11425, 11425], [11427, 11427], [11429, 11429], [11431, 11431], [11433, 11433], [11435, 11435], [11437, 11437], [11439, 11439], [11441, 11441], [11443, 11443], [11445, 11445], [11447, 11447], [11449, 11449], [11451, 11451], [11453, 11453], [11455, 11455], [11457, 11457], [11459, 11459], [11461, 11461], [11463, 11463], [11465, 11465], [11467, 11467], [11469, 11469], [11471, 11471], [11473, 11473], [11475, 11475], [11477, 11477], [11479, 11479], [11481, 11481], [11483, 11483], [11485, 11485], [11487, 11487], [11489, 11489], [11491, 11492], [11500, 11500], [11502, 11502], [11507, 11507], [11520, 11557], [11559, 11559], [11565, 11565], [42561, 42561], [42563, 42563], [42565, 42565], [42567, 42567], [42569, 42569], [42571, 42571], [42573, 42573], [42575, 42575], [42577, 42577], [42579, 42579], [42581, 42581], [42583, 42583], [42585, 42585], [42587, 42587], [42589, 42589], [42591, 42591], [42593, 42593], [42595, 42595], [42597, 42597], [42599, 42599], [42601, 42601], [42603, 42603], [42605, 42605], [42625, 42625], [42627, 42627], [42629, 42629], [42631, 42631], [42633, 42633], [42635, 42635], [42637, 42637], [42639, 42639], [42641, 42641], [42643, 42643], [42645, 42645], [42647, 42647], [42649, 42649], [42651, 42651], [42787, 42787], [42789, 42789], [42791, 42791], [42793, 42793], [42795, 42795], [42797, 42797], [42799, 42801], [42803, 42803], [42805, 42805], [42807, 42807], [42809, 42809], [42811, 42811], [42813, 42813], [42815, 42815], [42817, 42817], [42819, 42819], [42821, 42821], [42823, 42823], [42825, 42825], [42827, 42827], [42829, 42829], [42831, 42831], [42833, 42833], [42835, 42835], [42837, 42837], [42839, 42839], [42841, 42841], [42843, 42843], [42845, 42845], [42847, 42847], [42849, 42849], [42851, 42851], [42853, 42853], [42855, 42855], [42857, 42857], [42859, 42859], [42861, 42861], [42863, 42863], [42865, 42872], [42874, 42874], [42876, 42876], [42879, 42879], [42881, 42881], [42883, 42883], [42885, 42885], [42887, 42887], [42892, 42892], [42894, 42894], [42897, 42897], [42899, 42901], [42903, 42903], [42905, 42905], [42907, 42907], [42909, 42909], [42911, 42911], [42913, 42913], [42915, 42915], [42917, 42917], [42919, 42919], [42921, 42921], [42933, 42933], [42935, 42935], [43002, 43002], [43824, 43866], [43872, 43877], [43888, 43967], [64256, 64262], [64275, 64279], [65345, 65370]], "No": [[178, 179], [185, 185], [188, 190], [2548, 2553], [2930, 2935], [3056, 3058], [3192, 3198], [3416, 3422], [3440, 3448], [3882, 3891], [4969, 4988], [6128, 6137], [6618, 6618], [8304, 8304], [8308, 8313], [8320, 8329], [8528, 8543], [8585, 8585], [9312, 9371], [9450, 9471], [10102, 10131], [11517, 11517], [12690, 12693], [12832, 12841], [12872, 12879], [12881, 12895], [12928, 12937], [12977, 12991], [43056, 43061]], "Zs": [[32, 32], [160, 160], [5760, 5760], [8192, 8202], [8239, 8239], [8287, 8287], [12288, 12288]] }); };
- });
- unwrapExports(data_generated);
- var utils = createCommonjsModule(function (module, exports) {
- "use strict";
- exports.__esModule = true;
- function normalize_ranges(ranges) {
- return ranges
- .sort(function (_a, _b) {
- var start1 = _a[0];
- var start2 = _b[0];
- return start1 - start2;
- })
- .reduce(function (current, tuple, index) {
- if (index === 0) {
- return [tuple];
- }
- var _a = current[current.length - 1], last_start = _a[0], last_end = _a[1];
- var start = tuple[0], end = tuple[1];
- return last_end + 1 === start
- ? current.slice(0, -1).concat([[last_start, end]]) : current.concat([tuple]);
- }, []);
- }
- exports.normalize_ranges = normalize_ranges;
- function build_regex(ranges, flag) {
- var pattern = ranges
- .map(function (_a) {
- var start = _a[0], end = _a[1];
- return start === end
- ? "\\u" + get_hex(start)
- : "\\u" + get_hex(start) + "-\\u" + get_hex(end);
- })
- .join('');
- return new RegExp("[" + pattern + "]", flag);
- }
- exports.build_regex = build_regex;
- function get_hex(char_code) {
- var hex = char_code.toString(16);
- while (hex.length < 4) {
- hex = "0" + hex;
- }
- return hex;
- }
- });
- unwrapExports(utils);
- var lib$2 = function (categories, flag) {
- var data = data_generated.get_data();
- var ranges = categories.reduce(function (current, category) { return current.concat(data[category]); }, []);
- return utils.build_regex(utils.normalize_ranges(ranges), flag);
- };
- const emojiRegex = emojiRegex$1();
- const cjkPattern = lib().source;
- // http://spec.commonmark.org/0.25/#ascii-punctuation-character
- const asciiPunctuationCharRange = escapeStringRegexp(
- "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
- );
- // http://spec.commonmark.org/0.25/#punctuation-character
- const punctuationCharRange = `${asciiPunctuationCharRange}${lib$2([
- "Pc",
- "Pd",
- "Pe",
- "Pf",
- "Pi",
- "Po",
- "Ps"
- ]).source.slice(1, -1)}`; // remove bracket expression `[` and `]`
- const punctuationRegex = new RegExp(`[${punctuationCharRange}]`);
- function isExportDeclaration(node) {
- if (node) {
- switch (node.type) {
- case "ExportDefaultDeclaration":
- case "ExportDefaultSpecifier":
- case "DeclareExportDeclaration":
- case "ExportNamedDeclaration":
- case "ExportAllDeclaration":
- return true;
- }
- }
- return false;
- }
- function getParentExportDeclaration(path$$1) {
- const parentNode = path$$1.getParentNode();
- if (path$$1.getName() === "declaration" && isExportDeclaration(parentNode)) {
- return parentNode;
- }
- return null;
- }
- function getPenultimate(arr) {
- if (arr.length > 1) {
- return arr[arr.length - 2];
- }
- return null;
- }
- function getLast(arr) {
- if (arr.length > 0) {
- return arr[arr.length - 1];
- }
- return null;
- }
- function skip(chars) {
- return (text, index, opts) => {
- const backwards = opts && opts.backwards;
- // Allow `skip` functions to be threaded together without having
- // to check for failures (did someone say monads?).
- if (index === false) {
- return false;
- }
- const length = text.length;
- let cursor = index;
- while (cursor >= 0 && cursor < length) {
- const c = text.charAt(cursor);
- if (chars instanceof RegExp) {
- if (!chars.test(c)) {
- return cursor;
- }
- } else if (chars.indexOf(c) === -1) {
- return cursor;
- }
- backwards ? cursor-- : cursor++;
- }
- if (cursor === -1 || cursor === length) {
- // If we reached the beginning or end of the file, return the
- // out-of-bounds cursor. It's up to the caller to handle this
- // correctly. We don't want to indicate `false` though if it
- // actually skipped valid characters.
- return cursor;
- }
- return false;
- };
- }
- const skipWhitespace = skip(/\s/);
- const skipSpaces = skip(" \t");
- const skipToLineEnd = skip(",; \t");
- const skipEverythingButNewLine = skip(/[^\r\n]/);
- function skipInlineComment(text, index) {
- if (index === false) {
- return false;
- }
- if (text.charAt(index) === "/" && text.charAt(index + 1) === "*") {
- for (let i = index + 2; i < text.length; ++i) {
- if (text.charAt(i) === "*" && text.charAt(i + 1) === "/") {
- return i + 2;
- }
- }
- }
- return index;
- }
- function skipTrailingComment(text, index) {
- if (index === false) {
- return false;
- }
- if (text.charAt(index) === "/" && text.charAt(index + 1) === "/") {
- return skipEverythingButNewLine(text, index);
- }
- return index;
- }
- // This one doesn't use the above helper function because it wants to
- // test \r\n in order and `skip` doesn't support ordering and we only
- // want to skip one newline. It's simple to implement.
- function skipNewline(text, index, opts) {
- const backwards = opts && opts.backwards;
- if (index === false) {
- return false;
- }
- const atIndex = text.charAt(index);
- if (backwards) {
- if (text.charAt(index - 1) === "\r" && atIndex === "\n") {
- return index - 2;
- }
- if (
- atIndex === "\n" ||
- atIndex === "\r" ||
- atIndex === "\u2028" ||
- atIndex === "\u2029"
- ) {
- return index - 1;
- }
- } else {
- if (atIndex === "\r" && text.charAt(index + 1) === "\n") {
- return index + 2;
- }
- if (
- atIndex === "\n" ||
- atIndex === "\r" ||
- atIndex === "\u2028" ||
- atIndex === "\u2029"
- ) {
- return index + 1;
- }
- }
- return index;
- }
- function hasNewline(text, index, opts) {
- opts = opts || {};
- const idx = skipSpaces(text, opts.backwards ? index - 1 : index, opts);
- const idx2 = skipNewline(text, idx, opts);
- return idx !== idx2;
- }
- function hasNewlineInRange(text, start, end) {
- for (let i = start; i < end; ++i) {
- if (text.charAt(i) === "\n") {
- return true;
- }
- }
- return false;
- }
- // Note: this function doesn't ignore leading comments unlike isNextLineEmpty
- function isPreviousLineEmpty(text, node, locStart) {
- let idx = locStart(node) - 1;
- idx = skipSpaces(text, idx, { backwards: true });
- idx = skipNewline(text, idx, { backwards: true });
- idx = skipSpaces(text, idx, { backwards: true });
- const idx2 = skipNewline(text, idx, { backwards: true });
- return idx !== idx2;
- }
- function isNextLineEmptyAfterIndex(text, index) {
- let oldIdx = null;
- let idx = index;
- while (idx !== oldIdx) {
- // We need to skip all the potential trailing inline comments
- oldIdx = idx;
- idx = skipToLineEnd(text, idx);
- idx = skipInlineComment(text, idx);
- idx = skipSpaces(text, idx);
- }
- idx = skipTrailingComment(text, idx);
- idx = skipNewline(text, idx);
- return hasNewline(text, idx);
- }
- function isNextLineEmpty(text, node, locEnd) {
- return isNextLineEmptyAfterIndex(text, locEnd(node));
- }
- function getNextNonSpaceNonCommentCharacterIndex(text, node, locEnd) {
- let oldIdx = null;
- let idx = locEnd(node);
- while (idx !== oldIdx) {
- oldIdx = idx;
- idx = skipSpaces(text, idx);
- idx = skipInlineComment(text, idx);
- idx = skipTrailingComment(text, idx);
- idx = skipNewline(text, idx);
- }
- return idx;
- }
- function getNextNonSpaceNonCommentCharacter(text, node, locEnd) {
- return text.charAt(
- getNextNonSpaceNonCommentCharacterIndex(text, node, locEnd)
- );
- }
- function hasSpaces(text, index, opts) {
- opts = opts || {};
- const idx = skipSpaces(text, opts.backwards ? index - 1 : index, opts);
- return idx !== index;
- }
- // Super inefficient, needs to be cached.
- function lineColumnToIndex(lineColumn, text) {
- let index = 0;
- for (let i = 0; i < lineColumn.line - 1; ++i) {
- index = text.indexOf("\n", index) + 1;
- if (index === -1) {
- return -1;
- }
- }
- return index + lineColumn.column;
- }
- function setLocStart(node, index) {
- if (node.range) {
- node.range[0] = index;
- } else {
- node.start = index;
- }
- }
- function setLocEnd(node, index) {
- if (node.range) {
- node.range[1] = index;
- } else {
- node.end = index;
- }
- }
- const PRECEDENCE = {};
- [
- ["|>"],
- ["||", "??"],
- ["&&"],
- ["|"],
- ["^"],
- ["&"],
- ["==", "===", "!=", "!=="],
- ["<", ">", "<=", ">=", "in", "instanceof"],
- [">>", "<<", ">>>"],
- ["+", "-"],
- ["*", "/", "%"],
- ["**"]
- ].forEach((tier, i) => {
- tier.forEach(op => {
- PRECEDENCE[op] = i;
- });
- });
- function getPrecedence(op) {
- return PRECEDENCE[op];
- }
- const equalityOperators = {
- "==": true,
- "!=": true,
- "===": true,
- "!==": true
- };
- const multiplicativeOperators = {
- "*": true,
- "/": true,
- "%": true
- };
- const bitshiftOperators = {
- ">>": true,
- ">>>": true,
- "<<": true
- };
- function shouldFlatten(parentOp, nodeOp) {
- if (getPrecedence(nodeOp) !== getPrecedence(parentOp)) {
- return false;
- }
- // ** is right-associative
- // x ** y ** z --> x ** (y ** z)
- if (parentOp === "**") {
- return false;
- }
- // x == y == z --> (x == y) == z
- if (equalityOperators[parentOp] && equalityOperators[nodeOp]) {
- return false;
- }
- // x * y % z --> (x * y) % z
- if (
- (nodeOp === "%" && multiplicativeOperators[parentOp]) ||
- (parentOp === "%" && multiplicativeOperators[nodeOp])
- ) {
- return false;
- }
- // x << y << z --> (x << y) << z
- if (bitshiftOperators[parentOp] && bitshiftOperators[nodeOp]) {
- return false;
- }
- return true;
- }
- function isBitwiseOperator(operator) {
- return (
- !!bitshiftOperators[operator] ||
- operator === "|" ||
- operator === "^" ||
- operator === "&"
- );
- }
- // Tests if an expression starts with `{`, or (if forbidFunctionAndClass holds) `function` or `class`.
- // Will be overzealous if there's already necessary grouping parentheses.
- function startsWithNoLookaheadToken(node, forbidFunctionAndClass) {
- node = getLeftMost(node);
- switch (node.type) {
- // Hack. Remove after https://github.com/eslint/typescript-eslint-parser/issues/331
- case "ObjectPattern":
- return !forbidFunctionAndClass;
- case "FunctionExpression":
- case "ClassExpression":
- return forbidFunctionAndClass;
- case "ObjectExpression":
- return true;
- case "MemberExpression":
- return startsWithNoLookaheadToken(node.object, forbidFunctionAndClass);
- case "TaggedTemplateExpression":
- if (node.tag.type === "FunctionExpression") {
- // IIFEs are always already parenthesized
- return false;
- }
- return startsWithNoLookaheadToken(node.tag, forbidFunctionAndClass);
- case "CallExpression":
- if (node.callee.type === "FunctionExpression") {
- // IIFEs are always already parenthesized
- return false;
- }
- return startsWithNoLookaheadToken(node.callee, forbidFunctionAndClass);
- case "ConditionalExpression":
- return startsWithNoLookaheadToken(node.test, forbidFunctionAndClass);
- case "UpdateExpression":
- return (
- !node.prefix &&
- startsWithNoLookaheadToken(node.argument, forbidFunctionAndClass)
- );
- case "BindExpression":
- return (
- node.object &&
- startsWithNoLookaheadToken(node.object, forbidFunctionAndClass)
- );
- case "SequenceExpression":
- return startsWithNoLookaheadToken(
- node.expressions[0],
- forbidFunctionAndClass
- );
- case "TSAsExpression":
- return startsWithNoLookaheadToken(
- node.expression,
- forbidFunctionAndClass
- );
- default:
- return false;
- }
- }
- function getLeftMost(node) {
- if (node.left) {
- return getLeftMost(node.left);
- }
- return node;
- }
- function hasBlockComments(node) {
- return node.comments && node.comments.some(isBlockComment);
- }
- function isBlockComment(comment) {
- return comment.type === "Block" || comment.type === "CommentBlock";
- }
- function hasClosureCompilerTypeCastComment(text, node, locEnd) {
- // https://github.com/google/closure-compiler/wiki/Annotating-Types#type-casts
- // Syntax example: var x = /** @type {string} */ (fruit);
- return (
- node.comments &&
- node.comments.some(
- comment =>
- comment.leading &&
- isBlockComment(comment) &&
- comment.value.match(/^\*\s*@type\s*{[^}]+}\s*$/) &&
- getNextNonSpaceNonCommentCharacter(text, comment, locEnd) === "("
- )
- );
- }
- function getAlignmentSize(value, tabWidth, startIndex) {
- startIndex = startIndex || 0;
- let size = 0;
- for (let i = startIndex; i < value.length; ++i) {
- if (value[i] === "\t") {
- // Tabs behave in a way that they are aligned to the nearest
- // multiple of tabWidth:
- // 0 -> 4, 1 -> 4, 2 -> 4, 3 -> 4
- // 4 -> 8, 5 -> 8, 6 -> 8, 7 -> 8 ...
- size = size + tabWidth - size % tabWidth;
- } else {
- size++;
- }
- }
- return size;
- }
- function getIndentSize(value, tabWidth) {
- const lastNewlineIndex = value.lastIndexOf("\n");
- if (lastNewlineIndex === -1) {
- return 0;
- }
- return getAlignmentSize(
- // All the leading whitespaces
- value.slice(lastNewlineIndex + 1).match(/^[ \t]*/)[0],
- tabWidth
- );
- }
- function printString(raw, options, isDirectiveLiteral) {
- // `rawContent` is the string exactly like it appeared in the input source
- // code, without its enclosing quotes.
- const rawContent = raw.slice(1, -1);
- const double = { quote: '"', regex: /"/g };
- const single = { quote: "'", regex: /'/g };
- const preferred = options.singleQuote ? single : double;
- const alternate = preferred === single ? double : single;
- let shouldUseAlternateQuote = false;
- let canChangeDirectiveQuotes = false;
- // If `rawContent` contains at least one of the quote preferred for enclosing
- // the string, we might want to enclose with the alternate quote instead, to
- // minimize the number of escaped quotes.
- // Also check for the alternate quote, to determine if we're allowed to swap
- // the quotes on a DirectiveLiteral.
- if (
- rawContent.includes(preferred.quote) ||
- rawContent.includes(alternate.quote)
- ) {
- const numPreferredQuotes = (rawContent.match(preferred.regex) || []).length;
- const numAlternateQuotes = (rawContent.match(alternate.regex) || []).length;
- shouldUseAlternateQuote = numPreferredQuotes > numAlternateQuotes;
- } else {
- canChangeDirectiveQuotes = true;
- }
- const enclosingQuote =
- options.parser === "json"
- ? double.quote
- : shouldUseAlternateQuote
- ? alternate.quote
- : preferred.quote;
- // Directives are exact code unit sequences, which means that you can't
- // change the escape sequences they use.
- // See https://github.com/prettier/prettier/issues/1555
- // and https://tc39.github.io/ecma262/#directive-prologue
- if (isDirectiveLiteral) {
- if (canChangeDirectiveQuotes) {
- return enclosingQuote + rawContent + enclosingQuote;
- }
- return raw;
- }
- // It might sound unnecessary to use `makeString` even if the string already
- // is enclosed with `enclosingQuote`, but it isn't. The string could contain
- // unnecessary escapes (such as in `"\'"`). Always using `makeString` makes
- // sure that we consistently output the minimum amount of escaped quotes.
- return makeString(
- rawContent,
- enclosingQuote,
- !(
- options.parser === "css" ||
- options.parser === "less" ||
- options.parser === "scss"
- )
- );
- }
- function makeString(rawContent, enclosingQuote, unescapeUnnecessaryEscapes) {
- const otherQuote = enclosingQuote === '"' ? "'" : '"';
- // Matches _any_ escape and unescaped quotes (both single and double).
- const regex = /\\([\s\S])|(['"])/g;
- // Escape and unescape single and double quotes as needed to be able to
- // enclose `rawContent` with `enclosingQuote`.
- const newContent = rawContent.replace(regex, (match, escaped, quote) => {
- // If we matched an escape, and the escaped character is a quote of the
- // other type than we intend to enclose the string with, there's no need for
- // it to be escaped, so return it _without_ the backslash.
- if (escaped === otherQuote) {
- return escaped;
- }
- // If we matched an unescaped quote and it is of the _same_ type as we
- // intend to enclose the string with, it must be escaped, so return it with
- // a backslash.
- if (quote === enclosingQuote) {
- return "\\" + quote;
- }
- if (quote) {
- return quote;
- }
- // Unescape any unnecessarily escaped character.
- // Adapted from https://github.com/eslint/eslint/blob/de0b4ad7bd820ade41b1f606008bea68683dc11a/lib/rules/no-useless-escape.js#L27
- return unescapeUnnecessaryEscapes &&
- /^[^\\nrvtbfux\r\n\u2028\u2029"'0-7]$/.test(escaped)
- ? escaped
- : "\\" + escaped;
- });
- return enclosingQuote + newContent + enclosingQuote;
- }
- function printNumber(rawNumber) {
- return (
- rawNumber
- .toLowerCase()
- // Remove unnecessary plus and zeroes from scientific notation.
- .replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(\d)/, "$1$2$3")
- // Remove unnecessary scientific notation (1e0).
- .replace(/^([+-]?[\d.]+)e[+-]?0+$/, "$1")
- // Make sure numbers always start with a digit.
- .replace(/^([+-])?\./, "$10.")
- // Remove extraneous trailing decimal zeroes.
- .replace(/(\.\d+?)0+(?=e|$)/, "$1")
- // Remove trailing dot.
- .replace(/\.(?=e|$)/, "")
- );
- }
- function getMaxContinuousCount(str, target) {
- const results = str.match(
- new RegExp(`(${escapeStringRegexp(target)})+`, "g")
- );
- if (results === null) {
- return 0;
- }
- return results.reduce(
- (maxCount, result) => Math.max(maxCount, result.length / target.length),
- 0
- );
- }
- /**
- * split text into whitespaces and words
- * @param {string} text
- * @return {Array<{ type: "whitespace", value: " " | "\n" | "" } | { type: "word", value: string }>}
- */
- function splitText(text) {
- const KIND_NON_CJK = "non-cjk";
- const KIND_CJK_CHARACTER = "cjk-character";
- const KIND_CJK_PUNCTUATION = "cjk-punctuation";
- const nodes = [];
- text
- .replace(new RegExp(`(${cjkPattern})\n(${cjkPattern})`, "g"), "$1$2")
- .split(/([ \t\n]+)/)
- .forEach((token, index, tokens) => {
- // whitespace
- if (index % 2 === 1) {
- nodes.push({
- type: "whitespace",
- value: /\n/.test(token) ? "\n" : " "
- });
- return;
- }
- // word separated by whitespace
- if ((index === 0 || index === tokens.length - 1) && token === "") {
- return;
- }
- token
- .split(new RegExp(`(${cjkPattern})`))
- .forEach((innerToken, innerIndex, innerTokens) => {
- if (
- (innerIndex === 0 || innerIndex === innerTokens.length - 1) &&
- innerToken === ""
- ) {
- return;
- }
- // non-CJK word
- if (innerIndex % 2 === 0) {
- if (innerToken !== "") {
- appendNode({
- type: "word",
- value: innerToken,
- kind: KIND_NON_CJK,
- hasLeadingPunctuation: punctuationRegex.test(innerToken[0]),
- hasTrailingPunctuation: punctuationRegex.test(
- getLast(innerToken)
- )
- });
- }
- return;
- }
- // CJK character
- appendNode(
- punctuationRegex.test(innerToken)
- ? {
- type: "word",
- value: innerToken,
- kind: KIND_CJK_PUNCTUATION,
- hasLeadingPunctuation: true,
- hasTrailingPunctuation: true
- }
- : {
- type: "word",
- value: innerToken,
- kind: KIND_CJK_CHARACTER,
- hasLeadingPunctuation: false,
- hasTrailingPunctuation: false
- }
- );
- });
- });
- return nodes;
- function appendNode(node) {
- const lastNode = getLast(nodes);
- if (lastNode && lastNode.type === "word") {
- if (
- (lastNode.kind === KIND_NON_CJK &&
- node.kind === KIND_CJK_CHARACTER &&
- !lastNode.hasTrailingPunctuation) ||
- (lastNode.kind === KIND_CJK_CHARACTER &&
- node.kind === KIND_NON_CJK &&
- !node.hasLeadingPunctuation)
- ) {
- nodes.push({ type: "whitespace", value: " " });
- } else if (
- !isBetween(KIND_NON_CJK, KIND_CJK_PUNCTUATION) &&
- // disallow leading/trailing full-width whitespace
- ![lastNode.value, node.value].some(value => /\u3000/.test(value))
- ) {
- nodes.push({ type: "whitespace", value: "" });
- }
- }
- nodes.push(node);
- function isBetween(kind1, kind2) {
- return (
- (lastNode.kind === kind1 && node.kind === kind2) ||
- (lastNode.kind === kind2 && node.kind === kind1)
- );
- }
- }
- }
- function getStringWidth(text) {
- if (!text) {
- return 0;
- }
- // emojis are considered 2-char width for consistency
- // see https://github.com/sindresorhus/string-width/issues/11
- // for the reason why not implemented in `string-width`
- return stringWidth(text.replace(emojiRegex, " "));
- }
- function hasIgnoreComment(path$$1) {
- const node = path$$1.getValue();
- return hasNodeIgnoreComment(node);
- }
- function hasNodeIgnoreComment(node) {
- return (
- node &&
- node.comments &&
- node.comments.length > 0 &&
- node.comments.some(comment => comment.value.trim() === "prettier-ignore")
- );
- }
- function arrayify(object, keyName) {
- return Object.keys(object).reduce(
- (array, key) =>
- array.concat(Object.assign({ [keyName]: key }, object[key])),
- []
- );
- }
- function addCommentHelper(node, comment) {
- const comments = node.comments || (node.comments = []);
- comments.push(comment);
- comment.printed = false;
- // For some reason, TypeScript parses `// x` inside of JSXText as a comment
- // We already "print" it via the raw text, we don't need to re-print it as a
- // comment
- if (node.type === "JSXText") {
- comment.printed = true;
- }
- }
- function addLeadingComment(node, comment) {
- comment.leading = true;
- comment.trailing = false;
- addCommentHelper(node, comment);
- }
- function addDanglingComment(node, comment) {
- comment.leading = false;
- comment.trailing = false;
- addCommentHelper(node, comment);
- }
- function addTrailingComment(node, comment) {
- comment.leading = false;
- comment.trailing = true;
- addCommentHelper(node, comment);
- }
- var util$1 = {
- arrayify,
- punctuationRegex,
- punctuationCharRange,
- getStringWidth,
- splitText,
- getMaxContinuousCount,
- getPrecedence,
- shouldFlatten,
- isBitwiseOperator,
- isExportDeclaration,
- getParentExportDeclaration,
- getPenultimate,
- getLast,
- getNextNonSpaceNonCommentCharacterIndex,
- getNextNonSpaceNonCommentCharacter,
- skipWhitespace,
- skipSpaces,
- skipNewline,
- isNextLineEmptyAfterIndex,
- isNextLineEmpty,
- isPreviousLineEmpty,
- hasNewline,
- hasNewlineInRange,
- hasSpaces,
- setLocStart,
- setLocEnd,
- startsWithNoLookaheadToken,
- hasBlockComments,
- isBlockComment,
- hasClosureCompilerTypeCastComment,
- getAlignmentSize,
- getIndentSize,
- printString,
- printNumber,
- hasIgnoreComment,
- hasNodeIgnoreComment,
- lineColumnToIndex,
- makeString,
- addLeadingComment,
- addDanglingComment,
- addTrailingComment
- };
- function traverseDoc(doc, onEnter, onExit, shouldTraverseConditionalGroups) {
- function traverseDocRec(doc) {
- let shouldRecurse = true;
- if (onEnter) {
- if (onEnter(doc) === false) {
- shouldRecurse = false;
- }
- }
- if (shouldRecurse) {
- if (doc.type === "concat" || doc.type === "fill") {
- for (let i = 0; i < doc.parts.length; i++) {
- traverseDocRec(doc.parts[i]);
- }
- } else if (doc.type === "if-break") {
- if (doc.breakContents) {
- traverseDocRec(doc.breakContents);
- }
- if (doc.flatContents) {
- traverseDocRec(doc.flatContents);
- }
- } else if (doc.type === "group" && doc.expandedStates) {
- if (shouldTraverseConditionalGroups) {
- doc.expandedStates.forEach(traverseDocRec);
- } else {
- traverseDocRec(doc.contents);
- }
- } else if (doc.contents) {
- traverseDocRec(doc.contents);
- }
- }
- if (onExit) {
- onExit(doc);
- }
- }
- traverseDocRec(doc);
- }
- function mapDoc(doc, cb) {
- if (doc.type === "concat" || doc.type === "fill") {
- const parts = doc.parts.map(part => mapDoc(part, cb));
- return cb(Object.assign({}, doc, { parts }));
- } else if (doc.type === "if-break") {
- const breakContents = doc.breakContents && mapDoc(doc.breakContents, cb);
- const flatContents = doc.flatContents && mapDoc(doc.flatContents, cb);
- return cb(Object.assign({}, doc, { breakContents, flatContents }));
- } else if (doc.contents) {
- const contents = mapDoc(doc.contents, cb);
- return cb(Object.assign({}, doc, { contents }));
- }
- return cb(doc);
- }
- function findInDoc(doc, fn, defaultValue) {
- let result = defaultValue;
- let hasStopped = false;
- traverseDoc(doc, doc => {
- const maybeResult = fn(doc);
- if (maybeResult !== undefined) {
- hasStopped = true;
- result = maybeResult;
- }
- if (hasStopped) {
- return false;
- }
- });
- return result;
- }
- function isEmpty(n) {
- return typeof n === "string" && n.length === 0;
- }
- function isLineNext(doc) {
- return findInDoc(
- doc,
- doc => {
- if (typeof doc === "string") {
- return false;
- }
- if (doc.type === "line") {
- return true;
- }
- },
- false
- );
- }
- function willBreak(doc) {
- return findInDoc(
- doc,
- doc => {
- if (doc.type === "group" && doc.break) {
- return true;
- }
- if (doc.type === "line" && doc.hard) {
- return true;
- }
- if (doc.type === "break-parent") {
- return true;
- }
- },
- false
- );
- }
- function breakParentGroup(groupStack) {
- if (groupStack.length > 0) {
- const parentGroup = groupStack[groupStack.length - 1];
- // Breaks are not propagated through conditional groups because
- // the user is expected to manually handle what breaks.
- if (!parentGroup.expandedStates) {
- parentGroup.break = true;
- }
- }
- return null;
- }
- function propagateBreaks(doc) {
- const alreadyVisited = new Map();
- const groupStack = [];
- traverseDoc(
- doc,
- doc => {
- if (doc.type === "break-parent") {
- breakParentGroup(groupStack);
- }
- if (doc.type === "group") {
- groupStack.push(doc);
- if (alreadyVisited.has(doc)) {
- return false;
- }
- alreadyVisited.set(doc, true);
- }
- },
- doc => {
- if (doc.type === "group") {
- const group = groupStack.pop();
- if (group.break) {
- breakParentGroup(groupStack);
- }
- }
- },
- /* shouldTraverseConditionalGroups */ true
- );
- }
- function removeLines(doc) {
- // Force this doc into flat mode by statically converting all
- // lines into spaces (or soft lines into nothing). Hard lines
- // should still output because there's too great of a chance
- // of breaking existing assumptions otherwise.
- return mapDoc(doc, d => {
- if (d.type === "line" && !d.hard) {
- return d.soft ? "" : " ";
- } else if (d.type === "if-break") {
- return d.flatContents || "";
- }
- return d;
- });
- }
- function stripTrailingHardline(doc) {
- // HACK remove ending hardline, original PR: #1984
- if (
- doc.type === "concat" &&
- doc.parts.length === 2 &&
- doc.parts[1].type === "concat" &&
- doc.parts[1].parts.length === 2 &&
- doc.parts[1].parts[0].hard &&
- doc.parts[1].parts[1].type === "break-parent"
- ) {
- return doc.parts[0];
- }
- return doc;
- }
- var docUtils = {
- isEmpty,
- willBreak,
- isLineNext,
- traverseDoc,
- mapDoc,
- propagateBreaks,
- removeLines,
- stripTrailingHardline
- };
- function isNextLineEmpty$1(text, node, options) {
- return util$1.isNextLineEmpty(text, node, options.locEnd);
- }
- function getNextNonSpaceNonCommentCharacterIndex$1(text, node, options) {
- return util$1.getNextNonSpaceNonCommentCharacterIndex(
- text,
- node,
- options.locEnd
- );
- }
- var utilShared = {
- isNextLineEmpty: isNextLineEmpty$1,
- isNextLineEmptyAfterIndex: util$1.isNextLineEmptyAfterIndex,
- getNextNonSpaceNonCommentCharacterIndex: getNextNonSpaceNonCommentCharacterIndex$1,
- mapDoc: docUtils.mapDoc, // TODO: remove in 2.0, we already exposed it in docUtils
- makeString: util$1.makeString,
- addLeadingComment: util$1.addLeadingComment,
- addDanglingComment: util$1.addDanglingComment,
- addTrailingComment: util$1.addTrailingComment
- };
- var dedent_1 = createCommonjsModule(function (module) {
- "use strict";
- function dedent(strings) {
- var raw = void 0;
- if (typeof strings === "string") {
- // dedent can be used as a plain function
- raw = [strings];
- } else {
- raw = strings.raw;
- }
- // first, perform interpolation
- var result = "";
- for (var i = 0; i < raw.length; i++) {
- result += raw[i].
- // join lines when there is a suppressed newline
- replace(/\\\n[ \t]*/g, "").
- // handle escaped backticks
- replace(/\\`/g, "`");
- if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) {
- result += arguments.length <= i + 1 ? undefined : arguments[i + 1];
- }
- }
- // now strip indentation
- var lines = result.split("\n");
- var mindent = null;
- lines.forEach(function (l) {
- var m = l.match(/^(\s+)\S+/);
- if (m) {
- var indent = m[1].length;
- if (!mindent) {
- // this is the first indented line
- mindent = indent;
- } else {
- mindent = Math.min(mindent, indent);
- }
- }
- });
- if (mindent !== null) {
- result = lines.map(function (l) {
- return l[0] === " " ? l.slice(mindent) : l;
- }).join("\n");
- }
- // dedent eats leading and trailing whitespace too
- result = result.trim();
- // handle escaped newlines at the end to ensure they don't get stripped too
- return result.replace(/\\n/g, "\n");
- }
- {
- module.exports = dedent;
- }
- });
- var semver = createCommonjsModule(function (module, exports) {
- exports = module.exports = SemVer;
- // The debug function is excluded entirely from the minified version.
- /* nomin */ var debug;
- /* nomin */ if (typeof process === 'object' &&
- /* nomin */ process.env &&
- /* nomin */ process.env.NODE_DEBUG &&
- /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG))
- /* nomin */ debug = function() {
- /* nomin */ var args = Array.prototype.slice.call(arguments, 0);
- /* nomin */ args.unshift('SEMVER');
- /* nomin */ console.log.apply(console, args);
- /* nomin */ };
- /* nomin */ else
- /* nomin */ debug = function() {};
- // Note: this is the semver.org version of the spec that it implements
- // Not necessarily the package version of this code.
- exports.SEMVER_SPEC_VERSION = '2.0.0';
- var MAX_LENGTH = 256;
- var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
- // The actual regexps go on exports.re
- var re = exports.re = [];
- var src = exports.src = [];
- var R = 0;
- // The following Regular Expressions can be used for tokenizing,
- // validating, and parsing SemVer version strings.
- // ## Numeric Identifier
- // A single `0`, or a non-zero digit followed by zero or more digits.
- var NUMERICIDENTIFIER = R++;
- src[NUMERICIDENTIFIER] = '0|[1-9]\\d*';
- var NUMERICIDENTIFIERLOOSE = R++;
- src[NUMERICIDENTIFIERLOOSE] = '[0-9]+';
- // ## Non-numeric Identifier
- // Zero or more digits, followed by a letter or hyphen, and then zero or
- // more letters, digits, or hyphens.
- var NONNUMERICIDENTIFIER = R++;
- src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*';
- // ## Main Version
- // Three dot-separated numeric identifiers.
- var MAINVERSION = R++;
- src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
- '(' + src[NUMERICIDENTIFIER] + ')\\.' +
- '(' + src[NUMERICIDENTIFIER] + ')';
- var MAINVERSIONLOOSE = R++;
- src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
- '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
- '(' + src[NUMERICIDENTIFIERLOOSE] + ')';
- // ## Pre-release Version Identifier
- // A numeric identifier, or a non-numeric identifier.
- var PRERELEASEIDENTIFIER = R++;
- src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
- '|' + src[NONNUMERICIDENTIFIER] + ')';
- var PRERELEASEIDENTIFIERLOOSE = R++;
- src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
- '|' + src[NONNUMERICIDENTIFIER] + ')';
- // ## Pre-release Version
- // Hyphen, followed by one or more dot-separated pre-release version
- // identifiers.
- var PRERELEASE = R++;
- src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
- '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))';
- var PRERELEASELOOSE = R++;
- src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
- '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';
- // ## Build Metadata Identifier
- // Any combination of digits, letters, or hyphens.
- var BUILDIDENTIFIER = R++;
- src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';
- // ## Build Metadata
- // Plus sign, followed by one or more period-separated build metadata
- // identifiers.
- var BUILD = R++;
- src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
- '(?:\\.' + src[BUILDIDENTIFIER] + ')*))';
- // ## Full Version String
- // A main version, followed optionally by a pre-release version and
- // build metadata.
- // Note that the only major, minor, patch, and pre-release sections of
- // the version string are capturing groups. The build metadata is not a
- // capturing group, because it should not ever be used in version
- // comparison.
- var FULL = R++;
- var FULLPLAIN = 'v?' + src[MAINVERSION] +
- src[PRERELEASE] + '?' +
- src[BUILD] + '?';
- src[FULL] = '^' + FULLPLAIN + '$';
- // like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
- // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
- // common in the npm registry.
- var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
- src[PRERELEASELOOSE] + '?' +
- src[BUILD] + '?';
- var LOOSE = R++;
- src[LOOSE] = '^' + LOOSEPLAIN + '$';
- var GTLT = R++;
- src[GTLT] = '((?:<|>)?=?)';
- // Something like "2.*" or "1.2.x".
- // Note that "x.x" is a valid xRange identifer, meaning "any version"
- // Only the first item is strictly required.
- var XRANGEIDENTIFIERLOOSE = R++;
- src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
- var XRANGEIDENTIFIER = R++;
- src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*';
- var XRANGEPLAIN = R++;
- src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
- '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
- '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
- '(?:' + src[PRERELEASE] + ')?' +
- src[BUILD] + '?' +
- ')?)?';
- var XRANGEPLAINLOOSE = R++;
- src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
- '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
- '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
- '(?:' + src[PRERELEASELOOSE] + ')?' +
- src[BUILD] + '?' +
- ')?)?';
- var XRANGE = R++;
- src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
- var XRANGELOOSE = R++;
- src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$';
- // Tilde ranges.
- // Meaning is "reasonably at or greater than"
- var LONETILDE = R++;
- src[LONETILDE] = '(?:~>?)';
- var TILDETRIM = R++;
- src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
- re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
- var tildeTrimReplace = '$1~';
- var TILDE = R++;
- src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
- var TILDELOOSE = R++;
- src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
- // Caret ranges.
- // Meaning is "at least and backwards compatible with"
- var LONECARET = R++;
- src[LONECARET] = '(?:\\^)';
- var CARETTRIM = R++;
- src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
- re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
- var caretTrimReplace = '$1^';
- var CARET = R++;
- src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
- var CARETLOOSE = R++;
- src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
- // A simple gt/lt/eq thing, or just "" to indicate "any version"
- var COMPARATORLOOSE = R++;
- src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$';
- var COMPARATOR = R++;
- src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$';
- // An expression to strip any whitespace between the gtlt and the thing
- // it modifies, so that `> 1.2.3` ==> `>1.2.3`
- var COMPARATORTRIM = R++;
- src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
- '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';
- // this one has to use the /g flag
- re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');
- var comparatorTrimReplace = '$1$2$3';
- // Something like `1.2.3 - 1.2.4`
- // Note that these all use the loose form, because they'll be
- // checked against either the strict or loose comparator form
- // later.
- var HYPHENRANGE = R++;
- src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
- '\\s+-\\s+' +
- '(' + src[XRANGEPLAIN] + ')' +
- '\\s*$';
- var HYPHENRANGELOOSE = R++;
- src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
- '\\s+-\\s+' +
- '(' + src[XRANGEPLAINLOOSE] + ')' +
- '\\s*$';
- // Star ranges basically just allow anything at all.
- var STAR = R++;
- src[STAR] = '(<|>)?=?\\s*\\*';
- // Compile to actual regexp objects.
- // All are flag-free, unless they were created above with a flag.
- for (var i = 0; i < R; i++) {
- debug(i, src[i]);
- if (!re[i])
- re[i] = new RegExp(src[i]);
- }
- exports.parse = parse;
- function parse(version, loose) {
- if (version instanceof SemVer)
- return version;
- if (typeof version !== 'string')
- return null;
- if (version.length > MAX_LENGTH)
- return null;
- var r = loose ? re[LOOSE] : re[FULL];
- if (!r.test(version))
- return null;
- try {
- return new SemVer(version, loose);
- } catch (er) {
- return null;
- }
- }
- exports.valid = valid;
- function valid(version, loose) {
- var v = parse(version, loose);
- return v ? v.version : null;
- }
- exports.clean = clean;
- function clean(version, loose) {
- var s = parse(version.trim().replace(/^[=v]+/, ''), loose);
- return s ? s.version : null;
- }
- exports.SemVer = SemVer;
- function SemVer(version, loose) {
- if (version instanceof SemVer) {
- if (version.loose === loose)
- return version;
- else
- version = version.version;
- } else if (typeof version !== 'string') {
- throw new TypeError('Invalid Version: ' + version);
- }
- if (version.length > MAX_LENGTH)
- throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
- if (!(this instanceof SemVer))
- return new SemVer(version, loose);
- debug('SemVer', version, loose);
- this.loose = loose;
- var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);
- if (!m)
- throw new TypeError('Invalid Version: ' + version);
- this.raw = version;
- // these are actually numbers
- this.major = +m[1];
- this.minor = +m[2];
- this.patch = +m[3];
- if (this.major > MAX_SAFE_INTEGER || this.major < 0)
- throw new TypeError('Invalid major version')
- if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)
- throw new TypeError('Invalid minor version')
- if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)
- throw new TypeError('Invalid patch version')
- // numberify any prerelease numeric ids
- if (!m[4])
- this.prerelease = [];
- else
- this.prerelease = m[4].split('.').map(function(id) {
- if (/^[0-9]+$/.test(id)) {
- var num = +id;
- if (num >= 0 && num < MAX_SAFE_INTEGER)
- return num;
- }
- return id;
- });
- this.build = m[5] ? m[5].split('.') : [];
- this.format();
- }
- SemVer.prototype.format = function() {
- this.version = this.major + '.' + this.minor + '.' + this.patch;
- if (this.prerelease.length)
- this.version += '-' + this.prerelease.join('.');
- return this.version;
- };
- SemVer.prototype.toString = function() {
- return this.version;
- };
- SemVer.prototype.compare = function(other) {
- debug('SemVer.compare', this.version, this.loose, other);
- if (!(other instanceof SemVer))
- other = new SemVer(other, this.loose);
- return this.compareMain(other) || this.comparePre(other);
- };
- SemVer.prototype.compareMain = function(other) {
- if (!(other instanceof SemVer))
- other = new SemVer(other, this.loose);
- return compareIdentifiers(this.major, other.major) ||
- compareIdentifiers(this.minor, other.minor) ||
- compareIdentifiers(this.patch, other.patch);
- };
- SemVer.prototype.comparePre = function(other) {
- if (!(other instanceof SemVer))
- other = new SemVer(other, this.loose);
- // NOT having a prerelease is > having one
- if (this.prerelease.length && !other.prerelease.length)
- return -1;
- else if (!this.prerelease.length && other.prerelease.length)
- return 1;
- else if (!this.prerelease.length && !other.prerelease.length)
- return 0;
- var i = 0;
- do {
- var a = this.prerelease[i];
- var b = other.prerelease[i];
- debug('prerelease compare', i, a, b);
- if (a === undefined && b === undefined)
- return 0;
- else if (b === undefined)
- return 1;
- else if (a === undefined)
- return -1;
- else if (a === b)
- continue;
- else
- return compareIdentifiers(a, b);
- } while (++i);
- };
- // preminor will bump the version up to the next minor release, and immediately
- // down to pre-release. premajor and prepatch work the same way.
- SemVer.prototype.inc = function(release, identifier) {
- switch (release) {
- case 'premajor':
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor = 0;
- this.major++;
- this.inc('pre', identifier);
- break;
- case 'preminor':
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor++;
- this.inc('pre', identifier);
- break;
- case 'prepatch':
- // If this is already a prerelease, it will bump to the next version
- // drop any prereleases that might already exist, since they are not
- // relevant at this point.
- this.prerelease.length = 0;
- this.inc('patch', identifier);
- this.inc('pre', identifier);
- break;
- // If the input is a non-prerelease version, this acts the same as
- // prepatch.
- case 'prerelease':
- if (this.prerelease.length === 0)
- this.inc('patch', identifier);
- this.inc('pre', identifier);
- break;
- case 'major':
- // If this is a pre-major version, bump up to the same major version.
- // Otherwise increment major.
- // 1.0.0-5 bumps to 1.0.0
- // 1.1.0 bumps to 2.0.0
- if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)
- this.major++;
- this.minor = 0;
- this.patch = 0;
- this.prerelease = [];
- break;
- case 'minor':
- // If this is a pre-minor version, bump up to the same minor version.
- // Otherwise increment minor.
- // 1.2.0-5 bumps to 1.2.0
- // 1.2.1 bumps to 1.3.0
- if (this.patch !== 0 || this.prerelease.length === 0)
- this.minor++;
- this.patch = 0;
- this.prerelease = [];
- break;
- case 'patch':
- // If this is not a pre-release version, it will increment the patch.
- // If it is a pre-release it will bump up to the same patch version.
- // 1.2.0-5 patches to 1.2.0
- // 1.2.0 patches to 1.2.1
- if (this.prerelease.length === 0)
- this.patch++;
- this.prerelease = [];
- break;
- // This probably shouldn't be used publicly.
- // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
- case 'pre':
- if (this.prerelease.length === 0)
- this.prerelease = [0];
- else {
- var i = this.prerelease.length;
- while (--i >= 0) {
- if (typeof this.prerelease[i] === 'number') {
- this.prerelease[i]++;
- i = -2;
- }
- }
- if (i === -1) // didn't increment anything
- this.prerelease.push(0);
- }
- if (identifier) {
- // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
- // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
- if (this.prerelease[0] === identifier) {
- if (isNaN(this.prerelease[1]))
- this.prerelease = [identifier, 0];
- } else
- this.prerelease = [identifier, 0];
- }
- break;
- default:
- throw new Error('invalid increment argument: ' + release);
- }
- this.format();
- this.raw = this.version;
- return this;
- };
- exports.inc = inc;
- function inc(version, release, loose, identifier) {
- if (typeof(loose) === 'string') {
- identifier = loose;
- loose = undefined;
- }
- try {
- return new SemVer(version, loose).inc(release, identifier).version;
- } catch (er) {
- return null;
- }
- }
- exports.diff = diff;
- function diff(version1, version2) {
- if (eq(version1, version2)) {
- return null;
- } else {
- var v1 = parse(version1);
- var v2 = parse(version2);
- if (v1.prerelease.length || v2.prerelease.length) {
- for (var key in v1) {
- if (key === 'major' || key === 'minor' || key === 'patch') {
- if (v1[key] !== v2[key]) {
- return 'pre'+key;
- }
- }
- }
- return 'prerelease';
- }
- for (var key in v1) {
- if (key === 'major' || key === 'minor' || key === 'patch') {
- if (v1[key] !== v2[key]) {
- return key;
- }
- }
- }
- }
- }
- exports.compareIdentifiers = compareIdentifiers;
- var numeric = /^[0-9]+$/;
- function compareIdentifiers(a, b) {
- var anum = numeric.test(a);
- var bnum = numeric.test(b);
- if (anum && bnum) {
- a = +a;
- b = +b;
- }
- return (anum && !bnum) ? -1 :
- (bnum && !anum) ? 1 :
- a < b ? -1 :
- a > b ? 1 :
- 0;
- }
- exports.rcompareIdentifiers = rcompareIdentifiers;
- function rcompareIdentifiers(a, b) {
- return compareIdentifiers(b, a);
- }
- exports.major = major;
- function major(a, loose) {
- return new SemVer(a, loose).major;
- }
- exports.minor = minor;
- function minor(a, loose) {
- return new SemVer(a, loose).minor;
- }
- exports.patch = patch;
- function patch(a, loose) {
- return new SemVer(a, loose).patch;
- }
- exports.compare = compare;
- function compare(a, b, loose) {
- return new SemVer(a, loose).compare(new SemVer(b, loose));
- }
- exports.compareLoose = compareLoose;
- function compareLoose(a, b) {
- return compare(a, b, true);
- }
- exports.rcompare = rcompare;
- function rcompare(a, b, loose) {
- return compare(b, a, loose);
- }
- exports.sort = sort;
- function sort(list, loose) {
- return list.sort(function(a, b) {
- return exports.compare(a, b, loose);
- });
- }
- exports.rsort = rsort;
- function rsort(list, loose) {
- return list.sort(function(a, b) {
- return exports.rcompare(a, b, loose);
- });
- }
- exports.gt = gt;
- function gt(a, b, loose) {
- return compare(a, b, loose) > 0;
- }
- exports.lt = lt;
- function lt(a, b, loose) {
- return compare(a, b, loose) < 0;
- }
- exports.eq = eq;
- function eq(a, b, loose) {
- return compare(a, b, loose) === 0;
- }
- exports.neq = neq;
- function neq(a, b, loose) {
- return compare(a, b, loose) !== 0;
- }
- exports.gte = gte;
- function gte(a, b, loose) {
- return compare(a, b, loose) >= 0;
- }
- exports.lte = lte;
- function lte(a, b, loose) {
- return compare(a, b, loose) <= 0;
- }
- exports.cmp = cmp;
- function cmp(a, op, b, loose) {
- var ret;
- switch (op) {
- case '===':
- if (typeof a === 'object') a = a.version;
- if (typeof b === 'object') b = b.version;
- ret = a === b;
- break;
- case '!==':
- if (typeof a === 'object') a = a.version;
- if (typeof b === 'object') b = b.version;
- ret = a !== b;
- break;
- case '': case '=': case '==': ret = eq(a, b, loose); break;
- case '!=': ret = neq(a, b, loose); break;
- case '>': ret = gt(a, b, loose); break;
- case '>=': ret = gte(a, b, loose); break;
- case '<': ret = lt(a, b, loose); break;
- case '<=': ret = lte(a, b, loose); break;
- default: throw new TypeError('Invalid operator: ' + op);
- }
- return ret;
- }
- exports.Comparator = Comparator;
- function Comparator(comp, loose) {
- if (comp instanceof Comparator) {
- if (comp.loose === loose)
- return comp;
- else
- comp = comp.value;
- }
- if (!(this instanceof Comparator))
- return new Comparator(comp, loose);
- debug('comparator', comp, loose);
- this.loose = loose;
- this.parse(comp);
- if (this.semver === ANY)
- this.value = '';
- else
- this.value = this.operator + this.semver.version;
- debug('comp', this);
- }
- var ANY = {};
- Comparator.prototype.parse = function(comp) {
- var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
- var m = comp.match(r);
- if (!m)
- throw new TypeError('Invalid comparator: ' + comp);
- this.operator = m[1];
- if (this.operator === '=')
- this.operator = '';
- // if it literally is just '>' or '' then allow anything.
- if (!m[2])
- this.semver = ANY;
- else
- this.semver = new SemVer(m[2], this.loose);
- };
- Comparator.prototype.toString = function() {
- return this.value;
- };
- Comparator.prototype.test = function(version) {
- debug('Comparator.test', version, this.loose);
- if (this.semver === ANY)
- return true;
- if (typeof version === 'string')
- version = new SemVer(version, this.loose);
- return cmp(version, this.operator, this.semver, this.loose);
- };
- Comparator.prototype.intersects = function(comp, loose) {
- if (!(comp instanceof Comparator)) {
- throw new TypeError('a Comparator is required');
- }
- var rangeTmp;
- if (this.operator === '') {
- rangeTmp = new Range(comp.value, loose);
- return satisfies(this.value, rangeTmp, loose);
- } else if (comp.operator === '') {
- rangeTmp = new Range(this.value, loose);
- return satisfies(comp.semver, rangeTmp, loose);
- }
- var sameDirectionIncreasing =
- (this.operator === '>=' || this.operator === '>') &&
- (comp.operator === '>=' || comp.operator === '>');
- var sameDirectionDecreasing =
- (this.operator === '<=' || this.operator === '<') &&
- (comp.operator === '<=' || comp.operator === '<');
- var sameSemVer = this.semver.version === comp.semver.version;
- var differentDirectionsInclusive =
- (this.operator === '>=' || this.operator === '<=') &&
- (comp.operator === '>=' || comp.operator === '<=');
- var oppositeDirectionsLessThan =
- cmp(this.semver, '<', comp.semver, loose) &&
- ((this.operator === '>=' || this.operator === '>') &&
- (comp.operator === '<=' || comp.operator === '<'));
- var oppositeDirectionsGreaterThan =
- cmp(this.semver, '>', comp.semver, loose) &&
- ((this.operator === '<=' || this.operator === '<') &&
- (comp.operator === '>=' || comp.operator === '>'));
- return sameDirectionIncreasing || sameDirectionDecreasing ||
- (sameSemVer && differentDirectionsInclusive) ||
- oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
- };
- exports.Range = Range;
- function Range(range, loose) {
- if (range instanceof Range) {
- if (range.loose === loose) {
- return range;
- } else {
- return new Range(range.raw, loose);
- }
- }
- if (range instanceof Comparator) {
- return new Range(range.value, loose);
- }
- if (!(this instanceof Range))
- return new Range(range, loose);
- this.loose = loose;
- // First, split based on boolean or ||
- this.raw = range;
- this.set = range.split(/\s*\|\|\s*/).map(function(range) {
- return this.parseRange(range.trim());
- }, this).filter(function(c) {
- // throw out any that are not relevant for whatever reason
- return c.length;
- });
- if (!this.set.length) {
- throw new TypeError('Invalid SemVer Range: ' + range);
- }
- this.format();
- }
- Range.prototype.format = function() {
- this.range = this.set.map(function(comps) {
- return comps.join(' ').trim();
- }).join('||').trim();
- return this.range;
- };
- Range.prototype.toString = function() {
- return this.range;
- };
- Range.prototype.parseRange = function(range) {
- var loose = this.loose;
- range = range.trim();
- debug('range', range, loose);
- // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
- var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
- range = range.replace(hr, hyphenReplace);
- debug('hyphen replace', range);
- // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
- range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
- debug('comparator trim', range, re[COMPARATORTRIM]);
- // `~ 1.2.3` => `~1.2.3`
- range = range.replace(re[TILDETRIM], tildeTrimReplace);
- // `^ 1.2.3` => `^1.2.3`
- range = range.replace(re[CARETTRIM], caretTrimReplace);
- // normalize spaces
- range = range.split(/\s+/).join(' ');
- // At this point, the range is completely trimmed and
- // ready to be split into comparators.
- var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
- var set = range.split(' ').map(function(comp) {
- return parseComparator(comp, loose);
- }).join(' ').split(/\s+/);
- if (this.loose) {
- // in loose mode, throw out any that are not valid comparators
- set = set.filter(function(comp) {
- return !!comp.match(compRe);
- });
- }
- set = set.map(function(comp) {
- return new Comparator(comp, loose);
- });
- return set;
- };
- Range.prototype.intersects = function(range, loose) {
- if (!(range instanceof Range)) {
- throw new TypeError('a Range is required');
- }
- return this.set.some(function(thisComparators) {
- return thisComparators.every(function(thisComparator) {
- return range.set.some(function(rangeComparators) {
- return rangeComparators.every(function(rangeComparator) {
- return thisComparator.intersects(rangeComparator, loose);
- });
- });
- });
- });
- };
- // Mostly just for testing and legacy API reasons
- exports.toComparators = toComparators;
- function toComparators(range, loose) {
- return new Range(range, loose).set.map(function(comp) {
- return comp.map(function(c) {
- return c.value;
- }).join(' ').trim().split(' ');
- });
- }
- // comprised of xranges, tildes, stars, and gtlt's at this point.
- // already replaced the hyphen ranges
- // turn into a set of JUST comparators.
- function parseComparator(comp, loose) {
- debug('comp', comp);
- comp = replaceCarets(comp, loose);
- debug('caret', comp);
- comp = replaceTildes(comp, loose);
- debug('tildes', comp);
- comp = replaceXRanges(comp, loose);
- debug('xrange', comp);
- comp = replaceStars(comp, loose);
- debug('stars', comp);
- return comp;
- }
- function isX(id) {
- return !id || id.toLowerCase() === 'x' || id === '*';
- }
- // ~, ~> --> * (any, kinda silly)
- // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
- // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
- // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
- // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
- // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
- function replaceTildes(comp, loose) {
- return comp.trim().split(/\s+/).map(function(comp) {
- return replaceTilde(comp, loose);
- }).join(' ');
- }
- function replaceTilde(comp, loose) {
- var r = loose ? re[TILDELOOSE] : re[TILDE];
- return comp.replace(r, function(_, M, m, p, pr) {
- debug('tilde', comp, _, M, m, p, pr);
- var ret;
- if (isX(M))
- ret = '';
- else if (isX(m))
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
- else if (isX(p))
- // ~1.2 == >=1.2.0 <1.3.0
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
- else if (pr) {
- debug('replaceTilde pr', pr);
- if (pr.charAt(0) !== '-')
- pr = '-' + pr;
- ret = '>=' + M + '.' + m + '.' + p + pr +
- ' <' + M + '.' + (+m + 1) + '.0';
- } else
- // ~1.2.3 == >=1.2.3 <1.3.0
- ret = '>=' + M + '.' + m + '.' + p +
- ' <' + M + '.' + (+m + 1) + '.0';
- debug('tilde return', ret);
- return ret;
- });
- }
- // ^ --> * (any, kinda silly)
- // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
- // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
- // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
- // ^1.2.3 --> >=1.2.3 <2.0.0
- // ^1.2.0 --> >=1.2.0 <2.0.0
- function replaceCarets(comp, loose) {
- return comp.trim().split(/\s+/).map(function(comp) {
- return replaceCaret(comp, loose);
- }).join(' ');
- }
- function replaceCaret(comp, loose) {
- debug('caret', comp, loose);
- var r = loose ? re[CARETLOOSE] : re[CARET];
- return comp.replace(r, function(_, M, m, p, pr) {
- debug('caret', comp, _, M, m, p, pr);
- var ret;
- if (isX(M))
- ret = '';
- else if (isX(m))
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
- else if (isX(p)) {
- if (M === '0')
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
- else
- ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';
- } else if (pr) {
- debug('replaceCaret pr', pr);
- if (pr.charAt(0) !== '-')
- pr = '-' + pr;
- if (M === '0') {
- if (m === '0')
- ret = '>=' + M + '.' + m + '.' + p + pr +
- ' <' + M + '.' + m + '.' + (+p + 1);
- else
- ret = '>=' + M + '.' + m + '.' + p + pr +
- ' <' + M + '.' + (+m + 1) + '.0';
- } else
- ret = '>=' + M + '.' + m + '.' + p + pr +
- ' <' + (+M + 1) + '.0.0';
- } else {
- debug('no pr');
- if (M === '0') {
- if (m === '0')
- ret = '>=' + M + '.' + m + '.' + p +
- ' <' + M + '.' + m + '.' + (+p + 1);
- else
- ret = '>=' + M + '.' + m + '.' + p +
- ' <' + M + '.' + (+m + 1) + '.0';
- } else
- ret = '>=' + M + '.' + m + '.' + p +
- ' <' + (+M + 1) + '.0.0';
- }
- debug('caret return', ret);
- return ret;
- });
- }
- function replaceXRanges(comp, loose) {
- debug('replaceXRanges', comp, loose);
- return comp.split(/\s+/).map(function(comp) {
- return replaceXRange(comp, loose);
- }).join(' ');
- }
- function replaceXRange(comp, loose) {
- comp = comp.trim();
- var r = loose ? re[XRANGELOOSE] : re[XRANGE];
- return comp.replace(r, function(ret, gtlt, M, m, p, pr) {
- debug('xRange', comp, ret, gtlt, M, m, p, pr);
- var xM = isX(M);
- var xm = xM || isX(m);
- var xp = xm || isX(p);
- var anyX = xp;
- if (gtlt === '=' && anyX)
- gtlt = '';
- if (xM) {
- if (gtlt === '>' || gtlt === '<') {
- // nothing is allowed
- ret = '<0.0.0';
- } else {
- // nothing is forbidden
- ret = '*';
- }
- } else if (gtlt && anyX) {
- // replace X with 0
- if (xm)
- m = 0;
- if (xp)
- p = 0;
- if (gtlt === '>') {
- // >1 => >=2.0.0
- // >1.2 => >=1.3.0
- // >1.2.3 => >= 1.2.4
- gtlt = '>=';
- if (xm) {
- M = +M + 1;
- m = 0;
- p = 0;
- } else if (xp) {
- m = +m + 1;
- p = 0;
- }
- } else if (gtlt === '<=') {
- // <=0.7.x is actually <0.8.0, since any 0.7.x should
- // pass. Similarly, <=7.x is actually <8.0.0, etc.
- gtlt = '<';
- if (xm)
- M = +M + 1;
- else
- m = +m + 1;
- }
- ret = gtlt + M + '.' + m + '.' + p;
- } else if (xm) {
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
- } else if (xp) {
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
- }
- debug('xRange return', ret);
- return ret;
- });
- }
- // Because * is AND-ed with everything else in the comparator,
- // and '' means "any version", just remove the *s entirely.
- function replaceStars(comp, loose) {
- debug('replaceStars', comp, loose);
- // Looseness is ignored here. star is always as loose as it gets!
- return comp.trim().replace(re[STAR], '');
- }
- // This function is passed to string.replace(re[HYPHENRANGE])
- // M, m, patch, prerelease, build
- // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
- // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
- // 1.2 - 3.4 => >=1.2.0 <3.5.0
- function hyphenReplace($0,
- from, fM, fm, fp, fpr, fb,
- to, tM, tm, tp, tpr, tb) {
- if (isX(fM))
- from = '';
- else if (isX(fm))
- from = '>=' + fM + '.0.0';
- else if (isX(fp))
- from = '>=' + fM + '.' + fm + '.0';
- else
- from = '>=' + from;
- if (isX(tM))
- to = '';
- else if (isX(tm))
- to = '<' + (+tM + 1) + '.0.0';
- else if (isX(tp))
- to = '<' + tM + '.' + (+tm + 1) + '.0';
- else if (tpr)
- to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
- else
- to = '<=' + to;
- return (from + ' ' + to).trim();
- }
- // if ANY of the sets match ALL of its comparators, then pass
- Range.prototype.test = function(version) {
- if (!version)
- return false;
- if (typeof version === 'string')
- version = new SemVer(version, this.loose);
- for (var i = 0; i < this.set.length; i++) {
- if (testSet(this.set[i], version))
- return true;
- }
- return false;
- };
- function testSet(set, version) {
- for (var i = 0; i < set.length; i++) {
- if (!set[i].test(version))
- return false;
- }
- if (version.prerelease.length) {
- // Find the set of versions that are allowed to have prereleases
- // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
- // That should allow `1.2.3-pr.2` to pass.
- // However, `1.2.4-alpha.notready` should NOT be allowed,
- // even though it's within the range set by the comparators.
- for (var i = 0; i < set.length; i++) {
- debug(set[i].semver);
- if (set[i].semver === ANY)
- continue;
- if (set[i].semver.prerelease.length > 0) {
- var allowed = set[i].semver;
- if (allowed.major === version.major &&
- allowed.minor === version.minor &&
- allowed.patch === version.patch)
- return true;
- }
- }
- // Version has a -pre, but it's not one of the ones we like.
- return false;
- }
- return true;
- }
- exports.satisfies = satisfies;
- function satisfies(version, range, loose) {
- try {
- range = new Range(range, loose);
- } catch (er) {
- return false;
- }
- return range.test(version);
- }
- exports.maxSatisfying = maxSatisfying;
- function maxSatisfying(versions, range, loose) {
- var max = null;
- var maxSV = null;
- try {
- var rangeObj = new Range(range, loose);
- } catch (er) {
- return null;
- }
- versions.forEach(function (v) {
- if (rangeObj.test(v)) { // satisfies(v, range, loose)
- if (!max || maxSV.compare(v) === -1) { // compare(max, v, true)
- max = v;
- maxSV = new SemVer(max, loose);
- }
- }
- });
- return max;
- }
- exports.minSatisfying = minSatisfying;
- function minSatisfying(versions, range, loose) {
- var min = null;
- var minSV = null;
- try {
- var rangeObj = new Range(range, loose);
- } catch (er) {
- return null;
- }
- versions.forEach(function (v) {
- if (rangeObj.test(v)) { // satisfies(v, range, loose)
- if (!min || minSV.compare(v) === 1) { // compare(min, v, true)
- min = v;
- minSV = new SemVer(min, loose);
- }
- }
- });
- return min;
- }
- exports.validRange = validRange;
- function validRange(range, loose) {
- try {
- // Return '*' instead of '' so that truthiness works.
- // This will throw if it's invalid anyway
- return new Range(range, loose).range || '*';
- } catch (er) {
- return null;
- }
- }
- // Determine if version is less than all the versions possible in the range
- exports.ltr = ltr;
- function ltr(version, range, loose) {
- return outside(version, range, '<', loose);
- }
- // Determine if version is greater than all the versions possible in the range.
- exports.gtr = gtr;
- function gtr(version, range, loose) {
- return outside(version, range, '>', loose);
- }
- exports.outside = outside;
- function outside(version, range, hilo, loose) {
- version = new SemVer(version, loose);
- range = new Range(range, loose);
- var gtfn, ltefn, ltfn, comp, ecomp;
- switch (hilo) {
- case '>':
- gtfn = gt;
- ltefn = lte;
- ltfn = lt;
- comp = '>';
- ecomp = '>=';
- break;
- case '<':
- gtfn = lt;
- ltefn = gte;
- ltfn = gt;
- comp = '<';
- ecomp = '<=';
- break;
- default:
- throw new TypeError('Must provide a hilo val of "<" or ">"');
- }
- // If it satisifes the range it is not outside
- if (satisfies(version, range, loose)) {
- return false;
- }
- // From now on, variable terms are as if we're in "gtr" mode.
- // but note that everything is flipped for the "ltr" function.
- for (var i = 0; i < range.set.length; ++i) {
- var comparators = range.set[i];
- var high = null;
- var low = null;
- comparators.forEach(function(comparator) {
- if (comparator.semver === ANY) {
- comparator = new Comparator('>=0.0.0');
- }
- high = high || comparator;
- low = low || comparator;
- if (gtfn(comparator.semver, high.semver, loose)) {
- high = comparator;
- } else if (ltfn(comparator.semver, low.semver, loose)) {
- low = comparator;
- }
- });
- // If the edge version comparator has a operator then our version
- // isn't outside it
- if (high.operator === comp || high.operator === ecomp) {
- return false;
- }
- // If the lowest version comparator has an operator and our version
- // is less than it then it isn't higher than the range
- if ((!low.operator || low.operator === comp) &&
- ltefn(version, low.semver)) {
- return false;
- } else if (low.operator === ecomp && ltfn(version, low.semver)) {
- return false;
- }
- }
- return true;
- }
- exports.prerelease = prerelease;
- function prerelease(version, loose) {
- var parsed = parse(version, loose);
- return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;
- }
- exports.intersects = intersects;
- function intersects(r1, r2, loose) {
- r1 = new Range(r1, loose);
- r2 = new Range(r2, loose);
- return r1.intersects(r2)
- }
- });
- var assert$1 = true;
- var buffer_ieee754 = "< 0.9.7";
- var buffer = true;
- var child_process = true;
- var cluster = true;
- var console$1 = true;
- var constants = true;
- var crypto = true;
- var _debugger = "< 8";
- var dgram = true;
- var dns = true;
- var domain = true;
- var events = true;
- var freelist = "< 6";
- var fs$1 = true;
- var http = true;
- var http2 = ">= 8.8";
- var https = true;
- var _http_server = ">= 0.11";
- var _linklist = "< 8";
- var module$1 = true;
- var net = true;
- var os$1 = true;
- var path$1 = true;
- var perf_hooks = ">= 8.5";
- var process$1 = ">= 1";
- var punycode = true;
- var querystring = true;
- var readline = true;
- var repl = true;
- var stream = true;
- var string_decoder = true;
- var sys = true;
- var timers = true;
- var tls = true;
- var tty = true;
- var url$1 = true;
- var util$3 = true;
- var v8 = ">= 1";
- var vm = true;
- var zlib = true;
- var core$1 = {
- assert: assert$1,
- buffer_ieee754: buffer_ieee754,
- buffer: buffer,
- child_process: child_process,
- cluster: cluster,
- console: console$1,
- constants: constants,
- crypto: crypto,
- _debugger: _debugger,
- dgram: dgram,
- dns: dns,
- domain: domain,
- events: events,
- freelist: freelist,
- fs: fs$1,
- http: http,
- http2: http2,
- https: https,
- _http_server: _http_server,
- _linklist: _linklist,
- module: module$1,
- net: net,
- os: os$1,
- path: path$1,
- perf_hooks: perf_hooks,
- process: process$1,
- punycode: punycode,
- querystring: querystring,
- readline: readline,
- repl: repl,
- stream: stream,
- string_decoder: string_decoder,
- sys: sys,
- timers: timers,
- tls: tls,
- tty: tty,
- url: url$1,
- util: util$3,
- v8: v8,
- vm: vm,
- zlib: zlib
- };
- var core$2 = Object.freeze({
- assert: assert$1,
- buffer_ieee754: buffer_ieee754,
- buffer: buffer,
- child_process: child_process,
- cluster: cluster,
- console: console$1,
- constants: constants,
- crypto: crypto,
- _debugger: _debugger,
- dgram: dgram,
- dns: dns,
- domain: domain,
- events: events,
- freelist: freelist,
- fs: fs$1,
- http: http,
- http2: http2,
- https: https,
- _http_server: _http_server,
- _linklist: _linklist,
- module: module$1,
- net: net,
- os: os$1,
- path: path$1,
- perf_hooks: perf_hooks,
- process: process$1,
- punycode: punycode,
- querystring: querystring,
- readline: readline,
- repl: repl,
- stream: stream,
- string_decoder: string_decoder,
- sys: sys,
- timers: timers,
- tls: tls,
- tty: tty,
- url: url$1,
- util: util$3,
- v8: v8,
- vm: vm,
- zlib: zlib,
- default: core$1
- });
- var data = ( core$2 && core$1 ) || core$2;
- var current = (process.versions && process.versions.node && process.versions.node.split('.')) || [];
- function versionIncluded(specifier) {
- if (specifier === true) { return true; }
- var parts = specifier.split(' ');
- var op = parts[0];
- var versionParts = parts[1].split('.');
- for (var i = 0; i < 3; ++i) {
- var cur = Number(current[i] || 0);
- var ver = Number(versionParts[i] || 0);
- if (cur === ver) {
- continue; // eslint-disable-line no-restricted-syntax, no-continue
- }
- if (op === '<') {
- return cur < ver;
- } else if (op === '>=') {
- return cur >= ver;
- } else {
- return false;
- }
- }
- return false;
- }
- var core = {};
- for (var mod in data) { // eslint-disable-line no-restricted-syntax
- if (Object.prototype.hasOwnProperty.call(data, mod)) {
- core[mod] = versionIncluded(data[mod]);
- }
- }
- var core_1 = core;
- var caller = function () {
- // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
- var origPrepareStackTrace = Error.prepareStackTrace;
- Error.prepareStackTrace = function (_, stack) { return stack; };
- var stack = (new Error()).stack;
- Error.prepareStackTrace = origPrepareStackTrace;
- return stack[2].getFileName();
- };
- var pathParse = createCommonjsModule(function (module) {
- 'use strict';
- var isWindows = process.platform === 'win32';
- // Regex to split a windows path into three parts: [*, device, slash,
- // tail] windows-only
- var splitDeviceRe =
- /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
- // Regex to split the tail part of the above into [*, dir, basename, ext]
- var splitTailRe =
- /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/;
- var win32 = {};
- // Function to split a filename into [root, dir, basename, ext]
- function win32SplitPath(filename) {
- // Separate device+slash from tail
- var result = splitDeviceRe.exec(filename),
- device = (result[1] || '') + (result[2] || ''),
- tail = result[3] || '';
- // Split the tail into dir, basename and extension
- var result2 = splitTailRe.exec(tail),
- dir = result2[1],
- basename = result2[2],
- ext = result2[3];
- return [device, dir, basename, ext];
- }
- win32.parse = function(pathString) {
- if (typeof pathString !== 'string') {
- throw new TypeError(
- "Parameter 'pathString' must be a string, not " + typeof pathString
- );
- }
- var allParts = win32SplitPath(pathString);
- if (!allParts || allParts.length !== 4) {
- throw new TypeError("Invalid path '" + pathString + "'");
- }
- return {
- root: allParts[0],
- dir: allParts[0] + allParts[1].slice(0, -1),
- base: allParts[2],
- ext: allParts[3],
- name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
- };
- };
- // Split a filename into [root, dir, basename, ext], unix version
- // 'root' is just a slash, or nothing.
- var splitPathRe =
- /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
- var posix = {};
- function posixSplitPath(filename) {
- return splitPathRe.exec(filename).slice(1);
- }
- posix.parse = function(pathString) {
- if (typeof pathString !== 'string') {
- throw new TypeError(
- "Parameter 'pathString' must be a string, not " + typeof pathString
- );
- }
- var allParts = posixSplitPath(pathString);
- if (!allParts || allParts.length !== 4) {
- throw new TypeError("Invalid path '" + pathString + "'");
- }
- allParts[1] = allParts[1] || '';
- allParts[2] = allParts[2] || '';
- allParts[3] = allParts[3] || '';
- return {
- root: allParts[0],
- dir: allParts[0] + allParts[1].slice(0, -1),
- base: allParts[2],
- ext: allParts[3],
- name: allParts[2].slice(0, allParts[2].length - allParts[3].length)
- };
- };
- if (isWindows)
- module.exports = win32.parse;
- else /* posix */
- module.exports = posix.parse;
- module.exports.posix = posix.parse;
- module.exports.win32 = win32.parse;
- });
- var parse = path.parse || pathParse;
- var nodeModulesPaths = function nodeModulesPaths(start, opts) {
- var modules = opts && opts.moduleDirectory
- ? [].concat(opts.moduleDirectory)
- : ['node_modules'];
- // ensure that `start` is an absolute path at this point,
- // resolving against the process' current working directory
- var absoluteStart = path.resolve(start);
- if (opts && opts.preserveSymlinks === false) {
- try {
- absoluteStart = fs.realpathSync(absoluteStart);
- } catch (err) {
- if (err.code !== 'ENOENT') {
- throw err;
- }
- }
- }
- var prefix = '/';
- if (/^([A-Za-z]:)/.test(absoluteStart)) {
- prefix = '';
- } else if (/^\\\\/.test(absoluteStart)) {
- prefix = '\\\\';
- }
- var paths = [absoluteStart];
- var parsed = parse(absoluteStart);
- while (parsed.dir !== paths[paths.length - 1]) {
- paths.push(parsed.dir);
- parsed = parse(parsed.dir);
- }
- var dirs = paths.reduce(function (dirs, aPath) {
- return dirs.concat(modules.map(function (moduleDir) {
- return path.join(prefix, aPath, moduleDir);
- }));
- }, []);
- return opts && opts.paths ? dirs.concat(opts.paths) : dirs;
- };
- var async = function resolve(x, options, callback) {
- var cb = callback;
- var opts = options || {};
- if (typeof opts === 'function') {
- cb = opts;
- opts = {};
- }
- if (typeof x !== 'string') {
- var err = new TypeError('Path must be a string.');
- return process.nextTick(function () {
- cb(err);
- });
- }
- var isFile = opts.isFile || function (file, cb) {
- fs.stat(file, function (err, stat) {
- if (!err) {
- return cb(null, stat.isFile() || stat.isFIFO());
- }
- if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);
- return cb(err);
- });
- };
- var readFile = opts.readFile || fs.readFile;
- var extensions = opts.extensions || ['.js'];
- var y = opts.basedir || path.dirname(caller());
- opts.paths = opts.paths || [];
- if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/.test(x)) {
- var res = path.resolve(y, x);
- if (x === '..' || x.slice(-1) === '/') res += '/';
- if (/\/$/.test(x) && res === y) {
- loadAsDirectory(res, opts.package, onfile);
- } else loadAsFile(res, opts.package, onfile);
- } else loadNodeModules(x, y, function (err, n, pkg) {
- if (err) cb(err);
- else if (n) cb(null, n, pkg);
- else if (core_1[x]) return cb(null, x);
- else {
- var moduleError = new Error("Cannot find module '" + x + "' from '" + y + "'");
- moduleError.code = 'MODULE_NOT_FOUND';
- cb(moduleError);
- }
- });
- function onfile(err, m, pkg) {
- if (err) cb(err);
- else if (m) cb(null, m, pkg);
- else loadAsDirectory(res, function (err, d, pkg) {
- if (err) cb(err);
- else if (d) cb(null, d, pkg);
- else {
- var moduleError = new Error("Cannot find module '" + x + "' from '" + y + "'");
- moduleError.code = 'MODULE_NOT_FOUND';
- cb(moduleError);
- }
- });
- }
- function loadAsFile(x, thePackage, callback) {
- var loadAsFilePackage = thePackage;
- var cb = callback;
- if (typeof loadAsFilePackage === 'function') {
- cb = loadAsFilePackage;
- loadAsFilePackage = undefined;
- }
- var exts = [''].concat(extensions);
- load(exts, x, loadAsFilePackage);
- function load(exts, x, loadPackage) {
- if (exts.length === 0) return cb(null, undefined, loadPackage);
- var file = x + exts[0];
- var pkg = loadPackage;
- if (pkg) onpkg(null, pkg);
- else loadpkg(path.dirname(file), onpkg);
- function onpkg(err, pkg_, dir) {
- pkg = pkg_;
- if (err) return cb(err);
- if (dir && pkg && opts.pathFilter) {
- var rfile = path.relative(dir, file);
- var rel = rfile.slice(0, rfile.length - exts[0].length);
- var r = opts.pathFilter(pkg, x, rel);
- if (r) return load(
- [''].concat(extensions.slice()),
- path.resolve(dir, r),
- pkg
- );
- }
- isFile(file, onex);
- }
- function onex(err, ex) {
- if (err) return cb(err);
- if (ex) return cb(null, file, pkg);
- load(exts.slice(1), x, pkg);
- }
- }
- }
- function loadpkg(dir, cb) {
- if (dir === '' || dir === '/') return cb(null);
- if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) {
- return cb(null);
- }
- if (/[/\\]node_modules[/\\]*$/.test(dir)) return cb(null);
- var pkgfile = path.join(dir, 'package.json');
- isFile(pkgfile, function (err, ex) {
- // on err, ex is false
- if (!ex) return loadpkg(path.dirname(dir), cb);
- readFile(pkgfile, function (err, body) {
- if (err) cb(err);
- try { var pkg = JSON.parse(body); } catch (jsonErr) {}
- if (pkg && opts.packageFilter) {
- pkg = opts.packageFilter(pkg, pkgfile);
- }
- cb(null, pkg, dir);
- });
- });
- }
- function loadAsDirectory(x, loadAsDirectoryPackage, callback) {
- var cb = callback;
- var fpkg = loadAsDirectoryPackage;
- if (typeof fpkg === 'function') {
- cb = fpkg;
- fpkg = opts.package;
- }
- var pkgfile = path.join(x, 'package.json');
- isFile(pkgfile, function (err, ex) {
- if (err) return cb(err);
- if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb);
- readFile(pkgfile, function (err, body) {
- if (err) return cb(err);
- try {
- var pkg = JSON.parse(body);
- } catch (jsonErr) {}
- if (opts.packageFilter) {
- pkg = opts.packageFilter(pkg, pkgfile);
- }
- if (pkg.main) {
- if (pkg.main === '.' || pkg.main === './') {
- pkg.main = 'index';
- }
- loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) {
- if (err) return cb(err);
- if (m) return cb(null, m, pkg);
- if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb);
- var dir = path.resolve(x, pkg.main);
- loadAsDirectory(dir, pkg, function (err, n, pkg) {
- if (err) return cb(err);
- if (n) return cb(null, n, pkg);
- loadAsFile(path.join(x, 'index'), pkg, cb);
- });
- });
- return;
- }
- loadAsFile(path.join(x, '/index'), pkg, cb);
- });
- });
- }
- function processDirs(cb, dirs) {
- if (dirs.length === 0) return cb(null, undefined);
- var dir = dirs[0];
- var file = path.join(dir, x);
- loadAsFile(file, undefined, onfile);
- function onfile(err, m, pkg) {
- if (err) return cb(err);
- if (m) return cb(null, m, pkg);
- loadAsDirectory(path.join(dir, x), undefined, ondir);
- }
- function ondir(err, n, pkg) {
- if (err) return cb(err);
- if (n) return cb(null, n, pkg);
- processDirs(cb, dirs.slice(1));
- }
- }
- function loadNodeModules(x, start, cb) {
- processDirs(cb, nodeModulesPaths(start, opts));
- }
- };
- var sync = function (x, options) {
- if (typeof x !== 'string') {
- throw new TypeError('Path must be a string.');
- }
- var opts = options || {};
- var isFile = opts.isFile || function (file) {
- try {
- var stat = fs.statSync(file);
- } catch (e) {
- if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;
- throw e;
- }
- return stat.isFile() || stat.isFIFO();
- };
- var readFileSync = opts.readFileSync || fs.readFileSync;
- var extensions = opts.extensions || ['.js'];
- var y = opts.basedir || path.dirname(caller());
- opts.paths = opts.paths || [];
- if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/.test(x)) {
- var res = path.resolve(y, x);
- if (x === '..' || x.slice(-1) === '/') res += '/';
- var m = loadAsFileSync(res) || loadAsDirectorySync(res);
- if (m) return m;
- } else {
- var n = loadNodeModulesSync(x, y);
- if (n) return n;
- }
- if (core_1[x]) return x;
- var err = new Error("Cannot find module '" + x + "' from '" + y + "'");
- err.code = 'MODULE_NOT_FOUND';
- throw err;
- function loadAsFileSync(x) {
- if (isFile(x)) {
- return x;
- }
- for (var i = 0; i < extensions.length; i++) {
- var file = x + extensions[i];
- if (isFile(file)) {
- return file;
- }
- }
- }
- function loadAsDirectorySync(x) {
- var pkgfile = path.join(x, '/package.json');
- if (isFile(pkgfile)) {
- try {
- var body = readFileSync(pkgfile, 'UTF8');
- var pkg = JSON.parse(body);
- if (opts.packageFilter) {
- pkg = opts.packageFilter(pkg, x);
- }
- if (pkg.main) {
- if (pkg.main === '.' || pkg.main === './') {
- pkg.main = 'index';
- }
- var m = loadAsFileSync(path.resolve(x, pkg.main));
- if (m) return m;
- var n = loadAsDirectorySync(path.resolve(x, pkg.main));
- if (n) return n;
- }
- } catch (e) {}
- }
- return loadAsFileSync(path.join(x, '/index'));
- }
- function loadNodeModulesSync(x, start) {
- var dirs = nodeModulesPaths(start, opts);
- for (var i = 0; i < dirs.length; i++) {
- var dir = dirs[i];
- var m = loadAsFileSync(path.join(dir, '/', x));
- if (m) return m;
- var n = loadAsDirectorySync(path.join(dir, '/', x));
- if (n) return n;
- }
- }
- };
- var resolve = createCommonjsModule(function (module, exports) {
- async.core = core_1;
- async.isCore = function isCore(x) { return core_1[x]; };
- async.sync = sync;
- exports = async;
- module.exports = async;
- });
- var pathExists = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = fp => new Promise(resolve => {
- fs.access(fp, err => {
- resolve(!err);
- });
- });
- module.exports.sync = fp => {
- try {
- fs.accessSync(fp);
- return true;
- } catch (err) {
- return false;
- }
- };
- });
- var pLimit = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = concurrency => {
- if (concurrency < 1) {
- throw new TypeError('Expected `concurrency` to be a number from 1 and up');
- }
- const queue = [];
- let activeCount = 0;
- const next = () => {
- activeCount--;
- if (queue.length > 0) {
- queue.shift()();
- }
- };
- return fn => new Promise((resolve, reject) => {
- const run = () => {
- activeCount++;
- fn().then(
- val => {
- resolve(val);
- next();
- },
- err => {
- reject(err);
- next();
- }
- );
- };
- if (activeCount < concurrency) {
- run();
- } else {
- queue.push(run);
- }
- });
- };
- });
- var pLocate = createCommonjsModule(function (module) {
- 'use strict';
- class EndError extends Error {
- constructor(value) {
- super();
- this.value = value;
- }
- }
- // the input can also be a promise, so we `Promise.all()` them both
- const finder = el => Promise.all(el).then(val => val[1] === true && Promise.reject(new EndError(val[0])));
- module.exports = (iterable, tester, opts) => {
- opts = Object.assign({
- concurrency: Infinity,
- preserveOrder: true
- }, opts);
- const limit = pLimit(opts.concurrency);
- // start all the promises concurrently with optional limit
- const items = Array.from(iterable).map(el => [el, limit(() => Promise.resolve(el).then(tester))]);
- // check the promises either serially or concurrently
- const checkLimit = pLimit(opts.preserveOrder ? 1 : Infinity);
- return Promise.all(items.map(el => checkLimit(() => finder(el))))
- .then(() => {})
- .catch(err => err instanceof EndError ? err.value : Promise.reject(err));
- };
- });
- var locatePath = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = (iterable, opts) => {
- opts = Object.assign({
- cwd: process.cwd()
- }, opts);
- return pLocate(iterable, el => pathExists(path.resolve(opts.cwd, el)), opts);
- };
- module.exports.sync = (iterable, opts) => {
- opts = Object.assign({
- cwd: process.cwd()
- }, opts);
- for (const el of iterable) {
- if (pathExists.sync(path.resolve(opts.cwd, el))) {
- return el;
- }
- }
- };
- });
- var findUp = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = (filename, opts) => {
- opts = opts || {};
- const startDir = path.resolve(opts.cwd || '');
- const root = path.parse(startDir).root;
- const filenames = [].concat(filename);
- return new Promise(resolve => {
- (function find(dir) {
- locatePath(filenames, {cwd: dir}).then(file => {
- if (file) {
- resolve(path.join(dir, file));
- } else if (dir === root) {
- resolve(null);
- } else {
- find(path.dirname(dir));
- }
- });
- })(startDir);
- });
- };
- module.exports.sync = (filename, opts) => {
- opts = opts || {};
- let dir = path.resolve(opts.cwd || '');
- const root = path.parse(dir).root;
- const filenames = [].concat(filename);
- // eslint-disable-next-line no-constant-condition
- while (true) {
- const file = locatePath.sync(filenames, {cwd: dir});
- if (file) {
- return path.join(dir, file);
- } else if (dir === root) {
- return null;
- }
- dir = path.dirname(dir);
- }
- };
- });
- var stripBom = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = x => {
- if (typeof x !== 'string') {
- throw new TypeError('Expected a string, got ' + typeof x);
- }
- // Catches EFBBBF (UTF-8 BOM) because the buffer-to-string
- // conversion translates it to FEFF (UTF-16 BOM)
- if (x.charCodeAt(0) === 0xFEFF) {
- return x.slice(1);
- }
- return x;
- };
- });
- var isArrayish = function isArrayish(obj) {
- if (!obj) {
- return false;
- }
- return obj instanceof Array || Array.isArray(obj) ||
- (obj.length >= 0 && obj.splice instanceof Function);
- };
- var errorEx = function errorEx(name, properties) {
- if (!name || name.constructor !== String) {
- properties = name || {};
- name = Error.name;
- }
- var errorExError = function ErrorEXError(message) {
- if (!this) {
- return new ErrorEXError(message);
- }
- message = message instanceof Error
- ? message.message
- : (message || this.message);
- Error.call(this, message);
- Error.captureStackTrace(this, errorExError);
- this.name = name;
- Object.defineProperty(this, 'message', {
- configurable: true,
- enumerable: false,
- get: function () {
- var newMessage = message.split(/\r?\n/g);
- for (var key in properties) {
- if (!properties.hasOwnProperty(key)) {
- continue;
- }
- var modifier = properties[key];
- if ('message' in modifier) {
- newMessage = modifier.message(this[key], newMessage) || newMessage;
- if (!isArrayish(newMessage)) {
- newMessage = [newMessage];
- }
- }
- }
- return newMessage.join('\n');
- },
- set: function (v) {
- message = v;
- }
- });
- var stackDescriptor = Object.getOwnPropertyDescriptor(this, 'stack');
- var stackGetter = stackDescriptor.get;
- var stackValue = stackDescriptor.value;
- delete stackDescriptor.value;
- delete stackDescriptor.writable;
- stackDescriptor.get = function () {
- var stack = (stackGetter)
- ? stackGetter.call(this).split(/\r?\n+/g)
- : stackValue.split(/\r?\n+/g);
- // starting in Node 7, the stack builder caches the message.
- // just replace it.
- stack[0] = this.name + ': ' + this.message;
- var lineCount = 1;
- for (var key in properties) {
- if (!properties.hasOwnProperty(key)) {
- continue;
- }
- var modifier = properties[key];
- if ('line' in modifier) {
- var line = modifier.line(this[key]);
- if (line) {
- stack.splice(lineCount++, 0, ' ' + line);
- }
- }
- if ('stack' in modifier) {
- modifier.stack(this[key], stack);
- }
- }
- return stack.join('\n');
- };
- Object.defineProperty(this, 'stack', stackDescriptor);
- };
- if (Object.setPrototypeOf) {
- Object.setPrototypeOf(errorExError.prototype, Error.prototype);
- Object.setPrototypeOf(errorExError, Error);
- } else {
- util.inherits(errorExError, Error);
- }
- return errorExError;
- };
- errorEx.append = function (str, def) {
- return {
- message: function (v, message) {
- v = v || def;
- if (v) {
- message[0] += ' ' + str.replace('%s', v.toString());
- }
- return message;
- }
- };
- };
- errorEx.line = function (str, def) {
- return {
- line: function (v) {
- v = v || def;
- if (v) {
- return str.replace('%s', v.toString());
- }
- return null;
- }
- };
- };
- var errorEx_1 = errorEx;
- var jsonParseBetterErrors = parseJson$2;
- function parseJson$2 (txt, reviver, context) {
- context = context || 20;
- try {
- return JSON.parse(txt, reviver)
- } catch (e) {
- const syntaxErr = e.message.match(/^Unexpected token.*position\s+(\d+)/i);
- const errIdx = syntaxErr
- ? +syntaxErr[1]
- : e.message.match(/^Unexpected end of JSON.*/i)
- ? txt.length - 1
- : null;
- if (errIdx != null) {
- const start = errIdx <= context
- ? 0
- : errIdx - context;
- const end = errIdx + context >= txt.length
- ? txt.length
- : errIdx + context;
- e.message += ` while parsing near '${
- start === 0 ? '' : '...'
- }${txt.slice(start, end)}${
- end === txt.length ? '' : '...'
- }'`;
- } else {
- e.message += ` while parsing '${txt.slice(0, context * 2)}'`;
- }
- throw e
- }
- }
- var parseJson = createCommonjsModule(function (module) {
- 'use strict';
- const JSONError = errorEx_1('JSONError', {
- fileName: errorEx_1.append('in %s')
- });
- module.exports = (input, reviver, filename) => {
- if (typeof reviver === 'string') {
- filename = reviver;
- reviver = null;
- }
- try {
- try {
- return JSON.parse(input, reviver);
- } catch (err) {
- jsonParseBetterErrors(input, reviver);
- throw err;
- }
- } catch (err) {
- err.message = err.message.replace(/\n/g, '');
- const jsonErr = new JSONError(err);
- if (filename) {
- jsonErr.fileName = filename;
- }
- throw jsonErr;
- }
- };
- });
- var pify = createCommonjsModule(function (module) {
- 'use strict';
- const processFn = (fn, opts) => function () {
- const P = opts.promiseModule;
- const args = new Array(arguments.length);
- for (let i = 0; i < arguments.length; i++) {
- args[i] = arguments[i];
- }
- return new P((resolve, reject) => {
- if (opts.errorFirst) {
- args.push(function (err, result) {
- if (opts.multiArgs) {
- const results = new Array(arguments.length - 1);
- for (let i = 1; i < arguments.length; i++) {
- results[i - 1] = arguments[i];
- }
- if (err) {
- results.unshift(err);
- reject(results);
- } else {
- resolve(results);
- }
- } else if (err) {
- reject(err);
- } else {
- resolve(result);
- }
- });
- } else {
- args.push(function (result) {
- if (opts.multiArgs) {
- const results = new Array(arguments.length - 1);
- for (let i = 0; i < arguments.length; i++) {
- results[i] = arguments[i];
- }
- resolve(results);
- } else {
- resolve(result);
- }
- });
- }
- fn.apply(this, args);
- });
- };
- module.exports = (obj, opts) => {
- opts = Object.assign({
- exclude: [/.+(Sync|Stream)$/],
- errorFirst: true,
- promiseModule: Promise
- }, opts);
- const filter = key => {
- const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key);
- return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
- };
- let ret;
- if (typeof obj === 'function') {
- ret = function () {
- if (opts.excludeMain) {
- return obj.apply(this, arguments);
- }
- return processFn(obj, opts).apply(this, arguments);
- };
- } else {
- ret = Object.create(Object.getPrototypeOf(obj));
- }
- for (const key in obj) { // eslint-disable-line guard-for-in
- const x = obj[key];
- ret[key] = typeof x === 'function' && filter(key) ? processFn(x, opts) : x;
- }
- return ret;
- };
- });
- const parse$1 = (data, fp) => parseJson(stripBom(data), path.relative('.', fp));
- var loadJsonFile = fp => pify(fs.readFile)(fp, 'utf8').then(data => parse$1(data, fp));
- var sync$2 = fp => parse$1(fs.readFileSync(fp, 'utf8'), fp);
- loadJsonFile.sync = sync$2;
- var pify$3 = createCommonjsModule(function (module) {
- 'use strict';
- const processFn = (fn, opts) => function () {
- const P = opts.promiseModule;
- const args = new Array(arguments.length);
- for (let i = 0; i < arguments.length; i++) {
- args[i] = arguments[i];
- }
- return new P((resolve, reject) => {
- if (opts.errorFirst) {
- args.push(function (err, result) {
- if (opts.multiArgs) {
- const results = new Array(arguments.length - 1);
- for (let i = 1; i < arguments.length; i++) {
- results[i - 1] = arguments[i];
- }
- if (err) {
- results.unshift(err);
- reject(results);
- } else {
- resolve(results);
- }
- } else if (err) {
- reject(err);
- } else {
- resolve(result);
- }
- });
- } else {
- args.push(function (result) {
- if (opts.multiArgs) {
- const results = new Array(arguments.length - 1);
- for (let i = 0; i < arguments.length; i++) {
- results[i] = arguments[i];
- }
- resolve(results);
- } else {
- resolve(result);
- }
- });
- }
- fn.apply(this, args);
- });
- };
- module.exports = (obj, opts) => {
- opts = Object.assign({
- exclude: [/.+(Sync|Stream)$/],
- errorFirst: true,
- promiseModule: Promise
- }, opts);
- const filter = key => {
- const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key);
- return opts.include ? opts.include.some(match) : !opts.exclude.some(match);
- };
- let ret;
- if (typeof obj === 'function') {
- ret = function () {
- if (opts.excludeMain) {
- return obj.apply(this, arguments);
- }
- return processFn(obj, opts).apply(this, arguments);
- };
- } else {
- ret = Object.create(Object.getPrototypeOf(obj));
- }
- for (const key in obj) { // eslint-disable-line guard-for-in
- const x = obj[key];
- ret[key] = typeof x === 'function' && filter(key) ? processFn(x, opts) : x;
- }
- return ret;
- };
- });
- function type(fn, fn2, fp) {
- if (typeof fp !== 'string') {
- return Promise.reject(new TypeError(`Expected a string, got ${typeof fp}`));
- }
- return pify$3(fs[fn])(fp)
- .then(stats => stats[fn2]())
- .catch(err => {
- if (err.code === 'ENOENT') {
- return false;
- }
- throw err;
- });
- }
- function typeSync(fn, fn2, fp) {
- if (typeof fp !== 'string') {
- throw new TypeError(`Expected a string, got ${typeof fp}`);
- }
- try {
- return fs[fn](fp)[fn2]();
- } catch (err) {
- if (err.code === 'ENOENT') {
- return false;
- }
- throw err;
- }
- }
- var file = type.bind(null, 'stat', 'isFile');
- var dir = type.bind(null, 'stat', 'isDirectory');
- var symlink = type.bind(null, 'lstat', 'isSymbolicLink');
- var fileSync = typeSync.bind(null, 'statSync', 'isFile');
- var dirSync = typeSync.bind(null, 'statSync', 'isDirectory');
- var symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink');
- var pathType = {
- file: file,
- dir: dir,
- symlink: symlink,
- fileSync: fileSync,
- dirSync: dirSync,
- symlinkSync: symlinkSync
- };
- var parser$1 = createCommonjsModule(function (module, exports) {
- /* parser generated by jison 0.4.17 */
- /*
- Returns a Parser object of the following structure:
- Parser: {
- yy: {}
- }
- Parser.prototype: {
- yy: {},
- trace: function(),
- symbols_: {associative list: name ==> number},
- terminals_: {associative list: number ==> name},
- productions_: [...],
- performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
- table: [...],
- defaultActions: {...},
- parseError: function(str, hash),
- parse: function(input),
- lexer: {
- EOF: 1,
- parseError: function(str, hash),
- setInput: function(input),
- input: function(),
- unput: function(str),
- more: function(),
- less: function(n),
- pastInput: function(),
- upcomingInput: function(),
- showPosition: function(),
- test_match: function(regex_match_array, rule_index),
- next: function(),
- lex: function(),
- begin: function(condition),
- popState: function(),
- _currentRules: function(),
- topState: function(),
- pushState: function(condition),
- options: {
- ranges: boolean (optional: true ==> token location info will include a .range[] member)
- flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
- backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
- },
- performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
- rules: [...],
- conditions: {associative list: name ==> set},
- }
- }
- token location info (@$, _$, etc.): {
- first_line: n,
- last_line: n,
- first_column: n,
- last_column: n,
- range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
- }
- the parseError function receives a 'hash' object with these members for lexer and parser errors: {
- text: (matched text)
- token: (the produced terminal token, if any)
- line: (yylineno)
- }
- while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
- loc: (yylloc)
- expected: (string describing the set of expected tokens)
- recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
- }
- */
- var spdxparse = (function(){
- var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17];
- var parser = {trace: function trace() { },
- yy: {},
- symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1},
- terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"},
- productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]],
- performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
- /* this == yyval */
- var $0 = $$.length - 1;
- switch (yystate) {
- case 1:
- return this.$ = $$[$0-1]
- break;
- case 2: case 4: case 5:
- this.$ = {license: yytext};
- break;
- case 3:
- this.$ = {license: $$[$0-1], plus: true};
- break;
- case 6:
- this.$ = $$[$0];
- break;
- case 7:
- this.$ = {exception: $$[$0]};
- this.$.license = $$[$0-2].license;
- if ($$[$0-2].hasOwnProperty('plus')) {
- this.$.plus = $$[$0-2].plus;
- }
- break;
- case 8:
- this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]};
- break;
- case 9:
- this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]};
- break;
- case 10:
- this.$ = $$[$0-1];
- break;
- }
- },
- table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])],
- defaultActions: {8:[2,1]},
- parseError: function parseError(str, hash) {
- if (hash.recoverable) {
- this.trace(str);
- } else {
- function _parseError (msg, hash) {
- this.message = msg;
- this.hash = hash;
- }
- _parseError.prototype = Error;
- throw new _parseError(str, hash);
- }
- },
- parse: function parse(input) {
- var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
- var args = lstack.slice.call(arguments, 1);
- var lexer = Object.create(this.lexer);
- var sharedState = { yy: {} };
- for (var k in this.yy) {
- if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
- sharedState.yy[k] = this.yy[k];
- }
- }
- lexer.setInput(input, sharedState.yy);
- sharedState.yy.lexer = lexer;
- sharedState.yy.parser = this;
- if (typeof lexer.yylloc == 'undefined') {
- lexer.yylloc = {};
- }
- var yyloc = lexer.yylloc;
- lstack.push(yyloc);
- var ranges = lexer.options && lexer.options.ranges;
- if (typeof sharedState.yy.parseError === 'function') {
- this.parseError = sharedState.yy.parseError;
- } else {
- this.parseError = Object.getPrototypeOf(this).parseError;
- }
- _token_stack:
- var lex = function () {
- var token;
- token = lexer.lex() || EOF;
- if (typeof token !== 'number') {
- token = self.symbols_[token] || token;
- }
- return token;
- };
- var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
- while (true) {
- state = stack[stack.length - 1];
- if (this.defaultActions[state]) {
- action = this.defaultActions[state];
- } else {
- if (symbol === null || typeof symbol == 'undefined') {
- symbol = lex();
- }
- action = table[state] && table[state][symbol];
- }
- if (typeof action === 'undefined' || !action.length || !action[0]) {
- var errStr = '';
- expected = [];
- for (p in table[state]) {
- if (this.terminals_[p] && p > TERROR) {
- expected.push('\'' + this.terminals_[p] + '\'');
- }
- }
- if (lexer.showPosition) {
- errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
- } else {
- errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
- }
- this.parseError(errStr, {
- text: lexer.match,
- token: this.terminals_[symbol] || symbol,
- line: lexer.yylineno,
- loc: yyloc,
- expected: expected
- });
- }
- if (action[0] instanceof Array && action.length > 1) {
- throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
- }
- switch (action[0]) {
- case 1:
- stack.push(symbol);
- vstack.push(lexer.yytext);
- lstack.push(lexer.yylloc);
- stack.push(action[1]);
- symbol = null;
- if (!preErrorSymbol) {
- yyleng = lexer.yyleng;
- yytext = lexer.yytext;
- yylineno = lexer.yylineno;
- yyloc = lexer.yylloc;
- if (recovering > 0) {
- recovering--;
- }
- } else {
- symbol = preErrorSymbol;
- preErrorSymbol = null;
- }
- break;
- case 2:
- len = this.productions_[action[1]][1];
- yyval.$ = vstack[vstack.length - len];
- yyval._$ = {
- first_line: lstack[lstack.length - (len || 1)].first_line,
- last_line: lstack[lstack.length - 1].last_line,
- first_column: lstack[lstack.length - (len || 1)].first_column,
- last_column: lstack[lstack.length - 1].last_column
- };
- if (ranges) {
- yyval._$.range = [
- lstack[lstack.length - (len || 1)].range[0],
- lstack[lstack.length - 1].range[1]
- ];
- }
- r = this.performAction.apply(yyval, [
- yytext,
- yyleng,
- yylineno,
- sharedState.yy,
- action[1],
- vstack,
- lstack
- ].concat(args));
- if (typeof r !== 'undefined') {
- return r;
- }
- if (len) {
- stack = stack.slice(0, -1 * len * 2);
- vstack = vstack.slice(0, -1 * len);
- lstack = lstack.slice(0, -1 * len);
- }
- stack.push(this.productions_[action[1]][0]);
- vstack.push(yyval.$);
- lstack.push(yyval._$);
- newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
- stack.push(newState);
- break;
- case 3:
- return true;
- }
- }
- return true;
- }};
- /* generated by jison-lex 0.3.4 */
- var lexer = (function(){
- var lexer = ({
- EOF:1,
- parseError:function parseError(str, hash) {
- if (this.yy.parser) {
- this.yy.parser.parseError(str, hash);
- } else {
- throw new Error(str);
- }
- },
- // resets the lexer, sets new input
- setInput:function (input, yy) {
- this.yy = yy || this.yy || {};
- this._input = input;
- this._more = this._backtrack = this.done = false;
- this.yylineno = this.yyleng = 0;
- this.yytext = this.matched = this.match = '';
- this.conditionStack = ['INITIAL'];
- this.yylloc = {
- first_line: 1,
- first_column: 0,
- last_line: 1,
- last_column: 0
- };
- if (this.options.ranges) {
- this.yylloc.range = [0,0];
- }
- this.offset = 0;
- return this;
- },
- // consumes and returns one char from the input
- input:function () {
- var ch = this._input[0];
- this.yytext += ch;
- this.yyleng++;
- this.offset++;
- this.match += ch;
- this.matched += ch;
- var lines = ch.match(/(?:\r\n?|\n).*/g);
- if (lines) {
- this.yylineno++;
- this.yylloc.last_line++;
- } else {
- this.yylloc.last_column++;
- }
- if (this.options.ranges) {
- this.yylloc.range[1]++;
- }
- this._input = this._input.slice(1);
- return ch;
- },
- // unshifts one char (or a string) into the input
- unput:function (ch) {
- var len = ch.length;
- var lines = ch.split(/(?:\r\n?|\n)/g);
- this._input = ch + this._input;
- this.yytext = this.yytext.substr(0, this.yytext.length - len);
- //this.yyleng -= len;
- this.offset -= len;
- var oldLines = this.match.split(/(?:\r\n?|\n)/g);
- this.match = this.match.substr(0, this.match.length - 1);
- this.matched = this.matched.substr(0, this.matched.length - 1);
- if (lines.length - 1) {
- this.yylineno -= lines.length - 1;
- }
- var r = this.yylloc.range;
- this.yylloc = {
- first_line: this.yylloc.first_line,
- last_line: this.yylineno + 1,
- first_column: this.yylloc.first_column,
- last_column: lines ?
- (lines.length === oldLines.length ? this.yylloc.first_column : 0)
- + oldLines[oldLines.length - lines.length].length - lines[0].length :
- this.yylloc.first_column - len
- };
- if (this.options.ranges) {
- this.yylloc.range = [r[0], r[0] + this.yyleng - len];
- }
- this.yyleng = this.yytext.length;
- return this;
- },
- // When called from action, caches matched text and appends it on next action
- more:function () {
- this._more = true;
- return this;
- },
- // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
- reject:function () {
- if (this.options.backtrack_lexer) {
- this._backtrack = true;
- } else {
- return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
- text: "",
- token: null,
- line: this.yylineno
- });
- }
- return this;
- },
- // retain first n characters of the match
- less:function (n) {
- this.unput(this.match.slice(n));
- },
- // displays already matched input, i.e. for error messages
- pastInput:function () {
- var past = this.matched.substr(0, this.matched.length - this.match.length);
- return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
- },
- // displays upcoming input, i.e. for error messages
- upcomingInput:function () {
- var next = this.match;
- if (next.length < 20) {
- next += this._input.substr(0, 20-next.length);
- }
- return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
- },
- // displays the character position where the lexing error occurred, i.e. for error messages
- showPosition:function () {
- var pre = this.pastInput();
- var c = new Array(pre.length + 1).join("-");
- return pre + this.upcomingInput() + "\n" + c + "^";
- },
- // test the lexed token: return FALSE when not a match, otherwise return token
- test_match:function (match, indexed_rule) {
- var token,
- lines,
- backup;
- if (this.options.backtrack_lexer) {
- // save context
- backup = {
- yylineno: this.yylineno,
- yylloc: {
- first_line: this.yylloc.first_line,
- last_line: this.last_line,
- first_column: this.yylloc.first_column,
- last_column: this.yylloc.last_column
- },
- yytext: this.yytext,
- match: this.match,
- matches: this.matches,
- matched: this.matched,
- yyleng: this.yyleng,
- offset: this.offset,
- _more: this._more,
- _input: this._input,
- yy: this.yy,
- conditionStack: this.conditionStack.slice(0),
- done: this.done
- };
- if (this.options.ranges) {
- backup.yylloc.range = this.yylloc.range.slice(0);
- }
- }
- lines = match[0].match(/(?:\r\n?|\n).*/g);
- if (lines) {
- this.yylineno += lines.length;
- }
- this.yylloc = {
- first_line: this.yylloc.last_line,
- last_line: this.yylineno + 1,
- first_column: this.yylloc.last_column,
- last_column: lines ?
- lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
- this.yylloc.last_column + match[0].length
- };
- this.yytext += match[0];
- this.match += match[0];
- this.matches = match;
- this.yyleng = this.yytext.length;
- if (this.options.ranges) {
- this.yylloc.range = [this.offset, this.offset += this.yyleng];
- }
- this._more = false;
- this._backtrack = false;
- this._input = this._input.slice(match[0].length);
- this.matched += match[0];
- token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
- if (this.done && this._input) {
- this.done = false;
- }
- if (token) {
- return token;
- } else if (this._backtrack) {
- // recover context
- for (var k in backup) {
- this[k] = backup[k];
- }
- return false; // rule action called reject() implying the next rule should be tested instead.
- }
- return false;
- },
- // return next match in input
- next:function () {
- if (this.done) {
- return this.EOF;
- }
- if (!this._input) {
- this.done = true;
- }
- var token,
- match,
- tempMatch,
- index;
- if (!this._more) {
- this.yytext = '';
- this.match = '';
- }
- var rules = this._currentRules();
- for (var i = 0; i < rules.length; i++) {
- tempMatch = this._input.match(this.rules[rules[i]]);
- if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
- match = tempMatch;
- index = i;
- if (this.options.backtrack_lexer) {
- token = this.test_match(tempMatch, rules[i]);
- if (token !== false) {
- return token;
- } else if (this._backtrack) {
- match = false;
- continue; // rule action called reject() implying a rule MISmatch.
- } else {
- // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
- return false;
- }
- } else if (!this.options.flex) {
- break;
- }
- }
- }
- if (match) {
- token = this.test_match(match, rules[index]);
- if (token !== false) {
- return token;
- }
- // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
- return false;
- }
- if (this._input === "") {
- return this.EOF;
- } else {
- return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
- text: "",
- token: null,
- line: this.yylineno
- });
- }
- },
- // return next match that has a token
- lex:function lex() {
- var r = this.next();
- if (r) {
- return r;
- } else {
- return this.lex();
- }
- },
- // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
- begin:function begin(condition) {
- this.conditionStack.push(condition);
- },
- // pop the previously active lexer condition state off the condition stack
- popState:function popState() {
- var n = this.conditionStack.length - 1;
- if (n > 0) {
- return this.conditionStack.pop();
- } else {
- return this.conditionStack[0];
- }
- },
- // produce the lexer rule set which is active for the currently active lexer condition state
- _currentRules:function _currentRules() {
- if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
- return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
- } else {
- return this.conditions["INITIAL"].rules;
- }
- },
- // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
- topState:function topState(n) {
- n = this.conditionStack.length - 1 - Math.abs(n || 0);
- if (n >= 0) {
- return this.conditionStack[n];
- } else {
- return "INITIAL";
- }
- },
- // alias for begin(condition)
- pushState:function pushState(condition) {
- this.begin(condition);
- },
- // return the number of states currently on the stack
- stateStackSize:function stateStackSize() {
- return this.conditionStack.length;
- },
- options: {},
- performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
- var YYSTATE=YY_START;
- switch($avoiding_name_collisions) {
- case 0:return 5
- break;
- case 1:/* skip whitespace */
- break;
- case 2:return 8
- break;
- case 3:return 16
- break;
- case 4:return 17
- break;
- case 5:return 11
- break;
- case 6:return 10
- break;
- case 7:return 9
- break;
- case 8:return 14
- break;
- case 9:return 15
- break;
- case 10:return 12
- break;
- case 11:return 7
- break;
- case 12:return 7
- break;
- case 13:return 7
- break;
- case 14:return 7
- break;
- case 15:return 7
- break;
- case 16:return 7
- break;
- case 17:return 7
- break;
- case 18:return 7
- break;
- case 19:return 7
- break;
- case 20:return 7
- break;
- case 21:return 7
- break;
- case 22:return 7
- break;
- case 23:return 7
- break;
- case 24:return 13
- break;
- case 25:return 13
- break;
- case 26:return 13
- break;
- case 27:return 13
- break;
- case 28:return 13
- break;
- case 29:return 13
- break;
- case 30:return 13
- break;
- case 31:return 13
- break;
- case 32:return 7
- break;
- case 33:return 13
- break;
- case 34:return 7
- break;
- case 35:return 13
- break;
- case 36:return 7
- break;
- case 37:return 13
- break;
- case 38:return 13
- break;
- case 39:return 7
- break;
- case 40:return 13
- break;
- case 41:return 13
- break;
- case 42:return 13
- break;
- case 43:return 13
- break;
- case 44:return 13
- break;
- case 45:return 7
- break;
- case 46:return 13
- break;
- case 47:return 7
- break;
- case 48:return 7
- break;
- case 49:return 7
- break;
- case 50:return 7
- break;
- case 51:return 7
- break;
- case 52:return 7
- break;
- case 53:return 7
- break;
- case 54:return 7
- break;
- case 55:return 7
- break;
- case 56:return 7
- break;
- case 57:return 7
- break;
- case 58:return 7
- break;
- case 59:return 7
- break;
- case 60:return 7
- break;
- case 61:return 7
- break;
- case 62:return 7
- break;
- case 63:return 13
- break;
- case 64:return 7
- break;
- case 65:return 7
- break;
- case 66:return 13
- break;
- case 67:return 7
- break;
- case 68:return 7
- break;
- case 69:return 7
- break;
- case 70:return 7
- break;
- case 71:return 7
- break;
- case 72:return 7
- break;
- case 73:return 13
- break;
- case 74:return 7
- break;
- case 75:return 13
- break;
- case 76:return 7
- break;
- case 77:return 7
- break;
- case 78:return 7
- break;
- case 79:return 7
- break;
- case 80:return 7
- break;
- case 81:return 7
- break;
- case 82:return 7
- break;
- case 83:return 7
- break;
- case 84:return 7
- break;
- case 85:return 7
- break;
- case 86:return 7
- break;
- case 87:return 7
- break;
- case 88:return 7
- break;
- case 89:return 7
- break;
- case 90:return 7
- break;
- case 91:return 7
- break;
- case 92:return 7
- break;
- case 93:return 7
- break;
- case 94:return 7
- break;
- case 95:return 7
- break;
- case 96:return 7
- break;
- case 97:return 7
- break;
- case 98:return 7
- break;
- case 99:return 7
- break;
- case 100:return 7
- break;
- case 101:return 7
- break;
- case 102:return 7
- break;
- case 103:return 7
- break;
- case 104:return 7
- break;
- case 105:return 7
- break;
- case 106:return 7
- break;
- case 107:return 7
- break;
- case 108:return 7
- break;
- case 109:return 7
- break;
- case 110:return 7
- break;
- case 111:return 7
- break;
- case 112:return 7
- break;
- case 113:return 7
- break;
- case 114:return 7
- break;
- case 115:return 7
- break;
- case 116:return 7
- break;
- case 117:return 7
- break;
- case 118:return 7
- break;
- case 119:return 7
- break;
- case 120:return 7
- break;
- case 121:return 7
- break;
- case 122:return 7
- break;
- case 123:return 7
- break;
- case 124:return 7
- break;
- case 125:return 7
- break;
- case 126:return 7
- break;
- case 127:return 7
- break;
- case 128:return 7
- break;
- case 129:return 7
- break;
- case 130:return 7
- break;
- case 131:return 7
- break;
- case 132:return 7
- break;
- case 133:return 7
- break;
- case 134:return 7
- break;
- case 135:return 7
- break;
- case 136:return 7
- break;
- case 137:return 7
- break;
- case 138:return 7
- break;
- case 139:return 7
- break;
- case 140:return 7
- break;
- case 141:return 7
- break;
- case 142:return 7
- break;
- case 143:return 7
- break;
- case 144:return 7
- break;
- case 145:return 7
- break;
- case 146:return 7
- break;
- case 147:return 7
- break;
- case 148:return 7
- break;
- case 149:return 7
- break;
- case 150:return 7
- break;
- case 151:return 7
- break;
- case 152:return 7
- break;
- case 153:return 7
- break;
- case 154:return 7
- break;
- case 155:return 7
- break;
- case 156:return 7
- break;
- case 157:return 7
- break;
- case 158:return 7
- break;
- case 159:return 7
- break;
- case 160:return 7
- break;
- case 161:return 7
- break;
- case 162:return 7
- break;
- case 163:return 7
- break;
- case 164:return 7
- break;
- case 165:return 7
- break;
- case 166:return 7
- break;
- case 167:return 7
- break;
- case 168:return 7
- break;
- case 169:return 7
- break;
- case 170:return 7
- break;
- case 171:return 7
- break;
- case 172:return 7
- break;
- case 173:return 7
- break;
- case 174:return 7
- break;
- case 175:return 7
- break;
- case 176:return 7
- break;
- case 177:return 7
- break;
- case 178:return 7
- break;
- case 179:return 7
- break;
- case 180:return 7
- break;
- case 181:return 7
- break;
- case 182:return 7
- break;
- case 183:return 7
- break;
- case 184:return 7
- break;
- case 185:return 7
- break;
- case 186:return 7
- break;
- case 187:return 7
- break;
- case 188:return 7
- break;
- case 189:return 7
- break;
- case 190:return 7
- break;
- case 191:return 7
- break;
- case 192:return 7
- break;
- case 193:return 7
- break;
- case 194:return 7
- break;
- case 195:return 7
- break;
- case 196:return 7
- break;
- case 197:return 7
- break;
- case 198:return 7
- break;
- case 199:return 7
- break;
- case 200:return 7
- break;
- case 201:return 7
- break;
- case 202:return 7
- break;
- case 203:return 7
- break;
- case 204:return 7
- break;
- case 205:return 7
- break;
- case 206:return 7
- break;
- case 207:return 7
- break;
- case 208:return 7
- break;
- case 209:return 7
- break;
- case 210:return 7
- break;
- case 211:return 7
- break;
- case 212:return 7
- break;
- case 213:return 7
- break;
- case 214:return 7
- break;
- case 215:return 7
- break;
- case 216:return 7
- break;
- case 217:return 7
- break;
- case 218:return 7
- break;
- case 219:return 7
- break;
- case 220:return 7
- break;
- case 221:return 7
- break;
- case 222:return 7
- break;
- case 223:return 7
- break;
- case 224:return 7
- break;
- case 225:return 7
- break;
- case 226:return 7
- break;
- case 227:return 7
- break;
- case 228:return 7
- break;
- case 229:return 7
- break;
- case 230:return 7
- break;
- case 231:return 7
- break;
- case 232:return 7
- break;
- case 233:return 7
- break;
- case 234:return 7
- break;
- case 235:return 7
- break;
- case 236:return 7
- break;
- case 237:return 7
- break;
- case 238:return 7
- break;
- case 239:return 7
- break;
- case 240:return 7
- break;
- case 241:return 7
- break;
- case 242:return 7
- break;
- case 243:return 7
- break;
- case 244:return 7
- break;
- case 245:return 7
- break;
- case 246:return 7
- break;
- case 247:return 7
- break;
- case 248:return 7
- break;
- case 249:return 7
- break;
- case 250:return 7
- break;
- case 251:return 7
- break;
- case 252:return 7
- break;
- case 253:return 7
- break;
- case 254:return 7
- break;
- case 255:return 7
- break;
- case 256:return 7
- break;
- case 257:return 7
- break;
- case 258:return 7
- break;
- case 259:return 7
- break;
- case 260:return 7
- break;
- case 261:return 7
- break;
- case 262:return 7
- break;
- case 263:return 7
- break;
- case 264:return 7
- break;
- case 265:return 7
- break;
- case 266:return 7
- break;
- case 267:return 7
- break;
- case 268:return 7
- break;
- case 269:return 7
- break;
- case 270:return 7
- break;
- case 271:return 7
- break;
- case 272:return 7
- break;
- case 273:return 7
- break;
- case 274:return 7
- break;
- case 275:return 7
- break;
- case 276:return 7
- break;
- case 277:return 7
- break;
- case 278:return 7
- break;
- case 279:return 7
- break;
- case 280:return 7
- break;
- case 281:return 7
- break;
- case 282:return 7
- break;
- case 283:return 7
- break;
- case 284:return 7
- break;
- case 285:return 7
- break;
- case 286:return 7
- break;
- case 287:return 7
- break;
- case 288:return 7
- break;
- case 289:return 7
- break;
- case 290:return 7
- break;
- case 291:return 7
- break;
- case 292:return 7
- break;
- case 293:return 7
- break;
- case 294:return 7
- break;
- case 295:return 7
- break;
- case 296:return 7
- break;
- case 297:return 7
- break;
- case 298:return 7
- break;
- case 299:return 7
- break;
- case 300:return 7
- break;
- case 301:return 7
- break;
- case 302:return 7
- break;
- case 303:return 7
- break;
- case 304:return 7
- break;
- case 305:return 7
- break;
- case 306:return 7
- break;
- case 307:return 7
- break;
- case 308:return 7
- break;
- case 309:return 7
- break;
- case 310:return 7
- break;
- case 311:return 7
- break;
- case 312:return 7
- break;
- case 313:return 7
- break;
- case 314:return 7
- break;
- case 315:return 7
- break;
- case 316:return 7
- break;
- case 317:return 7
- break;
- case 318:return 7
- break;
- case 319:return 7
- break;
- case 320:return 7
- break;
- case 321:return 7
- break;
- case 322:return 7
- break;
- case 323:return 7
- break;
- case 324:return 7
- break;
- case 325:return 7
- break;
- case 326:return 7
- break;
- case 327:return 7
- break;
- case 328:return 7
- break;
- case 329:return 7
- break;
- case 330:return 7
- break;
- case 331:return 7
- break;
- case 332:return 7
- break;
- case 333:return 7
- break;
- case 334:return 7
- break;
- case 335:return 7
- break;
- case 336:return 7
- break;
- case 337:return 7
- break;
- case 338:return 7
- break;
- case 339:return 7
- break;
- case 340:return 7
- break;
- case 341:return 7
- break;
- case 342:return 7
- break;
- case 343:return 7
- break;
- case 344:return 7
- break;
- case 345:return 7
- break;
- case 346:return 7
- break;
- case 347:return 7
- break;
- case 348:return 7
- break;
- case 349:return 7
- break;
- case 350:return 7
- break;
- case 351:return 7
- break;
- case 352:return 7
- break;
- case 353:return 7
- break;
- case 354:return 7
- break;
- case 355:return 7
- break;
- case 356:return 7
- break;
- case 357:return 7
- break;
- case 358:return 7
- break;
- case 359:return 7
- break;
- case 360:return 7
- break;
- case 361:return 7
- break;
- case 362:return 7
- break;
- case 363:return 7
- break;
- case 364:return 7
- break;
- }
- },
- rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/],
- conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}}
- });
- return lexer;
- })();
- parser.lexer = lexer;
- function Parser () {
- this.yy = {};
- }
- Parser.prototype = parser;parser.Parser = Parser;
- return new Parser;
- })();
- if (typeof commonjsRequire !== 'undefined' && 'object' !== 'undefined') {
- exports.parser = spdxparse;
- exports.Parser = spdxparse.Parser;
- exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); };
- exports.main = function commonjsMain(args) {
- if (!args[1]) {
- console.log('Usage: '+args[0]+' FILE');
- process.exit(1);
- }
- var source = fs.readFileSync(path.normalize(args[1]), "utf8");
- return exports.parser.parse(source);
- };
- if ('object' !== 'undefined' && commonjsRequire.main === module) {
- exports.main(process.argv.slice(1));
- }
- }
- });
- var parser = parser$1.parser;
- var spdxExpressionParse = function (argument) {
- return parser.parse(argument)
- };
- var spdxLicenseIds = [
- "Glide",
- "Abstyles",
- "AFL-1.1",
- "AFL-1.2",
- "AFL-2.0",
- "AFL-2.1",
- "AFL-3.0",
- "AMPAS",
- "APL-1.0",
- "Adobe-Glyph",
- "APAFML",
- "Adobe-2006",
- "AGPL-1.0",
- "Afmparse",
- "Aladdin",
- "ADSL",
- "AMDPLPA",
- "ANTLR-PD",
- "Apache-1.0",
- "Apache-1.1",
- "Apache-2.0",
- "AML",
- "APSL-1.0",
- "APSL-1.1",
- "APSL-1.2",
- "APSL-2.0",
- "Artistic-1.0",
- "Artistic-1.0-Perl",
- "Artistic-1.0-cl8",
- "Artistic-2.0",
- "AAL",
- "Bahyph",
- "Barr",
- "Beerware",
- "BitTorrent-1.0",
- "BitTorrent-1.1",
- "BSL-1.0",
- "Borceux",
- "BSD-2-Clause",
- "BSD-2-Clause-FreeBSD",
- "BSD-2-Clause-NetBSD",
- "BSD-3-Clause",
- "BSD-3-Clause-Clear",
- "BSD-4-Clause",
- "BSD-Protection",
- "BSD-Source-Code",
- "BSD-3-Clause-Attribution",
- "0BSD",
- "BSD-4-Clause-UC",
- "bzip2-1.0.5",
- "bzip2-1.0.6",
- "Caldera",
- "CECILL-1.0",
- "CECILL-1.1",
- "CECILL-2.0",
- "CECILL-2.1",
- "CECILL-B",
- "CECILL-C",
- "ClArtistic",
- "MIT-CMU",
- "CNRI-Jython",
- "CNRI-Python",
- "CNRI-Python-GPL-Compatible",
- "CPOL-1.02",
- "CDDL-1.0",
- "CDDL-1.1",
- "CPAL-1.0",
- "CPL-1.0",
- "CATOSL-1.1",
- "Condor-1.1",
- "CC-BY-1.0",
- "CC-BY-2.0",
- "CC-BY-2.5",
- "CC-BY-3.0",
- "CC-BY-4.0",
- "CC-BY-ND-1.0",
- "CC-BY-ND-2.0",
- "CC-BY-ND-2.5",
- "CC-BY-ND-3.0",
- "CC-BY-ND-4.0",
- "CC-BY-NC-1.0",
- "CC-BY-NC-2.0",
- "CC-BY-NC-2.5",
- "CC-BY-NC-3.0",
- "CC-BY-NC-4.0",
- "CC-BY-NC-ND-1.0",
- "CC-BY-NC-ND-2.0",
- "CC-BY-NC-ND-2.5",
- "CC-BY-NC-ND-3.0",
- "CC-BY-NC-ND-4.0",
- "CC-BY-NC-SA-1.0",
- "CC-BY-NC-SA-2.0",
- "CC-BY-NC-SA-2.5",
- "CC-BY-NC-SA-3.0",
- "CC-BY-NC-SA-4.0",
- "CC-BY-SA-1.0",
- "CC-BY-SA-2.0",
- "CC-BY-SA-2.5",
- "CC-BY-SA-3.0",
- "CC-BY-SA-4.0",
- "CC0-1.0",
- "Crossword",
- "CrystalStacker",
- "CUA-OPL-1.0",
- "Cube",
- "curl",
- "D-FSL-1.0",
- "diffmark",
- "WTFPL",
- "DOC",
- "Dotseqn",
- "DSDP",
- "dvipdfm",
- "EPL-1.0",
- "ECL-1.0",
- "ECL-2.0",
- "eGenix",
- "EFL-1.0",
- "EFL-2.0",
- "MIT-advertising",
- "MIT-enna",
- "Entessa",
- "ErlPL-1.1",
- "EUDatagrid",
- "EUPL-1.0",
- "EUPL-1.1",
- "Eurosym",
- "Fair",
- "MIT-feh",
- "Frameworx-1.0",
- "FreeImage",
- "FTL",
- "FSFAP",
- "FSFUL",
- "FSFULLR",
- "Giftware",
- "GL2PS",
- "Glulxe",
- "AGPL-3.0",
- "GFDL-1.1",
- "GFDL-1.2",
- "GFDL-1.3",
- "GPL-1.0",
- "GPL-2.0",
- "GPL-3.0",
- "LGPL-2.1",
- "LGPL-3.0",
- "LGPL-2.0",
- "gnuplot",
- "gSOAP-1.3b",
- "HaskellReport",
- "HPND",
- "IBM-pibs",
- "IPL-1.0",
- "ICU",
- "ImageMagick",
- "iMatix",
- "Imlib2",
- "IJG",
- "Info-ZIP",
- "Intel-ACPI",
- "Intel",
- "Interbase-1.0",
- "IPA",
- "ISC",
- "JasPer-2.0",
- "JSON",
- "LPPL-1.0",
- "LPPL-1.1",
- "LPPL-1.2",
- "LPPL-1.3a",
- "LPPL-1.3c",
- "Latex2e",
- "BSD-3-Clause-LBNL",
- "Leptonica",
- "LGPLLR",
- "Libpng",
- "libtiff",
- "LAL-1.2",
- "LAL-1.3",
- "LiLiQ-P-1.1",
- "LiLiQ-Rplus-1.1",
- "LiLiQ-R-1.1",
- "LPL-1.02",
- "LPL-1.0",
- "MakeIndex",
- "MTLL",
- "MS-PL",
- "MS-RL",
- "MirOS",
- "MITNFA",
- "MIT",
- "Motosoto",
- "MPL-1.0",
- "MPL-1.1",
- "MPL-2.0",
- "MPL-2.0-no-copyleft-exception",
- "mpich2",
- "Multics",
- "Mup",
- "NASA-1.3",
- "Naumen",
- "NBPL-1.0",
- "NetCDF",
- "NGPL",
- "NOSL",
- "NPL-1.0",
- "NPL-1.1",
- "Newsletr",
- "NLPL",
- "Nokia",
- "NPOSL-3.0",
- "NLOD-1.0",
- "Noweb",
- "NRL",
- "NTP",
- "Nunit",
- "OCLC-2.0",
- "ODbL-1.0",
- "PDDL-1.0",
- "OCCT-PL",
- "OGTSL",
- "OLDAP-2.2.2",
- "OLDAP-1.1",
- "OLDAP-1.2",
- "OLDAP-1.3",
- "OLDAP-1.4",
- "OLDAP-2.0",
- "OLDAP-2.0.1",
- "OLDAP-2.1",
- "OLDAP-2.2",
- "OLDAP-2.2.1",
- "OLDAP-2.3",
- "OLDAP-2.4",
- "OLDAP-2.5",
- "OLDAP-2.6",
- "OLDAP-2.7",
- "OLDAP-2.8",
- "OML",
- "OPL-1.0",
- "OSL-1.0",
- "OSL-1.1",
- "OSL-2.0",
- "OSL-2.1",
- "OSL-3.0",
- "OpenSSL",
- "OSET-PL-2.1",
- "PHP-3.0",
- "PHP-3.01",
- "Plexus",
- "PostgreSQL",
- "psfrag",
- "psutils",
- "Python-2.0",
- "QPL-1.0",
- "Qhull",
- "Rdisc",
- "RPSL-1.0",
- "RPL-1.1",
- "RPL-1.5",
- "RHeCos-1.1",
- "RSCPL",
- "RSA-MD",
- "Ruby",
- "SAX-PD",
- "Saxpath",
- "SCEA",
- "SWL",
- "SMPPL",
- "Sendmail",
- "SGI-B-1.0",
- "SGI-B-1.1",
- "SGI-B-2.0",
- "OFL-1.0",
- "OFL-1.1",
- "SimPL-2.0",
- "Sleepycat",
- "SNIA",
- "Spencer-86",
- "Spencer-94",
- "Spencer-99",
- "SMLNJ",
- "SugarCRM-1.1.3",
- "SISSL",
- "SISSL-1.2",
- "SPL-1.0",
- "Watcom-1.0",
- "TCL",
- "Unlicense",
- "TMate",
- "TORQUE-1.1",
- "TOSL",
- "Unicode-TOU",
- "UPL-1.0",
- "NCSA",
- "Vim",
- "VOSTROM",
- "VSL-1.0",
- "W3C-19980720",
- "W3C",
- "Wsuipa",
- "Xnet",
- "X11",
- "Xerox",
- "XFree86-1.1",
- "xinetd",
- "xpp",
- "XSkat",
- "YPL-1.0",
- "YPL-1.1",
- "Zed",
- "Zend-2.0",
- "Zimbra-1.3",
- "Zimbra-1.4",
- "Zlib",
- "zlib-acknowledgement",
- "ZPL-1.1",
- "ZPL-2.0",
- "ZPL-2.1",
- "BSD-3-Clause-No-Nuclear-License",
- "BSD-3-Clause-No-Nuclear-Warranty",
- "BSD-3-Clause-No-Nuclear-License-2014",
- "eCos-2.0",
- "GPL-2.0-with-autoconf-exception",
- "GPL-2.0-with-bison-exception",
- "GPL-2.0-with-classpath-exception",
- "GPL-2.0-with-font-exception",
- "GPL-2.0-with-GCC-exception",
- "GPL-3.0-with-autoconf-exception",
- "GPL-3.0-with-GCC-exception",
- "StandardML-NJ",
- "WXwindows"
- ]
- ;
- var spdxLicenseIds$1 = Object.freeze({
- default: spdxLicenseIds
- });
- var licenseIDs = ( spdxLicenseIds$1 && spdxLicenseIds ) || spdxLicenseIds$1;
- function valid(string) {
- return licenseIDs.indexOf(string) > -1;
- }
- // Common transpositions of license identifier acronyms
- var transpositions = [
- ['APGL', 'AGPL'],
- ['Gpl', 'GPL'],
- ['GLP', 'GPL'],
- ['APL', 'Apache'],
- ['ISD', 'ISC'],
- ['GLP', 'GPL'],
- ['IST', 'ISC'],
- ['Claude', 'Clause'],
- [' or later', '+'],
- [' International', ''],
- ['GNU', 'GPL'],
- ['GUN', 'GPL'],
- ['+', ''],
- ['GNU GPL', 'GPL'],
- ['GNU/GPL', 'GPL'],
- ['GNU GLP', 'GPL'],
- ['GNU General Public License', 'GPL'],
- ['Gnu public license', 'GPL'],
- ['GNU Public License', 'GPL'],
- ['GNU GENERAL PUBLIC LICENSE', 'GPL'],
- ['MTI', 'MIT'],
- ['Mozilla Public License', 'MPL'],
- ['WTH', 'WTF'],
- ['-License', '']
- ];
- var TRANSPOSED = 0;
- var CORRECT = 1;
- // Simple corrections to nearly valid identifiers.
- var transforms = [
- // e.g. 'mit'
- function(argument) {
- return argument.toUpperCase();
- },
- // e.g. 'MIT '
- function(argument) {
- return argument.trim();
- },
- // e.g. 'M.I.T.'
- function(argument) {
- return argument.replace(/\./g, '');
- },
- // e.g. 'Apache- 2.0'
- function(argument) {
- return argument.replace(/\s+/g, '');
- },
- // e.g. 'CC BY 4.0''
- function(argument) {
- return argument.replace(/\s+/g, '-');
- },
- // e.g. 'LGPLv2.1'
- function(argument) {
- return argument.replace('v', '-');
- },
- // e.g. 'Apache 2.0'
- function(argument) {
- return argument.replace(/,?\s*(\d)/, '-$1');
- },
- // e.g. 'GPL 2'
- function(argument) {
- return argument.replace(/,?\s*(\d)/, '-$1.0');
- },
- // e.g. 'Apache Version 2.0'
- function(argument) {
- return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2');
- },
- // e.g. 'Apache Version 2'
- function(argument) {
- return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0');
- },
- // e.g. 'ZLIB'
- function(argument) {
- return argument[0].toUpperCase() + argument.slice(1);
- },
- // e.g. 'MPL/2.0'
- function(argument) {
- return argument.replace('/', '-');
- },
- // e.g. 'Apache 2'
- function(argument) {
- return argument
- .replace(/\s*V\s*(\d)/, '-$1')
- .replace(/(\d)$/, '$1.0');
- },
- // e.g. 'GPL-2.0-'
- function(argument) {
- return argument.slice(0, argument.length - 1);
- },
- // e.g. 'GPL2'
- function(argument) {
- return argument.replace(/(\d)$/, '-$1.0');
- },
- // e.g. 'BSD 3'
- function(argument) {
- return argument.replace(/(-| )?(\d)$/, '-$2-Clause');
- },
- // e.g. 'BSD clause 3'
- function(argument) {
- return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause');
- },
- // e.g. 'BY-NC-4.0'
- function(argument) {
- return 'CC-' + argument;
- },
- // e.g. 'BY-NC'
- function(argument) {
- return 'CC-' + argument + '-4.0';
- },
- // e.g. 'Attribution-NonCommercial'
- function(argument) {
- return argument
- .replace('Attribution', 'BY')
- .replace('NonCommercial', 'NC')
- .replace('NoDerivatives', 'ND')
- .replace(/ (\d)/, '-$1')
- .replace(/ ?International/, '');
- },
- // e.g. 'Attribution-NonCommercial'
- function(argument) {
- return 'CC-' +
- argument
- .replace('Attribution', 'BY')
- .replace('NonCommercial', 'NC')
- .replace('NoDerivatives', 'ND')
- .replace(/ (\d)/, '-$1')
- .replace(/ ?International/, '') +
- '-4.0';
- }
- ];
- // If all else fails, guess that strings containing certain substrings
- // meant to identify certain licenses.
- var lastResorts = [
- ['UNLI', 'Unlicense'],
- ['WTF', 'WTFPL'],
- ['2 CLAUSE', 'BSD-2-Clause'],
- ['2-CLAUSE', 'BSD-2-Clause'],
- ['3 CLAUSE', 'BSD-3-Clause'],
- ['3-CLAUSE', 'BSD-3-Clause'],
- ['AFFERO', 'AGPL-3.0'],
- ['AGPL', 'AGPL-3.0'],
- ['APACHE', 'Apache-2.0'],
- ['ARTISTIC', 'Artistic-2.0'],
- ['Affero', 'AGPL-3.0'],
- ['BEER', 'Beerware'],
- ['BOOST', 'BSL-1.0'],
- ['BSD', 'BSD-2-Clause'],
- ['ECLIPSE', 'EPL-1.0'],
- ['FUCK', 'WTFPL'],
- ['GNU', 'GPL-3.0'],
- ['LGPL', 'LGPL-3.0'],
- ['GPL', 'GPL-3.0'],
- ['MIT', 'MIT'],
- ['MPL', 'MPL-2.0'],
- ['X11', 'X11'],
- ['ZLIB', 'Zlib']
- ];
- var SUBSTRING = 0;
- var IDENTIFIER = 1;
- var validTransformation = function(identifier) {
- for (var i = 0; i < transforms.length; i++) {
- var transformed = transforms[i](identifier);
- if (transformed !== identifier && valid(transformed)) {
- return transformed;
- }
- }
- return null;
- };
- var validLastResort = function(identifier) {
- var upperCased = identifier.toUpperCase();
- for (var i = 0; i < lastResorts.length; i++) {
- var lastResort = lastResorts[i];
- if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) {
- return lastResort[IDENTIFIER];
- }
- }
- return null;
- };
- var anyCorrection = function(identifier, check) {
- for (var i = 0; i < transpositions.length; i++) {
- var transposition = transpositions[i];
- var transposed = transposition[TRANSPOSED];
- if (identifier.indexOf(transposed) > -1) {
- var corrected = identifier.replace(
- transposed,
- transposition[CORRECT]
- );
- var checked = check(corrected);
- if (checked !== null) {
- return checked;
- }
- }
- }
- return null;
- };
- var spdxCorrect = function(identifier) {
- identifier = identifier.replace(/\+$/, '');
- if (valid(identifier)) {
- return identifier;
- }
- var transformed = validTransformation(identifier);
- if (transformed !== null) {
- return transformed;
- }
- transformed = anyCorrection(identifier, function(argument) {
- if (valid(argument)) {
- return argument;
- }
- return validTransformation(argument);
- });
- if (transformed !== null) {
- return transformed;
- }
- transformed = validLastResort(identifier);
- if (transformed !== null) {
- return transformed;
- }
- transformed = anyCorrection(identifier, validLastResort);
- if (transformed !== null) {
- return transformed;
- }
- return null;
- };
- var genericWarning = (
- 'license should be ' +
- 'a valid SPDX license expression (without "LicenseRef"), ' +
- '"UNLICENSED", or ' +
- '"SEE LICENSE IN <filename>"'
- );
- var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/;
- function startsWith(prefix, string) {
- return string.slice(0, prefix.length) === prefix;
- }
- function usesLicenseRef(ast) {
- if (ast.hasOwnProperty('license')) {
- var license = ast.license;
- return (
- startsWith('LicenseRef', license) ||
- startsWith('DocumentRef', license)
- );
- } else {
- return (
- usesLicenseRef(ast.left) ||
- usesLicenseRef(ast.right)
- );
- }
- }
- var validateNpmPackageLicense = function(argument) {
- var ast;
- try {
- ast = spdxExpressionParse(argument);
- } catch (e) {
- var match;
- if (
- argument === 'UNLICENSED' ||
- argument === 'UNLICENCED'
- ) {
- return {
- validForOldPackages: true,
- validForNewPackages: true,
- unlicensed: true
- };
- } else if (match = fileReferenceRE.exec(argument)) {
- return {
- validForOldPackages: true,
- validForNewPackages: true,
- inFile: match[1]
- };
- } else {
- var result = {
- validForOldPackages: false,
- validForNewPackages: false,
- warnings: [genericWarning]
- };
- var corrected = spdxCorrect(argument);
- if (corrected) {
- result.warnings.push(
- 'license is similar to the valid expression "' + corrected + '"'
- );
- }
- return result;
- }
- }
- if (usesLicenseRef(ast)) {
- return {
- validForNewPackages: false,
- validForOldPackages: false,
- spdx: true,
- warnings: [genericWarning]
- };
- } else {
- return {
- validForNewPackages: true,
- validForOldPackages: true,
- spdx: true
- };
- }
- };
- var gitHostInfo = createCommonjsModule(function (module) {
- 'use strict';
- var gitHosts = module.exports = {
- github: {
- // First two are insecure and generally shouldn't be used any more, but
- // they are still supported.
- 'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ],
- 'domain': 'github.com',
- 'treepath': 'tree',
- 'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}',
- 'bugstemplate': 'https://{domain}/{user}/{project}/issues',
- 'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}',
- 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz'
- },
- bitbucket: {
- 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ],
- 'domain': 'bitbucket.org',
- 'treepath': 'src',
- 'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz'
- },
- gitlab: {
- 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ],
- 'domain': 'gitlab.com',
- 'treepath': 'tree',
- 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#README',
- 'bugstemplate': 'https://{domain}/{user}/{project}/issues',
- 'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}'
- },
- gist: {
- 'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ],
- 'domain': 'gist.github.com',
- 'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]+)(?:[.]git)?$/,
- 'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}',
- 'bugstemplate': 'https://{domain}/{project}',
- 'gittemplate': 'git://{domain}/{project}.git{#committish}',
- 'sshtemplate': 'git@{domain}:/{project}.git{#committish}',
- 'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}',
- 'browsetemplate': 'https://{domain}/{project}{/committish}',
- 'docstemplate': 'https://{domain}/{project}{/committish}',
- 'httpstemplate': 'git+https://{domain}/{project}.git{#committish}',
- 'shortcuttemplate': '{type}:{project}{#committish}',
- 'pathtemplate': '{project}{#committish}',
- 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz'
- }
- };
- var gitHostDefaults = {
- 'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}',
- 'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}',
- 'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}',
- 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme',
- 'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}',
- 'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}',
- 'shortcuttemplate': '{type}:{user}/{project}{#committish}',
- 'pathtemplate': '{user}/{project}{#committish}',
- 'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/
- };
- Object.keys(gitHosts).forEach(function (name) {
- Object.keys(gitHostDefaults).forEach(function (key) {
- if (gitHosts[name][key]) return
- gitHosts[name][key] = gitHostDefaults[key];
- });
- gitHosts[name].protocols_re = RegExp('^(' +
- gitHosts[name].protocols.map(function (protocol) {
- return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1')
- }).join('|') + '):$');
- });
- });
- var gitHost = createCommonjsModule(function (module) {
- 'use strict';
- var extend = Object.assign || util._extend;
- var GitHost = module.exports = function (type, user, auth, project, committish, defaultRepresentation, opts) {
- var gitHostInfo$$1 = this;
- gitHostInfo$$1.type = type;
- Object.keys(gitHostInfo[type]).forEach(function (key) {
- gitHostInfo$$1[key] = gitHostInfo[type][key];
- });
- gitHostInfo$$1.user = user;
- gitHostInfo$$1.auth = auth;
- gitHostInfo$$1.project = project;
- gitHostInfo$$1.committish = committish;
- gitHostInfo$$1.default = defaultRepresentation;
- gitHostInfo$$1.opts = opts || {};
- };
- GitHost.prototype = {};
- GitHost.prototype.hash = function () {
- return this.committish ? '#' + this.committish : ''
- };
- GitHost.prototype._fill = function (template, opts) {
- if (!template) return
- var vars = extend({}, opts);
- opts = extend(extend({}, this.opts), opts);
- var self = this;
- Object.keys(this).forEach(function (key) {
- if (self[key] != null && vars[key] == null) vars[key] = self[key];
- });
- var rawAuth = vars.auth;
- var rawComittish = vars.committish;
- Object.keys(vars).forEach(function (key) {
- vars[key] = encodeURIComponent(vars[key]);
- });
- vars['auth@'] = rawAuth ? rawAuth + '@' : '';
- if (opts.noCommittish) {
- vars['#committish'] = '';
- vars['/tree/committish'] = '';
- vars['/comittish'] = '';
- vars.comittish = '';
- } else {
- vars['#committish'] = rawComittish ? '#' + rawComittish : '';
- vars['/tree/committish'] = vars.committish
- ? '/' + vars.treepath + '/' + vars.committish
- : '';
- vars['/committish'] = vars.committish ? '/' + vars.committish : '';
- vars.committish = vars.committish || 'master';
- }
- var res = template;
- Object.keys(vars).forEach(function (key) {
- res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key]);
- });
- if (opts.noGitPlus) {
- return res.replace(/^git[+]/, '')
- } else {
- return res
- }
- };
- GitHost.prototype.ssh = function (opts) {
- return this._fill(this.sshtemplate, opts)
- };
- GitHost.prototype.sshurl = function (opts) {
- return this._fill(this.sshurltemplate, opts)
- };
- GitHost.prototype.browse = function (opts) {
- return this._fill(this.browsetemplate, opts)
- };
- GitHost.prototype.docs = function (opts) {
- return this._fill(this.docstemplate, opts)
- };
- GitHost.prototype.bugs = function (opts) {
- return this._fill(this.bugstemplate, opts)
- };
- GitHost.prototype.https = function (opts) {
- return this._fill(this.httpstemplate, opts)
- };
- GitHost.prototype.git = function (opts) {
- return this._fill(this.gittemplate, opts)
- };
- GitHost.prototype.shortcut = function (opts) {
- return this._fill(this.shortcuttemplate, opts)
- };
- GitHost.prototype.path = function (opts) {
- return this._fill(this.pathtemplate, opts)
- };
- GitHost.prototype.tarball = function (opts) {
- return this._fill(this.tarballtemplate, opts)
- };
- GitHost.prototype.file = function (P, opts) {
- return this._fill(this.filetemplate, extend({
- path: P.replace(/^[/]+/g, '')
- }, opts))
- };
- GitHost.prototype.getDefaultRepresentation = function () {
- return this.default
- };
- GitHost.prototype.toString = function (opts) {
- return (this[this.default] || this.sshurl).call(this, opts)
- };
- });
- var hostedGitInfo = createCommonjsModule(function (module) {
- 'use strict';
- var GitHost = module.exports = gitHost;
- var protocolToRepresentationMap = {
- 'git+ssh': 'sshurl',
- 'git+https': 'https',
- 'ssh': 'sshurl',
- 'git': 'git'
- };
- function protocolToRepresentation (protocol) {
- if (protocol.substr(-1) === ':') protocol = protocol.slice(0, -1);
- return protocolToRepresentationMap[protocol] || protocol
- }
- var authProtocols = {
- 'git:': true,
- 'https:': true,
- 'git+https:': true,
- 'http:': true,
- 'git+http:': true
- };
- module.exports.fromUrl = function (giturl, opts) {
- if (giturl == null || giturl === '') return
- var url$$1 = fixupUnqualifiedGist(
- isGitHubShorthand(giturl) ? 'github:' + giturl : giturl
- );
- var parsed = parseGitUrl(url$$1);
- var shortcutMatch = url$$1.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)'));
- var matches = Object.keys(gitHostInfo).map(function (gitHostName) {
- try {
- var gitHostInfo$$1 = gitHostInfo[gitHostName];
- var auth = null;
- if (parsed.auth && authProtocols[parsed.protocol]) {
- auth = decodeURIComponent(parsed.auth);
- }
- var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null;
- var user = null;
- var project = null;
- var defaultRepresentation = null;
- if (shortcutMatch && shortcutMatch[1] === gitHostName) {
- user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2]);
- project = decodeURIComponent(shortcutMatch[3]);
- defaultRepresentation = 'shortcut';
- } else {
- if (parsed.host !== gitHostInfo$$1.domain) return
- if (!gitHostInfo$$1.protocols_re.test(parsed.protocol)) return
- if (!parsed.path) return
- var pathmatch = gitHostInfo$$1.pathmatch;
- var matched = parsed.path.match(pathmatch);
- if (!matched) return
- if (matched[1] != null) user = decodeURIComponent(matched[1].replace(/^:/, ''));
- if (matched[2] != null) project = decodeURIComponent(matched[2]);
- defaultRepresentation = protocolToRepresentation(parsed.protocol);
- }
- return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts)
- } catch (ex) {
- if (!(ex instanceof URIError)) throw ex
- }
- }).filter(function (gitHostInfo$$1) { return gitHostInfo$$1 });
- if (matches.length !== 1) return
- return matches[0]
- };
- function isGitHubShorthand (arg) {
- // Note: This does not fully test the git ref format.
- // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html
- //
- // The only way to do this properly would be to shell out to
- // git-check-ref-format, and as this is a fast sync function,
- // we don't want to do that. Just let git fail if it turns
- // out that the commit-ish is invalid.
- // GH usernames cannot start with . or -
- return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg)
- }
- function fixupUnqualifiedGist (giturl) {
- // necessary for round-tripping gists
- var parsed = url.parse(giturl);
- if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) {
- return parsed.protocol + '/' + parsed.host
- } else {
- return giturl
- }
- }
- function parseGitUrl (giturl) {
- if (typeof giturl !== 'string') giturl = '' + giturl;
- var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/);
- if (!matched) return url.parse(giturl)
- return {
- protocol: 'git+ssh:',
- slashes: true,
- auth: matched[1],
- host: matched[2],
- port: null,
- hostname: matched[2],
- hash: matched[4],
- search: null,
- query: null,
- pathname: '/' + matched[3],
- path: '/' + matched[3],
- href: 'git+ssh://' + matched[1] + '@' + matched[2] +
- '/' + matched[3] + (matched[4] || '')
- }
- }
- });
- var blacklist = [
- 'freelist',
- 'sys'
- ];
- var builtinModules = Object.keys(process.binding('natives')).filter(function (el) {
- return !/^_|^internal|\//.test(el) && blacklist.indexOf(el) === -1;
- }).sort();
- var isBuiltinModule = function (str) {
- if (typeof str !== 'string') {
- throw new TypeError('Expected a string');
- }
- return builtinModules.indexOf(str) !== -1;
- };
- var extract_description = extractDescription;
- // Extracts description from contents of a readme file in markdown format
- function extractDescription (d) {
- if (!d) return;
- if (d === "ERROR: No README data found!") return;
- // the first block of text before the first heading
- // that isn't the first line heading
- d = d.trim().split('\n');
- for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++);
- var l = d.length;
- for (var e = s + 1; e < l && d[e].trim(); e ++);
- return d.slice(s, e).join(' ').trim()
- }
- var topLevel = {"dependancies":"dependencies","dependecies":"dependencies","depdenencies":"dependencies","devEependencies":"devDependencies","depends":"dependencies","dev-dependencies":"devDependencies","devDependences":"devDependencies","devDepenencies":"devDependencies","devdependencies":"devDependencies","repostitory":"repository","repo":"repository","prefereGlobal":"preferGlobal","hompage":"homepage","hampage":"homepage","autohr":"author","autor":"author","contributers":"contributors","publicationConfig":"publishConfig","script":"scripts"};
- var bugs = {"web":"url","name":"url"};
- var script = {"server":"start","tests":"test"};
- var typos = {
- topLevel: topLevel,
- bugs: bugs,
- script: script
- };
- var typos$1 = Object.freeze({
- topLevel: topLevel,
- bugs: bugs,
- script: script,
- default: typos
- });
- var typos$2 = ( typos$1 && typos ) || typos$1;
- var fixer_1 = createCommonjsModule(function (module) {
- var depTypes = ["dependencies","devDependencies","optionalDependencies"];
- var fixer = module.exports = {
- // default warning function
- warn: function() {},
- fixRepositoryField: function(data) {
- if (data.repositories) {
- this.warn("repositories");
- data.repository = data.repositories[0];
- }
- if (!data.repository) return this.warn("missingRepository")
- if (typeof data.repository === "string") {
- data.repository = {
- type: "git",
- url: data.repository
- };
- }
- var r = data.repository.url || "";
- if (r) {
- var hosted = hostedGitInfo.fromUrl(r);
- if (hosted) {
- r = data.repository.url
- = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString();
- }
- }
- if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) {
- this.warn("brokenGitUrl", r);
- }
- }
- , fixTypos: function(data) {
- Object.keys(typos$2.topLevel).forEach(function (d) {
- if (data.hasOwnProperty(d)) {
- this.warn("typo", d, typos$2.topLevel[d]);
- }
- }, this);
- }
- , fixScriptsField: function(data) {
- if (!data.scripts) return
- if (typeof data.scripts !== "object") {
- this.warn("nonObjectScripts");
- delete data.scripts;
- return
- }
- Object.keys(data.scripts).forEach(function (k) {
- if (typeof data.scripts[k] !== "string") {
- this.warn("nonStringScript");
- delete data.scripts[k];
- } else if (typos$2.script[k] && !data.scripts[typos$2.script[k]]) {
- this.warn("typo", k, typos$2.script[k], "scripts");
- }
- }, this);
- }
- , fixFilesField: function(data) {
- var files = data.files;
- if (files && !Array.isArray(files)) {
- this.warn("nonArrayFiles");
- delete data.files;
- } else if (data.files) {
- data.files = data.files.filter(function(file) {
- if (!file || typeof file !== "string") {
- this.warn("invalidFilename", file);
- return false
- } else {
- return true
- }
- }, this);
- }
- }
- , fixBinField: function(data) {
- if (!data.bin) return;
- if (typeof data.bin === "string") {
- var b = {};
- var match;
- if (match = data.name.match(/^@[^/]+[/](.*)$/)) {
- b[match[1]] = data.bin;
- } else {
- b[data.name] = data.bin;
- }
- data.bin = b;
- }
- }
- , fixManField: function(data) {
- if (!data.man) return;
- if (typeof data.man === "string") {
- data.man = [ data.man ];
- }
- }
- , fixBundleDependenciesField: function(data) {
- var bdd = "bundledDependencies";
- var bd = "bundleDependencies";
- if (data[bdd] && !data[bd]) {
- data[bd] = data[bdd];
- delete data[bdd];
- }
- if (data[bd] && !Array.isArray(data[bd])) {
- this.warn("nonArrayBundleDependencies");
- delete data[bd];
- } else if (data[bd]) {
- data[bd] = data[bd].filter(function(bd) {
- if (!bd || typeof bd !== 'string') {
- this.warn("nonStringBundleDependency", bd);
- return false
- } else {
- if (!data.dependencies) {
- data.dependencies = {};
- }
- if (!data.dependencies.hasOwnProperty(bd)) {
- this.warn("nonDependencyBundleDependency", bd);
- data.dependencies[bd] = "*";
- }
- return true
- }
- }, this);
- }
- }
- , fixDependencies: function(data, strict) {
- var loose = !strict;
- objectifyDeps(data, this.warn);
- addOptionalDepsToDeps(data, this.warn);
- this.fixBundleDependenciesField(data)
- ;['dependencies','devDependencies'].forEach(function(deps) {
- if (!(deps in data)) return
- if (!data[deps] || typeof data[deps] !== "object") {
- this.warn("nonObjectDependencies", deps);
- delete data[deps];
- return
- }
- Object.keys(data[deps]).forEach(function (d) {
- var r = data[deps][d];
- if (typeof r !== 'string') {
- this.warn("nonStringDependency", d, JSON.stringify(r));
- delete data[deps][d];
- }
- var hosted = hostedGitInfo.fromUrl(data[deps][d]);
- if (hosted) data[deps][d] = hosted.toString();
- }, this);
- }, this);
- }
- , fixModulesField: function (data) {
- if (data.modules) {
- this.warn("deprecatedModules");
- delete data.modules;
- }
- }
- , fixKeywordsField: function (data) {
- if (typeof data.keywords === "string") {
- data.keywords = data.keywords.split(/,\s+/);
- }
- if (data.keywords && !Array.isArray(data.keywords)) {
- delete data.keywords;
- this.warn("nonArrayKeywords");
- } else if (data.keywords) {
- data.keywords = data.keywords.filter(function(kw) {
- if (typeof kw !== "string" || !kw) {
- this.warn("nonStringKeyword");
- return false
- } else {
- return true
- }
- }, this);
- }
- }
- , fixVersionField: function(data, strict) {
- // allow "loose" semver 1.0 versions in non-strict mode
- // enforce strict semver 2.0 compliance in strict mode
- var loose = !strict;
- if (!data.version) {
- data.version = "";
- return true
- }
- if (!semver.valid(data.version, loose)) {
- throw new Error('Invalid version: "'+ data.version + '"')
- }
- data.version = semver.clean(data.version, loose);
- return true
- }
- , fixPeople: function(data) {
- modifyPeople(data, unParsePerson);
- modifyPeople(data, parsePerson);
- }
- , fixNameField: function(data, options) {
- if (typeof options === "boolean") options = {strict: options};
- else if (typeof options === "undefined") options = {};
- var strict = options.strict;
- if (!data.name && !strict) {
- data.name = "";
- return
- }
- if (typeof data.name !== "string") {
- throw new Error("name field must be a string.")
- }
- if (!strict)
- data.name = data.name.trim();
- ensureValidName(data.name, strict, options.allowLegacyCase);
- if (isBuiltinModule(data.name))
- this.warn("conflictingName", data.name);
- }
- , fixDescriptionField: function (data) {
- if (data.description && typeof data.description !== 'string') {
- this.warn("nonStringDescription");
- delete data.description;
- }
- if (data.readme && !data.description)
- data.description = extract_description(data.readme);
- if(data.description === undefined) delete data.description;
- if (!data.description) this.warn("missingDescription");
- }
- , fixReadmeField: function (data) {
- if (!data.readme) {
- this.warn("missingReadme");
- data.readme = "ERROR: No README data found!";
- }
- }
- , fixBugsField: function(data) {
- if (!data.bugs && data.repository && data.repository.url) {
- var hosted = hostedGitInfo.fromUrl(data.repository.url);
- if(hosted && hosted.bugs()) {
- data.bugs = {url: hosted.bugs()};
- }
- }
- else if(data.bugs) {
- var emailRe = /^.+@.*\..+$/;
- if(typeof data.bugs == "string") {
- if(emailRe.test(data.bugs))
- data.bugs = {email:data.bugs};
- else if(url.parse(data.bugs).protocol)
- data.bugs = {url: data.bugs};
- else
- this.warn("nonEmailUrlBugsString");
- }
- else {
- bugsTypos(data.bugs, this.warn);
- var oldBugs = data.bugs;
- data.bugs = {};
- if(oldBugs.url) {
- if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol)
- data.bugs.url = oldBugs.url;
- else
- this.warn("nonUrlBugsUrlField");
- }
- if(oldBugs.email) {
- if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email))
- data.bugs.email = oldBugs.email;
- else
- this.warn("nonEmailBugsEmailField");
- }
- }
- if(!data.bugs.email && !data.bugs.url) {
- delete data.bugs;
- this.warn("emptyNormalizedBugs");
- }
- }
- }
- , fixHomepageField: function(data) {
- if (!data.homepage && data.repository && data.repository.url) {
- var hosted = hostedGitInfo.fromUrl(data.repository.url);
- if (hosted && hosted.docs()) data.homepage = hosted.docs();
- }
- if (!data.homepage) return
- if(typeof data.homepage !== "string") {
- this.warn("nonUrlHomepage");
- return delete data.homepage
- }
- if(!url.parse(data.homepage).protocol) {
- this.warn("missingProtocolHomepage");
- data.homepage = "http://" + data.homepage;
- }
- }
- , fixLicenseField: function(data) {
- if (!data.license) {
- return this.warn("missingLicense")
- } else{
- if (
- typeof(data.license) !== 'string' ||
- data.license.length < 1
- ) {
- this.warn("invalidLicense");
- } else {
- if (!validateNpmPackageLicense(data.license).validForNewPackages)
- this.warn("invalidLicense");
- }
- }
- }
- };
- function isValidScopedPackageName(spec) {
- if (spec.charAt(0) !== '@') return false
- var rest = spec.slice(1).split('/');
- if (rest.length !== 2) return false
- return rest[0] && rest[1] &&
- rest[0] === encodeURIComponent(rest[0]) &&
- rest[1] === encodeURIComponent(rest[1])
- }
- function isCorrectlyEncodedName(spec) {
- return !spec.match(/[\/@\s\+%:]/) &&
- spec === encodeURIComponent(spec)
- }
- function ensureValidName (name, strict, allowLegacyCase) {
- if (name.charAt(0) === "." ||
- !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) ||
- (strict && (!allowLegacyCase) && name !== name.toLowerCase()) ||
- name.toLowerCase() === "node_modules" ||
- name.toLowerCase() === "favicon.ico") {
- throw new Error("Invalid name: " + JSON.stringify(name))
- }
- }
- function modifyPeople (data, fn) {
- if (data.author) data.author = fn(data.author)
- ;["maintainers", "contributors"].forEach(function (set) {
- if (!Array.isArray(data[set])) return;
- data[set] = data[set].map(fn);
- });
- return data
- }
- function unParsePerson (person) {
- if (typeof person === "string") return person
- var name = person.name || "";
- var u = person.url || person.web;
- var url$$1 = u ? (" ("+u+")") : "";
- var e = person.email || person.mail;
- var email = e ? (" <"+e+">") : "";
- return name+email+url$$1
- }
- function parsePerson (person) {
- if (typeof person !== "string") return person
- var name = person.match(/^([^\(<]+)/);
- var url$$1 = person.match(/\(([^\)]+)\)/);
- var email = person.match(/<([^>]+)>/);
- var obj = {};
- if (name && name[0].trim()) obj.name = name[0].trim();
- if (email) obj.email = email[1];
- if (url$$1) obj.url = url$$1[1];
- return obj
- }
- function addOptionalDepsToDeps (data, warn) {
- var o = data.optionalDependencies;
- if (!o) return;
- var d = data.dependencies || {};
- Object.keys(o).forEach(function (k) {
- d[k] = o[k];
- });
- data.dependencies = d;
- }
- function depObjectify (deps, type, warn) {
- if (!deps) return {}
- if (typeof deps === "string") {
- deps = deps.trim().split(/[\n\r\s\t ,]+/);
- }
- if (!Array.isArray(deps)) return deps
- warn("deprecatedArrayDependencies", type);
- var o = {};
- deps.filter(function (d) {
- return typeof d === "string"
- }).forEach(function(d) {
- d = d.trim().split(/(:?[@\s><=])/);
- var dn = d.shift();
- var dv = d.join("");
- dv = dv.trim();
- dv = dv.replace(/^@/, "");
- o[dn] = dv;
- });
- return o
- }
- function objectifyDeps (data, warn) {
- depTypes.forEach(function (type) {
- if (!data[type]) return;
- data[type] = depObjectify(data[type], type, warn);
- });
- }
- function bugsTypos(bugs, warn) {
- if (!bugs) return
- Object.keys(bugs).forEach(function (k) {
- if (typos$2.bugs[k]) {
- warn("typo", k, typos$2.bugs[k], "bugs");
- bugs[typos$2.bugs[k]] = bugs[k];
- delete bugs[k];
- }
- });
- }
- });
- var repositories = "'repositories' (plural) Not supported. Please pick one as the 'repository' field";
- var missingRepository = "No repository field.";
- var brokenGitUrl = "Probably broken git url: %s";
- var nonObjectScripts = "scripts must be an object";
- var nonStringScript = "script values must be string commands";
- var nonArrayFiles = "Invalid 'files' member";
- var invalidFilename = "Invalid filename in 'files' list: %s";
- var nonArrayBundleDependencies = "Invalid 'bundleDependencies' list. Must be array of package names";
- var nonStringBundleDependency = "Invalid bundleDependencies member: %s";
- var nonDependencyBundleDependency = "Non-dependency in bundleDependencies: %s";
- var nonObjectDependencies = "%s field must be an object";
- var nonStringDependency = "Invalid dependency: %s %s";
- var deprecatedArrayDependencies = "specifying %s as array is deprecated";
- var deprecatedModules = "modules field is deprecated";
- var nonArrayKeywords = "keywords should be an array of strings";
- var nonStringKeyword = "keywords should be an array of strings";
- var conflictingName = "%s is also the name of a node core module.";
- var nonStringDescription = "'description' field should be a string";
- var missingDescription = "No description";
- var missingReadme = "No README data";
- var missingLicense = "No license field.";
- var nonEmailUrlBugsString = "Bug string field must be url, email, or {email,url}";
- var nonUrlBugsUrlField = "bugs.url field must be a string url. Deleted.";
- var nonEmailBugsEmailField = "bugs.email field must be a string email. Deleted.";
- var emptyNormalizedBugs = "Normalized value of bugs field is an empty object. Deleted.";
- var nonUrlHomepage = "homepage field must be a string url. Deleted.";
- var invalidLicense = "license should be a valid SPDX license expression";
- var missingProtocolHomepage = "homepage field must start with a protocol.";
- var typo = "%s should probably be %s.";
- var warning_messages = {
- repositories: repositories,
- missingRepository: missingRepository,
- brokenGitUrl: brokenGitUrl,
- nonObjectScripts: nonObjectScripts,
- nonStringScript: nonStringScript,
- nonArrayFiles: nonArrayFiles,
- invalidFilename: invalidFilename,
- nonArrayBundleDependencies: nonArrayBundleDependencies,
- nonStringBundleDependency: nonStringBundleDependency,
- nonDependencyBundleDependency: nonDependencyBundleDependency,
- nonObjectDependencies: nonObjectDependencies,
- nonStringDependency: nonStringDependency,
- deprecatedArrayDependencies: deprecatedArrayDependencies,
- deprecatedModules: deprecatedModules,
- nonArrayKeywords: nonArrayKeywords,
- nonStringKeyword: nonStringKeyword,
- conflictingName: conflictingName,
- nonStringDescription: nonStringDescription,
- missingDescription: missingDescription,
- missingReadme: missingReadme,
- missingLicense: missingLicense,
- nonEmailUrlBugsString: nonEmailUrlBugsString,
- nonUrlBugsUrlField: nonUrlBugsUrlField,
- nonEmailBugsEmailField: nonEmailBugsEmailField,
- emptyNormalizedBugs: emptyNormalizedBugs,
- nonUrlHomepage: nonUrlHomepage,
- invalidLicense: invalidLicense,
- missingProtocolHomepage: missingProtocolHomepage,
- typo: typo
- };
- var warning_messages$1 = Object.freeze({
- repositories: repositories,
- missingRepository: missingRepository,
- brokenGitUrl: brokenGitUrl,
- nonObjectScripts: nonObjectScripts,
- nonStringScript: nonStringScript,
- nonArrayFiles: nonArrayFiles,
- invalidFilename: invalidFilename,
- nonArrayBundleDependencies: nonArrayBundleDependencies,
- nonStringBundleDependency: nonStringBundleDependency,
- nonDependencyBundleDependency: nonDependencyBundleDependency,
- nonObjectDependencies: nonObjectDependencies,
- nonStringDependency: nonStringDependency,
- deprecatedArrayDependencies: deprecatedArrayDependencies,
- deprecatedModules: deprecatedModules,
- nonArrayKeywords: nonArrayKeywords,
- nonStringKeyword: nonStringKeyword,
- conflictingName: conflictingName,
- nonStringDescription: nonStringDescription,
- missingDescription: missingDescription,
- missingReadme: missingReadme,
- missingLicense: missingLicense,
- nonEmailUrlBugsString: nonEmailUrlBugsString,
- nonUrlBugsUrlField: nonUrlBugsUrlField,
- nonEmailBugsEmailField: nonEmailBugsEmailField,
- emptyNormalizedBugs: emptyNormalizedBugs,
- nonUrlHomepage: nonUrlHomepage,
- invalidLicense: invalidLicense,
- missingProtocolHomepage: missingProtocolHomepage,
- typo: typo,
- default: warning_messages
- });
- var messages = ( warning_messages$1 && warning_messages ) || warning_messages$1;
- var make_warning = function() {
- var args = Array.prototype.slice.call(arguments, 0);
- var warningName = args.shift();
- if (warningName == "typo") {
- return makeTypoWarning.apply(null,args)
- }
- else {
- var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'";
- args.unshift(msgTemplate);
- return util.format.apply(null, args)
- }
- };
- function makeTypoWarning (providedName, probableName, field) {
- if (field) {
- providedName = field + "['" + providedName + "']";
- probableName = field + "['" + probableName + "']";
- }
- return util.format(messages.typo, providedName, probableName)
- }
- var normalize_1 = normalize;
- normalize.fixer = fixer_1;
- var fieldsToFix = ['name','version','description','repository','modules','scripts'
- ,'files','bin','man','bugs','keywords','readme','homepage','license'];
- var otherThingsToFix = ['dependencies','people', 'typos'];
- var thingsToFix = fieldsToFix.map(function(fieldName) {
- return ucFirst(fieldName) + "Field"
- });
- // two ways to do this in CoffeeScript on only one line, sub-70 chars:
- // thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field"
- // thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix)
- thingsToFix = thingsToFix.concat(otherThingsToFix);
- function normalize (data, warn, strict) {
- if(warn === true) warn = null, strict = true;
- if(!strict) strict = false;
- if(!warn || data.private) warn = function(msg) { /* noop */ };
- if (data.scripts &&
- data.scripts.install === "node-gyp rebuild" &&
- !data.scripts.preinstall) {
- data.gypfile = true;
- }
- fixer_1.warn = function() { warn(make_warning.apply(null, arguments)); };
- thingsToFix.forEach(function(thingName) {
- fixer_1["fix" + ucFirst(thingName)](data, strict);
- });
- data._id = data.name + "@" + data.version;
- }
- function ucFirst (string) {
- return string.charAt(0).toUpperCase() + string.slice(1);
- }
- var readPkg = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = (fp, opts) => {
- if (typeof fp !== 'string') {
- opts = fp;
- fp = '.';
- }
- opts = opts || {};
- return pathType.dir(fp)
- .then(isDir => {
- if (isDir) {
- fp = path.join(fp, 'package.json');
- }
- return loadJsonFile(fp);
- })
- .then(x => {
- if (opts.normalize !== false) {
- normalize_1(x);
- }
- return x;
- });
- };
- module.exports.sync = (fp, opts) => {
- if (typeof fp !== 'string') {
- opts = fp;
- fp = '.';
- }
- opts = opts || {};
- fp = pathType.dirSync(fp) ? path.join(fp, 'package.json') : fp;
- const x = loadJsonFile.sync(fp);
- if (opts.normalize !== false) {
- normalize_1(x);
- }
- return x;
- };
- });
- var readPkgUp = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = opts => {
- return findUp('package.json', opts).then(fp => {
- if (!fp) {
- return {};
- }
- return readPkg(fp, opts).then(pkg => ({pkg, path: fp}));
- });
- };
- module.exports.sync = opts => {
- const fp = findUp.sync('package.json', opts);
- if (!fp) {
- return {};
- }
- return {
- pkg: readPkg.sync(fp, opts),
- path: fp
- };
- };
- });
- function concat$2(parts) {
- return { type: "concat", parts };
- }
- function indent$2(contents) {
- return { type: "indent", contents };
- }
- function align$1(n, contents) {
- return { type: "align", contents, n };
- }
- function group$1(contents, opts) {
- opts = opts || {};
- return {
- type: "group",
- contents: contents,
- break: !!opts.shouldBreak,
- expandedStates: opts.expandedStates
- };
- }
- function dedentToRoot(contents) {
- return align$1(-Infinity, contents);
- }
- function markAsRoot(contents) {
- return align$1({ type: "root" }, contents);
- }
- function dedent$1(contents) {
- return align$1(-1, contents);
- }
- function conditionalGroup$1(states, opts) {
- return group$1(
- states[0],
- Object.assign(opts || {}, { expandedStates: states })
- );
- }
- function fill$1(parts) {
- return { type: "fill", parts };
- }
- function ifBreak$1(breakContents, flatContents) {
- return { type: "if-break", breakContents, flatContents };
- }
- function lineSuffix$1(contents) {
- return { type: "line-suffix", contents };
- }
- const lineSuffixBoundary$1 = { type: "line-suffix-boundary" };
- const breakParent$2 = { type: "break-parent" };
- const line$1 = { type: "line" };
- const softline$1 = { type: "line", soft: true };
- const hardline$2 = concat$2([{ type: "line", hard: true }, breakParent$2]);
- const literalline$1 = concat$2([
- { type: "line", hard: true, literal: true },
- breakParent$2
- ]);
- const cursor$1 = { type: "cursor", placeholder: Symbol("cursor") };
- function join$2(sep, arr) {
- const res = [];
- for (let i = 0; i < arr.length; i++) {
- if (i !== 0) {
- res.push(sep);
- }
- res.push(arr[i]);
- }
- return concat$2(res);
- }
- function addAlignmentToDoc$1(doc, size, tabWidth) {
- let aligned = doc;
- if (size > 0) {
- // Use indent to add tabs for all the levels of tabs we need
- for (let i = 0; i < Math.floor(size / tabWidth); ++i) {
- aligned = indent$2(aligned);
- }
- // Use align for all the spaces that are needed
- aligned = align$1(size % tabWidth, aligned);
- // size is absolute from 0 and not relative to the current
- // indentation, so we use -Infinity to reset the indentation to 0
- aligned = align$1(-Infinity, aligned);
- }
- return aligned;
- }
- var docBuilders$2 = {
- concat: concat$2,
- join: join$2,
- line: line$1,
- softline: softline$1,
- hardline: hardline$2,
- literalline: literalline$1,
- group: group$1,
- conditionalGroup: conditionalGroup$1,
- fill: fill$1,
- lineSuffix: lineSuffix$1,
- lineSuffixBoundary: lineSuffixBoundary$1,
- cursor: cursor$1,
- breakParent: breakParent$2,
- ifBreak: ifBreak$1,
- indent: indent$2,
- align: align$1,
- addAlignmentToDoc: addAlignmentToDoc$1,
- markAsRoot,
- dedentToRoot,
- dedent: dedent$1
- };
- const concat$3 = docBuilders$2.concat;
- const fill$2 = docBuilders$2.fill;
- const cursor$2 = docBuilders$2.cursor;
- const MODE_BREAK = 1;
- const MODE_FLAT = 2;
- function rootIndent() {
- return { value: "", length: 0, queue: [] };
- }
- function makeIndent(ind, options) {
- return generateInd(ind, { type: "indent" }, options);
- }
- function makeAlign(ind, n, options) {
- return n === -Infinity
- ? ind.root || rootIndent()
- : n < 0
- ? generateInd(ind, { type: "dedent" }, options)
- : !n
- ? ind
- : n.type === "root"
- ? Object.assign({}, ind, { root: ind })
- : typeof n === "string"
- ? generateInd(ind, { type: "stringAlign", n }, options)
- : generateInd(ind, { type: "numberAlign", n }, options);
- }
- function generateInd(ind, newPart, options) {
- const queue =
- newPart.type === "dedent"
- ? ind.queue.slice(0, -1)
- : ind.queue.concat(newPart);
- let value = "";
- let length = 0;
- let lastTabs = 0;
- let lastSpaces = 0;
- for (const part of queue) {
- switch (part.type) {
- case "indent":
- flush();
- if (options.useTabs) {
- addTabs(1);
- } else {
- addSpaces(options.tabWidth);
- }
- break;
- case "stringAlign":
- flush();
- value += part.n;
- length += part.n.length;
- break;
- case "numberAlign":
- lastTabs += 1;
- lastSpaces += part.n;
- break;
- /* istanbul ignore next */
- default:
- throw new Error(`Unexpected type '${part.type}'`);
- }
- }
- flushSpaces();
- return Object.assign({}, ind, { value, length, queue });
- function addTabs(count) {
- value += "\t".repeat(count);
- length += options.tabWidth * count;
- }
- function addSpaces(count) {
- value += " ".repeat(count);
- length += count;
- }
- function flush() {
- if (options.useTabs) {
- flushTabs();
- } else {
- flushSpaces();
- }
- }
- function flushTabs() {
- if (lastTabs > 0) {
- addTabs(lastTabs);
- }
- resetLast();
- }
- function flushSpaces() {
- if (lastSpaces > 0) {
- addSpaces(lastSpaces);
- }
- resetLast();
- }
- function resetLast() {
- lastTabs = 0;
- lastSpaces = 0;
- }
- }
- function fits(next, restCommands, width, options, mustBeFlat) {
- let restIdx = restCommands.length;
- const cmds = [next];
- while (width >= 0) {
- if (cmds.length === 0) {
- if (restIdx === 0) {
- return true;
- }
- cmds.push(restCommands[restIdx - 1]);
- restIdx--;
- continue;
- }
- const x = cmds.pop();
- const ind = x[0];
- const mode = x[1];
- const doc = x[2];
- if (typeof doc === "string") {
- width -= util$1.getStringWidth(doc);
- } else {
- switch (doc.type) {
- case "concat":
- for (let i = doc.parts.length - 1; i >= 0; i--) {
- cmds.push([ind, mode, doc.parts[i]]);
- }
- break;
- case "indent":
- cmds.push([makeIndent(ind, options), mode, doc.contents]);
- break;
- case "align":
- cmds.push([makeAlign(ind, doc.n, options), mode, doc.contents]);
- break;
- case "group":
- if (mustBeFlat && doc.break) {
- return false;
- }
- cmds.push([ind, doc.break ? MODE_BREAK : mode, doc.contents]);
- break;
- case "fill":
- for (let i = doc.parts.length - 1; i >= 0; i--) {
- cmds.push([ind, mode, doc.parts[i]]);
- }
- break;
- case "if-break":
- if (mode === MODE_BREAK) {
- if (doc.breakContents) {
- cmds.push([ind, mode, doc.breakContents]);
- }
- }
- if (mode === MODE_FLAT) {
- if (doc.flatContents) {
- cmds.push([ind, mode, doc.flatContents]);
- }
- }
- break;
- case "line":
- switch (mode) {
- // fallthrough
- case MODE_FLAT:
- if (!doc.hard) {
- if (!doc.soft) {
- width -= 1;
- }
- break;
- }
- return true;
- case MODE_BREAK:
- return true;
- }
- break;
- }
- }
- }
- return false;
- }
- function printDocToString$1(doc, options) {
- const width = options.printWidth;
- const newLine = options.newLine || "\n";
- let pos = 0;
- // cmds is basically a stack. We've turned a recursive call into a
- // while loop which is much faster. The while loop below adds new
- // cmds to the array instead of recursively calling `print`.
- const cmds = [[rootIndent(), MODE_BREAK, doc]];
- const out = [];
- let shouldRemeasure = false;
- let lineSuffix = [];
- while (cmds.length !== 0) {
- const x = cmds.pop();
- const ind = x[0];
- const mode = x[1];
- const doc = x[2];
- if (typeof doc === "string") {
- out.push(doc);
- pos += util$1.getStringWidth(doc);
- } else {
- switch (doc.type) {
- case "cursor":
- out.push(cursor$2.placeholder);
- break;
- case "concat":
- for (let i = doc.parts.length - 1; i >= 0; i--) {
- cmds.push([ind, mode, doc.parts[i]]);
- }
- break;
- case "indent":
- cmds.push([makeIndent(ind, options), mode, doc.contents]);
- break;
- case "align":
- cmds.push([makeAlign(ind, doc.n, options), mode, doc.contents]);
- break;
- case "group":
- switch (mode) {
- case MODE_FLAT:
- if (!shouldRemeasure) {
- cmds.push([
- ind,
- doc.break ? MODE_BREAK : MODE_FLAT,
- doc.contents
- ]);
- break;
- }
- // fallthrough
- case MODE_BREAK: {
- shouldRemeasure = false;
- const next = [ind, MODE_FLAT, doc.contents];
- const rem = width - pos;
- if (!doc.break && fits(next, cmds, rem, options)) {
- cmds.push(next);
- } else {
- // Expanded states are a rare case where a document
- // can manually provide multiple representations of
- // itself. It provides an array of documents
- // going from the least expanded (most flattened)
- // representation first to the most expanded. If a
- // group has these, we need to manually go through
- // these states and find the first one that fits.
- if (doc.expandedStates) {
- const mostExpanded =
- doc.expandedStates[doc.expandedStates.length - 1];
- if (doc.break) {
- cmds.push([ind, MODE_BREAK, mostExpanded]);
- break;
- } else {
- for (let i = 1; i < doc.expandedStates.length + 1; i++) {
- if (i >= doc.expandedStates.length) {
- cmds.push([ind, MODE_BREAK, mostExpanded]);
- break;
- } else {
- const state = doc.expandedStates[i];
- const cmd = [ind, MODE_FLAT, state];
- if (fits(cmd, cmds, rem, options)) {
- cmds.push(cmd);
- break;
- }
- }
- }
- }
- } else {
- cmds.push([ind, MODE_BREAK, doc.contents]);
- }
- }
- break;
- }
- }
- break;
- // Fills each line with as much code as possible before moving to a new
- // line with the same indentation.
- //
- // Expects doc.parts to be an array of alternating content and
- // whitespace. The whitespace contains the linebreaks.
- //
- // For example:
- // ["I", line, "love", line, "monkeys"]
- // or
- // [{ type: group, ... }, softline, { type: group, ... }]
- //
- // It uses this parts structure to handle three main layout cases:
- // * The first two content items fit on the same line without
- // breaking
- // -> output the first content item and the whitespace "flat".
- // * Only the first content item fits on the line without breaking
- // -> output the first content item "flat" and the whitespace with
- // "break".
- // * Neither content item fits on the line without breaking
- // -> output the first content item and the whitespace with "break".
- case "fill": {
- const rem = width - pos;
- const parts = doc.parts;
- if (parts.length === 0) {
- break;
- }
- const content = parts[0];
- const contentFlatCmd = [ind, MODE_FLAT, content];
- const contentBreakCmd = [ind, MODE_BREAK, content];
- const contentFits = fits(contentFlatCmd, [], rem, options, true);
- if (parts.length === 1) {
- if (contentFits) {
- cmds.push(contentFlatCmd);
- } else {
- cmds.push(contentBreakCmd);
- }
- break;
- }
- const whitespace = parts[1];
- const whitespaceFlatCmd = [ind, MODE_FLAT, whitespace];
- const whitespaceBreakCmd = [ind, MODE_BREAK, whitespace];
- if (parts.length === 2) {
- if (contentFits) {
- cmds.push(whitespaceFlatCmd);
- cmds.push(contentFlatCmd);
- } else {
- cmds.push(whitespaceBreakCmd);
- cmds.push(contentBreakCmd);
- }
- break;
- }
- // At this point we've handled the first pair (context, separator)
- // and will create a new fill doc for the rest of the content.
- // Ideally we wouldn't mutate the array here but coping all the
- // elements to a new array would make this algorithm quadratic,
- // which is unusable for large arrays (e.g. large texts in JSX).
- parts.splice(0, 2);
- const remainingCmd = [ind, mode, fill$2(parts)];
- const secondContent = parts[0];
- const firstAndSecondContentFlatCmd = [
- ind,
- MODE_FLAT,
- concat$3([content, whitespace, secondContent])
- ];
- const firstAndSecondContentFits = fits(
- firstAndSecondContentFlatCmd,
- [],
- rem,
- options,
- true
- );
- if (firstAndSecondContentFits) {
- cmds.push(remainingCmd);
- cmds.push(whitespaceFlatCmd);
- cmds.push(contentFlatCmd);
- } else if (contentFits) {
- cmds.push(remainingCmd);
- cmds.push(whitespaceBreakCmd);
- cmds.push(contentFlatCmd);
- } else {
- cmds.push(remainingCmd);
- cmds.push(whitespaceBreakCmd);
- cmds.push(contentBreakCmd);
- }
- break;
- }
- case "if-break":
- if (mode === MODE_BREAK) {
- if (doc.breakContents) {
- cmds.push([ind, mode, doc.breakContents]);
- }
- }
- if (mode === MODE_FLAT) {
- if (doc.flatContents) {
- cmds.push([ind, mode, doc.flatContents]);
- }
- }
- break;
- case "line-suffix":
- lineSuffix.push([ind, mode, doc.contents]);
- break;
- case "line-suffix-boundary":
- if (lineSuffix.length > 0) {
- cmds.push([ind, mode, { type: "line", hard: true }]);
- }
- break;
- case "line":
- switch (mode) {
- case MODE_FLAT:
- if (!doc.hard) {
- if (!doc.soft) {
- out.push(" ");
- pos += 1;
- }
- break;
- } else {
- // This line was forced into the output even if we
- // were in flattened mode, so we need to tell the next
- // group that no matter what, it needs to remeasure
- // because the previous measurement didn't accurately
- // capture the entire expression (this is necessary
- // for nested groups)
- shouldRemeasure = true;
- }
- // fallthrough
- case MODE_BREAK:
- if (lineSuffix.length) {
- cmds.push([ind, mode, doc]);
- [].push.apply(cmds, lineSuffix.reverse());
- lineSuffix = [];
- break;
- }
- if (doc.literal) {
- if (ind.root) {
- out.push(newLine, ind.root.value);
- pos = ind.root.length;
- } else {
- out.push(newLine);
- pos = 0;
- }
- } else {
- if (out.length > 0) {
- // Trim whitespace at the end of line
- while (
- out.length > 0 &&
- out[out.length - 1].match(/^[^\S\n]*$/)
- ) {
- out.pop();
- }
- if (
- out.length &&
- (options.parser !== "markdown" ||
- // preserve markdown's `break` node (two trailing spaces)
- !/\S {2}$/.test(out[out.length - 1]))
- ) {
- out[out.length - 1] = out[out.length - 1].replace(
- /[^\S\n]*$/,
- ""
- );
- }
- }
- out.push(newLine + ind.value);
- pos = ind.length;
- }
- break;
- }
- break;
- default:
- }
- }
- }
- const cursorPlaceholderIndex = out.indexOf(cursor$2.placeholder);
- if (cursorPlaceholderIndex !== -1) {
- const beforeCursor = out.slice(0, cursorPlaceholderIndex).join("");
- const afterCursor = out.slice(cursorPlaceholderIndex + 1).join("");
- return {
- formatted: beforeCursor + afterCursor,
- cursor: beforeCursor.length
- };
- }
- return { formatted: out.join("") };
- }
- var docPrinter = { printDocToString: printDocToString$1 };
- function flattenDoc(doc) {
- if (doc.type === "concat") {
- const res = [];
- for (let i = 0; i < doc.parts.length; ++i) {
- const doc2 = doc.parts[i];
- if (typeof doc2 !== "string" && doc2.type === "concat") {
- [].push.apply(res, flattenDoc(doc2).parts);
- } else {
- const flattened = flattenDoc(doc2);
- if (flattened !== "") {
- res.push(flattened);
- }
- }
- }
- return Object.assign({}, doc, { parts: res });
- } else if (doc.type === "if-break") {
- return Object.assign({}, doc, {
- breakContents:
- doc.breakContents != null ? flattenDoc(doc.breakContents) : null,
- flatContents:
- doc.flatContents != null ? flattenDoc(doc.flatContents) : null
- });
- } else if (doc.type === "group") {
- return Object.assign({}, doc, {
- contents: flattenDoc(doc.contents),
- expandedStates: doc.expandedStates
- ? doc.expandedStates.map(flattenDoc)
- : doc.expandedStates
- });
- } else if (doc.contents) {
- return Object.assign({}, doc, { contents: flattenDoc(doc.contents) });
- }
- return doc;
- }
- function printDoc(doc) {
- if (typeof doc === "string") {
- return JSON.stringify(doc);
- }
- if (doc.type === "line") {
- if (doc.literalline) {
- return "literalline";
- }
- if (doc.hard) {
- return "hardline";
- }
- if (doc.soft) {
- return "softline";
- }
- return "line";
- }
- if (doc.type === "break-parent") {
- return "breakParent";
- }
- if (doc.type === "concat") {
- return "[" + doc.parts.map(printDoc).join(", ") + "]";
- }
- if (doc.type === "indent") {
- return "indent(" + printDoc(doc.contents) + ")";
- }
- if (doc.type === "align") {
- return doc.n === -Infinity
- ? "dedentToRoot(" + printDoc(doc.contents) + ")"
- : doc.n < 0
- ? "dedent(" + printDoc(doc.contents) + ")"
- : doc.n.type === "root"
- ? "markAsRoot(" + printDoc(doc.contents) + ")"
- : "align(" +
- JSON.stringify(doc.n) +
- ", " +
- printDoc(doc.contents) +
- ")";
- }
- if (doc.type === "if-break") {
- return (
- "ifBreak(" +
- printDoc(doc.breakContents) +
- (doc.flatContents ? ", " + printDoc(doc.flatContents) : "") +
- ")"
- );
- }
- if (doc.type === "group") {
- if (doc.expandedStates) {
- return (
- "conditionalGroup(" +
- "[" +
- doc.expandedStates.map(printDoc).join(",") +
- "])"
- );
- }
- return (
- (doc.break ? "wrappedGroup" : "group") +
- "(" +
- printDoc(doc.contents) +
- ")"
- );
- }
- if (doc.type === "fill") {
- return "fill" + "(" + doc.parts.map(printDoc).join(", ") + ")";
- }
- if (doc.type === "line-suffix") {
- return "lineSuffix(" + printDoc(doc.contents) + ")";
- }
- if (doc.type === "line-suffix-boundary") {
- return "lineSuffixBoundary";
- }
- throw new Error("Unknown doc type " + doc.type);
- }
- var docDebug = {
- printDocToDebug: function(doc) {
- return printDoc(flattenDoc(doc));
- }
- };
- var doc = {
- builders: docBuilders$2,
- printer: docPrinter,
- utils: docUtils,
- debug: docDebug
- };
- const docBuilders$1 = doc.builders;
- const concat$1 = docBuilders$1.concat;
- const hardline$1 = docBuilders$1.hardline;
- const breakParent$1 = docBuilders$1.breakParent;
- const indent$1 = docBuilders$1.indent;
- const lineSuffix = docBuilders$1.lineSuffix;
- const join$1 = docBuilders$1.join;
- const cursor = docBuilders$1.cursor;
- const childNodesCacheKey = Symbol("child-nodes");
- const addLeadingComment$1 = utilShared.addLeadingComment;
- const addTrailingComment$1 = utilShared.addTrailingComment;
- const addDanglingComment$1 = utilShared.addDanglingComment;
- function getSortedChildNodes(node, text, options, resultArray) {
- if (!node) {
- return;
- }
- const printer = options.printer;
- const locStart = options.locStart;
- const locEnd = options.locEnd;
- if (resultArray) {
- if (node && printer.canAttachComment && printer.canAttachComment(node)) {
- // This reverse insertion sort almost always takes constant
- // time because we almost always (maybe always?) append the
- // nodes in order anyway.
- let i;
- for (i = resultArray.length - 1; i >= 0; --i) {
- if (
- locStart(resultArray[i]) <= locStart(node) &&
- locEnd(resultArray[i]) <= locEnd(node)
- ) {
- break;
- }
- }
- resultArray.splice(i + 1, 0, node);
- return;
- }
- } else if (node[childNodesCacheKey]) {
- return node[childNodesCacheKey];
- }
- let childNodes;
- if (printer.getCommentChildNodes) {
- childNodes = printer.getCommentChildNodes(node);
- } else if (node && typeof node === "object") {
- childNodes = Object.keys(node)
- .filter(
- n =>
- n !== "enclosingNode" &&
- n !== "precedingNode" &&
- n !== "followingNode"
- )
- .map(n => node[n]);
- }
- if (!childNodes) {
- return;
- }
- if (!resultArray) {
- Object.defineProperty(node, childNodesCacheKey, {
- value: (resultArray = []),
- enumerable: false
- });
- }
- childNodes.forEach(childNode => {
- getSortedChildNodes(childNode, text, options, resultArray);
- });
- return resultArray;
- }
- // As efficiently as possible, decorate the comment object with
- // .precedingNode, .enclosingNode, and/or .followingNode properties, at
- // least one of which is guaranteed to be defined.
- function decorateComment(node, comment, text, options) {
- const locStart = options.locStart;
- const locEnd = options.locEnd;
- const childNodes = getSortedChildNodes(node, text, options);
- let precedingNode;
- let followingNode;
- // Time to dust off the old binary search robes and wizard hat.
- let left = 0;
- let right = childNodes.length;
- while (left < right) {
- const middle = (left + right) >> 1;
- const child = childNodes[middle];
- if (
- locStart(child) - locStart(comment) <= 0 &&
- locEnd(comment) - locEnd(child) <= 0
- ) {
- // The comment is completely contained by this child node.
- comment.enclosingNode = child;
- decorateComment(child, comment, text, options);
- return; // Abandon the binary search at this level.
- }
- if (locEnd(child) - locStart(comment) <= 0) {
- // This child node falls completely before the comment.
- // Because we will never consider this node or any nodes
- // before it again, this node must be the closest preceding
- // node we have encountered so far.
- precedingNode = child;
- left = middle + 1;
- continue;
- }
- if (locEnd(comment) - locStart(child) <= 0) {
- // This child node falls completely after the comment.
- // Because we will never consider this node or any nodes after
- // it again, this node must be the closest following node we
- // have encountered so far.
- followingNode = child;
- right = middle;
- continue;
- }
- /* istanbul ignore next */
- throw new Error("Comment location overlaps with node location");
- }
- // We don't want comments inside of different expressions inside of the same
- // template literal to move to another expression.
- if (
- comment.enclosingNode &&
- comment.enclosingNode.type === "TemplateLiteral"
- ) {
- const quasis = comment.enclosingNode.quasis;
- const commentIndex = findExpressionIndexForComment(
- quasis,
- comment,
- options
- );
- if (
- precedingNode &&
- findExpressionIndexForComment(quasis, precedingNode, options) !==
- commentIndex
- ) {
- precedingNode = null;
- }
- if (
- followingNode &&
- findExpressionIndexForComment(quasis, followingNode, options) !==
- commentIndex
- ) {
- followingNode = null;
- }
- }
- if (precedingNode) {
- comment.precedingNode = precedingNode;
- }
- if (followingNode) {
- comment.followingNode = followingNode;
- }
- }
- function attach(comments, ast, text, options) {
- if (!Array.isArray(comments)) {
- return;
- }
- const tiesToBreak = [];
- const locStart = options.locStart;
- const locEnd = options.locEnd;
- comments.forEach((comment, i) => {
- if (options.parser === "json" && locStart(comment) - locStart(ast) <= 0) {
- addLeadingComment$1(ast, comment);
- return;
- }
- decorateComment(ast, comment, text, options);
- const precedingNode = comment.precedingNode;
- const enclosingNode = comment.enclosingNode;
- const followingNode = comment.followingNode;
- const pluginHandleOwnLineComment =
- options.printer.handleComments && options.printer.handleComments.ownLine
- ? options.printer.handleComments.ownLine
- : () => false;
- const pluginHandleEndOfLineComment =
- options.printer.handleComments && options.printer.handleComments.endOfLine
- ? options.printer.handleComments.endOfLine
- : () => false;
- const pluginHandleRemainingComment =
- options.printer.handleComments && options.printer.handleComments.remaining
- ? options.printer.handleComments.remaining
- : () => false;
- const isLastComment = comments.length - 1 === i;
- if (util$1.hasNewline(text, locStart(comment), { backwards: true })) {
- // If a comment exists on its own line, prefer a leading comment.
- // We also need to check if it's the first line of the file.
- if (
- pluginHandleOwnLineComment(comment, text, options, ast, isLastComment)
- ) {
- // We're good
- } else if (followingNode) {
- // Always a leading comment.
- addLeadingComment$1(followingNode, comment);
- } else if (precedingNode) {
- addTrailingComment$1(precedingNode, comment);
- } else if (enclosingNode) {
- addDanglingComment$1(enclosingNode, comment);
- } else {
- // There are no nodes, let's attach it to the root of the ast
- /* istanbul ignore next */
- addDanglingComment$1(ast, comment);
- }
- } else if (util$1.hasNewline(text, locEnd(comment))) {
- if (
- pluginHandleEndOfLineComment(comment, text, options, ast, isLastComment)
- ) {
- // We're good
- } else if (precedingNode) {
- // There is content before this comment on the same line, but
- // none after it, so prefer a trailing comment of the previous node.
- addTrailingComment$1(precedingNode, comment);
- } else if (followingNode) {
- addLeadingComment$1(followingNode, comment);
- } else if (enclosingNode) {
- addDanglingComment$1(enclosingNode, comment);
- } else {
- // There are no nodes, let's attach it to the root of the ast
- /* istanbul ignore next */
- addDanglingComment$1(ast, comment);
- }
- } else {
- if (
- pluginHandleRemainingComment(comment, text, options, ast, isLastComment)
- ) {
- // We're good
- } else if (precedingNode && followingNode) {
- // Otherwise, text exists both before and after the comment on
- // the same line. If there is both a preceding and following
- // node, use a tie-breaking algorithm to determine if it should
- // be attached to the next or previous node. In the last case,
- // simply attach the right node;
- const tieCount = tiesToBreak.length;
- if (tieCount > 0) {
- const lastTie = tiesToBreak[tieCount - 1];
- if (lastTie.followingNode !== comment.followingNode) {
- breakTies(tiesToBreak, text, options);
- }
- }
- tiesToBreak.push(comment);
- } else if (precedingNode) {
- addTrailingComment$1(precedingNode, comment);
- } else if (followingNode) {
- addLeadingComment$1(followingNode, comment);
- } else if (enclosingNode) {
- addDanglingComment$1(enclosingNode, comment);
- } else {
- // There are no nodes, let's attach it to the root of the ast
- /* istanbul ignore next */
- addDanglingComment$1(ast, comment);
- }
- }
- });
- breakTies(tiesToBreak, text, options);
- comments.forEach(comment => {
- // These node references were useful for breaking ties, but we
- // don't need them anymore, and they create cycles in the AST that
- // may lead to infinite recursion if we don't delete them here.
- delete comment.precedingNode;
- delete comment.enclosingNode;
- delete comment.followingNode;
- });
- }
- function breakTies(tiesToBreak, text, options) {
- const tieCount = tiesToBreak.length;
- if (tieCount === 0) {
- return;
- }
- const precedingNode = tiesToBreak[0].precedingNode;
- const followingNode = tiesToBreak[0].followingNode;
- let gapEndPos = options.locStart(followingNode);
- // Iterate backwards through tiesToBreak, examining the gaps
- // between the tied comments. In order to qualify as leading, a
- // comment must be separated from followingNode by an unbroken series of
- // gaps (or other comments). Gaps should only contain whitespace or open
- // parentheses.
- let indexOfFirstLeadingComment;
- for (
- indexOfFirstLeadingComment = tieCount;
- indexOfFirstLeadingComment > 0;
- --indexOfFirstLeadingComment
- ) {
- const comment = tiesToBreak[indexOfFirstLeadingComment - 1];
- assert.strictEqual(comment.precedingNode, precedingNode);
- assert.strictEqual(comment.followingNode, followingNode);
- const gap = text.slice(options.locEnd(comment), gapEndPos).trim();
- if (gap === "" || /^\(+$/.test(gap)) {
- gapEndPos = options.locStart(comment);
- } else {
- // The gap string contained something other than whitespace or open
- // parentheses.
- break;
- }
- }
- tiesToBreak.forEach((comment, i) => {
- if (i < indexOfFirstLeadingComment) {
- addTrailingComment$1(precedingNode, comment);
- } else {
- addLeadingComment$1(followingNode, comment);
- }
- });
- tiesToBreak.length = 0;
- }
- function printComment$1(commentPath, options) {
- const comment = commentPath.getValue();
- comment.printed = true;
- return options.printer.printComment(commentPath, options);
- }
- function findExpressionIndexForComment(quasis, comment, options) {
- const startPos = options.locStart(comment) - 1;
- for (let i = 1; i < quasis.length; ++i) {
- if (startPos < getQuasiRange(quasis[i]).start) {
- return i - 1;
- }
- }
- // We haven't found it, it probably means that some of the locations are off.
- // Let's just return the first one.
- /* istanbul ignore next */
- return 0;
- }
- function getQuasiRange(expr) {
- if (expr.start !== undefined) {
- // Babylon
- return { start: expr.start, end: expr.end };
- }
- // Flow
- return { start: expr.range[0], end: expr.range[1] };
- }
- function printLeadingComment(commentPath, print, options) {
- const comment = commentPath.getValue();
- const contents = printComment$1(commentPath, options);
- if (!contents) {
- return "";
- }
- const isBlock = util$1.isBlockComment(comment);
- // Leading block comments should see if they need to stay on the
- // same line or not.
- if (isBlock) {
- return concat$1([
- contents,
- util$1.hasNewline(options.originalText, options.locEnd(comment))
- ? hardline$1
- : " "
- ]);
- }
- return concat$1([contents, hardline$1]);
- }
- function printTrailingComment(commentPath, print, options) {
- const comment = commentPath.getValue();
- const contents = printComment$1(commentPath, options);
- if (!contents) {
- return "";
- }
- const isBlock = util$1.isBlockComment(comment);
- // We don't want the line to break
- // when the parentParentNode is a ClassDeclaration/-Expression
- // And the parentNode is in the superClass property
- const parentNode = commentPath.getNode(1);
- const parentParentNode = commentPath.getNode(2);
- const isParentSuperClass =
- parentParentNode &&
- (parentParentNode.type === "ClassDeclaration" ||
- parentParentNode.type === "ClassExpression") &&
- parentParentNode.superClass === parentNode;
- if (
- util$1.hasNewline(options.originalText, options.locStart(comment), {
- backwards: true
- })
- ) {
- // This allows comments at the end of nested structures:
- // {
- // x: 1,
- // y: 2
- // // A comment
- // }
- // Those kinds of comments are almost always leading comments, but
- // here it doesn't go "outside" the block and turns it into a
- // trailing comment for `2`. We can simulate the above by checking
- // if this a comment on its own line; normal trailing comments are
- // always at the end of another expression.
- const isLineBeforeEmpty = util$1.isPreviousLineEmpty(
- options.originalText,
- comment,
- options.locStart
- );
- return lineSuffix(
- concat$1([hardline$1, isLineBeforeEmpty ? hardline$1 : "", contents])
- );
- } else if (isBlock || isParentSuperClass) {
- // Trailing block comments never need a newline
- return concat$1([" ", contents]);
- }
- return concat$1([lineSuffix(" " + contents), !isBlock ? breakParent$1 : ""]);
- }
- function printDanglingComments(path$$1, options, sameIndent, filter) {
- const parts = [];
- const node = path$$1.getValue();
- if (!node || !node.comments) {
- return "";
- }
- path$$1.each(commentPath => {
- const comment = commentPath.getValue();
- if (
- comment &&
- !comment.leading &&
- !comment.trailing &&
- (!filter || filter(comment))
- ) {
- parts.push(printComment$1(commentPath, options));
- }
- }, "comments");
- if (parts.length === 0) {
- return "";
- }
- if (sameIndent) {
- return join$1(hardline$1, parts);
- }
- return indent$1(concat$1([hardline$1, join$1(hardline$1, parts)]));
- }
- function prependCursorPlaceholder(path$$1, options, printed) {
- if (path$$1.getNode() === options.cursorNode && path$$1.getValue()) {
- return concat$1([cursor, printed]);
- }
- return printed;
- }
- function printComments(path$$1, print, options, needsSemi) {
- const value = path$$1.getValue();
- const printed = print(path$$1);
- const comments = value && value.comments;
- if (!comments || comments.length === 0) {
- return prependCursorPlaceholder(path$$1, options, printed);
- }
- const leadingParts = [];
- const trailingParts = [needsSemi ? ";" : "", printed];
- path$$1.each(commentPath => {
- const comment = commentPath.getValue();
- const leading = comment.leading;
- const trailing = comment.trailing;
- if (leading) {
- const contents = printLeadingComment(commentPath, print, options);
- if (!contents) {
- return;
- }
- leadingParts.push(contents);
- const text = options.originalText;
- if (
- util$1.hasNewline(
- text,
- util$1.skipNewline(text, options.locEnd(comment))
- )
- ) {
- leadingParts.push(hardline$1);
- }
- } else if (trailing) {
- trailingParts.push(printTrailingComment(commentPath, print, options));
- }
- }, "comments");
- return prependCursorPlaceholder(
- path$$1,
- options,
- concat$1(leadingParts.concat(trailingParts))
- );
- }
- var comments = {
- attach,
- printComments,
- printDanglingComments,
- getSortedChildNodes
- };
- var ast = createCommonjsModule(function (module) {
- /*
- Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com>
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- (function () {
- 'use strict';
- function isExpression(node) {
- if (node == null) { return false; }
- switch (node.type) {
- case 'ArrayExpression':
- case 'AssignmentExpression':
- case 'BinaryExpression':
- case 'CallExpression':
- case 'ConditionalExpression':
- case 'FunctionExpression':
- case 'Identifier':
- case 'Literal':
- case 'LogicalExpression':
- case 'MemberExpression':
- case 'NewExpression':
- case 'ObjectExpression':
- case 'SequenceExpression':
- case 'ThisExpression':
- case 'UnaryExpression':
- case 'UpdateExpression':
- return true;
- }
- return false;
- }
- function isIterationStatement(node) {
- if (node == null) { return false; }
- switch (node.type) {
- case 'DoWhileStatement':
- case 'ForInStatement':
- case 'ForStatement':
- case 'WhileStatement':
- return true;
- }
- return false;
- }
- function isStatement(node) {
- if (node == null) { return false; }
- switch (node.type) {
- case 'BlockStatement':
- case 'BreakStatement':
- case 'ContinueStatement':
- case 'DebuggerStatement':
- case 'DoWhileStatement':
- case 'EmptyStatement':
- case 'ExpressionStatement':
- case 'ForInStatement':
- case 'ForStatement':
- case 'IfStatement':
- case 'LabeledStatement':
- case 'ReturnStatement':
- case 'SwitchStatement':
- case 'ThrowStatement':
- case 'TryStatement':
- case 'VariableDeclaration':
- case 'WhileStatement':
- case 'WithStatement':
- return true;
- }
- return false;
- }
- function isSourceElement(node) {
- return isStatement(node) || node != null && node.type === 'FunctionDeclaration';
- }
- function trailingStatement(node) {
- switch (node.type) {
- case 'IfStatement':
- if (node.alternate != null) {
- return node.alternate;
- }
- return node.consequent;
- case 'LabeledStatement':
- case 'ForStatement':
- case 'ForInStatement':
- case 'WhileStatement':
- case 'WithStatement':
- return node.body;
- }
- return null;
- }
- function isProblematicIfStatement(node) {
- var current;
- if (node.type !== 'IfStatement') {
- return false;
- }
- if (node.alternate == null) {
- return false;
- }
- current = node.consequent;
- do {
- if (current.type === 'IfStatement') {
- if (current.alternate == null) {
- return true;
- }
- }
- current = trailingStatement(current);
- } while (current);
- return false;
- }
- module.exports = {
- isExpression: isExpression,
- isStatement: isStatement,
- isIterationStatement: isIterationStatement,
- isSourceElement: isSourceElement,
- isProblematicIfStatement: isProblematicIfStatement,
- trailingStatement: trailingStatement
- };
- }());
- /* vim: set sw=4 ts=4 et tw=80 : */
- });
- var code = createCommonjsModule(function (module) {
- /*
- Copyright (C) 2013-2014 Yusuke Suzuki <utatane.tea@gmail.com>
- Copyright (C) 2014 Ivan Nikulin <ifaaan@gmail.com>
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- (function () {
- 'use strict';
- var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch;
- // See `tools/generate-identifier-regex.js`.
- ES5Regex = {
- // ECMAScript 5.1/Unicode v7.0.0 NonAsciiIdentifierStart:
- NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
- // ECMAScript 5.1/Unicode v7.0.0 NonAsciiIdentifierPart:
- NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/
- };
- ES6Regex = {
- // ECMAScript 6/Unicode v7.0.0 NonAsciiIdentifierStart:
- NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDE00-\uDE11\uDE13-\uDE2B\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDE00-\uDE2F\uDE44\uDE80-\uDEAA]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]/,
- // ECMAScript 6/Unicode v7.0.0 NonAsciiIdentifierPart:
- NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDD0-\uDDDA\uDE00-\uDE11\uDE13-\uDE37\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF01-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/
- };
- function isDecimalDigit(ch) {
- return 0x30 <= ch && ch <= 0x39; // 0..9
- }
- function isHexDigit(ch) {
- return 0x30 <= ch && ch <= 0x39 || // 0..9
- 0x61 <= ch && ch <= 0x66 || // a..f
- 0x41 <= ch && ch <= 0x46; // A..F
- }
- function isOctalDigit(ch) {
- return ch >= 0x30 && ch <= 0x37; // 0..7
- }
- // 7.2 White Space
- NON_ASCII_WHITESPACES = [
- 0x1680, 0x180E,
- 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A,
- 0x202F, 0x205F,
- 0x3000,
- 0xFEFF
- ];
- function isWhiteSpace(ch) {
- return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 ||
- ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0;
- }
- // 7.3 Line Terminators
- function isLineTerminator(ch) {
- return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;
- }
- // 7.6 Identifier Names and Identifiers
- function fromCodePoint(cp) {
- if (cp <= 0xFFFF) { return String.fromCharCode(cp); }
- var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800);
- var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00);
- return cu1 + cu2;
- }
- IDENTIFIER_START = new Array(0x80);
- for(ch = 0; ch < 0x80; ++ch) {
- IDENTIFIER_START[ch] =
- ch >= 0x61 && ch <= 0x7A || // a..z
- ch >= 0x41 && ch <= 0x5A || // A..Z
- ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
- }
- IDENTIFIER_PART = new Array(0x80);
- for(ch = 0; ch < 0x80; ++ch) {
- IDENTIFIER_PART[ch] =
- ch >= 0x61 && ch <= 0x7A || // a..z
- ch >= 0x41 && ch <= 0x5A || // A..Z
- ch >= 0x30 && ch <= 0x39 || // 0..9
- ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore)
- }
- function isIdentifierStartES5(ch) {
- return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
- }
- function isIdentifierPartES5(ch) {
- return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
- }
- function isIdentifierStartES6(ch) {
- return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch));
- }
- function isIdentifierPartES6(ch) {
- return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch));
- }
- module.exports = {
- isDecimalDigit: isDecimalDigit,
- isHexDigit: isHexDigit,
- isOctalDigit: isOctalDigit,
- isWhiteSpace: isWhiteSpace,
- isLineTerminator: isLineTerminator,
- isIdentifierStartES5: isIdentifierStartES5,
- isIdentifierPartES5: isIdentifierPartES5,
- isIdentifierStartES6: isIdentifierStartES6,
- isIdentifierPartES6: isIdentifierPartES6
- };
- }());
- /* vim: set sw=4 ts=4 et tw=80 : */
- });
- var keyword = createCommonjsModule(function (module) {
- /*
- Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com>
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- (function () {
- 'use strict';
- var code$$1 = code;
- function isStrictModeReservedWordES6(id) {
- switch (id) {
- case 'implements':
- case 'interface':
- case 'package':
- case 'private':
- case 'protected':
- case 'public':
- case 'static':
- case 'let':
- return true;
- default:
- return false;
- }
- }
- function isKeywordES5(id, strict) {
- // yield should not be treated as keyword under non-strict mode.
- if (!strict && id === 'yield') {
- return false;
- }
- return isKeywordES6(id, strict);
- }
- function isKeywordES6(id, strict) {
- if (strict && isStrictModeReservedWordES6(id)) {
- return true;
- }
- switch (id.length) {
- case 2:
- return (id === 'if') || (id === 'in') || (id === 'do');
- case 3:
- return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');
- case 4:
- return (id === 'this') || (id === 'else') || (id === 'case') ||
- (id === 'void') || (id === 'with') || (id === 'enum');
- case 5:
- return (id === 'while') || (id === 'break') || (id === 'catch') ||
- (id === 'throw') || (id === 'const') || (id === 'yield') ||
- (id === 'class') || (id === 'super');
- case 6:
- return (id === 'return') || (id === 'typeof') || (id === 'delete') ||
- (id === 'switch') || (id === 'export') || (id === 'import');
- case 7:
- return (id === 'default') || (id === 'finally') || (id === 'extends');
- case 8:
- return (id === 'function') || (id === 'continue') || (id === 'debugger');
- case 10:
- return (id === 'instanceof');
- default:
- return false;
- }
- }
- function isReservedWordES5(id, strict) {
- return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict);
- }
- function isReservedWordES6(id, strict) {
- return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict);
- }
- function isRestrictedWord(id) {
- return id === 'eval' || id === 'arguments';
- }
- function isIdentifierNameES5(id) {
- var i, iz, ch;
- if (id.length === 0) { return false; }
- ch = id.charCodeAt(0);
- if (!code$$1.isIdentifierStartES5(ch)) {
- return false;
- }
- for (i = 1, iz = id.length; i < iz; ++i) {
- ch = id.charCodeAt(i);
- if (!code$$1.isIdentifierPartES5(ch)) {
- return false;
- }
- }
- return true;
- }
- function decodeUtf16(lead, trail) {
- return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
- }
- function isIdentifierNameES6(id) {
- var i, iz, ch, lowCh, check;
- if (id.length === 0) { return false; }
- check = code$$1.isIdentifierStartES6;
- for (i = 0, iz = id.length; i < iz; ++i) {
- ch = id.charCodeAt(i);
- if (0xD800 <= ch && ch <= 0xDBFF) {
- ++i;
- if (i >= iz) { return false; }
- lowCh = id.charCodeAt(i);
- if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) {
- return false;
- }
- ch = decodeUtf16(ch, lowCh);
- }
- if (!check(ch)) {
- return false;
- }
- check = code$$1.isIdentifierPartES6;
- }
- return true;
- }
- function isIdentifierES5(id, strict) {
- return isIdentifierNameES5(id) && !isReservedWordES5(id, strict);
- }
- function isIdentifierES6(id, strict) {
- return isIdentifierNameES6(id) && !isReservedWordES6(id, strict);
- }
- module.exports = {
- isKeywordES5: isKeywordES5,
- isKeywordES6: isKeywordES6,
- isReservedWordES5: isReservedWordES5,
- isReservedWordES6: isReservedWordES6,
- isRestrictedWord: isRestrictedWord,
- isIdentifierNameES5: isIdentifierNameES5,
- isIdentifierNameES6: isIdentifierNameES6,
- isIdentifierES5: isIdentifierES5,
- isIdentifierES6: isIdentifierES6
- };
- }());
- /* vim: set sw=4 ts=4 et tw=80 : */
- });
- var utils$2 = createCommonjsModule(function (module, exports) {
- /*
- Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com>
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- (function () {
- 'use strict';
- exports.ast = ast;
- exports.code = code;
- exports.keyword = keyword;
- }());
- /* vim: set sw=4 ts=4 et tw=80 : */
- });
- const doc$2 = doc;
- const docUtils$4 = doc$2.utils;
- const docBuilders$5 = doc$2.builders;
- const indent$3 = docBuilders$5.indent;
- const join$3 = docBuilders$5.join;
- const hardline$3 = docBuilders$5.hardline;
- const softline$2 = docBuilders$5.softline;
- const literalline$2 = docBuilders$5.literalline;
- const concat$4 = docBuilders$5.concat;
- const dedentToRoot$1 = docBuilders$5.dedentToRoot;
- function embed(path$$1, print, textToDoc /*, options */) {
- const node = path$$1.getValue();
- const parent = path$$1.getParentNode();
- const parentParent = path$$1.getParentNode(1);
- switch (node.type) {
- case "TemplateLiteral": {
- const isCss = [isStyledJsx, isStyledComponents, isCssProp].some(isIt =>
- isIt(path$$1)
- );
- if (isCss) {
- // Get full template literal with expressions replaced by placeholders
- const rawQuasis = node.quasis.map(q => q.value.raw);
- let placeholderID = 0;
- const text = rawQuasis.reduce((prevVal, currVal, idx) => {
- return idx == 0
- ? currVal
- : prevVal +
- "@prettier-placeholder-" +
- placeholderID++ +
- "-id" +
- currVal;
- }, "");
- const doc$$2 = textToDoc(text, { parser: "css" });
- return transformCssDoc(doc$$2, path$$1, print);
- }
- /*
- * react-relay and graphql-tag
- * graphql`...`
- * graphql.experimental`...`
- * gql`...`
- *
- * This intentionally excludes Relay Classic tags, as Prettier does not
- * support Relay Classic formatting.
- */
- if (
- parent &&
- ((parent.type === "TaggedTemplateExpression" &&
- ((parent.tag.type === "MemberExpression" &&
- parent.tag.object.name === "graphql" &&
- parent.tag.property.name === "experimental") ||
- (parent.tag.type === "Identifier" &&
- (parent.tag.name === "gql" || parent.tag.name === "graphql")))) ||
- (parent.type === "CallExpression" &&
- parent.callee.type === "Identifier" &&
- parent.callee.name === "graphql"))
- ) {
- const expressionDocs = node.expressions
- ? path$$1.map(print, "expressions")
- : [];
- const numQuasis = node.quasis.length;
- if (numQuasis === 1 && node.quasis[0].value.raw.trim() === "") {
- return "``";
- }
- const parts = [];
- for (let i = 0; i < numQuasis; i++) {
- const templateElement = node.quasis[i];
- const isFirst = i === 0;
- const isLast = i === numQuasis - 1;
- const text = templateElement.value.cooked;
- // Bail out if any of the quasis have an invalid escape sequence
- // (which would make the `cooked` value be `null` or `undefined`)
- if (typeof text !== "string") {
- return null;
- }
- const lines = text.split("\n");
- const numLines = lines.length;
- const expressionDoc = expressionDocs[i];
- const startsWithBlankLine =
- numLines > 2 && lines[0].trim() === "" && lines[1].trim() === "";
- const endsWithBlankLine =
- numLines > 2 &&
- lines[numLines - 1].trim() === "" &&
- lines[numLines - 2].trim() === "";
- const commentsAndWhitespaceOnly = lines.every(line =>
- /^\s*(?:#[^\r\n]*)?$/.test(line)
- );
- // Bail out if an interpolation occurs within a comment.
- if (!isLast && /#[^\r\n]*$/.test(lines[numLines - 1])) {
- return null;
- }
- let doc$$2 = null;
- if (commentsAndWhitespaceOnly) {
- doc$$2 = printGraphqlComments(lines);
- } else {
- try {
- doc$$2 = docUtils$4.stripTrailingHardline(
- textToDoc(text, { parser: "graphql" })
- );
- } catch (error) {
- if (process.env.PRETTIER_DEBUG) {
- throw error;
- }
- // Bail if any part fails to parse.
- return null;
- }
- }
- if (doc$$2) {
- doc$$2 = escapeBackticks(doc$$2);
- if (!isFirst && startsWithBlankLine) {
- parts.push("");
- }
- parts.push(doc$$2);
- if (!isLast && endsWithBlankLine) {
- parts.push("");
- }
- } else if (!isFirst && !isLast && startsWithBlankLine) {
- parts.push("");
- }
- if (expressionDoc) {
- parts.push(concat$4(["${", expressionDoc, "}"]));
- }
- }
- return concat$4([
- "`",
- indent$3(concat$4([hardline$3, join$3(hardline$3, parts)])),
- hardline$3,
- "`"
- ]);
- }
- break;
- }
- case "TemplateElement": {
- /**
- * md`...`
- * markdown`...`
- */
- if (
- parentParent &&
- (parentParent.type === "TaggedTemplateExpression" &&
- parent.quasis.length === 1 &&
- (parentParent.tag.type === "Identifier" &&
- (parentParent.tag.name === "md" ||
- parentParent.tag.name === "markdown")))
- ) {
- const text = parent.quasis[0].value.cooked;
- const indentation = getIndentation(text);
- const hasIndent = indentation !== "";
- return concat$4([
- hasIndent
- ? indent$3(
- concat$4([
- softline$2,
- printMarkdown(
- text.replace(new RegExp(`^${indentation}`, "gm"), "")
- )
- ])
- )
- : concat$4([literalline$2, dedentToRoot$1(printMarkdown(text))]),
- softline$2
- ]);
- }
- break;
- }
- }
- function printMarkdown(text) {
- const doc$$2 = textToDoc(text, { parser: "markdown", __inJsTemplate: true });
- return docUtils$4.stripTrailingHardline(escapeBackticks(doc$$2));
- }
- }
- function getIndentation(str) {
- const firstMatchedIndent = str.match(/^([^\S\n]*)\S/m);
- return firstMatchedIndent === null ? "" : firstMatchedIndent[1];
- }
- function escapeBackticks(doc$$2) {
- return docUtils$4.mapDoc(doc$$2, currentDoc => {
- if (!currentDoc.parts) {
- return currentDoc;
- }
- const parts = [];
- currentDoc.parts.forEach(part => {
- if (typeof part === "string") {
- parts.push(part.replace(/`/g, "\\`"));
- } else {
- parts.push(part);
- }
- });
- return Object.assign({}, currentDoc, { parts });
- });
- }
- function transformCssDoc(quasisDoc, path$$1, print) {
- const parentNode = path$$1.getValue();
- const isEmpty =
- parentNode.quasis.length === 1 && !parentNode.quasis[0].value.raw.trim();
- if (isEmpty) {
- return "``";
- }
- const expressionDocs = parentNode.expressions
- ? path$$1.map(print, "expressions")
- : [];
- const newDoc = replacePlaceholders(quasisDoc, expressionDocs);
- /* istanbul ignore if */
- if (!newDoc) {
- throw new Error("Couldn't insert all the expressions");
- }
- return concat$4([
- "`",
- indent$3(concat$4([hardline$3, docUtils$4.stripTrailingHardline(newDoc)])),
- softline$2,
- "`"
- ]);
- }
- // Search all the placeholders in the quasisDoc tree
- // and replace them with the expression docs one by one
- // returns a new doc with all the placeholders replaced,
- // or null if it couldn't replace any expression
- function replacePlaceholders(quasisDoc, expressionDocs) {
- if (!expressionDocs || !expressionDocs.length) {
- return quasisDoc;
- }
- const expressions = expressionDocs.slice();
- let replaceCounter = 0;
- const newDoc = docUtils$4.mapDoc(quasisDoc, doc$$2 => {
- if (!doc$$2 || !doc$$2.parts || !doc$$2.parts.length) {
- return doc$$2;
- }
- let parts = doc$$2.parts;
- const atIndex = parts.indexOf("@");
- const placeholderIndex = atIndex + 1;
- if (
- atIndex > -1 &&
- typeof parts[placeholderIndex] === "string" &&
- parts[placeholderIndex].startsWith("prettier-placeholder")
- ) {
- // If placeholder is split, join it
- const at = parts[atIndex];
- const placeholder = parts[placeholderIndex];
- const rest = parts.slice(placeholderIndex + 1);
- parts = parts
- .slice(0, atIndex)
- .concat([at + placeholder])
- .concat(rest);
- }
- const atPlaceholderIndex = parts.findIndex(
- part =>
- typeof part === "string" && part.startsWith("@prettier-placeholder")
- );
- if (atPlaceholderIndex > -1) {
- const placeholder = parts[atPlaceholderIndex];
- const rest = parts.slice(atPlaceholderIndex + 1);
- const placeholderMatch = placeholder.match(
- /@prettier-placeholder-(.+)-id([\s\S]*)/
- );
- const placeholderID = placeholderMatch[1];
- // When the expression has a suffix appended, like:
- // animation: linear ${time}s ease-out;
- const suffix = placeholderMatch[2];
- const expression = expressions[placeholderID];
- replaceCounter++;
- parts = parts
- .slice(0, atPlaceholderIndex)
- .concat(["${", expression, "}" + suffix])
- .concat(rest);
- }
- return Object.assign({}, doc$$2, {
- parts: parts
- });
- });
- return expressions.length === replaceCounter ? newDoc : null;
- }
- function printGraphqlComments(lines) {
- const parts = [];
- let seenComment = false;
- lines.map(textLine => textLine.trim()).forEach((textLine, i, array) => {
- // Lines are either whitespace only, or a comment (with poential whitespace
- // around it). Drop whitespace-only lines.
- if (textLine === "") {
- return;
- }
- if (array[i - 1] === "" && seenComment) {
- // If a non-first comment is preceded by a blank (whitespace only) line,
- // add in a blank line.
- parts.push(concat$4([hardline$3, textLine]));
- } else {
- parts.push(textLine);
- }
- seenComment = true;
- });
- // If `lines` was whitespace only, return `null`.
- return parts.length === 0 ? null : join$3(hardline$3, parts);
- }
- /**
- * Template literal in this context:
- * <style jsx>{`div{color:red}`}</style>
- */
- function isStyledJsx(path$$1) {
- const node = path$$1.getValue();
- const parent = path$$1.getParentNode();
- const parentParent = path$$1.getParentNode(1);
- return (
- parentParent &&
- node.quasis &&
- parent.type === "JSXExpressionContainer" &&
- parentParent.type === "JSXElement" &&
- parentParent.openingElement.name.name === "style" &&
- parentParent.openingElement.attributes.some(
- attribute => attribute.name.name === "jsx"
- )
- );
- }
- /**
- * styled-components template literals
- */
- function isStyledComponents(path$$1) {
- const parent = path$$1.getParentNode();
- if (!parent || parent.type !== "TaggedTemplateExpression") {
- return false;
- }
- const tag = parent.tag;
- switch (tag.type) {
- case "MemberExpression":
- return (
- // styled.foo``
- isStyledIdentifier(tag.object) ||
- // Component.extend``
- (/^[A-Z]/.test(tag.object.name) && tag.property.name === "extend")
- );
- case "CallExpression":
- return (
- // styled(Component)``
- isStyledIdentifier(tag.callee) ||
- (tag.callee.type === "MemberExpression" &&
- // styled.foo.attr({})``
- ((tag.callee.object.type === "MemberExpression" &&
- isStyledIdentifier(tag.callee.object.object)) ||
- // styled(Component).attr({})``
- (tag.callee.object.type === "CallExpression" &&
- isStyledIdentifier(tag.callee.object.callee))))
- );
- case "Identifier":
- // css``
- return tag.name === "css";
- default:
- return false;
- }
- }
- /**
- * JSX element with CSS prop
- */
- function isCssProp(path$$1) {
- const parent = path$$1.getParentNode();
- const parentParent = path$$1.getParentNode(1);
- return (
- parentParent &&
- parent.type === "JSXExpressionContainer" &&
- parentParent.type === "JSXAttribute" &&
- parentParent.name.type === "JSXIdentifier" &&
- parentParent.name.name === "css"
- );
- }
- function isStyledIdentifier(node) {
- return node.type === "Identifier" && node.name === "styled";
- }
- var embed_1 = embed;
- function clean(ast, newObj, parent) {
- // We remove extra `;` and add them when needed
- if (ast.type === "EmptyStatement") {
- return null;
- }
- // We move text around, including whitespaces and add {" "}
- if (ast.type === "JSXText") {
- return null;
- }
- if (
- ast.type === "JSXExpressionContainer" &&
- ast.expression.type === "Literal" &&
- ast.expression.value === " "
- ) {
- return null;
- }
- // (TypeScript) Ignore `static` in `constructor(static p) {}`
- // and `export` in `constructor(export p) {}`
- if (
- ast.type === "TSParameterProperty" &&
- ast.accessibility === null &&
- !ast.readonly
- ) {
- return {
- type: "Identifier",
- name: ast.parameter.name,
- typeAnnotation: newObj.parameter.typeAnnotation,
- decorators: newObj.decorators
- };
- }
- // (TypeScript) ignore empty `specifiers` array
- if (
- ast.type === "TSNamespaceExportDeclaration" &&
- ast.specifiers &&
- ast.specifiers.length === 0
- ) {
- delete newObj.specifiers;
- }
- // (TypeScript) bypass TSParenthesizedType
- if (
- ast.type === "TSParenthesizedType" &&
- ast.typeAnnotation.type === "TSTypeAnnotation"
- ) {
- return newObj.typeAnnotation.typeAnnotation;
- }
- // We convert <div></div> to <div />
- if (ast.type === "JSXOpeningElement") {
- delete newObj.selfClosing;
- }
- if (ast.type === "JSXElement") {
- delete newObj.closingElement;
- }
- // We change {'key': value} into {key: value}
- if (
- (ast.type === "Property" ||
- ast.type === "MethodDefinition" ||
- ast.type === "ClassProperty" ||
- ast.type === "TSPropertySignature" ||
- ast.type === "ObjectTypeProperty") &&
- typeof ast.key === "object" &&
- ast.key &&
- (ast.key.type === "Literal" || ast.key.type === "Identifier")
- ) {
- delete newObj.key;
- }
- // Remove raw and cooked values from TemplateElement when it's CSS
- // styled-jsx
- if (
- ast.type === "JSXElement" &&
- ast.openingElement.name.name === "style" &&
- ast.openingElement.attributes.some(attr => attr.name.name === "jsx")
- ) {
- const templateLiterals = newObj.children
- .filter(
- child =>
- child.type === "JSXExpressionContainer" &&
- child.expression.type === "TemplateLiteral"
- )
- .map(container => container.expression);
- const quasis = templateLiterals.reduce(
- (quasis, templateLiteral) => quasis.concat(templateLiteral.quasis),
- []
- );
- quasis.forEach(q => delete q.value);
- }
- // CSS template literals in css prop
- if (
- ast.type === "JSXAttribute" &&
- ast.name.name === "css" &&
- ast.value.type === "JSXExpressionContainer" &&
- ast.value.expression.type === "TemplateLiteral"
- ) {
- newObj.value.expression.quasis.forEach(q => delete q.value);
- }
- // styled-components, graphql, markdown
- if (
- ast.type === "TaggedTemplateExpression" &&
- (ast.tag.type === "MemberExpression" ||
- (ast.tag.type === "Identifier" &&
- (ast.tag.name === "gql" ||
- ast.tag.name === "graphql" ||
- ast.tag.name === "css" ||
- ast.tag.name === "md" ||
- ast.tag.name === "markdown")) ||
- ast.tag.type === "CallExpression")
- ) {
- newObj.quasi.quasis.forEach(quasi => delete quasi.value);
- }
- if (
- ast.type === "TemplateLiteral" &&
- parent.type === "CallExpression" &&
- parent.callee.name === "graphql"
- ) {
- newObj.quasis.forEach(quasi => delete quasi.value);
- }
- }
- var clean_1 = clean;
- var detectNewline = createCommonjsModule(function (module) {
- 'use strict';
- module.exports = function (str) {
- if (typeof str !== 'string') {
- throw new TypeError('Expected a string');
- }
- var newlines = (str.match(/(?:\r?\n)/g) || []);
- if (newlines.length === 0) {
- return null;
- }
- var crlf = newlines.filter(function (el) {
- return el === '\r\n';
- }).length;
- var lf = newlines.length - crlf;
- return crlf > lf ? '\r\n' : '\n';
- };
- module.exports.graceful = function (str) {
- return module.exports(str) || '\n';
- };
- });
- var build = createCommonjsModule(function (module, exports) {
- 'use strict';Object.defineProperty(exports, "__esModule", { value: true });exports.
- extract = extract;exports.
- strip = strip;exports.
- parse = parse;exports.
- parseWithComments = parseWithComments;exports.
- print = print;var _detectNewline;function _load_detectNewline() {return _detectNewline = _interopRequireDefault(detectNewline);}var _os;function _load_os() {return _os = os;}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
- * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- *
- */const commentEndRe = /\*\/$/;const commentStartRe = /^\/\*\*/;const docblockRe = /^\s*(\/\*\*?(.|\r?\n)*?\*\/)/;const lineCommentRe = /(^|\s+)\/\/([^\r\n]*)/g;const ltrimRe = /^\s*/;const rtrimRe = /\s*$/;const ltrimNewlineRe = /^(\r?\n)+/;const multilineRe = /(?:^|\r?\n) *(@[^\r\n]*?) *\r?\n *(?![^@\r\n]*\/\/[^]*)([^@\r\n\s][^@\r\n]+?) *\r?\n/g;const propertyRe = /(?:^|\r?\n) *@(\S+) *([^\r\n]*)/g;const stringStartRe = /(\r?\n|^) *\* ?/g;function extract(contents) {const match = contents.match(docblockRe);return match ? match[0].replace(ltrimRe, '') || '' : '';}function strip(contents) {const match = contents.match(docblockRe);return match && match[0] ? contents.substring(match[0].length) : contents;}function parse(docblock) {return parseWithComments(docblock).pragmas;}function parseWithComments(docblock) {const line = (0, (_detectNewline || _load_detectNewline()).default)(docblock) || (_os || _load_os()).EOL;docblock = docblock.replace(commentStartRe, '').replace(commentEndRe, '').replace(stringStartRe, '$1'); // Normalize multi-line directives
- let prev = '';while (prev !== docblock) {prev = docblock;docblock = docblock.replace(multilineRe, `${line}$1 $2${line}`);}docblock = docblock.replace(ltrimNewlineRe, '').replace(rtrimRe, '');const result = Object.create(null);const comments = docblock.replace(propertyRe, '').replace(ltrimNewlineRe, '').replace(rtrimRe, '');let match;while (match = propertyRe.exec(docblock)) {// strip linecomments from pragmas
- const nextPragma = match[2].replace(lineCommentRe, '');if (typeof result[match[1]] === 'string' || Array.isArray(result[match[1]])) {result[match[1]] = [].concat(result[match[1]], nextPragma);} else {result[match[1]] = nextPragma;}}return { comments, pragmas: result };}function print(_ref) {var _ref$comments = _ref.comments;let comments = _ref$comments === undefined ? '' : _ref$comments;var _ref$pragmas = _ref.pragmas;let pragmas = _ref$pragmas === undefined ? {} : _ref$pragmas;const line = (0, (_detectNewline || _load_detectNewline()).default)(comments) || (_os || _load_os()).EOL;const head = '/**';
- const start = ' *';
- const tail = ' */';
- const keys = Object.keys(pragmas);
- const printedObject = keys.
- map(key => printKeyValues(key, pragmas[key])).
- reduce((arr, next) => arr.concat(next), []).
- map(keyValue => start + ' ' + keyValue + line).
- join('');
- if (!comments) {
- if (keys.length === 0) {
- return '';
- }
- if (keys.length === 1 && !Array.isArray(pragmas[keys[0]])) {
- const value = pragmas[keys[0]];
- return `${head} ${printKeyValues(keys[0], value)[0]}${tail}`;
- }
- }
- const printedComments =
- comments.
- split(line).
- map(textLine => `${start} ${textLine}`).
- join(line) + line;
- return (
- head +
- line + (
- comments ? printedComments : '') + (
- comments && keys.length ? start + line : '') +
- printedObject +
- tail);
- }
- function printKeyValues(key, valueOrArray) {
- return [].concat(valueOrArray).map(value => `@${key} ${value}`.trim());
- }
- });
- unwrapExports(build);
- function hasPragma$1(text) {
- const pragmas = Object.keys(build.parse(build.extract(text)));
- return pragmas.indexOf("prettier") !== -1 || pragmas.indexOf("format") !== -1;
- }
- function insertPragma$1(text) {
- const parsedDocblock = build.parseWithComments(build.extract(text));
- const pragmas = Object.assign({ format: "" }, parsedDocblock.pragmas);
- const newDocblock = build.print({
- pragmas,
- comments: parsedDocblock.comments.replace(/^(\s+?\r?\n)+/, "") // remove leading newlines
- });
- const strippedText = build.strip(text);
- const separatingNewlines = strippedText.startsWith("\n") ? "\n" : "\n\n";
- return newDocblock + separatingNewlines + strippedText;
- }
- var pragma = {
- hasPragma: hasPragma$1,
- insertPragma: insertPragma$1
- };
- const addLeadingComment$2 = utilShared.addLeadingComment;
- const addTrailingComment$2 = utilShared.addTrailingComment;
- const addDanglingComment$2 = utilShared.addDanglingComment;
- function handleOwnLineComment(comment, text, options, ast, isLastComment) {
- const precedingNode = comment.precedingNode;
- const enclosingNode = comment.enclosingNode;
- const followingNode = comment.followingNode;
- if (
- handleLastFunctionArgComments(
- text,
- precedingNode,
- enclosingNode,
- followingNode,
- comment,
- options
- ) ||
- handleMemberExpressionComments(enclosingNode, followingNode, comment) ||
- handleIfStatementComments(
- text,
- precedingNode,
- enclosingNode,
- followingNode,
- comment,
- options
- ) ||
- handleTryStatementComments(enclosingNode, followingNode, comment) ||
- handleClassComments(enclosingNode, precedingNode, followingNode, comment) ||
- handleImportSpecifierComments(enclosingNode, comment) ||
- handleForComments(enclosingNode, precedingNode, comment) ||
- handleUnionTypeComments(
- precedingNode,
- enclosingNode,
- followingNode,
- comment
- ) ||
- handleOnlyComments(enclosingNode, ast, comment, isLastComment) ||
- handleImportDeclarationComments(
- text,
- enclosingNode,
- precedingNode,
- comment,
- options
- ) ||
- handleAssignmentPatternComments(enclosingNode, comment) ||
- handleMethodNameComments(
- text,
- enclosingNode,
- precedingNode,
- comment,
- options
- )
- ) {
- return true;
- }
- return false;
- }
- function handleEndOfLineComment(comment, text, options, ast, isLastComment) {
- const precedingNode = comment.precedingNode;
- const enclosingNode = comment.enclosingNode;
- const followingNode = comment.followingNode;
- if (
- handleLastFunctionArgComments(
- text,
- precedingNode,
- enclosingNode,
- followingNode,
- comment,
- options
- ) ||
- handleConditionalExpressionComments(
- enclosingNode,
- precedingNode,
- followingNode,
- comment,
- text,
- options
- ) ||
- handleImportSpecifierComments(enclosingNode, comment) ||
- handleIfStatementComments(
- text,
- precedingNode,
- enclosingNode,
- followingNode,
- comment,
- options
- ) ||
- handleClassComments(enclosingNode, precedingNode, followingNode, comment) ||
- handleLabeledStatementComments(enclosingNode, comment) ||
- handleCallExpressionComments(precedingNode, enclosingNode, comment) ||
- handlePropertyComments(enclosingNode, comment) ||
- handleOnlyComments(enclosingNode, ast, comment, isLastComment) ||
- handleTypeAliasComments(enclosingNode, followingNode, comment) ||
- handleVariableDeclaratorComments(enclosingNode, followingNode, comment)
- ) {
- return true;
- }
- return false;
- }
- function handleRemainingComment(comment, text, options, ast, isLastComment) {
- const precedingNode = comment.precedingNode;
- const enclosingNode = comment.enclosingNode;
- const followingNode = comment.followingNode;
- if (
- handleIfStatementComments(
- text,
- precedingNode,
- enclosingNode,
- followingNode,
- comment,
- options
- ) ||
- handleObjectPropertyAssignment(enclosingNode, precedingNode, comment) ||
- handleCommentInEmptyParens(text, enclosingNode, comment, options) ||
- handleMethodNameComments(
- text,
- enclosingNode,
- precedingNode,
- comment,
- options
- ) ||
- handleOnlyComments(enclosingNode, ast, comment, isLastComment) ||
- handleCommentAfterArrowParams(text, enclosingNode, comment, options) ||
- handleFunctionNameComments(
- text,
- enclosingNode,
- precedingNode,
- comment,
- options
- ) ||
- handleBreakAndContinueStatementComments(enclosingNode, comment)
- ) {
- return true;
- }
- return false;
- }
- function addBlockStatementFirstComment(node, comment) {
- const body = node.body.filter(n => n.type !== "EmptyStatement");
- if (body.length === 0) {
- addDanglingComment$2(node, comment);
- } else {
- addLeadingComment$2(body[0], comment);
- }
- }
- function addBlockOrNotComment(node, comment) {
- if (node.type === "BlockStatement") {
- addBlockStatementFirstComment(node, comment);
- } else {
- addLeadingComment$2(node, comment);
- }
- }
- // There are often comments before the else clause of if statements like
- //
- // if (1) { ... }
- // // comment
- // else { ... }
- //
- // They are being attached as leading comments of the BlockExpression which
- // is not well printed. What we want is to instead move the comment inside
- // of the block and make it leadingComment of the first element of the block
- // or dangling comment of the block if there is nothing inside
- //
- // if (1) { ... }
- // else {
- // // comment
- // ...
- // }
- function handleIfStatementComments(
- text,
- precedingNode,
- enclosingNode,
- followingNode,
- comment,
- options
- ) {
- if (
- !enclosingNode ||
- enclosingNode.type !== "IfStatement" ||
- !followingNode
- ) {
- return false;
- }
- // We unfortunately have no way using the AST or location of nodes to know
- // if the comment is positioned before the condition parenthesis:
- // if (a /* comment */) {}
- // The only workaround I found is to look at the next character to see if
- // it is a ).
- const nextCharacter = util$1.getNextNonSpaceNonCommentCharacter(
- text,
- comment,
- options.locEnd
- );
- if (nextCharacter === ")") {
- addTrailingComment$2(precedingNode, comment);
- return true;
- }
- // Comments before `else`:
- // - treat as trailing comments of the consequent, if it's a BlockStatement
- // - treat as a dangling comment otherwise
- if (
- precedingNode === enclosingNode.consequent &&
- followingNode === enclosingNode.alternate
- ) {
- if (precedingNode.type === "BlockStatement") {
- addTrailingComment$2(precedingNode, comment);
- } else {
- addDanglingComment$2(enclosingNode, comment);
- }
- return true;
- }
- if (followingNode.type === "BlockStatement") {
- addBlockStatementFirstComment(followingNode, comment);
- return true;
- }
- if (followingNode.type === "IfStatement") {
- addBlockOrNotComment(followingNode.consequent, comment);
- return true;
- }
- // For comments positioned after the condition parenthesis in an if statement
- // before the consequent with or without brackets on, such as
- // if (a) /* comment */ {} or if (a) /* comment */ true,
- // we look at the next character to see if it is a { or if the following node
- // is the consequent for the if statement
- if (nextCharacter === "{" || enclosingNode.consequent === followingNode) {
- addLeadingComment$2(followingNode, comment);
- return true;
- }
- return false;
- }
- // Same as IfStatement but for TryStatement
- function handleTryStatementComments(enclosingNode, followingNode, comment) {
- if (
- !enclosingNode ||
- enclosingNode.type !== "TryStatement" ||
- !followingNode
- ) {
- return false;
- }
- if (followingNode.type === "BlockStatement") {
- addBlockStatementFirstComment(followingNode, comment);
- return true;
- }
- if (followingNode.type === "TryStatement") {
- addBlockOrNotComment(followingNode.finalizer, comment);
- return true;
- }
- if (followingNode.type === "CatchClause") {
- addBlockOrNotComment(followingNode.body, comment);
- return true;
- }
- return false;
- }
- function handleMemberExpressionComments(enclosingNode, followingNode, comment) {
- if (
- enclosingNode &&
- enclosingNode.type === "MemberExpression" &&
- followingNode &&
- followingNode.type === "Identifier"
- ) {
- addLeadingComment$2(enclosingNode, comment);
- return true;
- }
- return false;
- }
- function handleConditionalExpressionComments(
- enclosingNode,
- precedingNode,
- followingNode,
- comment,
- text,
- options
- ) {
- const isSameLineAsPrecedingNode =
- precedingNode &&
- !util$1.hasNewlineInRange(
- text,
- options.locEnd(precedingNode),
- options.locStart(comment)
- );
- if (
- (!precedingNode || !isSameLineAsPrecedingNode) &&
- enclosingNode &&
- enclosingNode.type === "ConditionalExpression" &&
- followingNode
- ) {
- addLeadingComment$2(followingNode, comment);
- return true;
- }
- return false;
- }
- function handleObjectPropertyAssignment(enclosingNode, precedingNode, comment) {
- if (
- enclosingNode &&
- (enclosingNode.type === "ObjectProperty" ||
- enclosingNode.type === "Property") &&
- enclosingNode.shorthand &&
- enclosingNode.key === precedingNode &&
- enclosingNode.value.type === "AssignmentPattern"
- ) {
- addTrailingComment$2(enclosingNode.value.left, comment);
- return true;
- }
- return false;
- }
- function handleClassComments(
- enclosingNode,
- precedingNode,
- followingNode,
- comment
- ) {
- if (
- enclosingNode &&
- (enclosingNode.type === "ClassDeclaration" ||
- enclosingNode.type === "ClassExpression") &&
- (enclosingNode.decorators && enclosingNode.decorators.length > 0) &&
- !(followingNode && followingNode.type === "Decorator")
- ) {
- if (!enclosingNode.decorators || enclosingNode.decorators.length === 0) {
- addLeadingComment$2(enclosingNode, comment);
- } else {
- addTrailingComment$2(
- enclosingNode.decorators[enclosingNode.decorators.length - 1],
- comment
- );
- }
- return true;
- }
- return false;
- }
- function handleMethodNameComments(
- text,
- enclosingNode,
- precedingNode,
- comment,
- options
- ) {
- // This is only needed for estree parsers (flow, typescript) to attach
- // after a method name:
- // obj = { fn /*comment*/() {} };
- if (
- enclosingNode &&
- precedingNode &&
- (enclosingNode.type === "Property" ||
- enclosingNode.type === "MethodDefinition") &&
- precedingNode.type === "Identifier" &&
- enclosingNode.key === precedingNode &&
- // special Property case: { key: /*comment*/(value) };
- // comment should be attached to value instead of key
- util$1.getNextNonSpaceNonCommentCharacter(
- text,
- precedingNode,
- options.locEnd
- ) !== ":"
- ) {
- addTrailingComment$2(precedingNode, comment);
- return true;
- }
- // Print comments between decorators and class methods as a trailing comment
- // on the decorator node instead of the method node
- if (
- precedingNode &&
- enclosingNode &&
- precedingNode.type === "Decorator" &&
- (enclosingNode.type === "ClassMethod" ||
- enclosingNode.type === "ClassProperty" ||
- enclosingNode.type === "TSAbstractClassProperty" ||
- enclosingNode.type === "TSAbstractMethodDefinition" ||
- enclosingNode.type === "MethodDefinition")
- ) {
- addTrailingComment$2(precedingNode, comment);
- return true;
- }
- return false;
- }
- function handleFunctionNameComments(
- text,
- enclosingNode,
- precedingNode,
- comment,
- options
- ) {
- if (
- util$1.getNextNonSpaceNonCommentCharacter(
- text,
- comment,
- options.locEnd
- ) !== "("
- ) {
- return false;
- }
- if (
- precedingNode &&
- enclosingNode &&
- (enclosingNode.type === "FunctionDeclaration" ||
- enclosingNode.type === "FunctionExpression" ||
- enclosingNode.type === "ClassMethod" ||
- enclosingNode.type === "MethodDefinition" ||
- enclosingNode.type === "ObjectMethod")
- ) {
- addTrailingComment$2(precedingNode, comment);
- return true;
- }
- return false;
- }
- function handleCommentAfterArrowParams(text, enclosingNode, comment, options) {
- if (!(enclosingNode && enclosingNode.type === "ArrowFunctionExpression")) {
- return false;
- }
- const index = utilShared.getNextNonSpaceNonCommentCharacterIndex(
- text,
- comment,
- options
- );
- if (text.substr(index, 2) === "=>") {
- addDanglingComment$2(enclosingNode, comment);
- return true;
- }
- return false;
- }
- function handleCommentInEmptyParens(text, enclosingNode, comment, options) {
- if (
- util$1.getNextNonSpaceNonCommentCharacter(
- text,
- comment,
- options.locEnd
- ) !== ")"
- ) {
- return false;
- }
- // Only add dangling comments to fix the case when no params are present,
- // i.e. a function without any argument.
- if (
- enclosingNode &&
- (((enclosingNode.type === "FunctionDeclaration" ||
- enclosingNode.type === "FunctionExpression" ||
- (enclosingNode.type === "ArrowFunctionExpression" &&
- (enclosingNode.body.type !== "CallExpression" ||
- enclosingNode.body.arguments.length === 0)) ||
- enclosingNode.type === "ClassMethod" ||
- enclosingNode.type === "ObjectMethod") &&
- enclosingNode.params.length === 0) ||
- (enclosingNode.type === "CallExpression" &&
- enclosingNode.arguments.length === 0))
- ) {
- addDanglingComment$2(enclosingNode, comment);
- return true;
- }
- if (
- enclosingNode &&
- (enclosingNode.type === "MethodDefinition" &&
- enclosingNode.value.params.length === 0)
- ) {
- addDanglingComment$2(enclosingNode.value, comment);
- return true;
- }
- return false;
- }
- function handleLastFunctionArgComments(
- text,
- precedingNode,
- enclosingNode,
- followingNode,
- comment,
- options
- ) {
- // Type definitions functions
- if (
- precedingNode &&
- precedingNode.type === "FunctionTypeParam" &&
- enclosingNode &&
- enclosingNode.type === "FunctionTypeAnnotation" &&
- followingNode &&
- followingNode.type !== "FunctionTypeParam"
- ) {
- addTrailingComment$2(precedingNode, comment);
- return true;
- }
- // Real functions
- if (
- precedingNode &&
- (precedingNode.type === "Identifier" ||
- precedingNode.type === "AssignmentPattern") &&
- enclosingNode &&
- (enclosingNode.type === "ArrowFunctionExpression" ||
- enclosingNode.type === "FunctionExpression" ||
- enclosingNode.type === "FunctionDeclaration" ||
- enclosingNode.type === "ObjectMethod" ||
- enclosingNode.type === "ClassMethod") &&
- util$1.getNextNonSpaceNonCommentCharacter(
- text,
- comment,
- options.locEnd
- ) === ")"
- ) {
- addTrailingComment$2(precedingNode, comment);
- return true;
- }
- return false;
- }
- function handleImportSpecifierComments(enclosingNode, comment) {
- if (enclosingNode && enclosingNode.type === "ImportSpecifier") {
- addLeadingComment$2(enclosingNode, comment);
- return true;
- }
- return false;
- }
- function handleLabeledStatementComments(enclosingNode, comment) {
- if (enclosingNode && enclosingNode.type === "LabeledStatement") {
- addLeadingComment$2(enclosingNode, comment);
- return true;
- }
- return false;
- }
- function handleBreakAndContinueStatementComments(enclosingNode, comment) {
- if (
- enclosingNode &&
- (enclosingNode.type === "ContinueStatement" ||
- enclosingNode.type === "BreakStatement") &&
- !enclosingNode.label
- ) {
- addTrailingComment$2(enclosingNode, comment);
- return true;
- }
- return false;
- }
- function handleCallExpressionComments(precedingNode, enclosingNode, comment) {
- if (
- enclosingNode &&
- enclosingNode.type === "CallExpression" &&
- precedingNode &&
- enclosingNode.callee === precedingNode &&
- enclosingNode.arguments.length > 0
- ) {
- addLeadingComment$2(enclosingNode.arguments[0], comment);
- return true;
- }
- return false;
- }
- function handleUnionTypeComments(
- precedingNode,
- enclosingNode,
- followingNode,
- comment
- ) {
- if (
- enclosingNode &&
- (enclosingNode.type === "UnionTypeAnnotation" ||
- enclosingNode.type === "TSUnionType")
- ) {
- addTrailingComment$2(precedingNode, comment);
- return true;
- }
- return false;
- }
- function handlePropertyComments(enclosingNode, comment) {
- if (
- enclosingNode &&
- (enclosingNode.type === "Property" ||
- enclosingNode.type === "ObjectProperty")
- ) {
- addLeadingComment$2(enclosingNode, comment);
- return true;
- }
- return false;
- }
- function handleOnlyComments(enclosingNode, ast, comment, isLastComment) {
- // With Flow the enclosingNode is undefined so use the AST instead.
- if (ast && ast.body && ast.body.length === 0) {
- if (isLastComment) {
- addDanglingComment$2(ast, comment);
- } else {
- addLeadingComment$2(ast, comment);
- }
- return true;
- } else if (
- enclosingNode &&
- enclosingNode.type === "Program" &&
- enclosingNode.body.length === 0 &&
- enclosingNode.directives &&
- enclosingNode.directives.length === 0
- ) {
- if (isLastComment) {
- addDanglingComment$2(enclosingNode, comment);
- } else {
- addLeadingComment$2(enclosingNode, comment);
- }
- return true;
- }
- return false;
- }
- function handleForComments(enclosingNode, precedingNode, comment) {
- if (
- enclosingNode &&
- (enclosingNode.type === "ForInStatement" ||
- enclosingNode.type === "ForOfStatement")
- ) {
- addLeadingComment$2(enclosingNode, comment);
- return true;
- }
- return false;
- }
- function handleImportDeclarationComments(
- text,
- enclosingNode,
- precedingNode,
- comment,
- options
- ) {
- if (
- precedingNode &&
- enclosingNode &&
- enclosingNode.type === "ImportDeclaration" &&
- util$1.hasNewline(text, options.locEnd(comment))
- ) {
- addTrailingComment$2(precedingNode, comment);
- return true;
- }
- return false;
- }
- function handleAssignmentPatternComments(enclosingNode, comment) {
- if (enclosingNode && enclosingNode.type === "AssignmentPattern") {
- addLeadingComment$2(enclosingNode, comment);
- return true;
- }
- return false;
- }
- function handleTypeAliasComments(enclosingNode, followingNode, comment) {
- if (enclosingNode && enclosingNode.type === "TypeAlias") {
- addLeadingComment$2(enclosingNode, comment);
- return true;
- }
- return false;
- }
- function handleVariableDeclaratorComments(
- enclosingNode,
- followingNode,
- comment
- ) {
- if (
- enclosingNode &&
- enclosingNode.type === "VariableDeclarator" &&
- followingNode &&
- (followingNode.type === "ObjectExpression" ||
- followingNode.type === "ArrayExpression")
- ) {
- addLeadingComment$2(followingNode, comment);
- return true;
- }
- return false;
- }
- var comments$2 = {
- handleOwnLineComment,
- handleEndOfLineComment,
- handleRemainingComment
- };
- function needsParens(path$$1, options) {
- const parent = path$$1.getParentNode();
- if (!parent) {
- return false;
- }
- const name = path$$1.getName();
- const node = path$$1.getNode();
- // If the value of this path is some child of a Node and not a Node
- // itself, then it doesn't need parentheses. Only Node objects (in
- // fact, only Expression nodes) need parentheses.
- if (path$$1.getValue() !== node) {
- return false;
- }
- // Only statements don't need parentheses.
- if (isStatement(node)) {
- return false;
- }
- // Closure compiler requires that type casted expressions to be surrounded by
- // parentheses.
- if (
- util$1.hasClosureCompilerTypeCastComment(
- options.originalText,
- node,
- options.locEnd
- )
- ) {
- return true;
- }
- // Identifiers never need parentheses.
- if (node.type === "Identifier") {
- return false;
- }
- if (parent.type === "ParenthesizedExpression") {
- return false;
- }
- // Add parens around the extends clause of a class. It is needed for almost
- // all expressions.
- if (
- (parent.type === "ClassDeclaration" || parent.type === "ClassExpression") &&
- parent.superClass === node &&
- (node.type === "ArrowFunctionExpression" ||
- node.type === "AssignmentExpression" ||
- node.type === "AwaitExpression" ||
- node.type === "BinaryExpression" ||
- node.type === "ConditionalExpression" ||
- node.type === "LogicalExpression" ||
- node.type === "NewExpression" ||
- node.type === "ObjectExpression" ||
- node.type === "ParenthesizedExpression" ||
- node.type === "SequenceExpression" ||
- node.type === "TaggedTemplateExpression" ||
- node.type === "UnaryExpression" ||
- node.type === "UpdateExpression" ||
- node.type === "YieldExpression")
- ) {
- return true;
- }
- if (
- (parent.type === "ArrowFunctionExpression" &&
- parent.body === node &&
- node.type !== "SequenceExpression" && // these have parens added anyway
- util$1.startsWithNoLookaheadToken(
- node,
- /* forbidFunctionAndClass */ false
- )) ||
- (parent.type === "ExpressionStatement" &&
- util$1.startsWithNoLookaheadToken(node, /* forbidFunctionAndClass */ true))
- ) {
- return true;
- }
- switch (node.type) {
- case "CallExpression": {
- let firstParentNotMemberExpression = parent;
- let i = 0;
- while (
- firstParentNotMemberExpression &&
- firstParentNotMemberExpression.type === "MemberExpression"
- ) {
- firstParentNotMemberExpression = path$$1.getParentNode(++i);
- }
- if (
- firstParentNotMemberExpression.type === "NewExpression" &&
- firstParentNotMemberExpression.callee === path$$1.getParentNode(i - 1)
- ) {
- return true;
- }
- return false;
- }
- case "SpreadElement":
- case "SpreadProperty":
- return (
- parent.type === "MemberExpression" &&
- name === "object" &&
- parent.object === node
- );
- case "UpdateExpression":
- if (parent.type === "UnaryExpression") {
- return (
- node.prefix &&
- ((node.operator === "++" && parent.operator === "+") ||
- (node.operator === "--" && parent.operator === "-"))
- );
- }
- // else fallthrough
- case "UnaryExpression":
- switch (parent.type) {
- case "UnaryExpression":
- return (
- node.operator === parent.operator &&
- (node.operator === "+" || node.operator === "-")
- );
- case "MemberExpression":
- return name === "object" && parent.object === node;
- case "TaggedTemplateExpression":
- return true;
- case "NewExpression":
- case "CallExpression":
- return name === "callee" && parent.callee === node;
- case "BinaryExpression":
- return parent.operator === "**" && name === "left";
- case "TSNonNullExpression":
- return true;
- default:
- return false;
- }
- case "BinaryExpression": {
- if (parent.type === "UpdateExpression") {
- return true;
- }
- const isLeftOfAForStatement = node => {
- let i = 0;
- while (node) {
- const parent = path$$1.getParentNode(i++);
- if (!parent) {
- return false;
- }
- if (parent.type === "ForStatement" && parent.init === node) {
- return true;
- }
- node = parent;
- }
- return false;
- };
- if (node.operator === "in" && isLeftOfAForStatement(node)) {
- return true;
- }
- }
- // fallthrough
- case "TSTypeAssertionExpression":
- case "TSAsExpression":
- case "LogicalExpression":
- switch (parent.type) {
- case "ConditionalExpression":
- return node.type === "TSAsExpression";
- case "CallExpression":
- case "NewExpression":
- return name === "callee" && parent.callee === node;
- case "ClassDeclaration":
- case "TSAbstractClassDeclaration":
- return name === "superClass" && parent.superClass === node;
- case "TSTypeAssertionExpression":
- case "TaggedTemplateExpression":
- case "UnaryExpression":
- case "SpreadElement":
- case "SpreadProperty":
- case "ExperimentalSpreadProperty":
- case "BindExpression":
- case "AwaitExpression":
- case "TSAsExpression":
- case "TSNonNullExpression":
- case "UpdateExpression":
- return true;
- case "MemberExpression":
- return name === "object" && parent.object === node;
- case "AssignmentExpression":
- return (
- parent.left === node &&
- (node.type === "TSTypeAssertionExpression" ||
- node.type === "TSAsExpression")
- );
- case "Decorator":
- return (
- parent.expression === node &&
- (node.type === "TSTypeAssertionExpression" ||
- node.type === "TSAsExpression")
- );
- case "BinaryExpression":
- case "LogicalExpression": {
- if (!node.operator && node.type !== "TSTypeAssertionExpression") {
- return true;
- }
- const po = parent.operator;
- const pp = util$1.getPrecedence(po);
- const no = node.operator;
- const np = util$1.getPrecedence(no);
- if (pp > np) {
- return true;
- }
- if ((po === "||" || po === "??") && no === "&&") {
- return true;
- }
- if (pp === np && name === "right") {
- assert.strictEqual(parent.right, node);
- return true;
- }
- if (pp === np && !util$1.shouldFlatten(po, no)) {
- return true;
- }
- // Add parenthesis when working with binary operators
- // It's not stricly needed but helps with code understanding
- if (util$1.isBitwiseOperator(po)) {
- return true;
- }
- return false;
- }
- default:
- return false;
- }
- case "TSParenthesizedType": {
- const grandParent = path$$1.getParentNode(1);
- if (
- (parent.type === "TSTypeParameter" ||
- parent.type === "TypeParameter" ||
- parent.type === "VariableDeclarator" ||
- parent.type === "TSTypeAnnotation" ||
- parent.type === "GenericTypeAnnotation" ||
- parent.type === "TSTypeReference") &&
- (node.typeAnnotation.type === "TSTypeAnnotation" &&
- node.typeAnnotation.typeAnnotation.type !== "TSFunctionType" &&
- grandParent.type !== "TSTypeOperator")
- ) {
- return false;
- }
- // Delegate to inner TSParenthesizedType
- if (node.typeAnnotation.type === "TSParenthesizedType") {
- return false;
- }
- return true;
- }
- case "SequenceExpression":
- switch (parent.type) {
- case "ReturnStatement":
- return false;
- case "ForStatement":
- // Although parentheses wouldn't hurt around sequence
- // expressions in the head of for loops, traditional style
- // dictates that e.g. i++, j++ should not be wrapped with
- // parentheses.
- return false;
- case "ExpressionStatement":
- return name !== "expression";
- case "ArrowFunctionExpression":
- // We do need parentheses, but SequenceExpressions are handled
- // specially when printing bodies of arrow functions.
- return name !== "body";
- default:
- // Otherwise err on the side of overparenthesization, adding
- // explicit exceptions above if this proves overzealous.
- return true;
- }
- case "YieldExpression":
- if (
- parent.type === "UnaryExpression" ||
- parent.type === "AwaitExpression" ||
- parent.type === "TSAsExpression" ||
- parent.type === "TSNonNullExpression"
- ) {
- return true;
- }
- // else fallthrough
- case "AwaitExpression":
- switch (parent.type) {
- case "TaggedTemplateExpression":
- case "UnaryExpression":
- case "BinaryExpression":
- case "LogicalExpression":
- case "SpreadElement":
- case "SpreadProperty":
- case "ExperimentalSpreadProperty":
- case "TSAsExpression":
- case "TSNonNullExpression":
- return true;
- case "MemberExpression":
- return parent.object === node;
- case "NewExpression":
- case "CallExpression":
- return parent.callee === node;
- case "ConditionalExpression":
- return parent.test === node;
- default:
- return false;
- }
- case "ArrayTypeAnnotation":
- return parent.type === "NullableTypeAnnotation";
- case "IntersectionTypeAnnotation":
- case "UnionTypeAnnotation":
- return (
- parent.type === "ArrayTypeAnnotation" ||
- parent.type === "NullableTypeAnnotation" ||
- parent.type === "IntersectionTypeAnnotation" ||
- parent.type === "UnionTypeAnnotation"
- );
- case "NullableTypeAnnotation":
- return parent.type === "ArrayTypeAnnotation";
- case "FunctionTypeAnnotation":
- return (
- parent.type === "UnionTypeAnnotation" ||
- parent.type === "IntersectionTypeAnnotation" ||
- parent.type === "ArrayTypeAnnotation"
- );
- case "StringLiteral":
- case "NumericLiteral":
- case "Literal":
- if (
- typeof node.value === "string" &&
- parent.type === "ExpressionStatement" &&
- // TypeScript workaround for eslint/typescript-eslint-parser#267
- // See corresponding workaround in printer.js case: "Literal"
- ((options.parser !== "typescript" && !parent.directive) ||
- (options.parser === "typescript" &&
- options.originalText.substr(options.locStart(node) - 1, 1) === "("))
- ) {
- // To avoid becoming a directive
- const grandParent = path$$1.getParentNode(1);
- return (
- grandParent.type === "Program" ||
- grandParent.type === "BlockStatement"
- );
- }
- return (
- parent.type === "MemberExpression" &&
- typeof node.value === "number" &&
- name === "object" &&
- parent.object === node
- );
- case "AssignmentExpression": {
- const grandParent = path$$1.getParentNode(1);
- if (parent.type === "ArrowFunctionExpression" && parent.body === node) {
- return true;
- } else if (
- parent.type === "ClassProperty" &&
- parent.key === node &&
- parent.computed
- ) {
- return false;
- } else if (
- parent.type === "TSPropertySignature" &&
- parent.name === node
- ) {
- return false;
- } else if (
- parent.type === "ForStatement" &&
- (parent.init === node || parent.update === node)
- ) {
- return false;
- } else if (parent.type === "ExpressionStatement") {
- return node.left.type === "ObjectPattern";
- } else if (parent.type === "TSPropertySignature" && parent.key === node) {
- return false;
- } else if (parent.type === "AssignmentExpression") {
- return false;
- } else if (
- parent.type === "SequenceExpression" &&
- grandParent &&
- grandParent.type === "ForStatement" &&
- (grandParent.init === parent || grandParent.update === parent)
- ) {
- return false;
- }
- return true;
- }
- case "ConditionalExpression":
- switch (parent.type) {
- case "TaggedTemplateExpression":
- case "UnaryExpression":
- case "SpreadElement":
- case "SpreadProperty":
- case "ExperimentalSpreadProperty":
- case "BinaryExpression":
- case "LogicalExpression":
- case "ExportDefaultDeclaration":
- case "AwaitExpression":
- case "JSXSpreadAttribute":
- case "TSTypeAssertionExpression":
- case "TypeCastExpression":
- case "TSAsExpression":
- case "TSNonNullExpression":
- return true;
- case "NewExpression":
- case "CallExpression":
- return name === "callee" && parent.callee === node;
- case "ConditionalExpression":
- return name === "test" && parent.test === node;
- case "MemberExpression":
- return name === "object" && parent.object === node;
- default:
- return false;
- }
- case "FunctionExpression":
- switch (parent.type) {
- case "CallExpression":
- return name === "callee"; // Not strictly necessary, but it's clearer to the reader if IIFEs are wrapped in parentheses.
- case "TaggedTemplateExpression":
- return true; // This is basically a kind of IIFE.
- case "ExportDefaultDeclaration":
- return true;
- default:
- return false;
- }
- case "ArrowFunctionExpression":
- switch (parent.type) {
- case "CallExpression":
- return name === "callee";
- case "NewExpression":
- return name === "callee";
- case "MemberExpression":
- return name === "object";
- case "TSAsExpression":
- case "BindExpression":
- case "TaggedTemplateExpression":
- case "UnaryExpression":
- case "LogicalExpression":
- case "BinaryExpression":
- case "AwaitExpression":
- case "TSTypeAssertionExpression":
- return true;
- case "ConditionalExpression":
- return name === "test";
- default:
- return false;
- }
- case "ClassExpression":
- return parent.type === "ExportDefaultDeclaration";
- }
- return false;
- }
- function isStatement(node) {
- return (
- node.type === "BlockStatement" ||
- node.type === "BreakStatement" ||
- node.type === "ClassBody" ||
- node.type === "ClassDeclaration" ||
- node.type === "ClassMethod" ||
- node.type === "ClassProperty" ||
- node.type === "ClassPrivateProperty" ||
- node.type === "ContinueStatement" ||
- node.type === "DebuggerStatement" ||
- node.type === "DeclareClass" ||
- node.type === "DeclareExportAllDeclaration" ||
- node.type === "DeclareExportDeclaration" ||
- node.type === "DeclareFunction" ||
- node.type === "DeclareInterface" ||
- node.type === "DeclareModule" ||
- node.type === "DeclareModuleExports" ||
- node.type === "DeclareVariable" ||
- node.type === "DoWhileStatement" ||
- node.type === "ExportAllDeclaration" ||
- node.type === "ExportDefaultDeclaration" ||
- node.type === "ExportNamedDeclaration" ||
- node.type === "ExpressionStatement" ||
- node.type === "ForAwaitStatement" ||
- node.type === "ForInStatement" ||
- node.type === "ForOfStatement" ||
- node.type === "ForStatement" ||
- node.type === "FunctionDeclaration" ||
- node.type === "IfStatement" ||
- node.type === "ImportDeclaration" ||
- node.type === "InterfaceDeclaration" ||
- node.type === "LabeledStatement" ||
- node.type === "MethodDefinition" ||
- node.type === "ReturnStatement" ||
- node.type === "SwitchStatement" ||
- node.type === "ThrowStatement" ||
- node.type === "TryStatement" ||
- node.type === "TSAbstractClassDeclaration" ||
- node.type === "TSEnumDeclaration" ||
- node.type === "TSImportEqualsDeclaration" ||
- node.type === "TSInterfaceDeclaration" ||
- node.type === "TSModuleDeclaration" ||
- node.type === "TSNamespaceExportDeclaration" ||
- node.type === "TypeAlias" ||
- node.type === "VariableDeclaration" ||
- node.type === "WhileStatement" ||
- node.type === "WithStatement"
- );
- }
- var needsParens_1 = needsParens;
- // TODO(azz): anything that imports from main shouldn't be in a `language-*` dir.
- const isIdentifierName = utils$2.keyword.isIdentifierNameES6;
- const insertPragma = pragma.insertPragma;
- const docBuilders = doc.builders;
- const concat = docBuilders.concat;
- const join = docBuilders.join;
- const line = docBuilders.line;
- const hardline = docBuilders.hardline;
- const softline = docBuilders.softline;
- const literalline = docBuilders.literalline;
- const group = docBuilders.group;
- const indent = docBuilders.indent;
- const align = docBuilders.align;
- const conditionalGroup = docBuilders.conditionalGroup;
- const fill = docBuilders.fill;
- const ifBreak = docBuilders.ifBreak;
- const breakParent = docBuilders.breakParent;
- const lineSuffixBoundary = docBuilders.lineSuffixBoundary;
- const addAlignmentToDoc = docBuilders.addAlignmentToDoc;
- const dedent = docBuilders.dedent;
- const docUtils$3 = doc.utils;
- const willBreak$1 = docUtils$3.willBreak;
- const isLineNext$1 = docUtils$3.isLineNext;
- const isEmpty$1 = docUtils$3.isEmpty;
- function shouldPrintComma(options, level) {
- level = level || "es5";
- switch (options.trailingComma) {
- case "all":
- if (level === "all") {
- return true;
- }
- // fallthrough
- case "es5":
- if (level === "es5") {
- return true;
- }
- // fallthrough
- case "none":
- default:
- return false;
- }
- }
- function genericPrint(path$$1, options, printPath, args) {
- const node = path$$1.getValue();
- let needsParens = false;
- const linesWithoutParens = printPathNoParens(path$$1, options, printPath, args);
- if (!node || isEmpty$1(linesWithoutParens)) {
- return linesWithoutParens;
- }
- const decorators = [];
- if (
- node.decorators &&
- node.decorators.length > 0 &&
- // If the parent node is an export declaration, it will be
- // responsible for printing node.decorators.
- !util$1.getParentExportDeclaration(path$$1)
- ) {
- let separator = hardline;
- path$$1.each(decoratorPath => {
- let prefix = "@";
- let decorator = decoratorPath.getValue();
- if (decorator.expression) {
- decorator = decorator.expression;
- prefix = "";
- }
- if (
- node.decorators.length === 1 &&
- node.type !== "ClassDeclaration" &&
- node.type !== "MethodDefinition" &&
- node.type !== "ClassMethod" &&
- (decorator.type === "Identifier" ||
- decorator.type === "MemberExpression" ||
- (decorator.type === "CallExpression" &&
- (decorator.arguments.length === 0 ||
- (decorator.arguments.length === 1 &&
- (isStringLiteral(decorator.arguments[0]) ||
- decorator.arguments[0].type === "Identifier" ||
- decorator.arguments[0].type === "MemberExpression")))))
- ) {
- separator = line;
- }
- decorators.push(prefix, printPath(decoratorPath), separator);
- }, "decorators");
- } else if (
- util$1.isExportDeclaration(node) &&
- node.declaration &&
- node.declaration.decorators
- ) {
- // Export declarations are responsible for printing any decorators
- // that logically apply to node.declaration.
- path$$1.each(
- decoratorPath => {
- const decorator = decoratorPath.getValue();
- const prefix = decorator.type === "Decorator" ? "" : "@";
- decorators.push(prefix, printPath(decoratorPath), hardline);
- },
- "declaration",
- "decorators"
- );
- } else {
- // Nodes with decorators can't have parentheses, so we can avoid
- // computing pathNeedsParens() except in this case.
- needsParens = needsParens_1(path$$1, options);
- }
- const parts = [];
- if (needsParens) {
- parts.unshift("(");
- }
- parts.push(linesWithoutParens);
- if (needsParens) {
- parts.push(")");
- }
- if (decorators.length > 0) {
- return group(concat(decorators.concat(parts)));
- }
- return concat(parts);
- }
- function hasPrettierIgnore(path$$1) {
- return util$1.hasIgnoreComment(path$$1) || hasJsxIgnoreComment(path$$1);
- }
- function hasJsxIgnoreComment(path$$1) {
- const node = path$$1.getValue();
- const parent = path$$1.getParentNode();
- if (!parent || !node || !isJSXNode(node) || !isJSXNode(parent)) {
- return false;
- }
- // Lookup the previous sibling, ignoring any empty JSXText elements
- const index = parent.children.indexOf(node);
- let prevSibling = null;
- for (let i = index; i > 0; i--) {
- const candidate = parent.children[i - 1];
- if (candidate.type === "JSXText" && !isMeaningfulJSXText(candidate)) {
- continue;
- }
- prevSibling = candidate;
- break;
- }
- return (
- prevSibling &&
- prevSibling.type === "JSXExpressionContainer" &&
- prevSibling.expression.type === "JSXEmptyExpression" &&
- prevSibling.expression.comments &&
- prevSibling.expression.comments.find(
- comment => comment.value.trim() === "prettier-ignore"
- )
- );
- }
- // The following is the shared logic for
- // ternary operators, namely ConditionalExpression
- // and TSConditionalType
- function formatTernaryOperator(path$$1, options, print, operatorOptions) {
- const n = path$$1.getValue();
- const parts = [];
- const operatorOpts = Object.assign(
- {
- beforeParts: () => [""],
- afterParts: () => [""],
- shouldCheckJsx: true,
- operatorName: "ConditionalExpression",
- consequentNode: "consequent",
- alternateNode: "alternate",
- testNode: "test",
- breakNested: true
- },
- operatorOptions || {}
- );
- // We print a ConditionalExpression in either "JSX mode" or "normal mode".
- // See tests/jsx/conditional-expression.js for more info.
- let jsxMode = false;
- const parent = path$$1.getParentNode();
- let forceNoIndent = parent.type === operatorOpts.operatorName;
- // Find the outermost non-ConditionalExpression parent, and the outermost
- // ConditionalExpression parent. We'll use these to determine if we should
- // print in JSX mode.
- let currentParent;
- let previousParent;
- let i = 0;
- do {
- previousParent = currentParent || n;
- currentParent = path$$1.getParentNode(i);
- i++;
- } while (currentParent && currentParent.type === operatorOpts.operatorName);
- const firstNonConditionalParent = currentParent || parent;
- const lastConditionalParent = previousParent;
- if (
- (operatorOpts.shouldCheckJsx && isJSXNode(n[operatorOpts.testNode])) ||
- isJSXNode(n[operatorOpts.consequentNode]) ||
- isJSXNode(n[operatorOpts.alternateNode]) ||
- conditionalExpressionChainContainsJSX(lastConditionalParent)
- ) {
- jsxMode = true;
- forceNoIndent = true;
- // Even though they don't need parens, we wrap (almost) everything in
- // parens when using ?: within JSX, because the parens are analogous to
- // curly braces in an if statement.
- const wrap = doc$$1 =>
- concat([
- ifBreak("(", ""),
- indent(concat([softline, doc$$1])),
- softline,
- ifBreak(")", "")
- ]);
- // The only things we don't wrap are:
- // * Nested conditional expressions in alternates
- // * null
- const isNull = node =>
- node.type === "NullLiteral" ||
- (node.type === "Literal" && node.value === null);
- parts.push(
- " ? ",
- isNull(n[operatorOpts.consequentNode])
- ? path$$1.call(print, operatorOpts.consequentNode)
- : wrap(path$$1.call(print, operatorOpts.consequentNode)),
- " : ",
- n[operatorOpts.alternateNode].type === operatorOpts.operatorName ||
- isNull(n[operatorOpts.alternateNode])
- ? path$$1.call(print, operatorOpts.alternateNode)
- : wrap(path$$1.call(print, operatorOpts.alternateNode))
- );
- } else {
- // normal mode
- const part = concat([
- line,
- "? ",
- n[operatorOpts.consequentNode].type === operatorOpts.operatorName
- ? ifBreak("", "(")
- : "",
- align(2, path$$1.call(print, operatorOpts.consequentNode)),
- n[operatorOpts.consequentNode].type === operatorOpts.operatorName
- ? ifBreak("", ")")
- : "",
- line,
- ": ",
- align(2, path$$1.call(print, operatorOpts.alternateNode))
- ]);
- parts.push(
- parent.type === operatorOpts.operatorName
- ? options.useTabs
- ? dedent(indent(part))
- : align(Math.max(0, options.tabWidth - 2), part)
- : part
- );
- }
- // We want a whole chain of ConditionalExpressions to all
- // break if any of them break. That means we should only group around the
- // outer-most ConditionalExpression.
- const maybeGroup = doc$$1 =>
- operatorOpts.breakNested
- ? parent === firstNonConditionalParent
- ? group(doc$$1)
- : doc$$1
- : group(doc$$1); // Always group in normal mode.
- // Break the closing paren to keep the chain right after it:
- // (a
- // ? b
- // : c
- // ).call()
- const breakClosingParen =
- !jsxMode && parent.type === "MemberExpression" && !parent.computed;
- return maybeGroup(
- concat(
- [].concat(
- operatorOpts.beforeParts(),
- forceNoIndent ? concat(parts) : indent(concat(parts)),
- operatorOpts.afterParts(breakClosingParen)
- )
- )
- );
- }
- function getTypeScriptMappedTypeModifier(tokenNode, keyword) {
- if (tokenNode.type === "TSPlusToken") {
- return "+" + keyword;
- } else if (tokenNode.type === "TSMinusToken") {
- return "-" + keyword;
- }
- return keyword;
- }
- function printPathNoParens(path$$1, options, print, args) {
- const n = path$$1.getValue();
- const semi = options.semi ? ";" : "";
- if (!n) {
- return "";
- }
- if (typeof n === "string") {
- return n;
- }
- let parts = [];
- switch (n.type) {
- case "File":
- return path$$1.call(print, "program");
- case "Program":
- // Babel 6
- if (n.directives) {
- path$$1.each(childPath => {
- parts.push(print(childPath), semi, hardline);
- if (
- utilShared.isNextLineEmpty(
- options.originalText,
- childPath.getValue(),
- options
- )
- ) {
- parts.push(hardline);
- }
- }, "directives");
- }
- parts.push(
- path$$1.call(bodyPath => {
- return printStatementSequence(bodyPath, options, print);
- }, "body")
- );
- parts.push(
- comments.printDanglingComments(path$$1, options, /* sameIndent */ true)
- );
- // Only force a trailing newline if there were any contents.
- if (n.body.length || n.comments) {
- parts.push(hardline);
- }
- return concat(parts);
- // Babel extension.
- case "EmptyStatement":
- return "";
- case "ExpressionStatement":
- // Detect Flow-parsed directives
- if (n.directive) {
- return concat([nodeStr(n.expression, options, true), semi]);
- }
- // Do not append semicolon after the only JSX element in a program
- return concat([
- path$$1.call(print, "expression"),
- isTheOnlyJSXElementInMarkdown(options, path$$1) ? "" : semi
- ]); // Babel extension.
- case "ParenthesizedExpression":
- return concat(["(", path$$1.call(print, "expression"), ")"]);
- case "AssignmentExpression":
- return printAssignment(
- n.left,
- path$$1.call(print, "left"),
- concat([" ", n.operator]),
- n.right,
- path$$1.call(print, "right"),
- options
- );
- case "BinaryExpression":
- case "LogicalExpression": {
- const parent = path$$1.getParentNode();
- const parentParent = path$$1.getParentNode(1);
- const isInsideParenthesis =
- n !== parent.body &&
- (parent.type === "IfStatement" ||
- parent.type === "WhileStatement" ||
- parent.type === "DoWhileStatement");
- const parts = printBinaryishExpressions(
- path$$1,
- print,
- options,
- /* isNested */ false,
- isInsideParenthesis
- );
- // if (
- // this.hasPlugin("dynamicImports") && this.lookahead().type === tt.parenLeft
- // ) {
- //
- // looks super weird, we want to break the children if the parent breaks
- //
- // if (
- // this.hasPlugin("dynamicImports") &&
- // this.lookahead().type === tt.parenLeft
- // ) {
- if (isInsideParenthesis) {
- return concat(parts);
- }
- // Break between the parens in unaries or in a member expression, i.e.
- //
- // (
- // a &&
- // b &&
- // c
- // ).call()
- if (
- parent.type === "UnaryExpression" ||
- (parent.type === "MemberExpression" && !parent.computed)
- ) {
- return group(
- concat([indent(concat([softline, concat(parts)])), softline])
- );
- }
- // Avoid indenting sub-expressions in some cases where the first sub-expression is already
- // indented accordingly. We should indent sub-expressions where the first case isn't indented.
- const shouldNotIndent =
- parent.type === "ReturnStatement" ||
- (parent.type === "JSXExpressionContainer" &&
- parentParent.type === "JSXAttribute") ||
- (n === parent.body && parent.type === "ArrowFunctionExpression") ||
- (n !== parent.body && parent.type === "ForStatement") ||
- (parent.type === "ConditionalExpression" &&
- parentParent.type !== "ReturnStatement");
- const shouldIndentIfInlining =
- parent.type === "AssignmentExpression" ||
- parent.type === "VariableDeclarator" ||
- parent.type === "ClassProperty" ||
- parent.type === "TSAbstractClassProperty" ||
- parent.type === "ClassPrivateProperty" ||
- parent.type === "ObjectProperty" ||
- parent.type === "Property";
- const samePrecedenceSubExpression =
- isBinaryish(n.left) &&
- util$1.shouldFlatten(n.operator, n.left.operator);
- if (
- shouldNotIndent ||
- (shouldInlineLogicalExpression(n) && !samePrecedenceSubExpression) ||
- (!shouldInlineLogicalExpression(n) && shouldIndentIfInlining)
- ) {
- return group(concat(parts));
- }
- const rest = concat(parts.slice(1));
- return group(
- concat([
- // Don't include the initial expression in the indentation
- // level. The first item is guaranteed to be the first
- // left-most expression.
- parts.length > 0 ? parts[0] : "",
- indent(rest)
- ])
- );
- }
- case "AssignmentPattern":
- return concat([
- path$$1.call(print, "left"),
- " = ",
- path$$1.call(print, "right")
- ]);
- case "TSTypeAssertionExpression":
- return concat([
- "<",
- path$$1.call(print, "typeAnnotation"),
- ">",
- path$$1.call(print, "expression")
- ]);
- case "MemberExpression": {
- const parent = path$$1.getParentNode();
- let firstNonMemberParent;
- let i = 0;
- do {
- firstNonMemberParent = path$$1.getParentNode(i);
- i++;
- } while (
- firstNonMemberParent &&
- (firstNonMemberParent.type === "MemberExpression" ||
- firstNonMemberParent.type === "TSNonNullExpression")
- );
- const shouldInline =
- (firstNonMemberParent &&
- (firstNonMemberParent.type === "NewExpression" ||
- (firstNonMemberParent.type === "VariableDeclarator" &&
- firstNonMemberParent.id.type !== "Identifier") ||
- (firstNonMemberParent.type === "AssignmentExpression" &&
- firstNonMemberParent.left.type !== "Identifier"))) ||
- n.computed ||
- (n.object.type === "Identifier" &&
- n.property.type === "Identifier" &&
- parent.type !== "MemberExpression");
- return concat([
- path$$1.call(print, "object"),
- shouldInline
- ? printMemberLookup(path$$1, options, print)
- : group(
- indent(
- concat([softline, printMemberLookup(path$$1, options, print)])
- )
- )
- ]);
- }
- case "MetaProperty":
- return concat([
- path$$1.call(print, "meta"),
- ".",
- path$$1.call(print, "property")
- ]);
- case "BindExpression":
- if (n.object) {
- parts.push(path$$1.call(print, "object"));
- }
- parts.push(printBindExpressionCallee(path$$1, options, print));
- return concat(parts);
- case "Identifier": {
- return concat([
- n.name,
- printOptionalToken(path$$1),
- printTypeAnnotation(path$$1, options, print)
- ]);
- }
- case "SpreadElement":
- case "SpreadElementPattern":
- case "RestProperty":
- case "ExperimentalRestProperty":
- case "ExperimentalSpreadProperty":
- case "SpreadProperty":
- case "SpreadPropertyPattern":
- case "RestElement":
- case "ObjectTypeSpreadProperty":
- return concat([
- "...",
- path$$1.call(print, "argument"),
- printTypeAnnotation(path$$1, options, print)
- ]);
- case "FunctionDeclaration":
- case "FunctionExpression":
- if (isNodeStartingWithDeclare(n, options)) {
- parts.push("declare ");
- }
- parts.push(printFunctionDeclaration(path$$1, print, options));
- if (!n.body) {
- parts.push(semi);
- }
- return concat(parts);
- case "ArrowFunctionExpression": {
- if (n.async) {
- parts.push("async ");
- }
- if (shouldPrintParamsWithoutParens(path$$1, options)) {
- parts.push(path$$1.call(print, "params", 0));
- } else {
- parts.push(
- group(
- concat([
- printFunctionParams(
- path$$1,
- print,
- options,
- /* expandLast */ args &&
- (args.expandLastArg || args.expandFirstArg),
- /* printTypeParams */ true
- ),
- printReturnType(path$$1, print, options)
- ])
- )
- );
- }
- const dangling = comments.printDanglingComments(
- path$$1,
- options,
- /* sameIndent */ true,
- comment => {
- const nextCharacter = utilShared.getNextNonSpaceNonCommentCharacterIndex(
- options.originalText,
- comment,
- options
- );
- return options.originalText.substr(nextCharacter, 2) === "=>";
- }
- );
- if (dangling) {
- parts.push(" ", dangling);
- }
- parts.push(" =>");
- const body = path$$1.call(bodyPath => print(bodyPath, args), "body");
- // We want to always keep these types of nodes on the same line
- // as the arrow.
- if (
- !hasLeadingOwnLineComment(options.originalText, n.body, options) &&
- (n.body.type === "ArrayExpression" ||
- n.body.type === "ObjectExpression" ||
- n.body.type === "BlockStatement" ||
- isJSXNode(n.body) ||
- isTemplateOnItsOwnLine(n.body, options.originalText, options) ||
- n.body.type === "ArrowFunctionExpression")
- ) {
- return group(concat([concat(parts), " ", body]));
- }
- // We handle sequence expressions as the body of arrows specially,
- // so that the required parentheses end up on their own lines.
- if (n.body.type === "SequenceExpression") {
- return group(
- concat([
- concat(parts),
- group(
- concat([" (", indent(concat([softline, body])), softline, ")"])
- )
- ])
- );
- }
- // if the arrow function is expanded as last argument, we are adding a
- // level of indentation and need to add a softline to align the closing )
- // with the opening (, or if it's inside a JSXExpression (e.g. an attribute)
- // we should align the expression's closing } with the line with the opening {.
- const shouldAddSoftLine =
- ((args && args.expandLastArg) ||
- path$$1.getParentNode().type === "JSXExpressionContainer") &&
- !(n.comments && n.comments.length);
- const printTrailingComma =
- args && args.expandLastArg && shouldPrintComma(options, "all");
- // In order to avoid confusion between
- // a => a ? a : a
- // a <= a ? a : a
- const shouldAddParens =
- n.body.type === "ConditionalExpression" &&
- !util$1.startsWithNoLookaheadToken(
- n.body,
- /* forbidFunctionAndClass */ false
- );
- return group(
- concat([
- concat(parts),
- group(
- concat([
- indent(
- concat([
- line,
- shouldAddParens ? ifBreak("", "(") : "",
- body,
- shouldAddParens ? ifBreak("", ")") : ""
- ])
- ),
- shouldAddSoftLine
- ? concat([ifBreak(printTrailingComma ? "," : ""), softline])
- : ""
- ])
- )
- ])
- );
- }
- case "MethodDefinition":
- case "TSAbstractMethodDefinition":
- if (n.accessibility) {
- parts.push(n.accessibility + " ");
- }
- if (n.static) {
- parts.push("static ");
- }
- if (n.type === "TSAbstractMethodDefinition") {
- parts.push("abstract ");
- }
- parts.push(printMethod(path$$1, options, print));
- return concat(parts);
- case "YieldExpression":
- parts.push("yield");
- if (n.delegate) {
- parts.push("*");
- }
- if (n.argument) {
- parts.push(" ", path$$1.call(print, "argument"));
- }
- return concat(parts);
- case "AwaitExpression":
- return concat(["await ", path$$1.call(print, "argument")]);
- case "ImportSpecifier":
- if (n.importKind) {
- parts.push(path$$1.call(print, "importKind"), " ");
- }
- parts.push(path$$1.call(print, "imported"));
- if (n.local && n.local.name !== n.imported.name) {
- parts.push(" as ", path$$1.call(print, "local"));
- }
- return concat(parts);
- case "ExportSpecifier":
- parts.push(path$$1.call(print, "local"));
- if (n.exported && n.exported.name !== n.local.name) {
- parts.push(" as ", path$$1.call(print, "exported"));
- }
- return concat(parts);
- case "ImportNamespaceSpecifier":
- parts.push("* as ");
- if (n.local) {
- parts.push(path$$1.call(print, "local"));
- } else if (n.id) {
- parts.push(path$$1.call(print, "id"));
- }
- return concat(parts);
- case "ImportDefaultSpecifier":
- if (n.local) {
- return path$$1.call(print, "local");
- }
- return path$$1.call(print, "id");
- case "TSExportAssignment":
- return concat(["export = ", path$$1.call(print, "expression"), semi]);
- case "ExportDefaultDeclaration":
- case "ExportNamedDeclaration":
- return printExportDeclaration(path$$1, options, print);
- case "ExportAllDeclaration":
- parts.push("export ");
- if (n.exportKind === "type") {
- parts.push("type ");
- }
- parts.push("* from ", path$$1.call(print, "source"), semi);
- return concat(parts);
- case "ExportNamespaceSpecifier":
- case "ExportDefaultSpecifier":
- return path$$1.call(print, "exported");
- case "ImportDeclaration": {
- parts.push("import ");
- if (n.importKind && n.importKind !== "value") {
- parts.push(n.importKind + " ");
- }
- const standalones = [];
- const grouped = [];
- if (n.specifiers && n.specifiers.length > 0) {
- path$$1.each(specifierPath => {
- const value = specifierPath.getValue();
- if (
- value.type === "ImportDefaultSpecifier" ||
- value.type === "ImportNamespaceSpecifier"
- ) {
- standalones.push(print(specifierPath));
- } else {
- grouped.push(print(specifierPath));
- }
- }, "specifiers");
- if (standalones.length > 0) {
- parts.push(join(", ", standalones));
- }
- if (standalones.length > 0 && grouped.length > 0) {
- parts.push(", ");
- }
- if (
- grouped.length === 1 &&
- standalones.length === 0 &&
- n.specifiers &&
- !n.specifiers.some(node => node.comments)
- ) {
- parts.push(
- concat([
- "{",
- options.bracketSpacing ? " " : "",
- concat(grouped),
- options.bracketSpacing ? " " : "",
- "}"
- ])
- );
- } else if (grouped.length >= 1) {
- parts.push(
- group(
- concat([
- "{",
- indent(
- concat([
- options.bracketSpacing ? line : softline,
- join(concat([",", line]), grouped)
- ])
- ),
- ifBreak(shouldPrintComma(options) ? "," : ""),
- options.bracketSpacing ? line : softline,
- "}"
- ])
- )
- );
- }
- parts.push(" from ");
- } else if (
- (n.importKind && n.importKind === "type") ||
- // import {} from 'x'
- /{\s*}/.test(
- options.originalText.slice(
- options.locStart(n),
- options.locStart(n.source)
- )
- )
- ) {
- parts.push("{} from ");
- }
- parts.push(path$$1.call(print, "source"), semi);
- return concat(parts);
- }
- case "Import":
- return "import";
- case "BlockStatement": {
- const naked = path$$1.call(bodyPath => {
- return printStatementSequence(bodyPath, options, print);
- }, "body");
- const hasContent = n.body.find(node => node.type !== "EmptyStatement");
- const hasDirectives = n.directives && n.directives.length > 0;
- const parent = path$$1.getParentNode();
- const parentParent = path$$1.getParentNode(1);
- if (
- !hasContent &&
- !hasDirectives &&
- !hasDanglingComments(n) &&
- (parent.type === "ArrowFunctionExpression" ||
- parent.type === "FunctionExpression" ||
- parent.type === "FunctionDeclaration" ||
- parent.type === "ObjectMethod" ||
- parent.type === "ClassMethod" ||
- parent.type === "ForStatement" ||
- parent.type === "WhileStatement" ||
- parent.type === "DoWhileStatement" ||
- (parent.type === "CatchClause" && !parentParent.finalizer))
- ) {
- return "{}";
- }
- parts.push("{");
- // Babel 6
- if (hasDirectives) {
- path$$1.each(childPath => {
- parts.push(indent(concat([hardline, print(childPath), semi])));
- if (
- utilShared.isNextLineEmpty(
- options.originalText,
- childPath.getValue(),
- options
- )
- ) {
- parts.push(hardline);
- }
- }, "directives");
- }
- if (hasContent) {
- parts.push(indent(concat([hardline, naked])));
- }
- parts.push(comments.printDanglingComments(path$$1, options));
- parts.push(hardline, "}");
- return concat(parts);
- }
- case "ReturnStatement":
- parts.push("return");
- if (n.argument) {
- if (returnArgumentHasLeadingComment(options, n.argument)) {
- parts.push(
- concat([
- " (",
- indent(concat([hardline, path$$1.call(print, "argument")])),
- hardline,
- ")"
- ])
- );
- } else if (
- n.argument.type === "LogicalExpression" ||
- n.argument.type === "BinaryExpression" ||
- n.argument.type === "SequenceExpression"
- ) {
- parts.push(
- group(
- concat([
- ifBreak(" (", " "),
- indent(concat([softline, path$$1.call(print, "argument")])),
- softline,
- ifBreak(")")
- ])
- )
- );
- } else {
- parts.push(" ", path$$1.call(print, "argument"));
- }
- }
- if (hasDanglingComments(n)) {
- parts.push(
- " ",
- comments.printDanglingComments(path$$1, options, /* sameIndent */ true)
- );
- }
- parts.push(semi);
- return concat(parts);
- case "NewExpression":
- case "CallExpression": {
- const isNew = n.type === "NewExpression";
- const optional = printOptionalToken(path$$1);
- if (
- // We want to keep CommonJS- and AMD-style require calls, and AMD-style
- // define calls, as a unit.
- // e.g. `define(["some/lib", (lib) => {`
- (!isNew &&
- n.callee.type === "Identifier" &&
- (n.callee.name === "require" || n.callee.name === "define")) ||
- n.callee.type === "Import" ||
- // Template literals as single arguments
- (n.arguments.length === 1 &&
- isTemplateOnItsOwnLine(
- n.arguments[0],
- options.originalText,
- options
- )) ||
- // Keep test declarations on a single line
- // e.g. `it('long name', () => {`
- (!isNew && isTestCall(n, path$$1.getParentNode()))
- ) {
- return concat([
- isNew ? "new " : "",
- path$$1.call(print, "callee"),
- optional,
- path$$1.call(print, "typeParameters"),
- concat(["(", join(", ", path$$1.map(print, "arguments")), ")"])
- ]);
- }
- // We detect calls on member lookups and possibly print them in a
- // special chain format. See `printMemberChain` for more info.
- if (!isNew && isMemberish(n.callee)) {
- return printMemberChain(path$$1, options, print);
- }
- return concat([
- isNew ? "new " : "",
- path$$1.call(print, "callee"),
- optional,
- printFunctionTypeParameters(path$$1, options, print),
- printArgumentsList(path$$1, options, print)
- ]);
- }
- case "TSInterfaceDeclaration":
- if (isNodeStartingWithDeclare(n, options)) {
- parts.push("declare ");
- }
- parts.push(
- n.abstract ? "abstract " : "",
- printTypeScriptModifiers(path$$1, options, print),
- "interface ",
- path$$1.call(print, "id"),
- n.typeParameters ? path$$1.call(print, "typeParameters") : "",
- " "
- );
- if (n.heritage.length) {
- parts.push(
- group(
- indent(
- concat([
- softline,
- "extends ",
- indent(join(concat([",", line]), path$$1.map(print, "heritage"))),
- " "
- ])
- )
- )
- );
- }
- parts.push(path$$1.call(print, "body"));
- return concat(parts);
- case "ObjectExpression":
- case "ObjectPattern":
- case "ObjectTypeAnnotation":
- case "TSInterfaceBody":
- case "TSTypeLiteral": {
- const isTypeAnnotation = n.type === "ObjectTypeAnnotation";
- const parent = path$$1.getParentNode(0);
- const shouldBreak =
- n.type === "TSInterfaceBody" ||
- (n.type === "ObjectPattern" &&
- parent.type !== "FunctionDeclaration" &&
- parent.type !== "FunctionExpression" &&
- parent.type !== "ArrowFunctionExpression" &&
- parent.type !== "AssignmentPattern" &&
- n.properties.some(
- property =>
- property.value &&
- (property.value.type === "ObjectPattern" ||
- property.value.type === "ArrayPattern")
- )) ||
- (n.type !== "ObjectPattern" &&
- util$1.hasNewlineInRange(
- options.originalText,
- options.locStart(n),
- options.locEnd(n)
- ));
- const isFlowInterfaceLikeBody =
- isTypeAnnotation &&
- parent &&
- (parent.type === "InterfaceDeclaration" ||
- parent.type === "DeclareInterface" ||
- parent.type === "DeclareClass") &&
- path$$1.getName() === "body";
- const separator = isFlowInterfaceLikeBody
- ? ";"
- : n.type === "TSInterfaceBody" || n.type === "TSTypeLiteral"
- ? ifBreak(semi, ";")
- : ",";
- const fields = [];
- const leftBrace = n.exact ? "{|" : "{";
- const rightBrace = n.exact ? "|}" : "}";
- let propertiesField;
- if (n.type === "TSTypeLiteral") {
- propertiesField = "members";
- } else if (n.type === "TSInterfaceBody") {
- propertiesField = "body";
- } else {
- propertiesField = "properties";
- }
- if (isTypeAnnotation) {
- fields.push("indexers", "callProperties");
- }
- fields.push(propertiesField);
- // Unfortunately, things are grouped together in the ast can be
- // interleaved in the source code. So we need to reorder them before
- // printing them.
- const propsAndLoc = [];
- fields.forEach(field => {
- path$$1.each(childPath => {
- const node = childPath.getValue();
- propsAndLoc.push({
- node: node,
- printed: print(childPath),
- loc: options.locStart(node)
- });
- }, field);
- });
- let separatorParts = [];
- const props = propsAndLoc.sort((a, b) => a.loc - b.loc).map(prop => {
- const result = concat(separatorParts.concat(group(prop.printed)));
- separatorParts = [separator, line];
- if (
- prop.node.type === "TSPropertySignature" &&
- util$1.hasNodeIgnoreComment(prop.node)
- ) {
- separatorParts.shift();
- }
- if (
- utilShared.isNextLineEmpty(options.originalText, prop.node, options)
- ) {
- separatorParts.push(hardline);
- }
- return result;
- });
- const lastElem = util$1.getLast(n[propertiesField]);
- const canHaveTrailingSeparator = !(
- lastElem &&
- (lastElem.type === "RestProperty" ||
- lastElem.type === "RestElement" ||
- lastElem.type === "ExperimentalRestProperty" ||
- util$1.hasNodeIgnoreComment(lastElem))
- );
- let content;
- if (props.length === 0 && !n.typeAnnotation) {
- if (!hasDanglingComments(n)) {
- return concat([leftBrace, rightBrace]);
- }
- content = group(
- concat([
- leftBrace,
- comments.printDanglingComments(path$$1, options),
- softline,
- rightBrace,
- printOptionalToken(path$$1)
- ])
- );
- } else {
- content = concat([
- leftBrace,
- indent(
- concat([options.bracketSpacing ? line : softline, concat(props)])
- ),
- ifBreak(
- canHaveTrailingSeparator &&
- (separator !== "," || shouldPrintComma(options))
- ? separator
- : ""
- ),
- concat([options.bracketSpacing ? line : softline, rightBrace]),
- printOptionalToken(path$$1),
- printTypeAnnotation(path$$1, options, print)
- ]);
- }
- // If we inline the object as first argument of the parent, we don't want
- // to create another group so that the object breaks before the return
- // type
- const parentParentParent = path$$1.getParentNode(2);
- if (
- (n.type === "ObjectPattern" &&
- parent &&
- shouldHugArguments(parent) &&
- parent.params[0] === n) ||
- (shouldHugType(n) &&
- parentParentParent &&
- shouldHugArguments(parentParentParent) &&
- parentParentParent.params[0].typeAnnotation &&
- parentParentParent.params[0].typeAnnotation.typeAnnotation === n)
- ) {
- return content;
- }
- return group(content, { shouldBreak });
- }
- // Babel 6
- case "ObjectProperty": // Non-standard AST node type.
- case "Property":
- if (n.method || n.kind === "get" || n.kind === "set") {
- return printMethod(path$$1, options, print);
- }
- if (n.shorthand) {
- parts.push(path$$1.call(print, "value"));
- } else {
- let printedLeft;
- if (n.computed) {
- printedLeft = concat(["[", path$$1.call(print, "key"), "]"]);
- } else {
- printedLeft = printPropertyKey(path$$1, options, print);
- }
- parts.push(
- printAssignment(
- n.key,
- printedLeft,
- ":",
- n.value,
- path$$1.call(print, "value"),
- options
- )
- );
- }
- return concat(parts); // Babel 6
- case "ClassMethod":
- if (n.static) {
- parts.push("static ");
- }
- parts = parts.concat(printObjectMethod(path$$1, options, print));
- return concat(parts); // Babel 6
- case "ObjectMethod":
- return printObjectMethod(path$$1, options, print);
- case "Decorator":
- return concat(["@", path$$1.call(print, "expression")]);
- case "ArrayExpression":
- case "ArrayPattern":
- if (n.elements.length === 0) {
- if (!hasDanglingComments(n)) {
- parts.push("[]");
- } else {
- parts.push(
- group(
- concat([
- "[",
- comments.printDanglingComments(path$$1, options),
- softline,
- "]"
- ])
- )
- );
- }
- } else {
- const lastElem = util$1.getLast(n.elements);
- const canHaveTrailingComma = !(
- lastElem && lastElem.type === "RestElement"
- );
- // JavaScript allows you to have empty elements in an array which
- // changes its length based on the number of commas. The algorithm
- // is that if the last argument is null, we need to force insert
- // a comma to ensure JavaScript recognizes it.
- // [,].length === 1
- // [1,].length === 1
- // [1,,].length === 2
- //
- // Note that privateUtil.getLast returns null if the array is empty, but
- // we already check for an empty array just above so we are safe
- const needsForcedTrailingComma =
- canHaveTrailingComma && lastElem === null;
- parts.push(
- group(
- concat([
- "[",
- indent(
- concat([
- softline,
- printArrayItems(path$$1, options, "elements", print)
- ])
- ),
- needsForcedTrailingComma ? "," : "",
- ifBreak(
- canHaveTrailingComma &&
- !needsForcedTrailingComma &&
- shouldPrintComma(options)
- ? ","
- : ""
- ),
- comments.printDanglingComments(
- path$$1,
- options,
- /* sameIndent */ true
- ),
- softline,
- "]"
- ])
- )
- );
- }
- parts.push(
- printOptionalToken(path$$1),
- printTypeAnnotation(path$$1, options, print)
- );
- return concat(parts);
- case "SequenceExpression": {
- const parent = path$$1.getParentNode(0);
- if (
- parent.type === "ExpressionStatement" ||
- parent.type === "ForStatement"
- ) {
- // For ExpressionStatements and for-loop heads, which are among
- // the few places a SequenceExpression appears unparenthesized, we want
- // to indent expressions after the first.
- const parts = [];
- path$$1.each(p => {
- if (p.getName() === 0) {
- parts.push(print(p));
- } else {
- parts.push(",", indent(concat([line, print(p)])));
- }
- }, "expressions");
- return group(concat(parts));
- }
- return group(
- concat([join(concat([",", line]), path$$1.map(print, "expressions"))])
- );
- }
- case "ThisExpression":
- return "this";
- case "Super":
- return "super";
- case "NullLiteral": // Babel 6 Literal split
- return "null";
- case "RegExpLiteral": // Babel 6 Literal split
- return printRegex(n);
- case "NumericLiteral": // Babel 6 Literal split
- return util$1.printNumber(n.extra.raw);
- case "BooleanLiteral": // Babel 6 Literal split
- case "StringLiteral": // Babel 6 Literal split
- case "Literal": {
- if (n.regex) {
- return printRegex(n.regex);
- }
- if (typeof n.value === "number") {
- return util$1.printNumber(n.raw);
- }
- if (typeof n.value !== "string") {
- return "" + n.value;
- }
- // TypeScript workaround for eslint/typescript-eslint-parser#267
- // See corresponding workaround in needs-parens.js
- const grandParent = path$$1.getParentNode(1);
- const isTypeScriptDirective =
- options.parser === "typescript" &&
- typeof n.value === "string" &&
- grandParent &&
- (grandParent.type === "Program" ||
- grandParent.type === "BlockStatement");
- return nodeStr(n, options, isTypeScriptDirective);
- }
- case "Directive":
- return path$$1.call(print, "value"); // Babel 6
- case "DirectiveLiteral":
- return nodeStr(n, options);
- case "UnaryExpression":
- parts.push(n.operator);
- if (/[a-z]$/.test(n.operator)) {
- parts.push(" ");
- }
- parts.push(path$$1.call(print, "argument"));
- return concat(parts);
- case "UpdateExpression":
- parts.push(path$$1.call(print, "argument"), n.operator);
- if (n.prefix) {
- parts.reverse();
- }
- return concat(parts);
- case "ConditionalExpression":
- return formatTernaryOperator(path$$1, options, print, {
- beforeParts: () => [path$$1.call(print, "test")],
- afterParts: breakClosingParen => [breakClosingParen ? softline : ""]
- });
- case "VariableDeclaration": {
- const printed = path$$1.map(childPath => {
- return print(childPath);
- }, "declarations");
- // We generally want to terminate all variable declarations with a
- // semicolon, except when they in the () part of for loops.
- const parentNode = path$$1.getParentNode();
- const isParentForLoop =
- parentNode.type === "ForStatement" ||
- parentNode.type === "ForInStatement" ||
- parentNode.type === "ForOfStatement" ||
- parentNode.type === "ForAwaitStatement";
- const hasValue = n.declarations.some(decl => decl.init);
- let firstVariable;
- if (printed.length === 1) {
- firstVariable = printed[0];
- } else if (printed.length > 1) {
- // Indent first var to comply with eslint one-var rule
- firstVariable = indent(printed[0]);
- }
- parts = [
- isNodeStartingWithDeclare(n, options) ? "declare " : "",
- n.kind,
- firstVariable ? concat([" ", firstVariable]) : "",
- indent(
- concat(
- printed
- .slice(1)
- .map(p =>
- concat([",", hasValue && !isParentForLoop ? hardline : line, p])
- )
- )
- )
- ];
- if (!(isParentForLoop && parentNode.body !== n)) {
- parts.push(semi);
- }
- return group(concat(parts));
- }
- case "VariableDeclarator":
- return printAssignment(
- n.id,
- concat([path$$1.call(print, "id"), path$$1.call(print, "typeParameters")]),
- " =",
- n.init,
- n.init && path$$1.call(print, "init"),
- options
- );
- case "WithStatement":
- return group(
- concat([
- "with (",
- path$$1.call(print, "object"),
- ")",
- adjustClause(n.body, path$$1.call(print, "body"))
- ])
- );
- case "IfStatement": {
- const con = adjustClause(n.consequent, path$$1.call(print, "consequent"));
- const opening = group(
- concat([
- "if (",
- group(
- concat([
- indent(concat([softline, path$$1.call(print, "test")])),
- softline
- ])
- ),
- ")",
- con
- ])
- );
- parts.push(opening);
- if (n.alternate) {
- const commentOnOwnLine =
- (hasTrailingComment(n.consequent) &&
- n.consequent.comments.some(
- comment =>
- comment.trailing && !util$1.isBlockComment(comment)
- )) ||
- needsHardlineAfterDanglingComment(n);
- const elseOnSameLine =
- n.consequent.type === "BlockStatement" && !commentOnOwnLine;
- parts.push(elseOnSameLine ? " " : hardline);
- if (hasDanglingComments(n)) {
- parts.push(
- comments.printDanglingComments(path$$1, options, true),
- commentOnOwnLine ? hardline : " "
- );
- }
- parts.push(
- "else",
- group(
- adjustClause(
- n.alternate,
- path$$1.call(print, "alternate"),
- n.alternate.type === "IfStatement"
- )
- )
- );
- }
- return concat(parts);
- }
- case "ForStatement": {
- const body = adjustClause(n.body, path$$1.call(print, "body"));
- // We want to keep dangling comments above the loop to stay consistent.
- // Any comment positioned between the for statement and the parentheses
- // is going to be printed before the statement.
- const dangling = comments.printDanglingComments(
- path$$1,
- options,
- /* sameLine */ true
- );
- const printedComments = dangling ? concat([dangling, softline]) : "";
- if (!n.init && !n.test && !n.update) {
- return concat([printedComments, group(concat(["for (;;)", body]))]);
- }
- return concat([
- printedComments,
- group(
- concat([
- "for (",
- group(
- concat([
- indent(
- concat([
- softline,
- path$$1.call(print, "init"),
- ";",
- line,
- path$$1.call(print, "test"),
- ";",
- line,
- path$$1.call(print, "update")
- ])
- ),
- softline
- ])
- ),
- ")",
- body
- ])
- )
- ]);
- }
- case "WhileStatement":
- return group(
- concat([
- "while (",
- group(
- concat([
- indent(concat([softline, path$$1.call(print, "test")])),
- softline
- ])
- ),
- ")",
- adjustClause(n.body, path$$1.call(print, "body"))
- ])
- );
- case "ForInStatement":
- // Note: esprima can't actually parse "for each (".
- return group(
- concat([
- n.each ? "for each (" : "for (",
- path$$1.call(print, "left"),
- " in ",
- path$$1.call(print, "right"),
- ")",
- adjustClause(n.body, path$$1.call(print, "body"))
- ])
- );
- case "ForOfStatement":
- case "ForAwaitStatement": {
- // Babylon 7 removed ForAwaitStatement in favor of ForOfStatement
- // with `"await": true`:
- // https://github.com/estree/estree/pull/138
- const isAwait = n.type === "ForAwaitStatement" || n.await;
- return group(
- concat([
- "for",
- isAwait ? " await" : "",
- " (",
- path$$1.call(print, "left"),
- " of ",
- path$$1.call(print, "right"),
- ")",
- adjustClause(n.body, path$$1.call(print, "body"))
- ])
- );
- }
- case "DoWhileStatement": {
- const clause = adjustClause(n.body, path$$1.call(print, "body"));
- const doBody = group(concat(["do", clause]));
- parts = [doBody];
- if (n.body.type === "BlockStatement") {
- parts.push(" ");
- } else {
- parts.push(hardline);
- }
- parts.push("while (");
- parts.push(
- group(
- concat([
- indent(concat([softline, path$$1.call(print, "test")])),
- softline
- ])
- ),
- ")",
- semi
- );
- return concat(parts);
- }
- case "DoExpression":
- return concat(["do ", path$$1.call(print, "body")]);
- case "BreakStatement":
- parts.push("break");
- if (n.label) {
- parts.push(" ", path$$1.call(print, "label"));
- }
- parts.push(semi);
- return concat(parts);
- case "ContinueStatement":
- parts.push("continue");
- if (n.label) {
- parts.push(" ", path$$1.call(print, "label"));
- }
- parts.push(semi);
- return concat(parts);
- case "LabeledStatement":
- if (n.body.type === "EmptyStatement") {
- return concat([path$$1.call(print, "label"), ":;"]);
- }
- return concat([
- path$$1.call(print, "label"),
- ": ",
- path$$1.call(print, "body")
- ]);
- case "TryStatement":
- return concat([
- "try ",
- path$$1.call(print, "block"),
- n.handler ? concat([" ", path$$1.call(print, "handler")]) : "",
- n.finalizer ? concat([" finally ", path$$1.call(print, "finalizer")]) : ""
- ]);
- case "CatchClause":
- return concat([
- "catch ",
- n.param ? concat(["(", path$$1.call(print, "param"), ") "]) : "",
- path$$1.call(print, "body")
- ]);
- case "ThrowStatement":
- return concat(["throw ", path$$1.call(print, "argument"), semi]);
- // Note: ignoring n.lexical because it has no printing consequences.
- case "SwitchStatement":
- return concat([
- group(
- concat([
- "switch (",
- indent(concat([softline, path$$1.call(print, "discriminant")])),
- softline,
- ")"
- ])
- ),
- " {",
- n.cases.length > 0
- ? indent(
- concat([
- hardline,
- join(
- hardline,
- path$$1.map(casePath => {
- const caseNode = casePath.getValue();
- return concat([
- casePath.call(print),
- n.cases.indexOf(caseNode) !== n.cases.length - 1 &&
- utilShared.isNextLineEmpty(
- options.originalText,
- caseNode,
- options
- )
- ? hardline
- : ""
- ]);
- }, "cases")
- )
- ])
- )
- : "",
- hardline,
- "}"
- ]);
- case "SwitchCase": {
- if (n.test) {
- parts.push("case ", path$$1.call(print, "test"), ":");
- } else {
- parts.push("default:");
- }
- const consequent = n.consequent.filter(
- node => node.type !== "EmptyStatement"
- );
- if (consequent.length > 0) {
- const cons = path$$1.call(consequentPath => {
- return printStatementSequence(consequentPath, options, print);
- }, "consequent");
- parts.push(
- consequent.length === 1 && consequent[0].type === "BlockStatement"
- ? concat([" ", cons])
- : indent(concat([hardline, cons]))
- );
- }
- return concat(parts);
- }
- // JSX extensions below.
- case "DebuggerStatement":
- return concat(["debugger", semi]);
- case "JSXAttribute":
- parts.push(path$$1.call(print, "name"));
- if (n.value) {
- let res;
- if (isStringLiteral(n.value)) {
- const value = rawText(n.value);
- res = '"' + value.slice(1, -1).replace(/"/g, """) + '"';
- } else {
- res = path$$1.call(print, "value");
- }
- parts.push("=", res);
- }
- return concat(parts);
- case "JSXIdentifier":
- // Can be removed when this is fixed:
- // https://github.com/eslint/typescript-eslint-parser/issues/337
- if (!n.name) {
- return "this";
- }
- return "" + n.name;
- case "JSXNamespacedName":
- return join(":", [
- path$$1.call(print, "namespace"),
- path$$1.call(print, "name")
- ]);
- case "JSXMemberExpression":
- return join(".", [
- path$$1.call(print, "object"),
- path$$1.call(print, "property")
- ]);
- case "TSQualifiedName":
- return join(".", [path$$1.call(print, "left"), path$$1.call(print, "right")]);
- case "JSXSpreadAttribute":
- case "JSXSpreadChild": {
- return concat([
- "{",
- path$$1.call(p => {
- const printed = concat(["...", print(p)]);
- const n = p.getValue();
- if (!n.comments || !n.comments.length) {
- return printed;
- }
- return concat([
- indent(
- concat([
- softline,
- comments.printComments(p, () => printed, options)
- ])
- ),
- softline
- ]);
- }, n.type === "JSXSpreadAttribute" ? "argument" : "expression"),
- "}"
- ]);
- }
- case "JSXExpressionContainer": {
- const parent = path$$1.getParentNode(0);
- const preventInline =
- parent.type === "JSXAttribute" &&
- n.expression.comments &&
- n.expression.comments.length > 0;
- const shouldInline =
- !preventInline &&
- (n.expression.type === "ArrayExpression" ||
- n.expression.type === "ObjectExpression" ||
- n.expression.type === "ArrowFunctionExpression" ||
- n.expression.type === "CallExpression" ||
- n.expression.type === "FunctionExpression" ||
- n.expression.type === "JSXEmptyExpression" ||
- n.expression.type === "TemplateLiteral" ||
- n.expression.type === "TaggedTemplateExpression" ||
- n.expression.type === "DoExpression" ||
- (isJSXNode(parent) &&
- (n.expression.type === "ConditionalExpression" ||
- isBinaryish(n.expression))));
- if (shouldInline) {
- return group(
- concat(["{", path$$1.call(print, "expression"), lineSuffixBoundary, "}"])
- );
- }
- return group(
- concat([
- "{",
- indent(concat([softline, path$$1.call(print, "expression")])),
- softline,
- lineSuffixBoundary,
- "}"
- ])
- );
- }
- case "JSXFragment":
- case "TSJsxFragment":
- case "JSXElement": {
- const elem = comments.printComments(
- path$$1,
- () => printJSXElement(path$$1, options, print),
- options
- );
- return maybeWrapJSXElementInParens(path$$1, elem);
- }
- case "JSXOpeningElement": {
- const n = path$$1.getValue();
- const nameHasComments =
- n.name && n.name.comments && n.name.comments.length > 0;
- // Don't break self-closing elements with no attributes and no comments
- if (n.selfClosing && !n.attributes.length && !nameHasComments) {
- return concat(["<", path$$1.call(print, "name"), " />"]);
- }
- // don't break up opening elements with a single long text attribute
- if (
- n.attributes &&
- n.attributes.length === 1 &&
- n.attributes[0].value &&
- isStringLiteral(n.attributes[0].value) &&
- !n.attributes[0].value.value.includes("\n") &&
- // We should break for the following cases:
- // <div
- // // comment
- // attr="value"
- // >
- // <div
- // attr="value"
- // // comment
- // >
- !nameHasComments &&
- (!n.attributes[0].comments || !n.attributes[0].comments.length)
- ) {
- return group(
- concat([
- "<",
- path$$1.call(print, "name"),
- " ",
- concat(path$$1.map(print, "attributes")),
- n.selfClosing ? " />" : ">"
- ])
- );
- }
- const lastAttrHasTrailingComments =
- n.attributes.length &&
- hasTrailingComment(util$1.getLast(n.attributes));
- const bracketSameLine =
- options.jsxBracketSameLine &&
- // We should print the bracket in a new line for the following cases:
- // <div
- // // comment
- // >
- // <div
- // attr // comment
- // >
- (!nameHasComments || n.attributes.length) &&
- !lastAttrHasTrailingComments;
- // We should print the opening element expanded if any prop value is a
- // string literal with newlines
- const shouldBreak =
- n.attributes &&
- n.attributes.some(
- attr =>
- attr.value &&
- isStringLiteral(attr.value) &&
- attr.value.value.includes("\n")
- );
- return group(
- concat([
- "<",
- path$$1.call(print, "name"),
- concat([
- indent(
- concat(
- path$$1.map(attr => concat([line, print(attr)]), "attributes")
- )
- ),
- n.selfClosing ? line : bracketSameLine ? ">" : softline
- ]),
- n.selfClosing ? "/>" : bracketSameLine ? "" : ">"
- ]),
- { shouldBreak }
- );
- }
- case "JSXClosingElement":
- return concat(["</", path$$1.call(print, "name"), ">"]);
- case "JSXOpeningFragment":
- case "JSXClosingFragment":
- case "TSJsxOpeningFragment":
- case "TSJsxClosingFragment": {
- const hasComment = n.comments && n.comments.length;
- const hasOwnLineComment =
- hasComment && !n.comments.every(util$1.isBlockComment);
- const isOpeningFragment =
- n.type === "JSXOpeningFragment" || n.type === "TSJsxOpeningFragment";
- return concat([
- isOpeningFragment ? "<" : "</",
- indent(
- concat([
- hasOwnLineComment
- ? hardline
- : hasComment && !isOpeningFragment
- ? " "
- : "",
- comments.printDanglingComments(path$$1, options, true)
- ])
- ),
- hasOwnLineComment ? hardline : "",
- ">"
- ]);
- }
- case "JSXText":
- /* istanbul ignore next */
- throw new Error("JSXTest should be handled by JSXElement");
- case "JSXEmptyExpression": {
- const requiresHardline =
- n.comments && !n.comments.every(util$1.isBlockComment);
- return concat([
- comments.printDanglingComments(
- path$$1,
- options,
- /* sameIndent */ !requiresHardline
- ),
- requiresHardline ? hardline : ""
- ]);
- }
- case "ClassBody":
- if (!n.comments && n.body.length === 0) {
- return "{}";
- }
- return concat([
- "{",
- n.body.length > 0
- ? indent(
- concat([
- hardline,
- path$$1.call(bodyPath => {
- return printStatementSequence(bodyPath, options, print);
- }, "body")
- ])
- )
- : comments.printDanglingComments(path$$1, options),
- hardline,
- "}"
- ]);
- case "ClassProperty":
- case "TSAbstractClassProperty":
- case "ClassPrivateProperty": {
- if (n.accessibility) {
- parts.push(n.accessibility + " ");
- }
- if (n.static) {
- parts.push("static ");
- }
- if (n.type === "TSAbstractClassProperty") {
- parts.push("abstract ");
- }
- if (n.readonly) {
- parts.push("readonly ");
- }
- const variance = getFlowVariance(n);
- if (variance) {
- parts.push(variance);
- }
- if (n.computed) {
- parts.push("[", path$$1.call(print, "key"), "]");
- } else {
- parts.push(printPropertyKey(path$$1, options, print));
- }
- parts.push(printTypeAnnotation(path$$1, options, print));
- if (n.value) {
- parts.push(
- " =",
- printAssignmentRight(
- n.value,
- path$$1.call(print, "value"),
- false, // canBreak
- options
- )
- );
- }
- parts.push(semi);
- return concat(parts);
- }
- case "ClassDeclaration":
- case "ClassExpression":
- case "TSAbstractClassDeclaration":
- if (isNodeStartingWithDeclare(n, options)) {
- parts.push("declare ");
- }
- parts.push(concat(printClass(path$$1, options, print)));
- return concat(parts);
- case "TSInterfaceHeritage":
- parts.push(path$$1.call(print, "id"));
- if (n.typeParameters) {
- parts.push(path$$1.call(print, "typeParameters"));
- }
- return concat(parts);
- case "TemplateElement":
- return join(literalline, n.value.raw.split(/\r?\n/g));
- case "TemplateLiteral": {
- const expressions = path$$1.map(print, "expressions");
- parts.push("`");
- path$$1.each(childPath => {
- const i = childPath.getName();
- parts.push(print(childPath));
- if (i < expressions.length) {
- // For a template literal of the following form:
- // `someQuery {
- // ${call({
- // a,
- // b,
- // })}
- // }`
- // the expression is on its own line (there is a \n in the previous
- // quasi literal), therefore we want to indent the JavaScript
- // expression inside at the beginning of ${ instead of the beginning
- // of the `.
- const tabWidth = options.tabWidth;
- const indentSize = util$1.getIndentSize(
- childPath.getValue().value.raw,
- tabWidth
- );
- let printed = expressions[i];
- if (
- (n.expressions[i].comments && n.expressions[i].comments.length) ||
- n.expressions[i].type === "MemberExpression" ||
- n.expressions[i].type === "ConditionalExpression"
- ) {
- printed = concat([indent(concat([softline, printed])), softline]);
- }
- const aligned = addAlignmentToDoc(printed, indentSize, tabWidth);
- parts.push(group(concat(["${", aligned, lineSuffixBoundary, "}"])));
- }
- }, "quasis");
- parts.push("`");
- return concat(parts);
- }
- // These types are unprintable because they serve as abstract
- // supertypes for other (printable) types.
- case "TaggedTemplateExpression":
- return concat([path$$1.call(print, "tag"), path$$1.call(print, "quasi")]);
- case "Node":
- case "Printable":
- case "SourceLocation":
- case "Position":
- case "Statement":
- case "Function":
- case "Pattern":
- case "Expression":
- case "Declaration":
- case "Specifier":
- case "NamedSpecifier":
- case "Comment":
- case "MemberTypeAnnotation": // Flow
- case "Type":
- /* istanbul ignore next */
- throw new Error("unprintable type: " + JSON.stringify(n.type));
- // Type Annotations for Facebook Flow, typically stripped out or
- // transformed away before printing.
- case "TypeAnnotation":
- case "TSTypeAnnotation":
- if (n.typeAnnotation) {
- return path$$1.call(print, "typeAnnotation");
- }
- /* istanbul ignore next */
- return "";
- case "TSTupleType":
- case "TupleTypeAnnotation": {
- const typesField = n.type === "TSTupleType" ? "elementTypes" : "types";
- return group(
- concat([
- "[",
- indent(
- concat([
- softline,
- printArrayItems(path$$1, options, typesField, print)
- ])
- ),
- // TypeScript doesn't support trailing commas in tuple types
- n.type === "TSTupleType"
- ? ""
- : ifBreak(shouldPrintComma(options) ? "," : ""),
- comments.printDanglingComments(path$$1, options, /* sameIndent */ true),
- softline,
- "]"
- ])
- );
- }
- case "ExistsTypeAnnotation":
- return "*";
- case "EmptyTypeAnnotation":
- return "empty";
- case "AnyTypeAnnotation":
- return "any";
- case "MixedTypeAnnotation":
- return "mixed";
- case "ArrayTypeAnnotation":
- return concat([path$$1.call(print, "elementType"), "[]"]);
- case "BooleanTypeAnnotation":
- return "boolean";
- case "BooleanLiteralTypeAnnotation":
- return "" + n.value;
- case "DeclareClass":
- return printFlowDeclaration(path$$1, printClass(path$$1, options, print));
- case "DeclareFunction":
- // For TypeScript the DeclareFunction node shares the AST
- // structure with FunctionDeclaration
- if (n.params) {
- return concat([
- "declare ",
- printFunctionDeclaration(path$$1, print, options),
- semi
- ]);
- }
- return printFlowDeclaration(path$$1, [
- "function ",
- path$$1.call(print, "id"),
- n.predicate ? " " : "",
- path$$1.call(print, "predicate"),
- semi
- ]);
- case "DeclareModule":
- return printFlowDeclaration(path$$1, [
- "module ",
- path$$1.call(print, "id"),
- " ",
- path$$1.call(print, "body")
- ]);
- case "DeclareModuleExports":
- return printFlowDeclaration(path$$1, [
- "module.exports",
- ": ",
- path$$1.call(print, "typeAnnotation"),
- semi
- ]);
- case "DeclareVariable":
- return printFlowDeclaration(path$$1, ["var ", path$$1.call(print, "id"), semi]);
- case "DeclareExportAllDeclaration":
- return concat(["declare export * from ", path$$1.call(print, "source")]);
- case "DeclareExportDeclaration":
- return concat(["declare ", printExportDeclaration(path$$1, options, print)]);
- case "DeclareOpaqueType":
- case "OpaqueType": {
- parts.push(
- "opaque type ",
- path$$1.call(print, "id"),
- path$$1.call(print, "typeParameters")
- );
- if (n.supertype) {
- parts.push(": ", path$$1.call(print, "supertype"));
- }
- if (n.impltype) {
- parts.push(" = ", path$$1.call(print, "impltype"));
- }
- parts.push(semi);
- if (n.type === "DeclareOpaqueType") {
- return printFlowDeclaration(path$$1, parts);
- }
- return concat(parts);
- }
- case "FunctionTypeAnnotation":
- case "TSFunctionType": {
- // FunctionTypeAnnotation is ambiguous:
- // declare function foo(a: B): void; OR
- // var A: (a: B) => void;
- const parent = path$$1.getParentNode(0);
- const parentParent = path$$1.getParentNode(1);
- const parentParentParent = path$$1.getParentNode(2);
- let isArrowFunctionTypeAnnotation =
- n.type === "TSFunctionType" ||
- !(
- (parent.type === "ObjectTypeProperty" &&
- !getFlowVariance(parent) &&
- !parent.optional &&
- options.locStart(parent) === options.locStart(n)) ||
- parent.type === "ObjectTypeCallProperty" ||
- (parentParentParent && parentParentParent.type === "DeclareFunction")
- );
- let needsColon =
- isArrowFunctionTypeAnnotation &&
- (parent.type === "TypeAnnotation" ||
- parent.type === "TSTypeAnnotation");
- // Sadly we can't put it inside of FastPath::needsColon because we are
- // printing ":" as part of the expression and it would put parenthesis
- // around :(
- const needsParens =
- needsColon &&
- isArrowFunctionTypeAnnotation &&
- (parent.type === "TypeAnnotation" ||
- parent.type === "TSTypeAnnotation") &&
- parentParent.type === "ArrowFunctionExpression";
- if (isObjectTypePropertyAFunction(parent, options)) {
- isArrowFunctionTypeAnnotation = true;
- needsColon = true;
- }
- if (needsParens) {
- parts.push("(");
- }
- parts.push(
- printFunctionParams(
- path$$1,
- print,
- options,
- /* expandArg */ false,
- /* printTypeParams */ true
- )
- );
- // The returnType is not wrapped in a TypeAnnotation, so the colon
- // needs to be added separately.
- if (n.returnType || n.predicate || n.typeAnnotation) {
- parts.push(
- isArrowFunctionTypeAnnotation ? " => " : ": ",
- path$$1.call(print, "returnType"),
- path$$1.call(print, "predicate"),
- path$$1.call(print, "typeAnnotation")
- );
- }
- if (needsParens) {
- parts.push(")");
- }
- return group(concat(parts));
- }
- case "FunctionTypeParam":
- return concat([
- path$$1.call(print, "name"),
- printOptionalToken(path$$1),
- n.name ? ": " : "",
- path$$1.call(print, "typeAnnotation")
- ]);
- case "GenericTypeAnnotation":
- return concat([
- path$$1.call(print, "id"),
- path$$1.call(print, "typeParameters")
- ]);
- case "DeclareInterface":
- case "InterfaceDeclaration": {
- if (
- n.type === "DeclareInterface" ||
- isNodeStartingWithDeclare(n, options)
- ) {
- parts.push("declare ");
- }
- parts.push(
- "interface ",
- path$$1.call(print, "id"),
- path$$1.call(print, "typeParameters")
- );
- if (n["extends"].length > 0) {
- parts.push(
- group(
- indent(
- concat([line, "extends ", join(", ", path$$1.map(print, "extends"))])
- )
- )
- );
- }
- parts.push(" ");
- parts.push(path$$1.call(print, "body"));
- return group(concat(parts));
- }
- case "ClassImplements":
- case "InterfaceExtends":
- return concat([
- path$$1.call(print, "id"),
- path$$1.call(print, "typeParameters")
- ]);
- case "TSIntersectionType":
- case "IntersectionTypeAnnotation": {
- const types = path$$1.map(print, "types");
- const result = [];
- let wasIndented = false;
- for (let i = 0; i < types.length; ++i) {
- if (i === 0) {
- result.push(types[i]);
- } else if (isObjectType(n.types[i - 1]) && isObjectType(n.types[i])) {
- // If both are objects, don't indent
- result.push(
- concat([" & ", wasIndented ? indent(types[i]) : types[i]])
- );
- } else if (!isObjectType(n.types[i - 1]) && !isObjectType(n.types[i])) {
- // If no object is involved, go to the next line if it breaks
- result.push(indent(concat([" &", line, types[i]])));
- } else {
- // If you go from object to non-object or vis-versa, then inline it
- if (i > 1) {
- wasIndented = true;
- }
- result.push(" & ", i > 1 ? indent(types[i]) : types[i]);
- }
- }
- return group(concat(result));
- }
- case "TSUnionType":
- case "UnionTypeAnnotation": {
- // single-line variation
- // A | B | C
- // multi-line variation
- // | A
- // | B
- // | C
- const parent = path$$1.getParentNode();
- // If there's a leading comment, the parent is doing the indentation
- const shouldIndent =
- parent.type !== "TypeParameterInstantiation" &&
- parent.type !== "TSTypeParameterInstantiation" &&
- parent.type !== "GenericTypeAnnotation" &&
- parent.type !== "TSTypeReference" &&
- !(parent.type === "FunctionTypeParam" && !parent.name) &&
- !(
- (parent.type === "TypeAlias" ||
- parent.type === "VariableDeclarator") &&
- hasLeadingOwnLineComment(options.originalText, n, options)
- );
- // {
- // a: string
- // } | null | void
- // should be inlined and not be printed in the multi-line variant
- const shouldHug = shouldHugType(n);
- // We want to align the children but without its comment, so it looks like
- // | child1
- // // comment
- // | child2
- const printed = path$$1.map(typePath => {
- let printedType = typePath.call(print);
- if (!shouldHug) {
- printedType = align(2, printedType);
- }
- return comments.printComments(typePath, () => printedType, options);
- }, "types");
- if (shouldHug) {
- return join(" | ", printed);
- }
- const code = concat([
- ifBreak(concat([shouldIndent ? line : "", "| "])),
- join(concat([line, "| "]), printed)
- ]);
- let hasParens;
- if (n.type === "TSUnionType") {
- const greatGrandParent = path$$1.getParentNode(2);
- const greatGreatGrandParent = path$$1.getParentNode(3);
- hasParens =
- greatGrandParent &&
- greatGrandParent.type === "TSParenthesizedType" &&
- greatGreatGrandParent &&
- (greatGreatGrandParent.type === "TSUnionType" ||
- greatGreatGrandParent.type === "TSIntersectionType");
- } else {
- hasParens = needsParens_1(path$$1, options);
- }
- if (hasParens) {
- return group(concat([indent(code), softline]));
- }
- return group(shouldIndent ? indent(code) : code);
- }
- case "NullableTypeAnnotation":
- return concat(["?", path$$1.call(print, "typeAnnotation")]);
- case "TSNullKeyword":
- case "NullLiteralTypeAnnotation":
- return "null";
- case "ThisTypeAnnotation":
- return "this";
- case "NumberTypeAnnotation":
- return "number";
- case "ObjectTypeCallProperty":
- if (n.static) {
- parts.push("static ");
- }
- parts.push(path$$1.call(print, "value"));
- return concat(parts);
- case "ObjectTypeIndexer": {
- const variance = getFlowVariance(n);
- return concat([
- variance || "",
- "[",
- path$$1.call(print, "id"),
- n.id ? ": " : "",
- path$$1.call(print, "key"),
- "]: ",
- path$$1.call(print, "value")
- ]);
- }
- case "ObjectTypeProperty": {
- const variance = getFlowVariance(n);
- return concat([
- n.static ? "static " : "",
- isGetterOrSetter(n) ? n.kind + " " : "",
- variance || "",
- printPropertyKey(path$$1, options, print),
- printOptionalToken(path$$1),
- isFunctionNotation(n, options) ? "" : ": ",
- path$$1.call(print, "value")
- ]);
- }
- case "QualifiedTypeIdentifier":
- return concat([
- path$$1.call(print, "qualification"),
- ".",
- path$$1.call(print, "id")
- ]);
- case "StringLiteralTypeAnnotation":
- return nodeStr(n, options);
- case "NumberLiteralTypeAnnotation":
- assert.strictEqual(typeof n.value, "number");
- if (n.extra != null) {
- return util$1.printNumber(n.extra.raw);
- }
- return util$1.printNumber(n.raw);
- case "StringTypeAnnotation":
- return "string";
- case "DeclareTypeAlias":
- case "TypeAlias": {
- if (
- n.type === "DeclareTypeAlias" ||
- isNodeStartingWithDeclare(n, options)
- ) {
- parts.push("declare ");
- }
- const canBreak = n.right.type === "StringLiteralTypeAnnotation";
- const printed = printAssignmentRight(
- n.right,
- path$$1.call(print, "right"),
- canBreak,
- options
- );
- parts.push(
- "type ",
- path$$1.call(print, "id"),
- path$$1.call(print, "typeParameters"),
- " =",
- printed,
- semi
- );
- return group(concat(parts));
- }
- case "TypeCastExpression":
- return concat([
- "(",
- path$$1.call(print, "expression"),
- ": ",
- path$$1.call(print, "typeAnnotation"),
- ")"
- ]);
- case "TypeParameterDeclaration":
- case "TypeParameterInstantiation":
- case "TSTypeParameterDeclaration":
- case "TSTypeParameterInstantiation":
- return printTypeParameters(path$$1, options, print, "params");
- case "TSTypeParameter":
- case "TypeParameter": {
- const parent = path$$1.getParentNode();
- if (parent.type === "TSMappedType") {
- parts.push(path$$1.call(print, "name"));
- if (n.constraint) {
- parts.push(" in ", path$$1.call(print, "constraint"));
- }
- return concat(parts);
- }
- const variance = getFlowVariance(n);
- if (variance) {
- parts.push(variance);
- }
- parts.push(path$$1.call(print, "name"));
- if (n.bound) {
- parts.push(": ");
- parts.push(path$$1.call(print, "bound"));
- }
- if (n.constraint) {
- parts.push(" extends ", path$$1.call(print, "constraint"));
- }
- if (n["default"]) {
- parts.push(" = ", path$$1.call(print, "default"));
- }
- return concat(parts);
- }
- case "TypeofTypeAnnotation":
- return concat(["typeof ", path$$1.call(print, "argument")]);
- case "VoidTypeAnnotation":
- return "void";
- case "InferredPredicate":
- return "%checks";
- // Unhandled types below. If encountered, nodes of these types should
- // be either left alone or desugared into AST types that are fully
- // supported by the pretty-printer.
- case "DeclaredPredicate":
- return concat(["%checks(", path$$1.call(print, "value"), ")"]);
- case "TSAbstractKeyword":
- return "abstract";
- case "TSAnyKeyword":
- return "any";
- case "TSAsyncKeyword":
- return "async";
- case "TSBooleanKeyword":
- return "boolean";
- case "TSConstKeyword":
- return "const";
- case "TSDeclareKeyword":
- return "declare";
- case "TSExportKeyword":
- return "export";
- case "TSNeverKeyword":
- return "never";
- case "TSNumberKeyword":
- return "number";
- case "TSObjectKeyword":
- return "object";
- case "TSProtectedKeyword":
- return "protected";
- case "TSPrivateKeyword":
- return "private";
- case "TSPublicKeyword":
- return "public";
- case "TSReadonlyKeyword":
- return "readonly";
- case "TSSymbolKeyword":
- return "symbol";
- case "TSStaticKeyword":
- return "static";
- case "TSStringKeyword":
- return "string";
- case "TSUndefinedKeyword":
- return "undefined";
- case "TSVoidKeyword":
- return "void";
- case "TSAsExpression":
- return concat([
- path$$1.call(print, "expression"),
- " as ",
- path$$1.call(print, "typeAnnotation")
- ]);
- case "TSArrayType":
- return concat([path$$1.call(print, "elementType"), "[]"]);
- case "TSPropertySignature": {
- if (n.export) {
- parts.push("export ");
- }
- if (n.accessibility) {
- parts.push(n.accessibility + " ");
- }
- if (n.static) {
- parts.push("static ");
- }
- if (n.readonly) {
- parts.push("readonly ");
- }
- if (n.computed) {
- parts.push("[");
- }
- parts.push(printPropertyKey(path$$1, options, print));
- if (n.computed) {
- parts.push("]");
- }
- parts.push(printOptionalToken(path$$1));
- if (n.typeAnnotation) {
- parts.push(": ");
- parts.push(path$$1.call(print, "typeAnnotation"));
- }
- // This isn't valid semantically, but it's in the AST so we can print it.
- if (n.initializer) {
- parts.push(" = ", path$$1.call(print, "initializer"));
- }
- return concat(parts);
- }
- case "TSParameterProperty":
- if (n.accessibility) {
- parts.push(n.accessibility + " ");
- }
- if (n.export) {
- parts.push("export ");
- }
- if (n.static) {
- parts.push("static ");
- }
- if (n.readonly) {
- parts.push("readonly ");
- }
- parts.push(path$$1.call(print, "parameter"));
- return concat(parts);
- case "TSTypeReference":
- return concat([
- path$$1.call(print, "typeName"),
- printTypeParameters(path$$1, options, print, "typeParameters")
- ]);
- case "TSTypeQuery":
- return concat(["typeof ", path$$1.call(print, "exprName")]);
- case "TSParenthesizedType": {
- return path$$1.call(print, "typeAnnotation");
- }
- case "TSIndexSignature": {
- const parent = path$$1.getParentNode();
- return concat([
- n.export ? "export " : "",
- n.accessibility ? concat([n.accessibility, " "]) : "",
- n.static ? "static " : "",
- n.readonly ? "readonly " : "",
- "[",
- path$$1.call(print, "index"),
- "]: ",
- path$$1.call(print, "typeAnnotation"),
- parent.type === "ClassBody" ? semi : ""
- ]);
- }
- case "TSTypePredicate":
- return concat([
- path$$1.call(print, "parameterName"),
- " is ",
- path$$1.call(print, "typeAnnotation")
- ]);
- case "TSNonNullExpression":
- return concat([path$$1.call(print, "expression"), "!"]);
- case "TSThisType":
- return "this";
- case "TSLastTypeNode":
- return path$$1.call(print, "literal");
- case "TSIndexedAccessType":
- return concat([
- path$$1.call(print, "objectType"),
- "[",
- path$$1.call(print, "indexType"),
- "]"
- ]);
- case "TSConstructSignature":
- case "TSConstructorType":
- case "TSCallSignature": {
- if (n.type !== "TSCallSignature") {
- parts.push("new ");
- }
- parts.push(
- group(
- printFunctionParams(
- path$$1,
- print,
- options,
- /* expandArg */ false,
- /* printTypeParams */ true
- )
- )
- );
- if (n.typeAnnotation) {
- const isType = n.type === "TSConstructorType";
- parts.push(isType ? " => " : ": ", path$$1.call(print, "typeAnnotation"));
- }
- return concat(parts);
- }
- case "TSTypeOperator":
- return concat([n.operator, " ", path$$1.call(print, "typeAnnotation")]);
- case "TSMappedType":
- return group(
- concat([
- "{",
- indent(
- concat([
- options.bracketSpacing ? line : softline,
- n.readonlyToken
- ? concat([
- getTypeScriptMappedTypeModifier(
- n.readonlyToken,
- "readonly"
- ),
- " "
- ])
- : "",
- printTypeScriptModifiers(path$$1, options, print),
- "[",
- path$$1.call(print, "typeParameter"),
- "]",
- n.questionToken
- ? getTypeScriptMappedTypeModifier(n.questionToken, "?")
- : "",
- ": ",
- path$$1.call(print, "typeAnnotation")
- ])
- ),
- comments.printDanglingComments(path$$1, options, /* sameIndent */ true),
- options.bracketSpacing ? line : softline,
- "}"
- ])
- );
- case "TSMethodSignature":
- parts.push(
- n.accessibility ? concat([n.accessibility, " "]) : "",
- n.export ? "export " : "",
- n.static ? "static " : "",
- n.readonly ? "readonly " : "",
- n.computed ? "[" : "",
- path$$1.call(print, "key"),
- n.computed ? "]" : "",
- printOptionalToken(path$$1),
- printFunctionParams(
- path$$1,
- print,
- options,
- /* expandArg */ false,
- /* printTypeParams */ true
- )
- );
- if (n.typeAnnotation) {
- parts.push(": ", path$$1.call(print, "typeAnnotation"));
- }
- return group(concat(parts));
- case "TSNamespaceExportDeclaration":
- parts.push("export as namespace ", path$$1.call(print, "name"));
- if (options.semi) {
- parts.push(";");
- }
- return group(concat(parts));
- case "TSEnumDeclaration":
- if (isNodeStartingWithDeclare(n, options)) {
- parts.push("declare ");
- }
- if (n.modifiers) {
- parts.push(printTypeScriptModifiers(path$$1, options, print));
- }
- if (n.const) {
- parts.push("const ");
- }
- parts.push("enum ", path$$1.call(print, "id"), " ");
- if (n.members.length === 0) {
- parts.push(
- group(
- concat([
- "{",
- comments.printDanglingComments(path$$1, options),
- softline,
- "}"
- ])
- )
- );
- } else {
- parts.push(
- group(
- concat([
- "{",
- indent(
- concat([
- hardline,
- printArrayItems(path$$1, options, "members", print),
- shouldPrintComma(options, "es5") ? "," : ""
- ])
- ),
- comments.printDanglingComments(
- path$$1,
- options,
- /* sameIndent */ true
- ),
- hardline,
- "}"
- ])
- )
- );
- }
- return concat(parts);
- case "TSEnumMember":
- parts.push(path$$1.call(print, "id"));
- if (n.initializer) {
- parts.push(" = ", path$$1.call(print, "initializer"));
- }
- return concat(parts);
- case "TSImportEqualsDeclaration":
- parts.push(
- printTypeScriptModifiers(path$$1, options, print),
- "import ",
- path$$1.call(print, "name"),
- " = ",
- path$$1.call(print, "moduleReference")
- );
- if (options.semi) {
- parts.push(";");
- }
- return group(concat(parts));
- case "TSExternalModuleReference":
- return concat(["require(", path$$1.call(print, "expression"), ")"]);
- case "TSModuleDeclaration": {
- const parent = path$$1.getParentNode();
- const isExternalModule = isLiteral(n.id);
- const parentIsDeclaration = parent.type === "TSModuleDeclaration";
- const bodyIsDeclaration = n.body && n.body.type === "TSModuleDeclaration";
- if (parentIsDeclaration) {
- parts.push(".");
- } else {
- if (n.declare === true) {
- parts.push("declare ");
- }
- parts.push(printTypeScriptModifiers(path$$1, options, print));
- // Global declaration looks like this:
- // (declare)? global { ... }
- const isGlobalDeclaration =
- n.id.type === "Identifier" &&
- n.id.name === "global" &&
- !/namespace|module/.test(
- options.originalText.slice(
- options.locStart(n),
- options.locStart(n.id)
- )
- );
- if (!isGlobalDeclaration) {
- parts.push(isExternalModule ? "module " : "namespace ");
- }
- }
- parts.push(path$$1.call(print, "id"));
- if (bodyIsDeclaration) {
- parts.push(path$$1.call(print, "body"));
- } else if (n.body) {
- parts.push(
- " {",
- indent(
- concat([
- line,
- path$$1.call(
- bodyPath =>
- comments.printDanglingComments(bodyPath, options, true),
- "body"
- ),
- group(path$$1.call(print, "body"))
- ])
- ),
- line,
- "}"
- );
- } else {
- parts.push(semi);
- }
- return concat(parts);
- }
- case "TSModuleBlock":
- return path$$1.call(bodyPath => {
- return printStatementSequence(bodyPath, options, print);
- }, "body");
- case "PrivateName":
- return concat(["#", path$$1.call(print, "id")]);
- case "TSConditionalType":
- return formatTernaryOperator(path$$1, options, print, {
- beforeParts: () => [
- path$$1.call(print, "checkType"),
- " ",
- "extends",
- " ",
- path$$1.call(print, "extendsType")
- ],
- shouldCheckJsx: false,
- operatorName: "TSConditionalType",
- consequentNode: "trueType",
- alternateNode: "falseType",
- testNode: "checkType",
- breakNested: false
- });
- case "TSInferType":
- return concat(["infer", " ", path$$1.call(print, "typeParameter")]);
- default:
- /* istanbul ignore next */
- throw new Error("unknown type: " + JSON.stringify(n.type));
- }
- }
- function printStatementSequence(path$$1, options, print) {
- const printed = [];
- const bodyNode = path$$1.getNode();
- const isClass = bodyNode.type === "ClassBody";
- path$$1.map((stmtPath, i) => {
- const stmt = stmtPath.getValue();
- // Just in case the AST has been modified to contain falsy
- // "statements," it's safer simply to skip them.
- /* istanbul ignore if */
- if (!stmt) {
- return;
- }
- // Skip printing EmptyStatement nodes to avoid leaving stray
- // semicolons lying around.
- if (stmt.type === "EmptyStatement") {
- return;
- }
- const stmtPrinted = print(stmtPath);
- const text = options.originalText;
- const parts = [];
- // in no-semi mode, prepend statement with semicolon if it might break ASI
- // don't prepend the only JSX element in a program with semicolon
- if (
- !options.semi &&
- !isClass &&
- !isTheOnlyJSXElementInMarkdown(options, stmtPath) &&
- stmtNeedsASIProtection(stmtPath, options)
- ) {
- if (stmt.comments && stmt.comments.some(comment => comment.leading)) {
- parts.push(print(stmtPath, { needsSemi: true }));
- } else {
- parts.push(";", stmtPrinted);
- }
- } else {
- parts.push(stmtPrinted);
- }
- if (!options.semi && isClass) {
- if (classPropMayCauseASIProblems(stmtPath)) {
- parts.push(";");
- } else if (stmt.type === "ClassProperty") {
- const nextChild = bodyNode.body[i + 1];
- if (classChildNeedsASIProtection(nextChild)) {
- parts.push(";");
- }
- }
- }
- if (
- utilShared.isNextLineEmpty(text, stmt, options) &&
- !isLastStatement(stmtPath)
- ) {
- parts.push(hardline);
- }
- printed.push(concat(parts));
- });
- return join(hardline, printed);
- }
- function printPropertyKey(path$$1, options, print) {
- const node = path$$1.getNode();
- const key = node.key;
- if (
- isStringLiteral(key) &&
- isIdentifierName(key.value) &&
- !node.computed &&
- options.parser !== "json"
- ) {
- // 'a' -> a
- return path$$1.call(
- keyPath => comments.printComments(keyPath, () => key.value, options),
- "key"
- );
- }
- return path$$1.call(print, "key");
- }
- function printMethod(path$$1, options, print) {
- const node = path$$1.getNode();
- const semi = options.semi ? ";" : "";
- const kind = node.kind;
- const parts = [];
- if (node.type === "ObjectMethod" || node.type === "ClassMethod") {
- node.value = node;
- }
- if (node.value.async) {
- parts.push("async ");
- }
- if (!kind || kind === "init" || kind === "method" || kind === "constructor") {
- if (node.value.generator) {
- parts.push("*");
- }
- } else {
- assert.ok(kind === "get" || kind === "set");
- parts.push(kind, " ");
- }
- let key = printPropertyKey(path$$1, options, print);
- if (node.computed) {
- key = concat(["[", key, "]"]);
- }
- parts.push(
- key,
- concat(
- path$$1.call(
- valuePath => [
- printFunctionTypeParameters(valuePath, options, print),
- group(
- concat([
- printFunctionParams(valuePath, print, options),
- printReturnType(valuePath, print, options)
- ])
- )
- ],
- "value"
- )
- )
- );
- if (!node.value.body || node.value.body.length === 0) {
- parts.push(semi);
- } else {
- parts.push(" ", path$$1.call(print, "value", "body"));
- }
- return concat(parts);
- }
- function couldGroupArg(arg) {
- return (
- (arg.type === "ObjectExpression" &&
- (arg.properties.length > 0 || arg.comments)) ||
- (arg.type === "ArrayExpression" &&
- (arg.elements.length > 0 || arg.comments)) ||
- arg.type === "TSTypeAssertionExpression" ||
- arg.type === "TSAsExpression" ||
- arg.type === "FunctionExpression" ||
- (arg.type === "ArrowFunctionExpression" &&
- (arg.body.type === "BlockStatement" ||
- arg.body.type === "ArrowFunctionExpression" ||
- arg.body.type === "ObjectExpression" ||
- arg.body.type === "ArrayExpression" ||
- arg.body.type === "CallExpression" ||
- isJSXNode(arg.body)))
- );
- }
- function shouldGroupLastArg(args) {
- const lastArg = util$1.getLast(args);
- const penultimateArg = util$1.getPenultimate(args);
- return (
- !hasLeadingComment(lastArg) &&
- !hasTrailingComment(lastArg) &&
- couldGroupArg(lastArg) &&
- // If the last two arguments are of the same type,
- // disable last element expansion.
- (!penultimateArg || penultimateArg.type !== lastArg.type)
- );
- }
- function shouldGroupFirstArg(args) {
- if (args.length !== 2) {
- return false;
- }
- const firstArg = args[0];
- const secondArg = args[1];
- return (
- (!firstArg.comments || !firstArg.comments.length) &&
- (firstArg.type === "FunctionExpression" ||
- (firstArg.type === "ArrowFunctionExpression" &&
- firstArg.body.type === "BlockStatement")) &&
- !couldGroupArg(secondArg)
- );
- }
- function printArgumentsList(path$$1, options, print) {
- const args = path$$1.getValue().arguments;
- if (args.length === 0) {
- return concat([
- "(",
- comments.printDanglingComments(path$$1, options, /* sameIndent */ true),
- ")"
- ]);
- }
- let anyArgEmptyLine = false;
- let hasEmptyLineFollowingFirstArg = false;
- const lastArgIndex = args.length - 1;
- const printedArguments = path$$1.map((argPath, index) => {
- const arg = argPath.getNode();
- const parts = [print(argPath)];
- if (index === lastArgIndex) {
- // do nothing
- } else if (utilShared.isNextLineEmpty(options.originalText, arg, options)) {
- if (index === 0) {
- hasEmptyLineFollowingFirstArg = true;
- }
- anyArgEmptyLine = true;
- parts.push(",", hardline, hardline);
- } else {
- parts.push(",", line);
- }
- return concat(parts);
- }, "arguments");
- const shouldGroupFirst = shouldGroupFirstArg(args);
- const shouldGroupLast = shouldGroupLastArg(args);
- if (shouldGroupFirst || shouldGroupLast) {
- const shouldBreak =
- (shouldGroupFirst
- ? printedArguments.slice(1).some(willBreak$1)
- : printedArguments.slice(0, -1).some(willBreak$1)) || anyArgEmptyLine;
- // We want to print the last argument with a special flag
- let printedExpanded;
- let i = 0;
- path$$1.each(argPath => {
- if (shouldGroupFirst && i === 0) {
- printedExpanded = [
- concat([
- argPath.call(p => print(p, { expandFirstArg: true })),
- printedArguments.length > 1 ? "," : "",
- hasEmptyLineFollowingFirstArg ? hardline : line,
- hasEmptyLineFollowingFirstArg ? hardline : ""
- ])
- ].concat(printedArguments.slice(1));
- }
- if (shouldGroupLast && i === args.length - 1) {
- printedExpanded = printedArguments
- .slice(0, -1)
- .concat(argPath.call(p => print(p, { expandLastArg: true })));
- }
- i++;
- }, "arguments");
- const somePrintedArgumentsWillBreak = printedArguments.some(willBreak$1);
- const maybeTrailingComma = shouldPrintComma(options, "all") ? "," : "";
- return concat([
- somePrintedArgumentsWillBreak ? breakParent : "",
- conditionalGroup(
- [
- concat([
- ifBreak(
- indent(concat(["(", softline, concat(printedExpanded)])),
- concat(["(", concat(printedExpanded)])
- ),
- somePrintedArgumentsWillBreak
- ? concat([ifBreak(maybeTrailingComma), softline])
- : "",
- ")"
- ]),
- shouldGroupFirst
- ? concat([
- "(",
- group(printedExpanded[0], { shouldBreak: true }),
- concat(printedExpanded.slice(1)),
- ")"
- ])
- : concat([
- "(",
- concat(printedArguments.slice(0, -1)),
- group(util$1.getLast(printedExpanded), {
- shouldBreak: true
- }),
- ")"
- ]),
- group(
- concat([
- "(",
- indent(concat([line, concat(printedArguments)])),
- maybeTrailingComma,
- line,
- ")"
- ]),
- { shouldBreak: true }
- )
- ],
- { shouldBreak }
- )
- ]);
- }
- return group(
- concat([
- "(",
- indent(concat([softline, concat(printedArguments)])),
- ifBreak(shouldPrintComma(options, "all") ? "," : ""),
- softline,
- ")"
- ]),
- { shouldBreak: printedArguments.some(willBreak$1) || anyArgEmptyLine }
- );
- }
- function printTypeAnnotation(path$$1, options, print) {
- const node = path$$1.getValue();
- if (!node.typeAnnotation) {
- return "";
- }
- const parentNode = path$$1.getParentNode();
- const isDefinite =
- node.definite ||
- (parentNode &&
- parentNode.type === "VariableDeclarator" &&
- parentNode.definite);
- const isFunctionDeclarationIdentifier =
- parentNode.type === "DeclareFunction" && parentNode.id === node;
- if (
- isFlowAnnotationComment(options.originalText, node.typeAnnotation, options)
- ) {
- return concat([" /*: ", path$$1.call(print, "typeAnnotation"), " */"]);
- }
- return concat([
- isFunctionDeclarationIdentifier ? "" : isDefinite ? "!: " : ": ",
- path$$1.call(print, "typeAnnotation")
- ]);
- }
- function printFunctionTypeParameters(path$$1, options, print) {
- const fun = path$$1.getValue();
- if (fun.typeParameters) {
- return path$$1.call(print, "typeParameters");
- }
- return "";
- }
- function printFunctionParams(path$$1, print, options, expandArg, printTypeParams) {
- const fun = path$$1.getValue();
- const paramsField = fun.parameters ? "parameters" : "params";
- const typeParams = printTypeParams
- ? printFunctionTypeParameters(path$$1, options, print)
- : "";
- let printed = [];
- if (fun[paramsField]) {
- printed = path$$1.map(print, paramsField);
- }
- if (fun.rest) {
- printed.push(concat(["...", path$$1.call(print, "rest")]));
- }
- if (printed.length === 0) {
- return concat([
- typeParams,
- "(",
- comments.printDanglingComments(
- path$$1,
- options,
- /* sameIndent */ true,
- comment =>
- util$1.getNextNonSpaceNonCommentCharacter(
- options.originalText,
- comment,
- options.locEnd
- ) === ")"
- ),
- ")"
- ]);
- }
- const lastParam = util$1.getLast(fun[paramsField]);
- // If the parent is a call with the first/last argument expansion and this is the
- // params of the first/last argument, we dont want the arguments to break and instead
- // want the whole expression to be on a new line.
- //
- // Good: Bad:
- // verylongcall( verylongcall((
- // (a, b) => { a,
- // } b,
- // }) ) => {
- // })
- if (
- expandArg &&
- !(fun[paramsField] && fun[paramsField].some(n => n.comments))
- ) {
- return group(
- concat([
- docUtils$3.removeLines(typeParams),
- "(",
- join(", ", printed.map(docUtils$3.removeLines)),
- ")"
- ])
- );
- }
- // Single object destructuring should hug
- //
- // function({
- // a,
- // b,
- // c
- // }) {}
- if (shouldHugArguments(fun)) {
- return concat([typeParams, "(", join(", ", printed), ")"]);
- }
- const parent = path$$1.getParentNode();
- // don't break in specs, eg; `it("should maintain parens around done even when long", (done) => {})`
- if (parent.type === "CallExpression" && isTestCall(parent)) {
- return concat([typeParams, "(", join(", ", printed), ")"]);
- }
- const flowTypeAnnotations = [
- "AnyTypeAnnotation",
- "NullLiteralTypeAnnotation",
- "GenericTypeAnnotation",
- "ThisTypeAnnotation",
- "NumberTypeAnnotation",
- "VoidTypeAnnotation",
- "EmptyTypeAnnotation",
- "MixedTypeAnnotation",
- "BooleanTypeAnnotation",
- "BooleanLiteralTypeAnnotation",
- "StringTypeAnnotation"
- ];
- const isFlowShorthandWithOneArg =
- (isObjectTypePropertyAFunction(parent, options) ||
- isTypeAnnotationAFunction(parent, options) ||
- parent.type === "TypeAlias" ||
- parent.type === "UnionTypeAnnotation" ||
- parent.type === "TSUnionType" ||
- parent.type === "IntersectionTypeAnnotation" ||
- (parent.type === "FunctionTypeAnnotation" &&
- parent.returnType === fun)) &&
- fun[paramsField].length === 1 &&
- fun[paramsField][0].name === null &&
- fun[paramsField][0].typeAnnotation &&
- fun.typeParameters === null &&
- flowTypeAnnotations.indexOf(fun[paramsField][0].typeAnnotation.type) !==
- -1 &&
- !(
- fun[paramsField][0].typeAnnotation.type === "GenericTypeAnnotation" &&
- fun[paramsField][0].typeAnnotation.typeParameters
- ) &&
- !fun.rest;
- if (isFlowShorthandWithOneArg) {
- if (options.arrowParens === "always") {
- return concat(["(", concat(printed), ")"]);
- }
- return concat(printed);
- }
- const canHaveTrailingComma =
- !(lastParam && lastParam.type === "RestElement") && !fun.rest;
- return concat([
- typeParams,
- "(",
- indent(concat([softline, join(concat([",", line]), printed)])),
- ifBreak(
- canHaveTrailingComma && shouldPrintComma(options, "all") ? "," : ""
- ),
- softline,
- ")"
- ]);
- }
- function shouldPrintParamsWithoutParens(path$$1, options) {
- if (options.arrowParens === "always") {
- return false;
- }
- if (options.arrowParens === "avoid") {
- const node = path$$1.getValue();
- return canPrintParamsWithoutParens(node);
- }
- // Fallback default; should be unreachable
- return false;
- }
- function canPrintParamsWithoutParens(node) {
- return (
- node.params.length === 1 &&
- !node.rest &&
- !node.typeParameters &&
- !hasDanglingComments(node) &&
- node.params[0].type === "Identifier" &&
- !node.params[0].typeAnnotation &&
- !node.params[0].comments &&
- !node.params[0].optional &&
- !node.predicate &&
- !node.returnType
- );
- }
- function printFunctionDeclaration(path$$1, print, options) {
- const n = path$$1.getValue();
- const parts = [];
- if (n.async) {
- parts.push("async ");
- }
- parts.push("function");
- if (n.generator) {
- parts.push("*");
- }
- if (n.id) {
- parts.push(" ", path$$1.call(print, "id"));
- }
- parts.push(
- printFunctionTypeParameters(path$$1, options, print),
- group(
- concat([
- printFunctionParams(path$$1, print, options),
- printReturnType(path$$1, print, options)
- ])
- ),
- n.body ? " " : "",
- path$$1.call(print, "body")
- );
- return concat(parts);
- }
- function printObjectMethod(path$$1, options, print) {
- const objMethod = path$$1.getValue();
- const parts = [];
- if (objMethod.async) {
- parts.push("async ");
- }
- if (objMethod.generator) {
- parts.push("*");
- }
- if (
- objMethod.method ||
- objMethod.kind === "get" ||
- objMethod.kind === "set"
- ) {
- return printMethod(path$$1, options, print);
- }
- const key = printPropertyKey(path$$1, options, print);
- if (objMethod.computed) {
- parts.push("[", key, "]");
- } else {
- parts.push(key);
- }
- parts.push(
- printFunctionTypeParameters(path$$1, options, print),
- group(
- concat([
- printFunctionParams(path$$1, print, options),
- printReturnType(path$$1, print, options)
- ])
- ),
- " ",
- path$$1.call(print, "body")
- );
- return concat(parts);
- }
- function printReturnType(path$$1, print, options) {
- const n = path$$1.getValue();
- const returnType = path$$1.call(print, "returnType");
- if (
- n.returnType &&
- isFlowAnnotationComment(options.originalText, n.returnType, options)
- ) {
- return concat([" /*: ", returnType, " */"]);
- }
- const parts = [returnType];
- // prepend colon to TypeScript type annotation
- if (n.returnType && n.returnType.typeAnnotation) {
- parts.unshift(": ");
- }
- if (n.predicate) {
- // The return type will already add the colon, but otherwise we
- // need to do it ourselves
- parts.push(n.returnType ? " " : ": ", path$$1.call(print, "predicate"));
- }
- return concat(parts);
- }
- function printExportDeclaration(path$$1, options, print) {
- const decl = path$$1.getValue();
- const semi = options.semi ? ";" : "";
- const parts = ["export "];
- const isDefault = decl["default"] || decl.type === "ExportDefaultDeclaration";
- if (isDefault) {
- parts.push("default ");
- }
- parts.push(
- comments.printDanglingComments(path$$1, options, /* sameIndent */ true)
- );
- if (needsHardlineAfterDanglingComment(decl)) {
- parts.push(hardline);
- }
- if (decl.declaration) {
- parts.push(path$$1.call(print, "declaration"));
- if (
- isDefault &&
- (decl.declaration.type !== "ClassDeclaration" &&
- decl.declaration.type !== "FunctionDeclaration" &&
- decl.declaration.type !== "TSAbstractClassDeclaration" &&
- decl.declaration.type !== "TSInterfaceDeclaration" &&
- decl.declaration.type !== "DeclareClass" &&
- decl.declaration.type !== "DeclareFunction")
- ) {
- parts.push(semi);
- }
- } else {
- if (decl.specifiers && decl.specifiers.length > 0) {
- const specifiers = [];
- const defaultSpecifiers = [];
- const namespaceSpecifiers = [];
- path$$1.each(specifierPath => {
- const specifierType = path$$1.getValue().type;
- if (specifierType === "ExportSpecifier") {
- specifiers.push(print(specifierPath));
- } else if (specifierType === "ExportDefaultSpecifier") {
- defaultSpecifiers.push(print(specifierPath));
- } else if (specifierType === "ExportNamespaceSpecifier") {
- namespaceSpecifiers.push(concat(["* as ", print(specifierPath)]));
- }
- }, "specifiers");
- const isNamespaceFollowed =
- namespaceSpecifiers.length !== 0 && specifiers.length !== 0;
- const isDefaultFollowed =
- defaultSpecifiers.length !== 0 &&
- (namespaceSpecifiers.length !== 0 || specifiers.length !== 0);
- parts.push(
- decl.exportKind === "type" ? "type " : "",
- concat(defaultSpecifiers),
- concat([isDefaultFollowed ? ", " : ""]),
- concat(namespaceSpecifiers),
- concat([isNamespaceFollowed ? ", " : ""]),
- specifiers.length !== 0
- ? group(
- concat([
- "{",
- indent(
- concat([
- options.bracketSpacing ? line : softline,
- join(concat([",", line]), specifiers)
- ])
- ),
- ifBreak(shouldPrintComma(options) ? "," : ""),
- options.bracketSpacing ? line : softline,
- "}"
- ])
- )
- : ""
- );
- } else {
- parts.push("{}");
- }
- if (decl.source) {
- parts.push(" from ", path$$1.call(print, "source"));
- }
- parts.push(semi);
- }
- return concat(parts);
- }
- function printFlowDeclaration(path$$1, parts) {
- const parentExportDecl = util$1.getParentExportDeclaration(path$$1);
- if (parentExportDecl) {
- assert.strictEqual(parentExportDecl.type, "DeclareExportDeclaration");
- } else {
- // If the parent node has type DeclareExportDeclaration, then it
- // will be responsible for printing the "declare" token. Otherwise
- // it needs to be printed with this non-exported declaration node.
- parts.unshift("declare ");
- }
- return concat(parts);
- }
- function getFlowVariance(path$$1) {
- if (!path$$1.variance) {
- return null;
- }
- // Babylon 7.0 currently uses variance node type, and flow should
- // follow suit soon:
- // https://github.com/babel/babel/issues/4722
- const variance = path$$1.variance.kind || path$$1.variance;
- switch (variance) {
- case "plus":
- return "+";
- case "minus":
- return "-";
- default:
- /* istanbul ignore next */
- return variance;
- }
- }
- function printTypeScriptModifiers(path$$1, options, print) {
- const n = path$$1.getValue();
- if (!n.modifiers || !n.modifiers.length) {
- return "";
- }
- return concat([join(" ", path$$1.map(print, "modifiers")), " "]);
- }
- function printTypeParameters(path$$1, options, print, paramsKey) {
- const n = path$$1.getValue();
- if (!n[paramsKey]) {
- return "";
- }
- // for TypeParameterDeclaration typeParameters is a single node
- if (!Array.isArray(n[paramsKey])) {
- return path$$1.call(print, paramsKey);
- }
- const grandparent = path$$1.getNode(2);
- const isParameterInTestCall =
- grandparent != null &&
- grandparent.type === "CallExpression" &&
- isTestCall(grandparent);
- const shouldInline =
- isParameterInTestCall ||
- n[paramsKey].length === 0 ||
- (n[paramsKey].length === 1 &&
- (shouldHugType(n[paramsKey][0]) ||
- (n[paramsKey][0].type === "GenericTypeAnnotation" &&
- shouldHugType(n[paramsKey][0].id)) ||
- (n[paramsKey][0].type === "TSTypeReference" &&
- shouldHugType(n[paramsKey][0].typeName)) ||
- n[paramsKey][0].type === "NullableTypeAnnotation"));
- if (shouldInline) {
- return concat(["<", join(", ", path$$1.map(print, paramsKey)), ">"]);
- }
- return group(
- concat([
- "<",
- indent(
- concat([
- softline,
- join(concat([",", line]), path$$1.map(print, paramsKey))
- ])
- ),
- ifBreak(
- options.parser !== "typescript" && shouldPrintComma(options, "all")
- ? ","
- : ""
- ),
- softline,
- ">"
- ])
- );
- }
- function printClass(path$$1, options, print) {
- const n = path$$1.getValue();
- const parts = [];
- if (n.type === "TSAbstractClassDeclaration") {
- parts.push("abstract ");
- }
- parts.push("class");
- if (n.id) {
- parts.push(" ", path$$1.call(print, "id"));
- }
- parts.push(path$$1.call(print, "typeParameters"));
- const partsGroup = [];
- if (n.superClass) {
- const printed = concat([
- "extends ",
- path$$1.call(print, "superClass"),
- path$$1.call(print, "superTypeParameters")
- ]);
- // Keep old behaviour of extends in same line
- // If there is only on extends and there are not comments
- if (
- (!n.implements || n.implements.length === 0) &&
- (!n.superClass.comments || n.superClass.comments.length === 0)
- ) {
- parts.push(
- concat([
- " ",
- path$$1.call(
- superClass =>
- comments.printComments(superClass, () => printed, options),
- "superClass"
- )
- ])
- );
- } else {
- partsGroup.push(
- group(
- concat([
- line,
- path$$1.call(
- superClass =>
- comments.printComments(superClass, () => printed, options),
- "superClass"
- )
- ])
- )
- );
- }
- } else if (n.extends && n.extends.length > 0) {
- parts.push(" extends ", join(", ", path$$1.map(print, "extends")));
- }
- if (n["implements"] && n["implements"].length > 0) {
- partsGroup.push(
- line,
- "implements",
- group(
- indent(
- concat([
- line,
- join(concat([",", line]), path$$1.map(print, "implements"))
- ])
- )
- )
- );
- }
- if (n["mixins"] && n["mixins"].length > 0) {
- partsGroup.push(
- line,
- "mixins ",
- group(indent(join(concat([",", line]), path$$1.map(print, "mixins"))))
- );
- }
- if (partsGroup.length > 0) {
- parts.push(group(indent(concat(partsGroup))));
- }
- if (
- n.body &&
- n.body.comments &&
- hasLeadingOwnLineComment(options.originalText, n.body, options)
- ) {
- parts.push(hardline);
- } else {
- parts.push(" ");
- }
- parts.push(path$$1.call(print, "body"));
- return parts;
- }
- function printOptionalToken(path$$1) {
- const node = path$$1.getValue();
- if (!node.optional) {
- return "";
- }
- if (
- node.type === "CallExpression" ||
- (node.type === "MemberExpression" && node.computed)
- ) {
- return "?.";
- }
- return "?";
- }
- function printMemberLookup(path$$1, options, print) {
- const property = path$$1.call(print, "property");
- const n = path$$1.getValue();
- const optional = printOptionalToken(path$$1);
- if (!n.computed) {
- return concat([optional, ".", property]);
- }
- if (!n.property || isNumericLiteral(n.property)) {
- return concat([optional, "[", property, "]"]);
- }
- return group(
- concat([optional, "[", indent(concat([softline, property])), softline, "]"])
- );
- }
- function printBindExpressionCallee(path$$1, options, print) {
- return concat(["::", path$$1.call(print, "callee")]);
- }
- // We detect calls on member expressions specially to format a
- // common pattern better. The pattern we are looking for is this:
- //
- // arr
- // .map(x => x + 1)
- // .filter(x => x > 10)
- // .some(x => x % 2)
- //
- // The way it is structured in the AST is via a nested sequence of
- // MemberExpression and CallExpression. We need to traverse the AST
- // and make groups out of it to print it in the desired way.
- function printMemberChain(path$$1, options, print) {
- // The first phase is to linearize the AST by traversing it down.
- //
- // a().b()
- // has the following AST structure:
- // CallExpression(MemberExpression(CallExpression(Identifier)))
- // and we transform it into
- // [Identifier, CallExpression, MemberExpression, CallExpression]
- const printedNodes = [];
- // Here we try to retain one typed empty line after each call expression or
- // the first group whether it is in parentheses or not
- function shouldInsertEmptyLineAfter(node) {
- const originalText = options.originalText;
- const nextCharIndex = utilShared.getNextNonSpaceNonCommentCharacterIndex(
- originalText,
- node,
- options
- );
- const nextChar = originalText.charAt(nextCharIndex);
- // if it is cut off by a parenthesis, we only account for one typed empty
- // line after that parenthesis
- if (nextChar == ")") {
- return utilShared.isNextLineEmptyAfterIndex(
- originalText,
- nextCharIndex + 1,
- options
- );
- }
- return utilShared.isNextLineEmpty(originalText, node, options);
- }
- function rec(path$$1) {
- const node = path$$1.getValue();
- if (
- node.type === "CallExpression" &&
- (isMemberish(node.callee) || node.callee.type === "CallExpression")
- ) {
- printedNodes.unshift({
- node: node,
- printed: concat([
- comments.printComments(
- path$$1,
- () =>
- concat([
- printOptionalToken(path$$1),
- printFunctionTypeParameters(path$$1, options, print),
- printArgumentsList(path$$1, options, print)
- ]),
- options
- ),
- shouldInsertEmptyLineAfter(node) ? hardline : ""
- ])
- });
- path$$1.call(callee => rec(callee), "callee");
- } else if (isMemberish(node)) {
- printedNodes.unshift({
- node: node,
- printed: comments.printComments(
- path$$1,
- () =>
- node.type === "MemberExpression"
- ? printMemberLookup(path$$1, options, print)
- : printBindExpressionCallee(path$$1, options, print),
- options
- )
- });
- path$$1.call(object => rec(object), "object");
- } else if (node.type === "TSNonNullExpression") {
- printedNodes.unshift({
- node: node,
- printed: comments.printComments(path$$1, () => "!", options)
- });
- path$$1.call(expression => rec(expression), "expression");
- } else {
- printedNodes.unshift({
- node: node,
- printed: path$$1.call(print)
- });
- }
- }
- // Note: the comments of the root node have already been printed, so we
- // need to extract this first call without printing them as they would
- // if handled inside of the recursive call.
- const node = path$$1.getValue();
- printedNodes.unshift({
- node,
- printed: concat([
- printOptionalToken(path$$1),
- printFunctionTypeParameters(path$$1, options, print),
- printArgumentsList(path$$1, options, print)
- ])
- });
- path$$1.call(callee => rec(callee), "callee");
- // Once we have a linear list of printed nodes, we want to create groups out
- // of it.
- //
- // a().b.c().d().e
- // will be grouped as
- // [
- // [Identifier, CallExpression],
- // [MemberExpression, MemberExpression, CallExpression],
- // [MemberExpression, CallExpression],
- // [MemberExpression],
- // ]
- // so that we can print it as
- // a()
- // .b.c()
- // .d()
- // .e
- // The first group is the first node followed by
- // - as many CallExpression as possible
- // < fn()()() >.something()
- // - as many array acessors as possible
- // < fn()[0][1][2] >.something()
- // - then, as many MemberExpression as possible but the last one
- // < this.items >.something()
- const groups = [];
- let currentGroup = [printedNodes[0]];
- let i = 1;
- for (; i < printedNodes.length; ++i) {
- if (
- printedNodes[i].node.type === "TSNonNullExpression" ||
- printedNodes[i].node.type === "CallExpression" ||
- (printedNodes[i].node.type === "MemberExpression" &&
- printedNodes[i].node.computed &&
- isNumericLiteral(printedNodes[i].node.property))
- ) {
- currentGroup.push(printedNodes[i]);
- } else {
- break;
- }
- }
- if (printedNodes[0].node.type !== "CallExpression") {
- for (; i + 1 < printedNodes.length; ++i) {
- if (
- isMemberish(printedNodes[i].node) &&
- isMemberish(printedNodes[i + 1].node)
- ) {
- currentGroup.push(printedNodes[i]);
- } else {
- break;
- }
- }
- }
- groups.push(currentGroup);
- currentGroup = [];
- // Then, each following group is a sequence of MemberExpression followed by
- // a sequence of CallExpression. To compute it, we keep adding things to the
- // group until we has seen a CallExpression in the past and reach a
- // MemberExpression
- let hasSeenCallExpression = false;
- for (; i < printedNodes.length; ++i) {
- if (hasSeenCallExpression && isMemberish(printedNodes[i].node)) {
- // [0] should be appended at the end of the group instead of the
- // beginning of the next one
- if (
- printedNodes[i].node.computed &&
- isNumericLiteral(printedNodes[i].node.property)
- ) {
- currentGroup.push(printedNodes[i]);
- continue;
- }
- groups.push(currentGroup);
- currentGroup = [];
- hasSeenCallExpression = false;
- }
- if (printedNodes[i].node.type === "CallExpression") {
- hasSeenCallExpression = true;
- }
- currentGroup.push(printedNodes[i]);
- if (
- printedNodes[i].node.comments &&
- printedNodes[i].node.comments.some(comment => comment.trailing)
- ) {
- groups.push(currentGroup);
- currentGroup = [];
- hasSeenCallExpression = false;
- }
- }
- if (currentGroup.length > 0) {
- groups.push(currentGroup);
- }
- // There are cases like Object.keys(), Observable.of(), _.values() where
- // they are the subject of all the chained calls and therefore should
- // be kept on the same line:
- //
- // Object.keys(items)
- // .filter(x => x)
- // .map(x => x)
- //
- // In order to detect those cases, we use an heuristic: if the first
- // node is just an identifier with the name starting with a capital
- // letter, just a sequence of _$ or this. The rationale is that they are
- // likely to be factories.
- function isFactory(name) {
- return name.match(/(^[A-Z])|^[_$]+$/);
- }
- const shouldMerge =
- groups.length >= 2 &&
- !groups[1][0].node.comments &&
- ((groups[0].length === 1 &&
- (groups[0][0].node.type === "ThisExpression" ||
- (groups[0][0].node.type === "Identifier" &&
- (isFactory(groups[0][0].node.name) ||
- (groups[1].length && groups[1][0].node.computed))))) ||
- (groups[0].length > 1 &&
- groups[0][groups[0].length - 1].node.type === "MemberExpression" &&
- groups[0][groups[0].length - 1].node.property.type === "Identifier" &&
- (isFactory(groups[0][groups[0].length - 1].node.property.name) ||
- (groups[1].length && groups[1][0].node.computed))));
- function printGroup(printedGroup) {
- return concat(printedGroup.map(tuple => tuple.printed));
- }
- function printIndentedGroup(groups) {
- if (groups.length === 0) {
- return "";
- }
- return indent(
- group(concat([hardline, join(hardline, groups.map(printGroup))]))
- );
- }
- const printedGroups = groups.map(printGroup);
- const oneLine = concat(printedGroups);
- const cutoff = shouldMerge ? 3 : 2;
- const flatGroups = groups
- .slice(0, cutoff)
- .reduce((res, group) => res.concat(group), []);
- const hasComment =
- flatGroups.slice(1, -1).some(node => hasLeadingComment(node.node)) ||
- flatGroups.slice(0, -1).some(node => hasTrailingComment(node.node)) ||
- (groups[cutoff] && hasLeadingComment(groups[cutoff][0].node));
- // If we only have a single `.`, we shouldn't do anything fancy and just
- // render everything concatenated together.
- if (groups.length <= cutoff && !hasComment) {
- return group(oneLine);
- }
- // Find out the last node in the first group and check if it has an
- // empty line after
- const lastNodeBeforeIndent = util$1.getLast(
- shouldMerge ? groups.slice(1, 2)[0] : groups[0]
- ).node;
- const shouldHaveEmptyLineBeforeIndent =
- lastNodeBeforeIndent.type !== "CallExpression" &&
- shouldInsertEmptyLineAfter(lastNodeBeforeIndent);
- const expanded = concat([
- printGroup(groups[0]),
- shouldMerge ? concat(groups.slice(1, 2).map(printGroup)) : "",
- shouldHaveEmptyLineBeforeIndent ? hardline : "",
- printIndentedGroup(groups.slice(shouldMerge ? 2 : 1))
- ]);
- const callExpressionCount = printedNodes.filter(
- tuple => tuple.node.type === "CallExpression"
- ).length;
- // We don't want to print in one line if there's:
- // * A comment.
- // * 3 or more chained calls.
- // * Any group but the last one has a hard line.
- // If the last group is a function it's okay to inline if it fits.
- if (
- hasComment ||
- callExpressionCount >= 3 ||
- printedGroups.slice(0, -1).some(willBreak$1)
- ) {
- return group(expanded);
- }
- return concat([
- // We only need to check `oneLine` because if `expanded` is chosen
- // that means that the parent group has already been broken
- // naturally
- willBreak$1(oneLine) || shouldHaveEmptyLineBeforeIndent ? breakParent : "",
- conditionalGroup([oneLine, expanded])
- ]);
- }
- function isJSXNode(node) {
- return (
- node.type === "JSXElement" ||
- node.type === "JSXFragment" ||
- node.type === "TSJsxFragment"
- );
- }
- function isEmptyJSXElement(node) {
- if (node.children.length === 0) {
- return true;
- }
- if (node.children.length > 1) {
- return false;
- }
- // if there is one text child and does not contain any meaningful text
- // we can treat the element as empty.
- const child = node.children[0];
- return isLiteral(child) && !isMeaningfulJSXText(child);
- }
- // Only space, newline, carriage return, and tab are treated as whitespace
- // inside JSX.
- const jsxWhitespaceChars = " \n\r\t";
- const containsNonJsxWhitespaceRegex = new RegExp(
- "[^" + jsxWhitespaceChars + "]"
- );
- const matchJsxWhitespaceRegex = new RegExp("([" + jsxWhitespaceChars + "]+)");
- // Meaningful if it contains non-whitespace characters,
- // or it contains whitespace without a new line.
- function isMeaningfulJSXText(node) {
- return (
- isLiteral(node) &&
- (containsNonJsxWhitespaceRegex.test(rawText(node)) ||
- !/\n/.test(rawText(node)))
- );
- }
- function conditionalExpressionChainContainsJSX(node) {
- return Boolean(getConditionalChainContents(node).find(isJSXNode));
- }
- // If we have nested conditional expressions, we want to print them in JSX mode
- // if there's at least one JSXElement somewhere in the tree.
- //
- // A conditional expression chain like this should be printed in normal mode,
- // because there aren't JSXElements anywhere in it:
- //
- // isA ? "A" : isB ? "B" : isC ? "C" : "Unknown";
- //
- // But a conditional expression chain like this should be printed in JSX mode,
- // because there is a JSXElement in the last ConditionalExpression:
- //
- // isA ? "A" : isB ? "B" : isC ? "C" : <span className="warning">Unknown</span>;
- //
- // This type of ConditionalExpression chain is structured like this in the AST:
- //
- // ConditionalExpression {
- // test: ...,
- // consequent: ...,
- // alternate: ConditionalExpression {
- // test: ...,
- // consequent: ...,
- // alternate: ConditionalExpression {
- // test: ...,
- // consequent: ...,
- // alternate: ...,
- // }
- // }
- // }
- //
- // We want to traverse over that shape and convert it into a flat structure so
- // that we can find if there's a JSXElement somewhere inside.
- function getConditionalChainContents(node) {
- // Given this code:
- //
- // // Using a ConditionalExpression as the consequent is uncommon, but should
- // // be handled.
- // A ? B : C ? D : E ? F ? G : H : I
- //
- // which has this AST:
- //
- // ConditionalExpression {
- // test: Identifier(A),
- // consequent: Identifier(B),
- // alternate: ConditionalExpression {
- // test: Identifier(C),
- // consequent: Identifier(D),
- // alternate: ConditionalExpression {
- // test: Identifier(E),
- // consequent: ConditionalExpression {
- // test: Identifier(F),
- // consequent: Identifier(G),
- // alternate: Identifier(H),
- // },
- // alternate: Identifier(I),
- // }
- // }
- // }
- //
- // we should return this Array:
- //
- // [
- // Identifier(A),
- // Identifier(B),
- // Identifier(C),
- // Identifier(D),
- // Identifier(E),
- // Identifier(F),
- // Identifier(G),
- // Identifier(H),
- // Identifier(I)
- // ];
- //
- // This loses the information about whether each node was the test,
- // consequent, or alternate, but we don't care about that here- we are only
- // flattening this structure to find if there's any JSXElements inside.
- const nonConditionalExpressions = [];
- function recurse(node) {
- if (node.type === "ConditionalExpression") {
- recurse(node.test);
- recurse(node.consequent);
- recurse(node.alternate);
- } else {
- nonConditionalExpressions.push(node);
- }
- }
- recurse(node);
- return nonConditionalExpressions;
- }
- // Detect an expression node representing `{" "}`
- function isJSXWhitespaceExpression(node) {
- return (
- node.type === "JSXExpressionContainer" &&
- isLiteral(node.expression) &&
- node.expression.value === " " &&
- !node.expression.comments
- );
- }
- // JSX Children are strange, mostly for two reasons:
- // 1. JSX reads newlines into string values, instead of skipping them like JS
- // 2. up to one whitespace between elements within a line is significant,
- // but not between lines.
- //
- // Leading, trailing, and lone whitespace all need to
- // turn themselves into the rather ugly `{' '}` when breaking.
- //
- // We print JSX using the `fill` doc primitive.
- // This requires that we give it an array of alternating
- // content and whitespace elements.
- // To ensure this we add dummy `""` content elements as needed.
- function printJSXChildren(path$$1, options, print, jsxWhitespace) {
- const n = path$$1.getValue();
- const children = [];
- // using `map` instead of `each` because it provides `i`
- path$$1.map((childPath, i) => {
- const child = childPath.getValue();
- if (isLiteral(child)) {
- const text = rawText(child);
- // Contains a non-whitespace character
- if (isMeaningfulJSXText(child)) {
- const words = text.split(matchJsxWhitespaceRegex);
- // Starts with whitespace
- if (words[0] === "") {
- children.push("");
- words.shift();
- if (/\n/.test(words[0])) {
- children.push(hardline);
- } else {
- children.push(jsxWhitespace);
- }
- words.shift();
- }
- let endWhitespace;
- // Ends with whitespace
- if (util$1.getLast(words) === "") {
- words.pop();
- endWhitespace = words.pop();
- }
- // This was whitespace only without a new line.
- if (words.length === 0) {
- return;
- }
- words.forEach((word, i) => {
- if (i % 2 === 1) {
- children.push(line);
- } else {
- children.push(word);
- }
- });
- if (endWhitespace !== undefined) {
- if (/\n/.test(endWhitespace)) {
- children.push(hardline);
- } else {
- children.push(jsxWhitespace);
- }
- } else {
- // Ideally this would be a `hardline` to allow a break between
- // tags and text.
- // Unfortunately Facebook have a custom translation pipeline
- // (https://github.com/prettier/prettier/issues/1581#issuecomment-300975032)
- // that uses the JSX syntax, but does not follow the React whitespace
- // rules.
- // Ensuring that we never have a break between tags and text in JSX
- // will allow Facebook to adopt Prettier without too much of an
- // adverse effect on formatting algorithm.
- children.push("");
- }
- } else if (/\n/.test(text)) {
- // Keep (up to one) blank line between tags/expressions/text.
- // Note: We don't keep blank lines between text elements.
- if (text.match(/\n/g).length > 1) {
- children.push("");
- children.push(hardline);
- }
- } else {
- children.push("");
- children.push(jsxWhitespace);
- }
- } else {
- const printedChild = print(childPath);
- children.push(printedChild);
- const next = n.children[i + 1];
- const directlyFollowedByMeaningfulText =
- next && isMeaningfulJSXText(next) && !/^[ \n\r\t]/.test(rawText(next));
- if (directlyFollowedByMeaningfulText) {
- // Potentially this could be a hardline as well.
- // See the comment above about the Facebook translation pipeline as
- // to why this is an empty string.
- children.push("");
- } else {
- children.push(hardline);
- }
- }
- }, "children");
- return children;
- }
- // JSX expands children from the inside-out, instead of the outside-in.
- // This is both to break children before attributes,
- // and to ensure that when children break, their parents do as well.
- //
- // Any element that is written without any newlines and fits on a single line
- // is left that way.
- // Not only that, any user-written-line containing multiple JSX siblings
- // should also be kept on one line if possible,
- // so each user-written-line is wrapped in its own group.
- //
- // Elements that contain newlines or don't fit on a single line (recursively)
- // are fully-split, using hardline and shouldBreak: true.
- //
- // To support that case properly, all leading and trailing spaces
- // are stripped from the list of children, and replaced with a single hardline.
- function printJSXElement(path$$1, options, print) {
- const n = path$$1.getValue();
- // Turn <div></div> into <div />
- if (n.type === "JSXElement" && isEmptyJSXElement(n)) {
- n.openingElement.selfClosing = true;
- return path$$1.call(print, "openingElement");
- }
- const openingLines =
- n.type === "JSXElement"
- ? path$$1.call(print, "openingElement")
- : path$$1.call(print, "openingFragment");
- const closingLines =
- n.type === "JSXElement"
- ? path$$1.call(print, "closingElement")
- : path$$1.call(print, "closingFragment");
- if (
- n.children.length === 1 &&
- n.children[0].type === "JSXExpressionContainer" &&
- (n.children[0].expression.type === "TemplateLiteral" ||
- n.children[0].expression.type === "TaggedTemplateExpression")
- ) {
- return concat([
- openingLines,
- concat(path$$1.map(print, "children")),
- closingLines
- ]);
- }
- // Convert `{" "}` to text nodes containing a space.
- // This makes it easy to turn them into `jsxWhitespace` which
- // can then print as either a space or `{" "}` when breaking.
- n.children = n.children.map(child => {
- if (isJSXWhitespaceExpression(child)) {
- return {
- type: "JSXText",
- value: " ",
- raw: " "
- };
- }
- return child;
- });
- const containsTag = n.children.filter(isJSXNode).length > 0;
- const containsMultipleExpressions =
- n.children.filter(child => child.type === "JSXExpressionContainer").length >
- 1;
- const containsMultipleAttributes =
- n.type === "JSXElement" && n.openingElement.attributes.length > 1;
- // Record any breaks. Should never go from true to false, only false to true.
- let forcedBreak =
- willBreak$1(openingLines) ||
- containsTag ||
- containsMultipleAttributes ||
- containsMultipleExpressions;
- const rawJsxWhitespace = options.singleQuote ? "{' '}" : '{" "}';
- const jsxWhitespace = ifBreak(concat([rawJsxWhitespace, softline]), " ");
- const children = printJSXChildren(path$$1, options, print, jsxWhitespace);
- const containsText =
- n.children.filter(child => isMeaningfulJSXText(child)).length > 0;
- // We can end up we multiple whitespace elements with empty string
- // content between them.
- // We need to remove empty whitespace and softlines before JSX whitespace
- // to get the correct output.
- for (let i = children.length - 2; i >= 0; i--) {
- const isPairOfEmptyStrings = children[i] === "" && children[i + 1] === "";
- const isPairOfHardlines =
- children[i] === hardline &&
- children[i + 1] === "" &&
- children[i + 2] === hardline;
- const isLineFollowedByJSXWhitespace =
- (children[i] === softline || children[i] === hardline) &&
- children[i + 1] === "" &&
- children[i + 2] === jsxWhitespace;
- const isJSXWhitespaceFollowedByLine =
- children[i] === jsxWhitespace &&
- children[i + 1] === "" &&
- (children[i + 2] === softline || children[i + 2] === hardline);
- const isDoubleJSXWhitespace =
- children[i] === jsxWhitespace &&
- children[i + 1] === "" &&
- children[i + 2] === jsxWhitespace;
- if (
- (isPairOfHardlines && containsText) ||
- isPairOfEmptyStrings ||
- isLineFollowedByJSXWhitespace ||
- isDoubleJSXWhitespace
- ) {
- children.splice(i, 2);
- } else if (isJSXWhitespaceFollowedByLine) {
- children.splice(i + 1, 2);
- }
- }
- // Trim trailing lines (or empty strings)
- while (
- children.length &&
- (isLineNext$1(util$1.getLast(children)) ||
- isEmpty$1(util$1.getLast(children)))
- ) {
- children.pop();
- }
- // Trim leading lines (or empty strings)
- while (
- children.length &&
- (isLineNext$1(children[0]) || isEmpty$1(children[0])) &&
- (isLineNext$1(children[1]) || isEmpty$1(children[1]))
- ) {
- children.shift();
- children.shift();
- }
- // Tweak how we format children if outputting this element over multiple lines.
- // Also detect whether we will force this element to output over multiple lines.
- const multilineChildren = [];
- children.forEach((child, i) => {
- // There are a number of situations where we need to ensure we display
- // whitespace as `{" "}` when outputting this element over multiple lines.
- if (child === jsxWhitespace) {
- if (i === 1 && children[i - 1] === "") {
- if (children.length === 2) {
- // Solitary whitespace
- multilineChildren.push(rawJsxWhitespace);
- return;
- }
- // Leading whitespace
- multilineChildren.push(concat([rawJsxWhitespace, hardline]));
- return;
- } else if (i === children.length - 1) {
- // Trailing whitespace
- multilineChildren.push(rawJsxWhitespace);
- return;
- } else if (children[i - 1] === "" && children[i - 2] === hardline) {
- // Whitespace after line break
- multilineChildren.push(rawJsxWhitespace);
- return;
- }
- }
- multilineChildren.push(child);
- if (willBreak$1(child)) {
- forcedBreak = true;
- }
- });
- // If there is text we use `fill` to fit as much onto each line as possible.
- // When there is no text (just tags and expressions) we use `group`
- // to output each on a separate line.
- const content = containsText
- ? fill(multilineChildren)
- : group(concat(multilineChildren), { shouldBreak: true });
- const multiLineElem = group(
- concat([
- openingLines,
- indent(concat([hardline, content])),
- hardline,
- closingLines
- ])
- );
- if (forcedBreak) {
- return multiLineElem;
- }
- return conditionalGroup([
- group(concat([openingLines, concat(children), closingLines])),
- multiLineElem
- ]);
- }
- function maybeWrapJSXElementInParens(path$$1, elem) {
- const parent = path$$1.getParentNode();
- if (!parent) {
- return elem;
- }
- const NO_WRAP_PARENTS = {
- ArrayExpression: true,
- JSXAttribute: true,
- JSXElement: true,
- JSXExpressionContainer: true,
- JSXFragment: true,
- TSJsxFragment: true,
- ExpressionStatement: true,
- CallExpression: true,
- ConditionalExpression: true
- };
- if (NO_WRAP_PARENTS[parent.type]) {
- return elem;
- }
- return group(
- concat([
- ifBreak("("),
- indent(concat([softline, elem])),
- softline,
- ifBreak(")")
- ])
- );
- }
- function isBinaryish(node) {
- return node.type === "BinaryExpression" || node.type === "LogicalExpression";
- }
- function isMemberish(node) {
- return (
- node.type === "MemberExpression" ||
- (node.type === "BindExpression" && node.object)
- );
- }
- function shouldInlineLogicalExpression(node) {
- if (node.type !== "LogicalExpression") {
- return false;
- }
- if (
- node.right.type === "ObjectExpression" &&
- node.right.properties.length !== 0
- ) {
- return true;
- }
- if (
- node.right.type === "ArrayExpression" &&
- node.right.elements.length !== 0
- ) {
- return true;
- }
- if (isJSXNode(node.right)) {
- return true;
- }
- return false;
- }
- // For binary expressions to be consistent, we need to group
- // subsequent operators with the same precedence level under a single
- // group. Otherwise they will be nested such that some of them break
- // onto new lines but not all. Operators with the same precedence
- // level should either all break or not. Because we group them by
- // precedence level and the AST is structured based on precedence
- // level, things are naturally broken up correctly, i.e. `&&` is
- // broken before `+`.
- function printBinaryishExpressions(
- path$$1,
- print,
- options,
- isNested,
- isInsideParenthesis
- ) {
- let parts = [];
- const node = path$$1.getValue();
- // We treat BinaryExpression and LogicalExpression nodes the same.
- if (isBinaryish(node)) {
- // Put all operators with the same precedence level in the same
- // group. The reason we only need to do this with the `left`
- // expression is because given an expression like `1 + 2 - 3`, it
- // is always parsed like `((1 + 2) - 3)`, meaning the `left` side
- // is where the rest of the expression will exist. Binary
- // expressions on the right side mean they have a difference
- // precedence level and should be treated as a separate group, so
- // print them normally. (This doesn't hold for the `**` operator,
- // which is unique in that it is right-associative.)
- if (util$1.shouldFlatten(node.operator, node.left.operator)) {
- // Flatten them out by recursively calling this function.
- parts = parts.concat(
- path$$1.call(
- left =>
- printBinaryishExpressions(
- left,
- print,
- options,
- /* isNested */ true,
- isInsideParenthesis
- ),
- "left"
- )
- );
- } else {
- parts.push(path$$1.call(print, "left"));
- }
- const shouldInline = shouldInlineLogicalExpression(node);
- const lineBeforeOperator = node.operator === "|>";
- const right = shouldInline
- ? concat([node.operator, " ", path$$1.call(print, "right")])
- : concat([
- lineBeforeOperator ? softline : "",
- node.operator,
- lineBeforeOperator ? " " : line,
- path$$1.call(print, "right")
- ]);
- // If there's only a single binary expression, we want to create a group
- // in order to avoid having a small right part like -1 be on its own line.
- const parent = path$$1.getParentNode();
- const shouldGroup =
- !(isInsideParenthesis && node.type === "LogicalExpression") &&
- parent.type !== node.type &&
- node.left.type !== node.type &&
- node.right.type !== node.type;
- parts.push(" ", shouldGroup ? group(right) : right);
- // The root comments are already printed, but we need to manually print
- // the other ones since we don't call the normal print on BinaryExpression,
- // only for the left and right parts
- if (isNested && node.comments) {
- parts = comments.printComments(path$$1, () => concat(parts), options);
- }
- } else {
- // Our stopping case. Simply print the node normally.
- parts.push(path$$1.call(print));
- }
- return parts;
- }
- function printAssignmentRight(rightNode, printedRight, canBreak, options) {
- if (hasLeadingOwnLineComment(options.originalText, rightNode, options)) {
- return indent(concat([hardline, printedRight]));
- }
- if (canBreak) {
- return indent(concat([line, printedRight]));
- }
- return concat([" ", printedRight]);
- }
- function printAssignment(
- leftNode,
- printedLeft,
- operator,
- rightNode,
- printedRight,
- options
- ) {
- if (!rightNode) {
- return printedLeft;
- }
- const canBreak =
- (isBinaryish(rightNode) && !shouldInlineLogicalExpression(rightNode)) ||
- (rightNode.type === "ConditionalExpression" &&
- isBinaryish(rightNode.test) &&
- !shouldInlineLogicalExpression(rightNode.test)) ||
- ((leftNode.type === "Identifier" ||
- isStringLiteral(leftNode) ||
- leftNode.type === "MemberExpression") &&
- (isStringLiteral(rightNode) || isMemberExpressionChain(rightNode)));
- const printed = printAssignmentRight(
- rightNode,
- printedRight,
- canBreak,
- options
- );
- return group(concat([printedLeft, operator, printed]));
- }
- function adjustClause(node, clause, forceSpace) {
- if (node.type === "EmptyStatement") {
- return ";";
- }
- if (node.type === "BlockStatement" || forceSpace) {
- return concat([" ", clause]);
- }
- return indent(concat([line, clause]));
- }
- function nodeStr(node, options, isFlowOrTypeScriptDirectiveLiteral) {
- const raw = rawText(node);
- const isDirectiveLiteral =
- isFlowOrTypeScriptDirectiveLiteral || node.type === "DirectiveLiteral";
- return util$1.printString(raw, options, isDirectiveLiteral);
- }
- function printRegex(node) {
- const flags = node.flags
- .split("")
- .sort()
- .join("");
- return `/${node.pattern}/${flags}`;
- }
- function isLastStatement(path$$1) {
- const parent = path$$1.getParentNode();
- if (!parent) {
- return true;
- }
- const node = path$$1.getValue();
- const body = (parent.body || parent.consequent).filter(
- stmt => stmt.type !== "EmptyStatement"
- );
- return body && body[body.length - 1] === node;
- }
- function hasLeadingComment(node) {
- return node.comments && node.comments.some(comment => comment.leading);
- }
- function hasTrailingComment(node) {
- return node.comments && node.comments.some(comment => comment.trailing);
- }
- function hasLeadingOwnLineComment(text, node, options) {
- if (isJSXNode(node)) {
- return util$1.hasNodeIgnoreComment(node);
- }
- const res =
- node.comments &&
- node.comments.some(
- comment =>
- comment.leading && util$1.hasNewline(text, options.locEnd(comment))
- );
- return res;
- }
- function hasNakedLeftSide(node) {
- return (
- node.type === "AssignmentExpression" ||
- node.type === "BinaryExpression" ||
- node.type === "LogicalExpression" ||
- node.type === "ConditionalExpression" ||
- node.type === "CallExpression" ||
- node.type === "MemberExpression" ||
- node.type === "SequenceExpression" ||
- node.type === "TaggedTemplateExpression" ||
- (node.type === "BindExpression" && !node.object) ||
- (node.type === "UpdateExpression" && !node.prefix)
- );
- }
- function isFlowAnnotationComment(text, typeAnnotation, options) {
- const start = options.locStart(typeAnnotation);
- const end = util$1.skipWhitespace(text, options.locEnd(typeAnnotation));
- return text.substr(start, 2) === "/*" && text.substr(end, 2) === "*/";
- }
- function getLeftSide(node) {
- if (node.expressions) {
- return node.expressions[0];
- }
- return (
- node.left ||
- node.test ||
- node.callee ||
- node.object ||
- node.tag ||
- node.argument ||
- node.expression
- );
- }
- function getLeftSidePathName(path$$1, node) {
- if (node.expressions) {
- return ["expressions", 0];
- }
- if (node.left) {
- return ["left"];
- }
- if (node.test) {
- return ["test"];
- }
- if (node.callee) {
- return ["callee"];
- }
- if (node.object) {
- return ["object"];
- }
- if (node.tag) {
- return ["tag"];
- }
- if (node.argument) {
- return ["argument"];
- }
- if (node.expression) {
- return ["expression"];
- }
- throw new Error("Unexpected node has no left side", node);
- }
- function exprNeedsASIProtection(path$$1, options) {
- const node = path$$1.getValue();
- const maybeASIProblem =
- needsParens_1(path$$1, options) ||
- node.type === "ParenthesizedExpression" ||
- node.type === "TypeCastExpression" ||
- (node.type === "ArrowFunctionExpression" &&
- !shouldPrintParamsWithoutParens(path$$1, options)) ||
- node.type === "ArrayExpression" ||
- node.type === "ArrayPattern" ||
- (node.type === "UnaryExpression" &&
- node.prefix &&
- (node.operator === "+" || node.operator === "-")) ||
- node.type === "TemplateLiteral" ||
- node.type === "TemplateElement" ||
- isJSXNode(node) ||
- node.type === "BindExpression" ||
- node.type === "RegExpLiteral" ||
- (node.type === "Literal" && node.pattern) ||
- (node.type === "Literal" && node.regex);
- if (maybeASIProblem) {
- return true;
- }
- if (!hasNakedLeftSide(node)) {
- return false;
- }
- return path$$1.call.apply(
- path$$1,
- [childPath => exprNeedsASIProtection(childPath, options)].concat(
- getLeftSidePathName(path$$1, node)
- )
- );
- }
- function stmtNeedsASIProtection(path$$1, options) {
- const node = path$$1.getNode();
- if (node.type !== "ExpressionStatement") {
- return false;
- }
- return path$$1.call(
- childPath => exprNeedsASIProtection(childPath, options),
- "expression"
- );
- }
- function classPropMayCauseASIProblems(path$$1) {
- const node = path$$1.getNode();
- if (node.type !== "ClassProperty") {
- return false;
- }
- const name = node.key && node.key.name;
- // this isn't actually possible yet with most parsers available today
- // so isn't properly tested yet.
- if (
- (name === "static" || name === "get" || name === "set") &&
- !node.value &&
- !node.typeAnnotation
- ) {
- return true;
- }
- }
- function classChildNeedsASIProtection(node) {
- if (!node) {
- return;
- }
- if (!node.computed) {
- const name = node.key && node.key.name;
- if (name === "in" || name === "instanceof") {
- return true;
- }
- }
- switch (node.type) {
- case "ClassProperty":
- case "TSAbstractClassProperty":
- return node.computed;
- case "MethodDefinition": // Flow
- case "TSAbstractMethodDefinition": // TypeScript
- case "ClassMethod": {
- // Babylon
- const isAsync = node.value ? node.value.async : node.async;
- const isGenerator = node.value ? node.value.generator : node.generator;
- if (
- isAsync ||
- node.static ||
- node.kind === "get" ||
- node.kind === "set"
- ) {
- return false;
- }
- if (node.computed || isGenerator) {
- return true;
- }
- return false;
- }
- default:
- /* istanbul ignore next */
- return false;
- }
- }
- // This recurses the return argument, looking for the first token
- // (the leftmost leaf node) and, if it (or its parents) has any
- // leadingComments, returns true (so it can be wrapped in parens).
- function returnArgumentHasLeadingComment(options, argument) {
- if (hasLeadingOwnLineComment(options.originalText, argument, options)) {
- return true;
- }
- if (hasNakedLeftSide(argument)) {
- let leftMost = argument;
- let newLeftMost;
- while ((newLeftMost = getLeftSide(leftMost))) {
- leftMost = newLeftMost;
- if (hasLeadingOwnLineComment(options.originalText, leftMost, options)) {
- return true;
- }
- }
- }
- return false;
- }
- function isMemberExpressionChain(node) {
- if (node.type !== "MemberExpression") {
- return false;
- }
- if (node.object.type === "Identifier") {
- return true;
- }
- return isMemberExpressionChain(node.object);
- }
- // Hack to differentiate between the following two which have the same ast
- // type T = { method: () => void };
- // type T = { method(): void };
- function isObjectTypePropertyAFunction(node, options) {
- return (
- node.type === "ObjectTypeProperty" &&
- node.value.type === "FunctionTypeAnnotation" &&
- !node.static &&
- !isFunctionNotation(node, options)
- );
- }
- // TODO: This is a bad hack and we need a better way to distinguish between
- // arrow functions and otherwise
- function isFunctionNotation(node, options) {
- return isGetterOrSetter(node) || sameLocStart(node, node.value, options);
- }
- function isGetterOrSetter(node) {
- return node.kind === "get" || node.kind === "set";
- }
- function sameLocStart(nodeA, nodeB, options) {
- return options.locStart(nodeA) === options.locStart(nodeB);
- }
- // Hack to differentiate between the following two which have the same ast
- // declare function f(a): void;
- // var f: (a) => void;
- function isTypeAnnotationAFunction(node, options) {
- return (
- (node.type === "TypeAnnotation" || node.type === "TSTypeAnnotation") &&
- node.typeAnnotation.type === "FunctionTypeAnnotation" &&
- !node.static &&
- !sameLocStart(node, node.typeAnnotation, options)
- );
- }
- function isNodeStartingWithDeclare(node, options) {
- if (!(options.parser === "flow" || options.parser === "typescript")) {
- return false;
- }
- return (
- options.originalText
- .slice(0, options.locStart(node))
- .match(/declare[ \t]*$/) ||
- options.originalText
- .slice(node.range[0], node.range[1])
- .startsWith("declare ")
- );
- }
- function shouldHugType(node) {
- if (isObjectType(node)) {
- return true;
- }
- if (node.type === "UnionTypeAnnotation" || node.type === "TSUnionType") {
- const voidCount = node.types.filter(
- n =>
- n.type === "VoidTypeAnnotation" ||
- n.type === "TSVoidKeyword" ||
- n.type === "NullLiteralTypeAnnotation" ||
- n.type === "TSNullKeyword"
- ).length;
- const objectCount = node.types.filter(
- n =>
- n.type === "ObjectTypeAnnotation" ||
- n.type === "TSTypeLiteral" ||
- // This is a bit aggressive but captures Array<{x}>
- n.type === "GenericTypeAnnotation" ||
- n.type === "TSTypeReference"
- ).length;
- if (node.types.length - 1 === voidCount && objectCount > 0) {
- return true;
- }
- }
- return false;
- }
- function shouldHugArguments(fun) {
- return (
- fun &&
- fun.params &&
- fun.params.length === 1 &&
- !fun.params[0].comments &&
- (fun.params[0].type === "ObjectPattern" ||
- fun.params[0].type === "ArrayPattern" ||
- (fun.params[0].type === "Identifier" &&
- fun.params[0].typeAnnotation &&
- (fun.params[0].typeAnnotation.type === "TypeAnnotation" ||
- fun.params[0].typeAnnotation.type === "TSTypeAnnotation") &&
- isObjectType(fun.params[0].typeAnnotation.typeAnnotation)) ||
- (fun.params[0].type === "FunctionTypeParam" &&
- isObjectType(fun.params[0].typeAnnotation)) ||
- (fun.params[0].type === "AssignmentPattern" &&
- (fun.params[0].left.type === "ObjectPattern" ||
- fun.params[0].left.type === "ArrayPattern") &&
- (fun.params[0].right.type === "Identifier" ||
- (fun.params[0].right.type === "ObjectExpression" &&
- fun.params[0].right.properties.length === 0) ||
- (fun.params[0].right.type === "ArrayExpression" &&
- fun.params[0].right.elements.length === 0)))) &&
- !fun.rest
- );
- }
- function templateLiteralHasNewLines(template) {
- return template.quasis.some(quasi => quasi.value.raw.includes("\n"));
- }
- function isTemplateOnItsOwnLine(n, text, options) {
- return (
- ((n.type === "TemplateLiteral" && templateLiteralHasNewLines(n)) ||
- (n.type === "TaggedTemplateExpression" &&
- templateLiteralHasNewLines(n.quasi))) &&
- !util$1.hasNewline(text, options.locStart(n), { backwards: true })
- );
- }
- function printArrayItems(path$$1, options, printPath, print) {
- const printedElements = [];
- let separatorParts = [];
- path$$1.each(childPath => {
- printedElements.push(concat(separatorParts));
- printedElements.push(group(print(childPath)));
- separatorParts = [",", line];
- if (
- childPath.getValue() &&
- utilShared.isNextLineEmpty(
- options.originalText,
- childPath.getValue(),
- options
- )
- ) {
- separatorParts.push(softline);
- }
- }, printPath);
- return concat(printedElements);
- }
- function hasDanglingComments(node) {
- return (
- node.comments &&
- node.comments.some(comment => !comment.leading && !comment.trailing)
- );
- }
- function needsHardlineAfterDanglingComment(node) {
- if (!node.comments) {
- return false;
- }
- const lastDanglingComment = util$1.getLast(
- node.comments.filter(comment => !comment.leading && !comment.trailing)
- );
- return (
- lastDanglingComment && !util$1.isBlockComment(lastDanglingComment)
- );
- }
- function isLiteral(node) {
- return (
- node.type === "BooleanLiteral" ||
- node.type === "DirectiveLiteral" ||
- node.type === "Literal" ||
- node.type === "NullLiteral" ||
- node.type === "NumericLiteral" ||
- node.type === "RegExpLiteral" ||
- node.type === "StringLiteral" ||
- node.type === "TemplateLiteral" ||
- node.type === "TSTypeLiteral" ||
- node.type === "JSXText"
- );
- }
- function isNumericLiteral(node) {
- return (
- node.type === "NumericLiteral" ||
- (node.type === "Literal" && typeof node.value === "number")
- );
- }
- function isStringLiteral(node) {
- return (
- node.type === "StringLiteral" ||
- (node.type === "Literal" && typeof node.value === "string")
- );
- }
- function isObjectType(n) {
- return n.type === "ObjectTypeAnnotation" || n.type === "TSTypeLiteral";
- }
- // eg; `describe("some string", (done) => {})`
- function isTestCall(n, parent) {
- const unitTestRe = /^(skip|(f|x)?(it|describe|test))$/;
- if (n.arguments.length === 1) {
- if (
- n.callee.type === "Identifier" &&
- n.callee.name === "async" &&
- parent &&
- parent.type === "CallExpression" &&
- isTestCall(parent)
- ) {
- return isFunctionOrArrowExpression(n.arguments[0].type);
- }
- if (isUnitTestSetUp(n)) {
- return (
- isFunctionOrArrowExpression(n.arguments[0].type) ||
- isIdentiferAsync(n.arguments[0])
- );
- }
- } else if (n.arguments.length === 2) {
- if (
- ((n.callee.type === "Identifier" && unitTestRe.test(n.callee.name)) ||
- isSkipOrOnlyBlock(n)) &&
- (isTemplateLiteral(n.arguments[0]) || isStringLiteral(n.arguments[0]))
- ) {
- return (
- (isFunctionOrArrowExpression(n.arguments[1].type) &&
- n.arguments[1].params.length <= 1) ||
- isIdentiferAsync(n.arguments[1])
- );
- }
- }
- return false;
- }
- function isSkipOrOnlyBlock(node) {
- const unitTestRe = /^(skip|(f|x)?(it|describe|test))$/;
- return (
- node.callee.type === "MemberExpression" &&
- node.callee.object.type === "Identifier" &&
- node.callee.property.type === "Identifier" &&
- unitTestRe.test(node.callee.object.name) &&
- (node.callee.property.name === "only" ||
- node.callee.property.name === "skip")
- );
- }
- function isTemplateLiteral(node) {
- return node.type === "TemplateLiteral";
- }
- function isIdentiferAsync(node) {
- return (
- node.type === "CallExpression" &&
- node.callee.type === "Identifier" &&
- node.callee.name === "async"
- );
- }
- function isFunctionOrArrowExpression(type) {
- return type === "FunctionExpression" || type === "ArrowFunctionExpression";
- }
- function isUnitTestSetUp(n) {
- const unitTestSetUpRe = /^(before|after)(Each|All)$/;
- return (
- n.callee.type === "Identifier" &&
- unitTestSetUpRe.test(n.callee.name) &&
- n.arguments.length === 1
- );
- }
- function isTheOnlyJSXElementInMarkdown(options, path$$1) {
- if (options.parentParser !== "markdown") {
- return false;
- }
- const node = path$$1.getNode();
- if (!node.expression || !isJSXNode(node.expression)) {
- return false;
- }
- const parent = path$$1.getParentNode();
- return parent.type === "Program" && parent.body.length == 1;
- }
- function willPrintOwnComments(path$$1) {
- const node = path$$1.getValue();
- const parent = path$$1.getParentNode();
- return (
- ((node && isJSXNode(node)) ||
- (parent &&
- (parent.type === "JSXSpreadAttribute" ||
- parent.type === "JSXSpreadChild" ||
- parent.type === "UnionTypeAnnotation" ||
- parent.type === "TSUnionType" ||
- ((parent.type === "ClassDeclaration" ||
- parent.type === "ClassExpression") &&
- parent.superClass === node)))) &&
- !util$1.hasIgnoreComment(path$$1)
- );
- }
- function canAttachComment(node) {
- return (
- node.type &&
- node.type !== "CommentBlock" &&
- node.type !== "CommentLine" &&
- node.type !== "Line" &&
- node.type !== "Block" &&
- node.type !== "EmptyStatement" &&
- node.type !== "TemplateElement" &&
- node.type !== "Import" &&
- !(node.callee && node.callee.type === "Import")
- );
- }
- function printComment(commentPath, options) {
- const comment = commentPath.getValue();
- switch (comment.type) {
- case "CommentBlock":
- case "Block": {
- if (isJsDocComment(comment)) {
- return printJsDocComment(comment);
- }
- const isInsideFlowComment =
- options.originalText.substr(options.locEnd(comment) - 3, 3) === "*-/";
- return "/*" + comment.value + (isInsideFlowComment ? "*-/" : "*/");
- }
- case "CommentLine":
- case "Line":
- // Print shebangs with the proper comment characters
- if (
- options.originalText.slice(options.locStart(comment)).startsWith("#!")
- ) {
- return "#!" + comment.value.trimRight();
- }
- return "//" + comment.value.trimRight();
- default:
- throw new Error("Not a comment: " + JSON.stringify(comment));
- }
- }
- function isJsDocComment(comment) {
- const lines = comment.value.split("\n");
- return (
- lines.length > 1 &&
- lines.slice(0, lines.length - 1).every(line => line.trim()[0] === "*")
- );
- }
- function printJsDocComment(comment) {
- const lines = comment.value.split("\n");
- return concat([
- "/*",
- join(
- hardline,
- lines.map(
- (line, index) =>
- (index > 0 ? " " : "") +
- (index < lines.length - 1 ? line.trim() : line.trimLeft())
- )
- ),
- "*/"
- ]);
- }
- function rawText(node) {
- return node.extra ? node.extra.raw : node.raw;
- }
- var printerEstree = {
- print: genericPrint,
- embed: embed_1,
- insertPragma,
- massageAstNode: clean_1,
- hasPrettierIgnore,
- willPrintOwnComments,
- canAttachComment,
- printComment,
- handleComments: {
- ownLine: comments$2.handleOwnLineComment,
- endOfLine: comments$2.handleEndOfLineComment,
- remaining: comments$2.handleRemainingComment
- }
- };
- const CATEGORY_JAVASCRIPT = "JavaScript";
- // format based on https://github.com/prettier/prettier/blob/master/src/common/support.js
- var options = {
- arrowParens: {
- since: "1.9.0",
- category: CATEGORY_JAVASCRIPT,
- type: "choice",
- default: "avoid",
- description: "Include parentheses around a sole arrow function parameter.",
- choices: [
- {
- value: "avoid",
- description: "Omit parens when possible. Example: `x => x`"
- },
- {
- value: "always",
- description: "Always include parens. Example: `(x) => x`"
- }
- ]
- },
- bracketSpacing: {
- since: "0.0.0",
- category: CATEGORY_JAVASCRIPT,
- type: "boolean",
- default: true,
- description: "Print spaces between brackets.",
- oppositeDescription: "Do not print spaces between brackets."
- },
- jsxBracketSameLine: {
- since: "0.17.0",
- category: CATEGORY_JAVASCRIPT,
- type: "boolean",
- default: false,
- description: "Put > on the last line instead of at a new line."
- },
- semi: {
- since: "1.0.0",
- category: CATEGORY_JAVASCRIPT,
- type: "boolean",
- default: true,
- description: "Print semicolons.",
- oppositeDescription:
- "Do not print semicolons, except at the beginning of lines which may need them."
- },
- singleQuote: {
- since: "0.0.0",
- category: CATEGORY_JAVASCRIPT,
- type: "boolean",
- default: false,
- description: "Use single quotes instead of double quotes."
- },
- trailingComma: {
- since: "0.0.0",
- category: CATEGORY_JAVASCRIPT,
- type: "choice",
- default: [
- { since: "0.0.0", value: false },
- { since: "0.19.0", value: "none" }
- ],
- description: "Print trailing commas wherever possible when multi-line.",
- choices: [
- { value: "none", description: "No trailing commas." },
- {
- value: "es5",
- description:
- "Trailing commas where valid in ES5 (objects, arrays, etc.)"
- },
- {
- value: "all",
- description:
- "Trailing commas wherever possible (including function arguments)."
- },
- { value: true, deprecated: "0.19.0", redirect: "es5" },
- { value: false, deprecated: "0.19.0", redirect: "none" }
- ]
- }
- };
- const hasPragma = pragma.hasPragma;
- // Based on:
- // https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
- const locStart = function(node) {
- // Handle nodes with decorators. They should start at the first decorator
- if (
- node.declaration &&
- node.declaration.decorators &&
- node.declaration.decorators.length > 0
- ) {
- return locStart(node.declaration.decorators[0]);
- }
- if (node.decorators && node.decorators.length > 0) {
- return locStart(node.decorators[0]);
- }
- if (node.__location) {
- return node.__location.startOffset;
- }
- if (node.range) {
- return node.range[0];
- }
- if (typeof node.start === "number") {
- return node.start;
- }
- if (node.loc) {
- return node.loc.start;
- }
- return null;
- };
- const locEnd = function(node) {
- const endNode = node.nodes && util$1.getLast(node.nodes);
- if (endNode && node.source && !node.source.end) {
- node = endNode;
- }
- let loc;
- if (node.range) {
- loc = node.range[1];
- } else if (typeof node.end === "number") {
- loc = node.end;
- }
- if (node.__location) {
- return node.__location.endOffset;
- }
- if (node.typeAnnotation) {
- return Math.max(loc, locEnd(node.typeAnnotation));
- }
- if (node.loc && !loc) {
- return node.loc.end;
- }
- return loc;
- };
- const languages = [
- {
- name: "JavaScript",
- since: "0.0.0",
- parsers: ["babylon", "flow"],
- group: "JavaScript",
- tmScope: "source.js",
- aceMode: "javascript",
- codemirrorMode: "javascript",
- codemirrorMimeType: "text/javascript",
- aliases: ["js", "node"],
- extensions: [
- ".js",
- "._js",
- ".bones",
- ".es",
- ".es6",
- ".frag",
- ".gs",
- ".jake",
- ".jsb",
- ".jscad",
- ".jsfl",
- ".jsm",
- ".jss",
- ".mjs",
- ".njs",
- ".pac",
- ".sjs",
- ".ssjs",
- ".xsjs",
- ".xsjslib"
- ],
- filenames: ["Jakefile"],
- linguistLanguageId: 183,
- vscodeLanguageIds: ["javascript"]
- },
- {
- name: "JSX",
- since: "0.0.0",
- parsers: ["babylon", "flow"],
- group: "JavaScript",
- extensions: [".jsx"],
- tmScope: "source.js.jsx",
- aceMode: "javascript",
- codemirrorMode: "jsx",
- codemirrorMimeType: "text/jsx",
- liguistLanguageId: 178,
- vscodeLanguageIds: ["javascriptreact"]
- },
- {
- name: "TypeScript",
- since: "1.4.0",
- parsers: ["typescript-eslint"],
- group: "JavaScript",
- aliases: ["ts"],
- extensions: [".ts", ".tsx"],
- tmScope: "source.ts",
- aceMode: "typescript",
- codemirrorMode: "javascript",
- codemirrorMimeType: "application/typescript",
- liguistLanguageId: 378,
- vscodeLanguageIds: ["typescript", "typescriptreact"]
- },
- {
- name: "JSON",
- since: "1.5.0",
- parsers: ["json"],
- group: "JavaScript",
- tmScope: "source.json",
- aceMode: "json",
- codemirrorMode: "javascript",
- codemirrorMimeType: "application/json",
- extensions: [
- ".json",
- ".json5",
- ".geojson",
- ".JSON-tmLanguage",
- ".topojson"
- ],
- filenames: [
- ".arcconfig",
- ".jshintrc",
- ".babelrc",
- ".eslintrc",
- ".prettierrc",
- "composer.lock",
- "mcmod.info"
- ],
- linguistLanguageId: 174,
- vscodeLanguageIds: ["json", "jsonc"]
- }
- ];
- const typescript = {
- get parse() {
- return require("./parser-typescript");
- },
- astFormat: "estree",
- hasPragma,
- locStart,
- locEnd
- };
- const babylon = {
- get parse() {
- return require("./parser-babylon");
- },
- astFormat: "estree",
- hasPragma,
- locStart,
- locEnd
- };
- const parsers = {
- babylon,
- json: Object.assign({}, babylon, {
- hasPragma() {
- return false;
- }
- }),
- flow: {
- get parse() {
- return require("./parser-flow");
- },
- astFormat: "estree",
- hasPragma,
- locStart,
- locEnd
- },
- "typescript-eslint": typescript,
- // TODO: Delete this in 2.0
- typescript
- };
- const printers = {
- estree: printerEstree
- };
- var languageJs = {
- languages,
- options,
- parsers,
- printers,
- locStart,
- locEnd
- };
- var index$1 = [
- "a",
- "abbr",
- "acronym",
- "address",
- "applet",
- "area",
- "article",
- "aside",
- "audio",
- "b",
- "base",
- "basefont",
- "bdi",
- "bdo",
- "bgsound",
- "big",
- "blink",
- "blockquote",
- "body",
- "br",
- "button",
- "canvas",
- "caption",
- "center",
- "cite",
- "code",
- "col",
- "colgroup",
- "command",
- "content",
- "data",
- "datalist",
- "dd",
- "del",
- "details",
- "dfn",
- "dialog",
- "dir",
- "div",
- "dl",
- "dt",
- "element",
- "em",
- "embed",
- "fieldset",
- "figcaption",
- "figure",
- "font",
- "footer",
- "form",
- "frame",
- "frameset",
- "h1",
- "h2",
- "h3",
- "h4",
- "h5",
- "h6",
- "head",
- "header",
- "hgroup",
- "hr",
- "html",
- "i",
- "iframe",
- "image",
- "img",
- "input",
- "ins",
- "isindex",
- "kbd",
- "keygen",
- "label",
- "legend",
- "li",
- "link",
- "listing",
- "main",
- "map",
- "mark",
- "marquee",
- "math",
- "menu",
- "menuitem",
- "meta",
- "meter",
- "multicol",
- "nav",
- "nextid",
- "nobr",
- "noembed",
- "noframes",
- "noscript",
- "object",
- "ol",
- "optgroup",
- "option",
- "output",
- "p",
- "param",
- "picture",
- "plaintext",
- "pre",
- "progress",
- "q",
- "rb",
- "rbc",
- "rp",
- "rt",
- "rtc",
- "ruby",
- "s",
- "samp",
- "script",
- "section",
- "select",
- "shadow",
- "slot",
- "small",
- "source",
- "spacer",
- "span",
- "strike",
- "strong",
- "style",
- "sub",
- "summary",
- "sup",
- "svg",
- "table",
- "tbody",
- "td",
- "template",
- "textarea",
- "tfoot",
- "th",
- "thead",
- "time",
- "title",
- "tr",
- "track",
- "tt",
- "u",
- "ul",
- "var",
- "video",
- "wbr",
- "xmp"
- ]
- ;
- var htmlTagNames = Object.freeze({
- default: index$1
- });
- var htmlTagNames$1 = ( htmlTagNames && index$1 ) || htmlTagNames;
- function clean$2(ast, newObj) {
- if (
- ast.type === "media-query" ||
- ast.type === "media-query-list" ||
- ast.type === "media-feature-expression"
- ) {
- delete newObj.value;
- }
- if (ast.type === "css-rule") {
- delete newObj.params;
- }
- if (ast.type === "selector-combinator") {
- newObj.value = newObj.value.replace(/\s+/g, " ");
- }
- if (ast.type === "media-feature") {
- newObj.value = newObj.value.replace(/ /g, "");
- }
- if (
- (ast.type === "value-word" &&
- ((ast.isColor && ast.isHex) ||
- ["initial", "inherit", "unset", "revert"].indexOf(
- newObj.value.replace().toLowerCase()
- ) !== -1)) ||
- ast.type === "media-feature" ||
- ast.type === "selector-root-invalid" ||
- ast.type === "selector-pseudo"
- ) {
- newObj.value = newObj.value.toLowerCase();
- }
- if (ast.type === "css-decl") {
- newObj.prop = newObj.prop.toLowerCase();
- }
- if (ast.type === "css-atrule" || ast.type === "css-import") {
- newObj.name = newObj.name.toLowerCase();
- }
- if (ast.type === "value-number") {
- newObj.unit = newObj.unit.toLowerCase();
- }
- if (
- (ast.type === "media-feature" ||
- ast.type === "media-keyword" ||
- ast.type === "media-type" ||
- ast.type === "media-unknown" ||
- ast.type === "media-url" ||
- ast.type === "media-value" ||
- ast.type === "selector-root-invalid" ||
- ast.type === "selector-attribute" ||
- ast.type === "selector-string" ||
- ast.type === "selector-class" ||
- ast.type === "selector-combinator" ||
- ast.type === "value-string") &&
- newObj.value
- ) {
- newObj.value = cleanCSSStrings(newObj.value);
- }
- if (ast.type === "css-import" && newObj.importPath) {
- newObj.importPath = cleanCSSStrings(newObj.importPath);
- }
- if (ast.type === "selector-attribute") {
- newObj.attribute = newObj.attribute.trim();
- if (newObj.namespace) {
- if (typeof newObj.namespace === "string") {
- newObj.namespace = newObj.namespace.trim();
- if (newObj.namespace.length === 0) {
- newObj.namespace = true;
- }
- }
- }
- if (newObj.value) {
- newObj.value = newObj.value.trim().replace(/^['"]|['"]$/g, "");
- delete newObj.quoted;
- }
- }
- if (
- (ast.type === "media-value" ||
- ast.type === "media-type" ||
- ast.type === "value-number" ||
- ast.type === "selector-root-invalid" ||
- ast.type === "selector-class" ||
- ast.type === "selector-combinator" ||
- ast.type === "selector-tag") &&
- newObj.value
- ) {
- newObj.value = newObj.value.replace(
- /([\d.eE+-]+)([a-zA-Z]*)/g,
- (match, numStr, unit) => {
- const num = Number(numStr);
- return isNaN(num) ? match : num + unit.toLowerCase();
- }
- );
- }
- if (ast.type === "media-url") {
- newObj.value = newObj.value
- .replace(/^url\(\s+/gi, "url(")
- .replace(/\s+\)$/gi, ")");
- }
- if (ast.type === "selector-tag") {
- const lowercasedValue = ast.value.toLowerCase();
- if (htmlTagNames$1.indexOf(lowercasedValue) !== -1) {
- newObj.value = lowercasedValue;
- }
- if (["from", "to"].indexOf(lowercasedValue) !== -1) {
- newObj.value = lowercasedValue;
- }
- }
- }
- function cleanCSSStrings(value) {
- return value.replace(/'/g, '"').replace(/\\([^a-fA-F\d])/g, "$1");
- }
- var clean_1$2 = clean$2;
- const docBuilders$6 = doc.builders;
- const concat$5 = docBuilders$6.concat;
- const join$4 = docBuilders$6.join;
- const line$2 = docBuilders$6.line;
- const hardline$4 = docBuilders$6.hardline;
- const softline$3 = docBuilders$6.softline;
- const group$2 = docBuilders$6.group;
- const fill$3 = docBuilders$6.fill;
- const indent$4 = docBuilders$6.indent;
- const removeLines$1 = doc.utils.removeLines;
- function genericPrint$1(path$$1, options, print) {
- const node = path$$1.getValue();
- /* istanbul ignore if */
- if (!node) {
- return "";
- }
- if (typeof node === "string") {
- return node;
- }
- switch (node.type) {
- case "css-comment-yaml":
- return node.value;
- case "css-root": {
- const nodes = printNodeSequence(path$$1, options, print);
- if (nodes.parts.length) {
- return concat$5([nodes, hardline$4]);
- }
- return nodes;
- }
- case "css-comment": {
- if (node.raws.content) {
- return node.raws.content;
- }
- const text = options.originalText.slice(
- options.locStart(node),
- options.locEnd(node)
- );
- const rawText = node.raws.text || node.text;
- // Workaround a bug where the location is off.
- // https://github.com/postcss/postcss-scss/issues/63
- if (text.indexOf(rawText) === -1) {
- if (node.raws.inline) {
- return concat$5(["// ", rawText]);
- }
- return concat$5(["/* ", rawText, " */"]);
- }
- return text;
- }
- case "css-rule": {
- return concat$5([
- path$$1.call(print, "selector"),
- node.important ? " !important" : "",
- node.nodes
- ? concat$5([
- " {",
- node.nodes.length > 0
- ? indent$4(
- concat$5([hardline$4, printNodeSequence(path$$1, options, print)])
- )
- : "",
- hardline$4,
- "}",
- isDetachedRulesetDeclaration(node) ? ";" : ""
- ])
- : ";"
- ]);
- }
- case "css-decl": {
- // When the following less construct &:extend(.foo); is parsed with scss,
- // it will put a space after `:` and break it. Ideally we should parse
- // less files with less, but we can hardcode this to work with scss as
- // well.
- const isValueExtend =
- node.value.type === "value-root" &&
- node.value.group.type === "value-value" &&
- node.value.group.group.type === "value-func" &&
- node.value.group.group.value === "extend";
- const isComposed =
- node.value.type === "value-root" &&
- node.value.group.type === "value-value" &&
- node.prop === "composes";
- const ruleAncestorNode = getAncestorNode(path$$1, "css-rule");
- const isiCSS =
- ruleAncestorNode &&
- ruleAncestorNode.raws.selector &&
- (ruleAncestorNode.raws.selector.startsWith(":import") ||
- ruleAncestorNode.raws.selector.startsWith(":export"));
- return concat$5([
- node.raws.before.replace(/[\s;]/g, ""),
- isiCSS ? node.prop : maybeToLowerCase(node.prop),
- node.raws.between.trim() === ":" ? ":" : node.raws.between.trim(),
- isValueExtend ? "" : " ",
- isComposed
- ? removeLines$1(path$$1.call(print, "value"))
- : path$$1.call(print, "value"),
- node.raws.important
- ? node.raws.important.replace(/\s*!\s*important/i, " !important")
- : node.important
- ? " !important"
- : "",
- node.raws.scssDefault
- ? node.raws.scssDefault.replace(/\s*!default/i, " !default")
- : node.scssDefault
- ? " !default"
- : "",
- node.raws.scssGlobal
- ? node.raws.scssGlobal.replace(/\s*!global/i, " !global")
- : node.scssGlobal
- ? " !global"
- : "",
- node.nodes
- ? concat$5([
- " {",
- indent$4(
- concat$5([softline$3, printNodeSequence(path$$1, options, print)])
- ),
- softline$3,
- "}"
- ])
- : ";"
- ]);
- }
- case "css-atrule": {
- const hasParams =
- node.params &&
- !(node.params.type === "media-query-list" && node.params.value === "");
- const isDetachedRulesetCall = hasParams && /^\(\s*\)$/.test(node.params);
- const hasParensAround =
- node.value &&
- node.value.group.group.type === "value-paren_group" &&
- node.value.group.group.open !== null &&
- node.value.group.group.close !== null;
- return concat$5([
- "@",
- // If a Less file ends up being parsed with the SCSS parser, Less
- // variable declarations will be parsed as atrules with names ending
- // with a colon, so keep the original case then.
- isDetachedRulesetCall || node.name.endsWith(":")
- ? node.name
- : maybeToLowerCase(node.name),
- hasParams
- ? concat$5([
- isDetachedRulesetCall ? "" : " ",
- path$$1.call(print, "params")
- ])
- : "",
- node.selector
- ? indent$4(concat$5([" ", path$$1.call(print, "selector")]))
- : "",
- node.value
- ? group$2(
- concat$5([
- " ",
- path$$1.call(print, "value"),
- isControlDirectiveNode(node)
- ? hasParensAround
- ? " "
- : line$2
- : ""
- ])
- )
- : node.name === "else"
- ? " "
- : "",
- node.nodes
- ? concat$5([
- isControlDirectiveNode(node) ? "" : " ",
- "{",
- indent$4(
- concat$5([
- node.nodes.length > 0 ? softline$3 : "",
- printNodeSequence(path$$1, options, print)
- ])
- ),
- softline$3,
- "}"
- ])
- : ";"
- ]);
- }
- case "css-import": {
- return concat$5([
- "@",
- maybeToLowerCase(node.name),
- " ",
- node.directives ? concat$5([node.directives, " "]) : "",
- adjustStrings(node.importPath, options),
- node.nodes.length > 0
- ? concat$5([
- " {",
- indent$4(
- concat$5([softline$3, printNodeSequence(path$$1, options, print)])
- ),
- softline$3,
- "}"
- ])
- : ";"
- ]);
- }
- // postcss-media-query-parser
- case "media-query-list": {
- const parts = [];
- path$$1.each(childPath => {
- const node = childPath.getValue();
- if (node.type === "media-query" && node.value === "") {
- return;
- }
- parts.push(childPath.call(print));
- }, "nodes");
- return group$2(indent$4(join$4(line$2, parts)));
- }
- case "media-query": {
- return concat$5([
- join$4(" ", path$$1.map(print, "nodes")),
- isLastNode(path$$1, node) ? "" : ","
- ]);
- }
- case "media-type": {
- const atRuleAncestorNode = getAncestorNode(path$$1, "css-atrule");
- if (
- atRuleAncestorNode &&
- atRuleAncestorNode.name.toLowerCase() === "charset"
- ) {
- return node.value;
- }
- return adjustNumbers(adjustStrings(node.value, options));
- }
- case "media-feature-expression": {
- if (!node.nodes) {
- return node.value;
- }
- return concat$5(["(", concat$5(path$$1.map(print, "nodes")), ")"]);
- }
- case "media-feature": {
- return maybeToLowerCase(
- adjustStrings(node.value.replace(/ +/g, " "), options)
- );
- }
- case "media-colon": {
- return concat$5([node.value, " "]);
- }
- case "media-value": {
- return adjustNumbers(adjustStrings(node.value, options));
- }
- case "media-keyword": {
- return adjustStrings(node.value, options);
- }
- case "media-url": {
- return adjustStrings(
- node.value.replace(/^url\(\s+/gi, "url(").replace(/\s+\)$/gi, ")"),
- options
- );
- }
- case "media-unknown": {
- return adjustStrings(node.value, options);
- }
- // postcss-selector-parser
- case "selector-root-invalid": {
- // This is likely a SCSS nested property: `background: { color: red; }`.
- return adjustNumbers(
- adjustStrings(maybeToLowerCase(node.value), options)
- );
- }
- case "selector-root": {
- const atRuleAncestorNode = getAncestorNode(path$$1, "css-atrule");
- const insideAtRuleNode =
- atRuleAncestorNode &&
- ["extend", "custom-selector", "nest"].indexOf(
- atRuleAncestorNode.name
- ) !== -1;
- return group$2(
- concat$5([
- atRuleAncestorNode && atRuleAncestorNode.name === "custom-selector"
- ? concat$5([atRuleAncestorNode.customSelector, line$2])
- : "",
- join$4(
- concat$5([",", insideAtRuleNode ? line$2 : hardline$4]),
- path$$1.map(print, "nodes")
- )
- ])
- );
- }
- case "selector-comment": {
- return node.value;
- }
- case "selector-string": {
- return adjustStrings(node.value, options);
- }
- case "selector-tag": {
- const parentNode = path$$1.getParentNode();
- const index = parentNode && parentNode.nodes.indexOf(node);
- const prevNode = index && parentNode.nodes[index - 1];
- return concat$5([
- node.namespace
- ? concat$5([node.namespace === true ? "" : node.namespace.trim(), "|"])
- : "",
- prevNode.type === "selector-nesting"
- ? node.value
- : adjustNumbers(
- isHTMLTag(node.value) ||
- isKeyframeAtRuleKeywords(path$$1, node.value)
- ? node.value.toLowerCase()
- : node.value
- )
- ]);
- }
- case "selector-id": {
- return concat$5(["#", node.value]);
- }
- case "selector-class": {
- return concat$5([".", adjustNumbers(adjustStrings(node.value, options))]);
- }
- case "selector-attribute": {
- return concat$5([
- "[",
- node.namespace
- ? concat$5([node.namespace === true ? "" : node.namespace.trim(), "|"])
- : "",
- node.attribute.trim(),
- node.operator ? node.operator : "",
- node.value
- ? quoteAttributeValue(
- adjustStrings(node.value.trim(), options),
- options
- )
- : "",
- node.insensitive ? " i" : "",
- "]"
- ]);
- }
- case "selector-combinator": {
- if (
- node.value === "+" ||
- node.value === ">" ||
- node.value === "~" ||
- node.value === ">>>"
- ) {
- const parentNode = path$$1.getParentNode();
- const leading =
- parentNode.type === "selector-selector" &&
- parentNode.nodes[0] === node
- ? ""
- : line$2;
- return concat$5([leading, node.value, isLastNode(path$$1, node) ? "" : " "]);
- }
- const leading = node.value.trim().startsWith("(") ? line$2 : "";
- const value =
- adjustNumbers(adjustStrings(node.value.trim(), options)) || line$2;
- return concat$5([leading, value]);
- }
- case "selector-universal": {
- return concat$5([
- node.namespace
- ? concat$5([node.namespace === true ? "" : node.namespace.trim(), "|"])
- : "",
- adjustNumbers(node.value)
- ]);
- }
- case "selector-selector": {
- return group$2(indent$4(concat$5(path$$1.map(print, "nodes"))));
- }
- case "selector-pseudo": {
- return concat$5([
- maybeToLowerCase(node.value),
- node.nodes && node.nodes.length > 0
- ? concat$5(["(", join$4(", ", path$$1.map(print, "nodes")), ")"])
- : ""
- ]);
- }
- case "selector-nesting": {
- return node.value;
- }
- // postcss-values-parser
- case "value-root": {
- return path$$1.call(print, "group");
- }
- case "value-comment": {
- return concat$5([
- node.inline ? "//" : "/*",
- node.value,
- node.inline ? "" : "*/"
- ]);
- }
- case "value-comma_group": {
- const parentNode = path$$1.getParentNode();
- const declAncestorNode = getAncestorNode(path$$1, "css-decl");
- const declAncestorProp =
- declAncestorNode &&
- declAncestorNode.prop &&
- declAncestorNode.prop.toLowerCase();
- const isGridValue =
- declAncestorProp &&
- parentNode.type === "value-value" &&
- (declAncestorProp === "grid" ||
- declAncestorProp.startsWith("grid-template"));
- const atRuleAncestorNode = getAncestorNode(path$$1, "css-atrule");
- const isControlDirective =
- atRuleAncestorNode && isControlDirectiveNode(atRuleAncestorNode);
- const printed = path$$1.map(print, "groups");
- const parts = [];
- const functionAncestorNode = getAncestorNode(path$$1, "value-func");
- const insideInFunction =
- functionAncestorNode && functionAncestorNode.value;
- const insideURLFunction =
- insideInFunction && functionAncestorNode.value.toLowerCase() === "url";
- let didBreak = false;
- for (let i = 0; i < node.groups.length; ++i) {
- parts.push(printed[i]);
- // Ignore value inside `url()`
- if (insideURLFunction) {
- continue;
- }
- const iPrevNode = node.groups[i - 1];
- const iNode = node.groups[i];
- const iNextNode = node.groups[i + 1];
- const iNextNextNode = node.groups[i + 2];
- // Ignore after latest node (i.e. before semicolon)
- if (!iNextNode) {
- continue;
- }
- // Ignore colon
- if (iNode.value === ":") {
- continue;
- }
- // Ignore `@` in Less (i.e. `@@var;`)
- if (iNode.type === "value-atword" && iNode.value === "") {
- continue;
- }
- // Ignore `~` in Less (i.e. `content: ~"^//* some horrible but needed css hack";`)
- if (iNode.value === "~") {
- continue;
- }
- if (
- (iPrevNode &&
- iPrevNode.type === "value-comment" &&
- iPrevNode.inline) ||
- (iNextNode.type === "value-comment" && iNextNode.inline)
- ) {
- continue;
- }
- const isHash = iNode.type === "value-word" && iNode.value === "#";
- const isLeftCurlyBrace =
- iNode.type === "value-word" && iNode.value === "{";
- const isNextLeftCurlyBrace =
- iNextNode.type === "value-word" && iNextNode.value === "{";
- const isRightCurlyBrace =
- iNode.type === "value-word" && iNode.value === "}";
- const isNextRightCurlyBrace =
- iNextNode.type === "value-word" && iNextNode.value === "}";
- // Ignore interpolation in SCSS (i.e. ``#{variable}``)
- if (
- isHash ||
- isLeftCurlyBrace ||
- isNextRightCurlyBrace ||
- (isNextLeftCurlyBrace &&
- iNextNode.raws &&
- iNextNode.raws.before === "") ||
- (isRightCurlyBrace && iNextNode.raws && iNextNode.raws.before === "")
- ) {
- continue;
- }
- const isNextHash =
- iNextNode.type === "value-word" && iNextNode.value === "#";
- const isMathOperator = isMathOperatorNode(iNode);
- const isNextMathOperator = isMathOperatorNode(iNextNode);
- const isMultiplication =
- !isNextHash && isMathOperator && iNode.value === "*";
- const isNextMultiplication =
- !isRightCurlyBrace && isNextMathOperator && iNextNode.value === "*";
- const isDivision = !isNextHash && isMathOperator && iNode.value === "/";
- const isNextDivision =
- !isRightCurlyBrace && isNextMathOperator && iNextNode.value === "/";
- const isAddition = !isNextHash && isMathOperator && iNode.value === "+";
- const isNextAddition =
- !isRightCurlyBrace && isNextMathOperator && iNextNode.value === "+";
- const isPrevFunction = iPrevNode && iPrevNode.type === "value-func";
- const isFunction = iNode.type === "value-func";
- const isNextFunction = iNextNode.type === "value-func";
- const isNextNextFunction =
- iNextNextNode && iNextNextNode.type === "value-func";
- const isPrevWord =
- iPrevNode &&
- ["value-word", "value-atword"].indexOf(iPrevNode.type) !== -1;
- const isWord =
- ["value-word", "value-atword"].indexOf(iNode.type) !== -1;
- const isNextWord =
- ["value-word", "value-atword"].indexOf(iNextNode.type) !== -1;
- const isNextNextWord =
- iNextNextNode &&
- ["value-word", "value-atword"].indexOf(iNextNextNode.type) !== -1;
- // Math operators
- const insideCalcFunction =
- insideInFunction &&
- functionAncestorNode.value.toLowerCase() === "calc";
- const hasSpaceBeforeOperator =
- isNextNextFunction || isNextNextWord || isFunction || isWord;
- const hasSpaceAfterOperator =
- isNextFunction || isNextWord || isPrevFunction || isPrevWord;
- if (
- (isMathOperator || isNextMathOperator) &&
- // Multiplication
- !isMultiplication &&
- !isNextMultiplication &&
- // Division
- !(isNextDivision && (hasSpaceBeforeOperator || insideCalcFunction)) &&
- !(isDivision && (hasSpaceAfterOperator || insideCalcFunction)) &&
- // Addition
- !(isNextAddition && hasSpaceBeforeOperator) &&
- !(isAddition && hasSpaceAfterOperator)
- ) {
- const isNextParenGroup = isParenGroupNode(iNextNode);
- const isNextValueNumber = iNextNode.type === "value-number";
- if (
- (iNextNode.raws && iNextNode.raws.before === "") ||
- (isMathOperator &&
- (isNextParenGroup ||
- isNextWord ||
- isNextValueNumber ||
- isMathOperatorNode(iNextNode)) &&
- (!iPrevNode || (iPrevNode && isMathOperatorNode(iPrevNode))))
- ) {
- continue;
- }
- }
- const isEqualityOperator =
- isControlDirective && isEqualityOperatorNode(iNode);
- const isRelationalOperator =
- isControlDirective && isRelationalOperatorNode(iNode);
- const isNextEqualityOperator =
- isControlDirective && isEqualityOperatorNode(iNextNode);
- const isNextRelationalOperator =
- isControlDirective && isRelationalOperatorNode(iNextNode);
- const isNextIfElseKeyword =
- isControlDirective && isIfElseKeywordNode(iNextNode);
- const isEachKeyword = isControlDirective && isEachKeywordNode(iNode);
- const isNextEachKeyword =
- isControlDirective && isEachKeywordNode(iNextNode);
- const isForKeyword =
- atRuleAncestorNode &&
- atRuleAncestorNode.name === "for" &&
- isForKeywordNode(iNode);
- const isNextForKeyword =
- isControlDirective && isForKeywordNode(iNextNode);
- const IsNextColon = iNextNode.value === ":";
- if (isGridValue) {
- if (iNode.source.start.line !== iNextNode.source.start.line) {
- parts.push(hardline$4);
- didBreak = true;
- } else {
- parts.push(" ");
- }
- } else if (iNode.type === "value-comment" && iNode.inline) {
- parts.push(hardline$4);
- } else if (
- isNextMathOperator ||
- isNextEqualityOperator ||
- isNextRelationalOperator ||
- isNextIfElseKeyword ||
- isForKeyword ||
- isEachKeyword
- ) {
- parts.push(" ");
- } else if (
- !IsNextColon ||
- isEqualityOperator ||
- isRelationalOperator ||
- isNextForKeyword ||
- isNextEachKeyword
- ) {
- parts.push(line$2);
- }
- }
- if (didBreak) {
- parts.unshift(hardline$4);
- }
- if (isControlDirective) {
- return group$2(indent$4(concat$5(parts)));
- }
- return group$2(indent$4(fill$3(parts)));
- }
- case "value-paren_group": {
- const parentNode = path$$1.getParentNode();
- const isURLCall =
- parentNode &&
- parentNode.type === "value-func" &&
- parentNode.value === "url";
- if (
- isURLCall &&
- (node.groups.length === 1 ||
- (node.groups.length > 0 &&
- node.groups[0].type === "value-comma_group" &&
- node.groups[0].groups.length > 0 &&
- node.groups[0].groups[0].type === "value-word" &&
- node.groups[0].groups[0].value.startsWith("data:")))
- ) {
- return concat$5([
- node.open ? path$$1.call(print, "open") : "",
- join$4(",", path$$1.map(print, "groups")),
- node.close ? path$$1.call(print, "close") : ""
- ]);
- }
- if (!node.open) {
- const printed = path$$1.map(print, "groups");
- const res = [];
- for (let i = 0; i < printed.length; i++) {
- if (i !== 0) {
- res.push(concat$5([",", line$2]));
- }
- res.push(printed[i]);
- }
- return group$2(indent$4(fill$3(res)));
- }
- const declNode = path$$1.getParentNode(2);
- const isMap =
- declNode &&
- declNode.type === "css-decl" &&
- declNode.prop.startsWith("$");
- return group$2(
- concat$5([
- node.open ? path$$1.call(print, "open") : "",
- indent$4(
- concat$5([
- softline$3,
- join$4(
- concat$5([",", isMap ? hardline$4 : line$2]),
- path$$1.map(print, "groups")
- )
- ])
- ),
- softline$3,
- node.close ? path$$1.call(print, "close") : ""
- ])
- );
- }
- case "value-value": {
- return path$$1.call(print, "group");
- }
- case "value-func": {
- return concat$5([node.value, path$$1.call(print, "group")]);
- }
- case "value-paren": {
- return node.value;
- }
- case "value-number": {
- return concat$5([printNumber$1(node.value), maybeToLowerCase(node.unit)]);
- }
- case "value-operator": {
- return node.value;
- }
- case "value-word": {
- if ((node.isColor && node.isHex) || isWideKeywords(node.value)) {
- return node.value.toLowerCase();
- }
- return node.value;
- }
- case "value-colon": {
- return concat$5([node.value, insideURLFunctionNode(path$$1) ? "" : line$2]);
- }
- case "value-comma": {
- return concat$5([node.value, " "]);
- }
- case "value-string": {
- return util$1.printString(
- node.raws.quote + node.value + node.raws.quote,
- options
- );
- }
- case "value-atword": {
- return concat$5(["@", node.value]);
- }
- case "value-unicode-range": {
- return node.value;
- }
- default:
- /* istanbul ignore next */
- throw new Error(`Unknown postcss type ${JSON.stringify(node.type)}`);
- }
- }
- function isLastNode(path$$1, node) {
- const parentNode = path$$1.getParentNode();
- if (!parentNode) {
- return false;
- }
- const nodes = parentNode.nodes;
- return nodes && nodes.indexOf(node) === nodes.length - 1;
- }
- function isDetachedRulesetDeclaration(node) {
- // If a Less file ends up being parsed with the SCSS parser, Less
- // variable declarations will be parsed as atrules with names ending
- // with a colon, so keep the original case then.
- return (
- node.selector &&
- node.selector.type !== "selector-root-invalid" &&
- ((typeof node.selector === "string" && /^@.+:.*$/.test(node.selector)) ||
- (node.selector.value && /^@.+:.*$/.test(node.selector.value)))
- );
- }
- function isKeyframeAtRuleKeywords(path$$1, value) {
- const atRuleAncestorNode = getAncestorNode(path$$1, "css-atrule");
- return (
- atRuleAncestorNode &&
- atRuleAncestorNode.name &&
- atRuleAncestorNode.name.toLowerCase().endsWith("keyframes") &&
- ["from", "to"].indexOf(value.toLowerCase()) !== -1
- );
- }
- function isHTMLTag(value) {
- return htmlTagNames$1.indexOf(value.toLowerCase()) !== -1;
- }
- function insideURLFunctionNode(path$$1) {
- const funcAncestorNode = getAncestorNode(path$$1, "value-func");
- return (
- funcAncestorNode &&
- funcAncestorNode.value &&
- funcAncestorNode.value === "url"
- );
- }
- function isParenGroupNode(node) {
- return node.type && node.type === "value-paren_group";
- }
- function isForKeywordNode(node) {
- return (
- node.type &&
- node.type === "value-word" &&
- node.value &&
- ["from", "through", "end"].indexOf(node.value) !== -1
- );
- }
- function isIfElseKeywordNode(node) {
- return (
- node.type &&
- node.type === "value-word" &&
- node.value &&
- ["and", "or", "not"].indexOf(node.value) !== -1
- );
- }
- function isEachKeywordNode(node) {
- return (
- node.type &&
- node.type === "value-word" &&
- node.value &&
- ["in"].indexOf(node.value) !== -1
- );
- }
- function isMathOperatorNode(node) {
- return (
- node.type &&
- node.type === "value-operator" &&
- node.value &&
- ["+", "-", "/", "*", "%"].indexOf(node.value) !== -1
- );
- }
- function isEqualityOperatorNode(node) {
- return (
- node.type &&
- node.type === "value-word" &&
- node.value &&
- ["==", "!="].indexOf(node.value) !== -1
- );
- }
- function isRelationalOperatorNode(node) {
- return (
- node.type &&
- node.type === "value-word" &&
- node.value &&
- ["<", ">", "<=", ">="].indexOf(node.value) !== -1
- );
- }
- function isControlDirectiveNode(node) {
- return (
- node.type &&
- node.type === "css-atrule" &&
- node.name &&
- (node.name === "if" ||
- node.name === "else" ||
- node.name === "for" ||
- node.name === "each" ||
- node.name === "while")
- );
- }
- function getAncestorCounter(path$$1, typeOrTypes) {
- const types = [].concat(typeOrTypes);
- let counter = -1;
- let ancestorNode;
- while ((ancestorNode = path$$1.getParentNode(++counter))) {
- if (types.indexOf(ancestorNode.type) !== -1) {
- return counter;
- }
- }
- return -1;
- }
- function getAncestorNode(path$$1, typeOrTypes) {
- const counter = getAncestorCounter(path$$1, typeOrTypes);
- return counter === -1 ? null : path$$1.getParentNode(counter);
- }
- function printNodeSequence(path$$1, options, print) {
- const node = path$$1.getValue();
- const parts = [];
- let i = 0;
- path$$1.map(pathChild => {
- const prevNode = node.nodes[i - 1];
- if (
- prevNode &&
- prevNode.type === "css-comment" &&
- prevNode.text.trim() === "prettier-ignore"
- ) {
- const childNode = pathChild.getValue();
- parts.push(
- options.originalText.slice(
- options.locStart(childNode),
- options.locEnd(childNode)
- )
- );
- } else {
- parts.push(pathChild.call(print));
- }
- if (i !== node.nodes.length - 1) {
- if (
- (node.nodes[i + 1].type === "css-comment" &&
- !util$1.hasNewline(
- options.originalText,
- options.locStart(node.nodes[i + 1]),
- { backwards: true }
- )) ||
- (node.nodes[i + 1].type === "css-atrule" &&
- node.nodes[i + 1].name === "else" &&
- node.nodes[i].type !== "css-comment")
- ) {
- parts.push(" ");
- } else {
- parts.push(hardline$4);
- if (
- utilShared.isNextLineEmpty(
- options.originalText,
- pathChild.getValue(),
- options
- )
- ) {
- parts.push(hardline$4);
- }
- }
- }
- i++;
- }, "nodes");
- return concat$5(parts);
- }
- const STRING_REGEX = /(['"])(?:(?!\1)[^\\]|\\[\s\S])*\1/g;
- const NUMBER_REGEX = /(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g;
- const STANDARD_UNIT_REGEX = /[a-zA-Z]+/g;
- const WORD_PART_REGEX = /[$@]?[a-zA-Z_\u0080-\uFFFF][\w\-\u0080-\uFFFF]*/g;
- const ADJUST_NUMBERS_REGEX = RegExp(
- STRING_REGEX.source +
- `|` +
- `(${WORD_PART_REGEX.source})?` +
- `(${NUMBER_REGEX.source})` +
- `(${STANDARD_UNIT_REGEX.source})?`,
- "g"
- );
- function adjustStrings(value, options) {
- return value.replace(STRING_REGEX, match =>
- util$1.printString(match, options)
- );
- }
- function quoteAttributeValue(value, options) {
- const quote = options.singleQuote ? "'" : '"';
- return value.includes('"') || value.includes("'")
- ? value
- : quote + value + quote;
- }
- function adjustNumbers(value) {
- return value.replace(
- ADJUST_NUMBERS_REGEX,
- (match, quote, wordPart, number, unit) =>
- !wordPart && number
- ? (wordPart || "") + printNumber$1(number) + maybeToLowerCase(unit || "")
- : match
- );
- }
- function printNumber$1(rawNumber) {
- return (
- util$1
- .printNumber(rawNumber)
- // Remove trailing `.0`.
- .replace(/\.0(?=$|e)/, "")
- );
- }
- function maybeToLowerCase(value) {
- return value.includes("$") ||
- value.includes("@") ||
- value.includes("#") ||
- value.startsWith("%") ||
- value.startsWith("--") ||
- value.startsWith(":--") ||
- (value.includes("(") && value.includes(")"))
- ? value
- : value.toLowerCase();
- }
- function isWideKeywords(value) {
- return (
- ["initial", "inherit", "unset", "revert"].indexOf(
- value.replace().toLowerCase()
- ) !== -1
- );
- }
- var printerPostcss = {
- print: genericPrint$1,
- hasPrettierIgnore: util$1.hasIgnoreComment,
- massageAstNode: clean_1$2
- };
- // format based on https://github.com/prettier/prettier/blob/master/src/common/support.js
- var options$2 = {
- singleQuote: options.singleQuote
- };
- const lineColumnToIndex$1 = util$1.lineColumnToIndex;
- const getLast$1 = util$1.getLast;
- // Based on:
- // https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
- const languages$1 = [
- {
- name: "CSS",
- since: "1.4.0",
- parsers: ["css"],
- group: "CSS",
- tmScope: "source.css",
- aceMode: "css",
- codemirrorMode: "css",
- codemirrorMimeType: "text/css",
- extensions: [".css", ".pcss", ".postcss"],
- liguistLanguageId: 50,
- vscodeLanguageIds: ["css", "postcss"]
- },
- {
- name: "Less",
- since: "1.4.0",
- parsers: ["less"],
- group: "CSS",
- extensions: [".less"],
- tmScope: "source.css.less",
- aceMode: "less",
- codemirrorMode: "css",
- codemirrorMimeType: "text/css",
- liguistLanguageId: 198,
- vscodeLanguageIds: ["less"]
- },
- {
- name: "SCSS",
- since: "1.4.0",
- parsers: ["scss"],
- group: "CSS",
- tmScope: "source.scss",
- aceMode: "scss",
- codemirrorMode: "css",
- codemirrorMimeType: "text/x-scss",
- extensions: [".scss"],
- liguistLanguageId: 329,
- vscodeLanguageIds: ["scss"]
- }
- ];
- const postcss = {
- get parse() {
- return require("./parser-postcss");
- },
- astFormat: "postcss",
- locEnd: function(node) {
- const endNode = node.nodes && getLast$1(node.nodes);
- if (endNode && node.source && !node.source.end) {
- node = endNode;
- }
- if (node.source) {
- return lineColumnToIndex$1(node.source.end, node.source.input.css);
- }
- return null;
- },
- locStart: function(node) {
- if (node.source) {
- return lineColumnToIndex$1(node.source.start, node.source.input.css) - 1;
- }
- return null;
- }
- };
- // TODO: switch these to just `postcss` and use `language` instead.
- const parsers$1 = {
- css: postcss,
- less: postcss,
- scss: postcss
- };
- const printers$1 = {
- postcss: printerPostcss
- };
- var languageCss = {
- languages: languages$1,
- options: options$2,
- parsers: parsers$1,
- printers: printers$1
- };
- const concat$6 = docBuilders$2.concat;
- const join$5 = docBuilders$2.join;
- const softline$4 = docBuilders$2.softline;
- const hardline$5 = docBuilders$2.hardline;
- const line$3 = docBuilders$2.line;
- const group$3 = docBuilders$2.group;
- const indent$5 = docBuilders$2.indent;
- const ifBreak$2 = docBuilders$2.ifBreak;
- // http://w3c.github.io/html/single-page.html#void-elements
- const voidTags = [
- "area",
- "base",
- "br",
- "col",
- "embed",
- "hr",
- "img",
- "input",
- "link",
- "meta",
- "param",
- "source",
- "track",
- "wbr"
- ];
- // Formatter based on @glimmerjs/syntax's built-in test formatter:
- // https://github.com/glimmerjs/glimmer-vm/blob/master/packages/%40glimmer/syntax/lib/generation/print.ts
- function print(path$$1, options, print) {
- const n = path$$1.getValue();
- /* istanbul ignore if*/
- if (!n) {
- return "";
- }
- switch (n.type) {
- case "Program": {
- return group$3(
- join$5(softline$4, path$$1.map(print, "body").filter(text => text !== ""))
- );
- }
- case "ElementNode": {
- const isVoid = voidTags.indexOf(n.tag) !== -1;
- const closeTag = isVoid ? concat$6([" />", softline$4]) : ">";
- const hasChildren = n.children.length > 0;
- const getParams = (path$$1, print) =>
- indent$5(
- concat$6([
- n.attributes.length ? line$3 : "",
- join$5(line$3, path$$1.map(print, "attributes")),
- n.modifiers.length ? line$3 : "",
- join$5(line$3, path$$1.map(print, "modifiers")),
- n.comments.length ? line$3 : "",
- join$5(line$3, path$$1.map(print, "comments"))
- ])
- );
- // The problem here is that I want to not break at all if the children
- // would not break but I need to force an indent, so I use a hardline.
- /**
- * What happens now:
- * <div>
- * Hello
- * </div>
- * ==>
- * <div>Hello</div>
- * This is due to me using hasChildren to decide to put the hardline in.
- * I would rather use a {DOES THE WHOLE THING NEED TO BREAK}
- */
- return concat$6([
- group$3(
- concat$6([
- "<",
- n.tag,
- getParams(path$$1, print),
- ifBreak$2(softline$4, ""),
- closeTag
- ])
- ),
- group$3(
- concat$6([
- indent$5(join$5(softline$4, [""].concat(path$$1.map(print, "children")))),
- ifBreak$2(hasChildren ? hardline$5 : "", ""),
- !isVoid ? concat$6(["</", n.tag, ">"]) : ""
- ])
- )
- ]);
- }
- case "BlockStatement": {
- const pp = path$$1.getParentNode(1);
- const isElseIf =
- pp &&
- pp.inverse &&
- pp.inverse.body[0] === n &&
- pp.inverse.body[0].path.parts[0] === "if";
- const hasElseIf =
- n.inverse &&
- n.inverse.body[0] &&
- n.inverse.body[0].type === "BlockStatement" &&
- n.inverse.body[0].path.parts[0] === "if";
- const indentElse = hasElseIf ? a => a : indent$5;
- if (n.inverse) {
- return concat$6([
- isElseIf
- ? concat$6(["{{else ", printPathParams(path$$1, print), "}}"])
- : printOpenBlock(path$$1, print),
- indent$5(concat$6([hardline$5, path$$1.call(print, "program")])),
- n.inverse && !hasElseIf ? concat$6([hardline$5, "{{else}}"]) : "",
- n.inverse
- ? indentElse(concat$6([hardline$5, path$$1.call(print, "inverse")]))
- : "",
- isElseIf ? "" : concat$6([hardline$5, printCloseBlock(path$$1, print)])
- ]);
- } else if (isElseIf) {
- return concat$6([
- concat$6(["{{else ", printPathParams(path$$1, print), "}}"]),
- indent$5(concat$6([hardline$5, path$$1.call(print, "program")]))
- ]);
- }
- /**
- * I want this boolean to be: if params are going to cause a break,
- * not that it has params.
- */
- const hasParams = n.params.length > 0 || n.hash.pairs.length > 0;
- const hasChildren = n.program.body.length > 0;
- return concat$6([
- printOpenBlock(path$$1, print),
- group$3(
- concat$6([
- indent$5(concat$6([softline$4, path$$1.call(print, "program")])),
- hasParams && hasChildren ? hardline$5 : "",
- printCloseBlock(path$$1, print)
- ])
- )
- ]);
- }
- case "ElementModifierStatement":
- case "MustacheStatement": {
- const pp = path$$1.getParentNode(1);
- const isConcat = pp && pp.type === "ConcatStatement";
- return group$3(
- concat$6([
- /*n.escaped ? "{{{" : */ "{{",
- printPathParams(path$$1, print),
- isConcat ? "" : softline$4,
- /*.escaped ? "}}}" :*/ "}}"
- ])
- );
- }
- case "SubExpression": {
- return group$3(
- concat$6([
- "(",
- printPath(path$$1, print),
- indent$5(concat$6([line$3, group$3(join$5(line$3, getParams(path$$1, print)))])),
- softline$4,
- ")"
- ])
- );
- }
- case "AttrNode": {
- const quote = n.value.type === "TextNode" ? '"' : "";
- return concat$6([n.name, "=", quote, path$$1.call(print, "value"), quote]);
- }
- case "ConcatStatement": {
- return concat$6([
- '"',
- group$3(
- indent$5(
- join$5(
- softline$4,
- path$$1
- .map(partPath => print(partPath), "parts")
- .filter(a => a !== "")
- )
- )
- ),
- '"'
- ]);
- }
- case "Hash": {
- return concat$6([join$5(line$3, path$$1.map(print, "pairs"))]);
- }
- case "HashPair": {
- return concat$6([n.key, "=", path$$1.call(print, "value")]);
- }
- case "TextNode": {
- return n.chars.replace(/^\s+/, "").replace(/\s+$/, "");
- }
- case "MustacheCommentStatement": {
- const dashes = n.value.indexOf("}}") > -1 ? "--" : "";
- return concat$6(["{{!", dashes, n.value, dashes, "}}"]);
- }
- case "PathExpression": {
- return n.original;
- }
- case "BooleanLiteral": {
- return String(n.value);
- }
- case "CommentStatement": {
- return concat$6(["<!--", n.value, "-->"]);
- }
- case "StringLiteral": {
- return `"${n.value}"`;
- }
- case "NumberLiteral": {
- return String(n.value);
- }
- case "UndefinedLiteral": {
- return "undefined";
- }
- case "NullLiteral": {
- return "null";
- }
- /* istanbul ignore next */
- default:
- throw new Error("unknown glimmer type: " + JSON.stringify(n.type));
- }
- }
- function printPath(path$$1, print) {
- return path$$1.call(print, "path");
- }
- function getParams(path$$1, print) {
- const node = path$$1.getValue();
- let parts = [];
- if (node.params.length > 0) {
- parts = parts.concat(path$$1.map(print, "params"));
- }
- if (node.hash && node.hash.pairs.length > 0) {
- parts.push(path$$1.call(print, "hash"));
- }
- return parts;
- }
- function printPathParams(path$$1, print) {
- let parts = [];
- parts.push(printPath(path$$1, print));
- parts = parts.concat(getParams(path$$1, print));
- return indent$5(group$3(join$5(line$3, parts)));
- }
- function printBlockParams(path$$1) {
- const block = path$$1.getValue();
- if (!block.program || !block.program.blockParams.length) {
- return "";
- }
- return concat$6([" as |", block.program.blockParams.join(" "), "|"]);
- }
- function printOpenBlock(path$$1, print) {
- return group$3(
- concat$6([
- "{{#",
- printPathParams(path$$1, print),
- printBlockParams(path$$1, print),
- softline$4,
- "}}"
- ])
- );
- }
- function printCloseBlock(path$$1, print) {
- return concat$6(["{{/", path$$1.call(print, "path"), "}}"]);
- }
- function clean$4(ast, newObj) {
- // (Glimmer/HTML) ignore TextNode whitespace
- if (ast.type === "TextNode") {
- if (ast.chars.replace(/\s+/, "") === "") {
- return null;
- }
- newObj.chars = ast.chars.replace(/^\s+/, "").replace(/\s+$/, "");
- }
- }
- var printerGlimmer = {
- print,
- massageAstNode: clean$4
- };
- // Based on:
- // https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
- const languages$2 = [
- {
- type: "markup",
- group: "HTML",
- aliases: ["hbs", "htmlbars"],
- extensions: [".handlebars", ".hbs"],
- tm_scope: "text.html.handlebars",
- ace_mode: "handlebars",
- language_id: 155,
- since: null // unreleased
- }
- ];
- const parsers$2 = {
- glimmer: {
- get parse() {
- return require("./parser-glimmer");
- },
- astFormat: "glimmer",
- locEnd: function(node) {
- return node.loc && node.loc.end;
- },
- locStart: function(node) {
- return node.loc && node.loc.start;
- }
- }
- };
- const printers$2 = {
- glimmer: printerGlimmer
- };
- var languageHandlebars = {
- languages: languages$2,
- parsers: parsers$2,
- printers: printers$2
- };
- const docBuilders$7 = doc.builders;
- const concat$7 = docBuilders$7.concat;
- const join$6 = docBuilders$7.join;
- const hardline$6 = docBuilders$7.hardline;
- const line$4 = docBuilders$7.line;
- const softline$5 = docBuilders$7.softline;
- const group$4 = docBuilders$7.group;
- const indent$6 = docBuilders$7.indent;
- const ifBreak$3 = docBuilders$7.ifBreak;
- function genericPrint$2(path$$1, options, print) {
- const n = path$$1.getValue();
- if (!n) {
- return "";
- }
- if (typeof n === "string") {
- return n;
- }
- switch (n.kind) {
- case "Document": {
- return concat$7([
- join$6(concat$7([hardline$6, hardline$6]), path$$1.map(print, "definitions")),
- hardline$6
- ]);
- }
- case "OperationDefinition": {
- const hasOperation = options.originalText[options.locStart(n)] !== "{";
- const hasName = !!n.name;
- return concat$7([
- hasOperation ? n.operation : "",
- hasOperation && hasName ? concat$7([" ", path$$1.call(print, "name")]) : "",
- n.variableDefinitions && n.variableDefinitions.length
- ? group$4(
- concat$7([
- "(",
- indent$6(
- concat$7([
- softline$5,
- join$6(
- concat$7([ifBreak$3("", ", "), softline$5]),
- path$$1.map(print, "variableDefinitions")
- )
- ])
- ),
- softline$5,
- ")"
- ])
- )
- : "",
- printDirectives(path$$1, print, n),
- n.selectionSet ? (!hasOperation && !hasName ? "" : " ") : "",
- path$$1.call(print, "selectionSet")
- ]);
- }
- case "FragmentDefinition": {
- return concat$7([
- "fragment ",
- path$$1.call(print, "name"),
- " on ",
- path$$1.call(print, "typeCondition"),
- printDirectives(path$$1, print, n),
- " ",
- path$$1.call(print, "selectionSet")
- ]);
- }
- case "SelectionSet": {
- return concat$7([
- "{",
- indent$6(
- concat$7([
- hardline$6,
- join$6(
- hardline$6,
- path$$1.call(
- selectionsPath => printSequence(selectionsPath, options, print),
- "selections"
- )
- )
- ])
- ),
- hardline$6,
- "}"
- ]);
- }
- case "Field": {
- return group$4(
- concat$7([
- n.alias ? concat$7([path$$1.call(print, "alias"), ": "]) : "",
- path$$1.call(print, "name"),
- n.arguments.length > 0
- ? group$4(
- concat$7([
- "(",
- indent$6(
- concat$7([
- softline$5,
- join$6(
- concat$7([ifBreak$3("", ", "), softline$5]),
- path$$1.call(
- argsPath => printSequence(argsPath, options, print),
- "arguments"
- )
- )
- ])
- ),
- softline$5,
- ")"
- ])
- )
- : "",
- printDirectives(path$$1, print, n),
- n.selectionSet ? " " : "",
- path$$1.call(print, "selectionSet")
- ])
- );
- }
- case "Name": {
- return n.value;
- }
- case "StringValue": {
- if (n.block) {
- return concat$7([
- '"""',
- hardline$6,
- join$6(hardline$6, n.value.replace(/"""/g, "\\$&").split("\n")),
- hardline$6,
- '"""'
- ]);
- }
- return concat$7(['"', n.value.replace(/["\\]/g, "\\$&"), '"']);
- }
- case "IntValue":
- case "FloatValue":
- case "EnumValue": {
- return n.value;
- }
- case "BooleanValue": {
- return n.value ? "true" : "false";
- }
- case "NullValue": {
- return "null";
- }
- case "Variable": {
- return concat$7(["$", path$$1.call(print, "name")]);
- }
- case "ListValue": {
- return group$4(
- concat$7([
- "[",
- indent$6(
- concat$7([
- softline$5,
- join$6(
- concat$7([ifBreak$3("", ", "), softline$5]),
- path$$1.map(print, "values")
- )
- ])
- ),
- softline$5,
- "]"
- ])
- );
- }
- case "ObjectValue": {
- return group$4(
- concat$7([
- "{",
- options.bracketSpacing && n.fields.length > 0 ? " " : "",
- indent$6(
- concat$7([
- softline$5,
- join$6(
- concat$7([ifBreak$3("", ", "), softline$5]),
- path$$1.map(print, "fields")
- )
- ])
- ),
- softline$5,
- ifBreak$3("", options.bracketSpacing && n.fields.length > 0 ? " " : ""),
- "}"
- ])
- );
- }
- case "ObjectField":
- case "Argument": {
- return concat$7([
- path$$1.call(print, "name"),
- ": ",
- path$$1.call(print, "value")
- ]);
- }
- case "Directive": {
- return concat$7([
- "@",
- path$$1.call(print, "name"),
- n.arguments.length > 0
- ? group$4(
- concat$7([
- "(",
- indent$6(
- concat$7([
- softline$5,
- join$6(
- concat$7([ifBreak$3("", ", "), softline$5]),
- path$$1.call(
- argsPath => printSequence(argsPath, options, print),
- "arguments"
- )
- )
- ])
- ),
- softline$5,
- ")"
- ])
- )
- : ""
- ]);
- }
- case "NamedType": {
- return path$$1.call(print, "name");
- }
- case "VariableDefinition": {
- return concat$7([
- path$$1.call(print, "variable"),
- ": ",
- path$$1.call(print, "type"),
- n.defaultValue ? concat$7([" = ", path$$1.call(print, "defaultValue")]) : ""
- ]);
- }
- case "TypeExtensionDefinition": {
- return concat$7(["extend ", path$$1.call(print, "definition")]);
- }
- case "ObjectTypeExtension":
- case "ObjectTypeDefinition": {
- return concat$7([
- path$$1.call(print, "description"),
- n.description ? hardline$6 : "",
- n.kind === "ObjectTypeExtension" ? "extend " : "",
- "type ",
- path$$1.call(print, "name"),
- n.interfaces.length > 0
- ? concat$7([
- " implements ",
- join$6(
- determineInterfaceSeparator(
- options.originalText.substr(
- options.locStart(n),
- options.locEnd(n)
- )
- ),
- path$$1.map(print, "interfaces")
- )
- ])
- : "",
- printDirectives(path$$1, print, n),
- n.fields.length > 0
- ? concat$7([
- " {",
- indent$6(
- concat$7([
- hardline$6,
- join$6(
- hardline$6,
- path$$1.call(
- fieldsPath => printSequence(fieldsPath, options, print),
- "fields"
- )
- )
- ])
- ),
- hardline$6,
- "}"
- ])
- : ""
- ]);
- }
- case "FieldDefinition": {
- return concat$7([
- path$$1.call(print, "description"),
- n.description ? hardline$6 : "",
- path$$1.call(print, "name"),
- n.arguments.length > 0
- ? group$4(
- concat$7([
- "(",
- indent$6(
- concat$7([
- softline$5,
- join$6(
- concat$7([ifBreak$3("", ", "), softline$5]),
- path$$1.call(
- argsPath => printSequence(argsPath, options, print),
- "arguments"
- )
- )
- ])
- ),
- softline$5,
- ")"
- ])
- )
- : "",
- ": ",
- path$$1.call(print, "type"),
- printDirectives(path$$1, print, n)
- ]);
- }
- case "DirectiveDefinition": {
- return concat$7([
- path$$1.call(print, "description"),
- n.description ? hardline$6 : "",
- "directive ",
- "@",
- path$$1.call(print, "name"),
- n.arguments.length > 0
- ? group$4(
- concat$7([
- "(",
- indent$6(
- concat$7([
- softline$5,
- join$6(
- concat$7([ifBreak$3("", ", "), softline$5]),
- path$$1.call(
- argsPath => printSequence(argsPath, options, print),
- "arguments"
- )
- )
- ])
- ),
- softline$5,
- ")"
- ])
- )
- : "",
- concat$7([" on ", join$6(" | ", path$$1.map(print, "locations"))])
- ]);
- }
- case "EnumTypeExtension":
- case "EnumTypeDefinition": {
- return concat$7([
- path$$1.call(print, "description"),
- n.description ? hardline$6 : "",
- n.kind === "EnumTypeExtension" ? "extend " : "",
- "enum ",
- path$$1.call(print, "name"),
- printDirectives(path$$1, print, n),
- n.values.length > 0
- ? concat$7([
- " {",
- indent$6(
- concat$7([
- hardline$6,
- join$6(
- hardline$6,
- path$$1.call(
- valuesPath => printSequence(valuesPath, options, print),
- "values"
- )
- )
- ])
- ),
- hardline$6,
- "}"
- ])
- : ""
- ]);
- }
- case "EnumValueDefinition": {
- return concat$7([
- path$$1.call(print, "description"),
- n.description ? hardline$6 : "",
- path$$1.call(print, "name"),
- printDirectives(path$$1, print, n)
- ]);
- }
- case "InputValueDefinition": {
- return concat$7([
- path$$1.call(print, "description"),
- n.description ? (n.description.block ? hardline$6 : line$4) : "",
- path$$1.call(print, "name"),
- ": ",
- path$$1.call(print, "type"),
- n.defaultValue ? concat$7([" = ", path$$1.call(print, "defaultValue")]) : "",
- printDirectives(path$$1, print, n)
- ]);
- }
- case "InputObjectTypeExtension":
- case "InputObjectTypeDefinition": {
- return concat$7([
- path$$1.call(print, "description"),
- n.description ? hardline$6 : "",
- n.kind === "InputObjectTypeExtension" ? "extend " : "",
- "input ",
- path$$1.call(print, "name"),
- printDirectives(path$$1, print, n),
- n.fields.length > 0
- ? concat$7([
- " {",
- indent$6(
- concat$7([
- hardline$6,
- join$6(
- hardline$6,
- path$$1.call(
- fieldsPath => printSequence(fieldsPath, options, print),
- "fields"
- )
- )
- ])
- ),
- hardline$6,
- "}"
- ])
- : ""
- ]);
- }
- case "SchemaDefinition": {
- return concat$7([
- "schema",
- printDirectives(path$$1, print, n),
- " {",
- n.operationTypes.length > 0
- ? indent$6(
- concat$7([
- hardline$6,
- join$6(
- hardline$6,
- path$$1.call(
- opsPath => printSequence(opsPath, options, print),
- "operationTypes"
- )
- )
- ])
- )
- : "",
- hardline$6,
- "}"
- ]);
- }
- case "OperationTypeDefinition": {
- return concat$7([
- path$$1.call(print, "operation"),
- ": ",
- path$$1.call(print, "type")
- ]);
- }
- case "InterfaceTypeExtension":
- case "InterfaceTypeDefinition": {
- return concat$7([
- path$$1.call(print, "description"),
- n.description ? hardline$6 : "",
- n.kind === "InterfaceTypeExtension" ? "extend " : "",
- "interface ",
- path$$1.call(print, "name"),
- printDirectives(path$$1, print, n),
- n.fields.length > 0
- ? concat$7([
- " {",
- indent$6(
- concat$7([
- hardline$6,
- join$6(
- hardline$6,
- path$$1.call(
- fieldsPath => printSequence(fieldsPath, options, print),
- "fields"
- )
- )
- ])
- ),
- hardline$6,
- "}"
- ])
- : ""
- ]);
- }
- case "FragmentSpread": {
- return concat$7([
- "...",
- path$$1.call(print, "name"),
- printDirectives(path$$1, print, n)
- ]);
- }
- case "InlineFragment": {
- return concat$7([
- "...",
- n.typeCondition
- ? concat$7([" on ", path$$1.call(print, "typeCondition")])
- : "",
- printDirectives(path$$1, print, n),
- " ",
- path$$1.call(print, "selectionSet")
- ]);
- }
- case "UnionTypeExtension":
- case "UnionTypeDefinition": {
- return group$4(
- concat$7([
- path$$1.call(print, "description"),
- n.description ? hardline$6 : "",
- group$4(
- concat$7([
- n.kind === "UnionTypeExtension" ? "extend " : "",
- "union ",
- path$$1.call(print, "name"),
- printDirectives(path$$1, print, n),
- n.types.length > 0
- ? concat$7([
- " =",
- ifBreak$3("", " "),
- indent$6(
- concat$7([
- ifBreak$3(concat$7([line$4, " "])),
- join$6(concat$7([line$4, "| "]), path$$1.map(print, "types"))
- ])
- )
- ])
- : ""
- ])
- )
- ])
- );
- }
- case "ScalarTypeExtension":
- case "ScalarTypeDefinition": {
- return concat$7([
- path$$1.call(print, "description"),
- n.description ? hardline$6 : "",
- n.kind === "ScalarTypeExtension" ? "extend " : "",
- "scalar ",
- path$$1.call(print, "name"),
- printDirectives(path$$1, print, n)
- ]);
- }
- case "NonNullType": {
- return concat$7([path$$1.call(print, "type"), "!"]);
- }
- case "ListType": {
- return concat$7(["[", path$$1.call(print, "type"), "]"]);
- }
- default:
- /* istanbul ignore next */
- throw new Error("unknown graphql type: " + JSON.stringify(n.kind));
- }
- }
- function printDirectives(path$$1, print, n) {
- if (n.directives.length === 0) {
- return "";
- }
- return concat$7([
- " ",
- group$4(
- indent$6(
- concat$7([
- softline$5,
- join$6(
- concat$7([ifBreak$3("", " "), softline$5]),
- path$$1.map(print, "directives")
- )
- ])
- )
- )
- ]);
- }
- function printSequence(sequencePath, options, print) {
- const count = sequencePath.getValue().length;
- return sequencePath.map((path$$1, i) => {
- const printed = print(path$$1);
- if (
- utilShared.isNextLineEmpty(
- options.originalText,
- path$$1.getValue(),
- options
- ) &&
- i < count - 1
- ) {
- return concat$7([printed, hardline$6]);
- }
- return printed;
- });
- }
- function canAttachComment$1(node) {
- return node.kind && node.kind !== "Comment";
- }
- function printComment$2(commentPath) {
- const comment = commentPath.getValue();
- switch (comment.kind) {
- case "Comment":
- return "#" + comment.value.trimRight();
- default:
- throw new Error("Not a comment: " + JSON.stringify(comment));
- }
- }
- function determineInterfaceSeparator(originalSource) {
- const start = originalSource.indexOf("implements");
- if (start === -1) {
- throw new Error("Must implement interfaces: " + originalSource);
- }
- let end = originalSource.indexOf("{");
- if (end === -1) {
- end = originalSource.length;
- }
- return originalSource.substr(start, end).includes("&") ? " & " : ", ";
- }
- var printerGraphql = {
- print: genericPrint$2,
- hasPrettierIgnore: util$1.hasIgnoreComment,
- printComment: printComment$2,
- canAttachComment: canAttachComment$1
- };
- // format based on https://github.com/prettier/prettier/blob/master/src/common/support.js
- var options$5 = {
- bracketSpacing: options.bracketSpacing
- };
- // Based on:
- // https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
- const languages$3 = [
- {
- name: "GraphQL",
- since: "1.5.0",
- parsers: ["graphql"],
- extensions: [".graphql", ".gql"],
- tmScope: "source.graphql",
- aceMode: "text",
- liguistLanguageId: 139,
- vscodeLanguageIds: ["graphql"]
- }
- ];
- const parsers$3 = {
- graphql: {
- get parse() {
- return require("./parser-graphql");
- },
- astFormat: "graphql",
- locStart: function(node) {
- if (typeof node.start === "number") {
- return node.start;
- }
- return node.loc && node.loc.start;
- },
- locEnd: function(node) {
- if (typeof node.end === "number") {
- return node.end;
- }
- return node.loc && node.loc.end;
- }
- }
- };
- const printers$3 = {
- graphql: printerGraphql
- };
- var languageGraphql = {
- languages: languages$3,
- options: options$5,
- parsers: parsers$3,
- printers: printers$3
- };
- const docBuilders$9 = doc.builders;
- const hardline$8 = docBuilders$9.hardline;
- const literalline$3 = docBuilders$9.literalline;
- const concat$9 = docBuilders$9.concat;
- const markAsRoot$1 = docBuilders$9.markAsRoot;
- function embed$2(path$$1, print, textToDoc, options) {
- const node = path$$1.getValue();
- if (node.type === "code" && node.lang !== null) {
- // only look for the first string so as to support [markdown-preview-enhanced](https://shd101wyy.github.io/markdown-preview-enhanced/#/code-chunk)
- const lang = node.lang.split(/\s/, 1)[0];
- const parser = getParserName(lang);
- if (parser) {
- const styleUnit = options.__inJsTemplate ? "~" : "`";
- const style = styleUnit.repeat(
- Math.max(3, util$1.getMaxContinuousCount(node.value, styleUnit) + 1)
- );
- const doc$$2 = textToDoc(node.value, { parser });
- return markAsRoot$1(
- concat$9([
- style,
- node.lang,
- hardline$8,
- replaceNewlinesWithLiterallines(doc$$2),
- style
- ])
- );
- }
- }
- return null;
- function getParserName(lang) {
- const supportInfo = support.getSupportInfo(null, {
- plugins: options.plugins,
- pluginsLoaded: true
- });
- const language = supportInfo.languages.find(
- language =>
- language.name.toLowerCase() === lang ||
- (language.extensions &&
- language.extensions.find(ext => ext.substring(1) === lang))
- );
- if (language) {
- return language.parsers[0];
- }
- return null;
- }
- function replaceNewlinesWithLiterallines(doc$$2) {
- return docUtils.mapDoc(
- doc$$2,
- currentDoc =>
- typeof currentDoc === "string" && currentDoc.includes("\n")
- ? concat$9(
- currentDoc
- .split(/(\n)/g)
- .map((v, i) => (i % 2 === 0 ? v : literalline$3))
- )
- : currentDoc
- );
- }
- }
- var embed_1$2 = embed$2;
- var pragma$2 = createCommonjsModule(function (module) {
- "use strict";
- const pragmas = ["format", "prettier"];
- function startWithPragma(text) {
- const pragma = `@(${pragmas.join("|")})`;
- const regex = new RegExp(
- [
- `<!--\\s*${pragma}\\s*-->`,
- `<!--.*\n[\\s\\S]*(^|\n)[^\\S\n]*${pragma}[^\\S\n]*($|\n)[\\s\\S]*\n.*-->`
- ].join("|"),
- "m"
- );
- const matched = text.match(regex);
- return matched && matched.index === 0;
- }
- function extract(text) {
- // yaml (---) and toml (+++)
- const matched = text.match(
- /^((---|\+\+\+)(?:\n[\s\S]*?\n|\n)\2(?:\n|$))?([\s\S]*)/
- );
- const frontMatter = matched[1];
- const mainContent = matched[3];
- return { frontMatter, mainContent };
- }
- module.exports = {
- startWithPragma,
- hasPragma: text => startWithPragma(extract(text).mainContent.trimLeft()),
- insertPragma: text => {
- const extracted = extract(text);
- const pragma = `<!-- @${pragmas[0]} -->`;
- return extracted.frontMatter
- ? `${extracted.frontMatter}\n\n${pragma}\n\n${extracted.mainContent}`
- : `${pragma}\n\n${extracted.mainContent}`;
- }
- };
- });
- const docBuilders$8 = doc.builders;
- const concat$8 = docBuilders$8.concat;
- const join$7 = docBuilders$8.join;
- const line$5 = docBuilders$8.line;
- const hardline$7 = docBuilders$8.hardline;
- const softline$6 = docBuilders$8.softline;
- const fill$4 = docBuilders$8.fill;
- const align$2 = docBuilders$8.align;
- const group$5 = docBuilders$8.group;
- const printDocToString$2 = doc.printer.printDocToString;
- const SINGLE_LINE_NODE_TYPES = ["heading", "tableCell", "link"];
- const SIBLING_NODE_TYPES = ["listItem", "definition", "footnoteDefinition"];
- const INLINE_NODE_TYPES = [
- "inlineCode",
- "emphasis",
- "strong",
- "delete",
- "link",
- "linkReference",
- "image",
- "imageReference",
- "footnote",
- "footnoteReference",
- "sentence",
- "whitespace",
- "word",
- "break"
- ];
- const INLINE_NODE_WRAPPER_TYPES = INLINE_NODE_TYPES.concat([
- "tableCell",
- "paragraph",
- "heading"
- ]);
- function genericPrint$3(path$$1, options, print) {
- const node = path$$1.getValue();
- if (shouldRemainTheSameContent(path$$1)) {
- return concat$8(
- util$1
- .splitText(
- options.originalText.slice(
- node.position.start.offset,
- node.position.end.offset
- )
- )
- .map(
- node =>
- node.type === "word"
- ? node.value
- : node.value === ""
- ? ""
- : printLine(path$$1, node.value, options)
- )
- );
- }
- switch (node.type) {
- case "root":
- return concat$8([normalizeDoc(printRoot(path$$1, options, print)), hardline$7]);
- case "paragraph":
- return printChildren(path$$1, options, print, {
- postprocessor: fill$4
- });
- case "sentence":
- return printChildren(path$$1, options, print);
- case "word":
- return node.value
- .replace(/[*]/g, "\\*") // escape all `*`
- .replace(
- new RegExp(
- [
- `(^|[${util$1.punctuationCharRange}])(_+)`,
- `(_+)([${util$1.punctuationCharRange}]|$)`
- ].join("|"),
- "g"
- ),
- (_, text1, underscore1, underscore2, text2) =>
- (underscore1
- ? `${text1}${underscore1}`
- : `${underscore2}${text2}`
- ).replace(/_/g, "\\_")
- ); // escape all `_` except concating with non-punctuation, e.g. `1_2_3` is not considered emphasis
- case "whitespace": {
- const parentNode = path$$1.getParentNode();
- const index = parentNode.children.indexOf(node);
- const nextNode = parentNode.children[index + 1];
- const proseWrap =
- // leading char that may cause different syntax
- nextNode && /^>|^([-+*]|#{1,6}|[0-9]+[.)])$/.test(nextNode.value)
- ? "never"
- : options.proseWrap;
- return printLine(path$$1, node.value, { proseWrap });
- }
- case "emphasis": {
- const parentNode = path$$1.getParentNode();
- const index = parentNode.children.indexOf(node);
- const prevNode = parentNode.children[index - 1];
- const nextNode = parentNode.children[index + 1];
- const hasPrevOrNextWord = // `1*2*3` is considered emphais but `1_2_3` is not
- (prevNode &&
- prevNode.type === "sentence" &&
- prevNode.children.length > 0 &&
- util$1.getLast(prevNode.children).type === "word" &&
- !util$1.getLast(prevNode.children).hasTrailingPunctuation) ||
- (nextNode &&
- nextNode.type === "sentence" &&
- nextNode.children.length > 0 &&
- nextNode.children[0].type === "word" &&
- !nextNode.children[0].hasLeadingPunctuation);
- const style =
- hasPrevOrNextWord || getAncestorNode$1(path$$1, "emphasis") ? "*" : "_";
- return concat$8([style, printChildren(path$$1, options, print), style]);
- }
- case "strong":
- return concat$8(["**", printChildren(path$$1, options, print), "**"]);
- case "delete":
- return concat$8(["~~", printChildren(path$$1, options, print), "~~"]);
- case "inlineCode": {
- const backtickCount = util$1.getMaxContinuousCount(node.value, "`");
- const style = backtickCount === 1 ? "``" : "`";
- const gap = backtickCount ? " " : "";
- return concat$8([style, gap, node.value, gap, style]);
- }
- case "link":
- switch (options.originalText[node.position.start.offset]) {
- case "<":
- return concat$8(["<", node.url, ">"]);
- case "[":
- return concat$8([
- "[",
- printChildren(path$$1, options, print),
- "](",
- printUrl(node.url, ")"),
- printTitle(node.title, options),
- ")"
- ]);
- default:
- return options.originalText.slice(
- node.position.start.offset,
- node.position.end.offset
- );
- }
- case "image":
- return concat$8([
- ""),
- printTitle(node.title, options),
- ")"
- ]);
- case "blockquote":
- return concat$8(["> ", align$2("> ", printChildren(path$$1, options, print))]);
- case "heading":
- return concat$8([
- "#".repeat(node.depth) + " ",
- printChildren(path$$1, options, print)
- ]);
- case "code": {
- if (
- // the first char may point to `\n`, e.g. `\n\t\tbar`, just ignore it
- /^\n?( {4,}|\t)/.test(
- options.originalText.slice(
- node.position.start.offset,
- node.position.end.offset
- )
- )
- ) {
- // indented code block
- const alignment = " ".repeat(4);
- return align$2(
- alignment,
- concat$8([alignment, join$7(hardline$7, node.value.split("\n"))])
- );
- }
- // fenced code block
- const styleUnit = options.__inJsTemplate ? "~" : "`";
- const style = styleUnit.repeat(
- Math.max(
- 3,
- util$1.getMaxContinuousCount(node.value, styleUnit) + 1
- )
- );
- return concat$8([
- style,
- node.lang || "",
- hardline$7,
- join$7(hardline$7, node.value.split("\n")),
- hardline$7,
- style
- ]);
- }
- case "yaml":
- case "toml": {
- const style = node.type === "yaml" ? "---" : "+++";
- return node.value
- ? concat$8([style, hardline$7, node.value, hardline$7, style])
- : concat$8([style, hardline$7, style]);
- }
- case "html": {
- const parentNode = path$$1.getParentNode();
- return replaceNewlinesWithHardlines(
- parentNode.type === "root" &&
- util$1.getLast(parentNode.children) === node
- ? node.value.trimRight()
- : node.value
- );
- }
- case "list": {
- const nthSiblingIndex = getNthListSiblingIndex(
- node,
- path$$1.getParentNode()
- );
- const isGitDiffFriendlyOrderedList =
- node.ordered &&
- node.children.length > 1 &&
- /^\s*1(\.|\))/.test(
- options.originalText.slice(
- node.children[1].position.start.offset,
- node.children[1].position.end.offset
- )
- );
- return printChildren(path$$1, options, print, {
- processor: (childPath, index) => {
- const prefix = getPrefix();
- return concat$8([
- prefix,
- align$2(
- " ".repeat(prefix.length),
- printListItem(childPath, options, print, prefix)
- )
- ]);
- function getPrefix() {
- const rawPrefix = node.ordered
- ? (index === 0
- ? node.start
- : isGitDiffFriendlyOrderedList
- ? 1
- : node.start + index) +
- (nthSiblingIndex % 2 === 0 ? ". " : ") ")
- : nthSiblingIndex % 2 === 0
- ? "* "
- : "- ";
- // do not print trailing spaces for empty list item since it might be treated as `break` node
- // by [doc-printer](https://github.com/prettier/prettier/blob/1.10.2/src/doc/doc-printer.js#L395-L405),
- // we don't want to preserve unnecessary trailing spaces.
- const listItem = childPath.getValue();
- return listItem.children.length
- ? alignListPrefix(rawPrefix, options)
- : rawPrefix;
- }
- }
- });
- }
- case "thematicBreak": {
- const counter = getAncestorCounter$1(path$$1, "list");
- if (counter === -1) {
- return "---";
- }
- const nthSiblingIndex = getNthListSiblingIndex(
- path$$1.getParentNode(counter),
- path$$1.getParentNode(counter + 1)
- );
- return nthSiblingIndex % 2 === 0 ? "---" : "***";
- }
- case "linkReference":
- return concat$8([
- "[",
- printChildren(path$$1, options, print),
- "]",
- node.referenceType === "full"
- ? concat$8(["[", node.identifier, "]"])
- : node.referenceType === "collapsed"
- ? "[]"
- : ""
- ]);
- case "imageReference":
- switch (node.referenceType) {
- case "full":
- return concat$8(["![", node.alt || "", "][", node.identifier, "]"]);
- default:
- return concat$8([
- "![",
- node.alt,
- "]",
- node.referenceType === "collapsed" ? "[]" : ""
- ]);
- }
- case "definition":
- return concat$8([
- "[",
- node.identifier,
- "]: ",
- printUrl(node.url),
- printTitle(node.title, options)
- ]);
- case "footnote":
- return concat$8(["[^", printChildren(path$$1, options, print), "]"]);
- case "footnoteReference":
- return concat$8(["[^", node.identifier, "]"]);
- case "footnoteDefinition": {
- const nextNode = path$$1.getParentNode().children[path$$1.getName() + 1];
- return concat$8([
- "[^",
- node.identifier,
- "]: ",
- group$5(
- concat$8([
- align$2(
- " ".repeat(options.tabWidth),
- printChildren(path$$1, options, print, {
- processor: (childPath, index) =>
- index === 0
- ? group$5(concat$8([softline$6, softline$6, childPath.call(print)]))
- : childPath.call(print)
- })
- ),
- nextNode && nextNode.type === "footnoteDefinition" ? softline$6 : ""
- ])
- )
- ]);
- }
- case "table":
- return printTable(path$$1, options, print);
- case "tableCell":
- return printChildren(path$$1, options, print);
- case "break":
- return concat$8([
- /\s/.test(options.originalText[node.position.start.offset])
- ? " "
- : "\\",
- hardline$7
- ]);
- case "tableRow": // handled in "table"
- case "listItem": // handled in "list"
- default:
- throw new Error(`Unknown markdown type ${JSON.stringify(node.type)}`);
- }
- }
- function printListItem(path$$1, options, print, listPrefix) {
- const node = path$$1.getValue();
- const prefix = node.checked === null ? "" : node.checked ? "[x] " : "[ ] ";
- return concat$8([
- prefix,
- printChildren(path$$1, options, print, {
- processor: (childPath, index) => {
- if (index === 0 && childPath.getValue().type !== "list") {
- return align$2(" ".repeat(prefix.length), childPath.call(print));
- }
- const alignment = " ".repeat(
- clamp(options.tabWidth - listPrefix.length, 0, 3) // 4+ will cause indented code block
- );
- return concat$8([alignment, align$2(alignment, childPath.call(print))]);
- }
- })
- ]);
- }
- function alignListPrefix(prefix, options) {
- const additionalSpaces = getAdditionalSpaces();
- return (
- prefix +
- " ".repeat(
- additionalSpaces >= 4 ? 0 : additionalSpaces // 4+ will cause indented code block
- )
- );
- function getAdditionalSpaces() {
- const restSpaces = prefix.length % options.tabWidth;
- return restSpaces === 0 ? 0 : options.tabWidth - restSpaces;
- }
- }
- function getNthListSiblingIndex(node, parentNode) {
- return getNthSiblingIndex(
- node,
- parentNode,
- siblingNode => siblingNode.ordered === node.ordered
- );
- }
- function replaceNewlinesWithHardlines(str) {
- return join$7(hardline$7, str.split("\n"));
- }
- function getNthSiblingIndex(node, parentNode, condition) {
- condition = condition || (() => true);
- let index = -1;
- for (const childNode of parentNode.children) {
- if (childNode.type === node.type && condition(childNode)) {
- index++;
- } else {
- index = -1;
- }
- if (childNode === node) {
- return index;
- }
- }
- }
- function getAncestorCounter$1(path$$1, typeOrTypes) {
- const types = [].concat(typeOrTypes);
- let counter = -1;
- let ancestorNode;
- while ((ancestorNode = path$$1.getParentNode(++counter))) {
- if (types.indexOf(ancestorNode.type) !== -1) {
- return counter;
- }
- }
- return -1;
- }
- function getAncestorNode$1(path$$1, typeOrTypes) {
- const counter = getAncestorCounter$1(path$$1, typeOrTypes);
- return counter === -1 ? null : path$$1.getParentNode(counter);
- }
- function printLine(path$$1, value, options) {
- if (options.proseWrap === "preserve" && value === "\n") {
- return hardline$7;
- }
- const isBreakable =
- options.proseWrap === "always" &&
- !getAncestorNode$1(path$$1, SINGLE_LINE_NODE_TYPES);
- return value !== ""
- ? isBreakable
- ? line$5
- : " "
- : isBreakable
- ? softline$6
- : "";
- }
- function printTable(path$$1, options, print) {
- const node = path$$1.getValue();
- const contents = []; // { [rowIndex: number]: { [columnIndex: number]: string } }
- path$$1.map(rowPath => {
- const rowContents = [];
- rowPath.map(cellPath => {
- rowContents.push(
- printDocToString$2(cellPath.call(print), options).formatted
- );
- }, "children");
- contents.push(rowContents);
- }, "children");
- const columnMaxWidths = contents.reduce(
- (currentWidths, rowContents) =>
- currentWidths.map((width, columnIndex) =>
- Math.max(width, util$1.getStringWidth(rowContents[columnIndex]))
- ),
- contents[0].map(() => 3) // minimum width = 3 (---, :--, :-:, --:)
- );
- return join$7(hardline$7, [
- printRow(contents[0]),
- printSeparator(),
- join$7(hardline$7, contents.slice(1).map(printRow))
- ]);
- function printSeparator() {
- return concat$8([
- "| ",
- join$7(
- " | ",
- columnMaxWidths.map((width, index) => {
- switch (node.align[index]) {
- case "left":
- return ":" + "-".repeat(width - 1);
- case "right":
- return "-".repeat(width - 1) + ":";
- case "center":
- return ":" + "-".repeat(width - 2) + ":";
- default:
- return "-".repeat(width);
- }
- })
- ),
- " |"
- ]);
- }
- function printRow(rowContents) {
- return concat$8([
- "| ",
- join$7(
- " | ",
- rowContents.map((rowContent, columnIndex) => {
- switch (node.align[columnIndex]) {
- case "right":
- return alignRight(rowContent, columnMaxWidths[columnIndex]);
- case "center":
- return alignCenter(rowContent, columnMaxWidths[columnIndex]);
- default:
- return alignLeft(rowContent, columnMaxWidths[columnIndex]);
- }
- })
- ),
- " |"
- ]);
- }
- function alignLeft(text, width) {
- return concat$8([text, " ".repeat(width - util$1.getStringWidth(text))]);
- }
- function alignRight(text, width) {
- return concat$8([" ".repeat(width - util$1.getStringWidth(text)), text]);
- }
- function alignCenter(text, width) {
- const spaces = width - util$1.getStringWidth(text);
- const left = Math.floor(spaces / 2);
- const right = spaces - left;
- return concat$8([" ".repeat(left), text, " ".repeat(right)]);
- }
- }
- function printRoot(path$$1, options, print) {
- /** @typedef {{ index: number, offset: number }} IgnorePosition */
- /** @type {Array<{start: IgnorePosition, end: IgnorePosition}>} */
- const ignoreRanges = [];
- /** @type {IgnorePosition | null} */
- let ignoreStart = null;
- const children = path$$1.getValue().children;
- children.forEach((childNode, index) => {
- switch (isPrettierIgnore(childNode)) {
- case "start":
- if (ignoreStart === null) {
- ignoreStart = { index, offset: childNode.position.end.offset };
- }
- break;
- case "end":
- if (ignoreStart !== null) {
- ignoreRanges.push({
- start: ignoreStart,
- end: { index, offset: childNode.position.start.offset }
- });
- ignoreStart = null;
- }
- break;
- default:
- // do nothing
- break;
- }
- });
- return printChildren(path$$1, options, print, {
- processor: (childPath, index) => {
- if (ignoreRanges.length !== 0) {
- const ignoreRange = ignoreRanges[0];
- if (index === ignoreRange.start.index) {
- return concat$8([
- children[ignoreRange.start.index].value,
- options.originalText.slice(
- ignoreRange.start.offset,
- ignoreRange.end.offset
- ),
- children[ignoreRange.end.index].value
- ]);
- }
- if (ignoreRange.start.index < index && index < ignoreRange.end.index) {
- return false;
- }
- if (index === ignoreRange.end.index) {
- ignoreRanges.shift();
- return false;
- }
- }
- return childPath.call(print);
- }
- });
- }
- function printChildren(path$$1, options, print, events) {
- events = events || {};
- const postprocessor = events.postprocessor || concat$8;
- const processor = events.processor || (childPath => childPath.call(print));
- const node = path$$1.getValue();
- const parts = [];
- let lastChildNode;
- path$$1.map((childPath, index) => {
- const childNode = childPath.getValue();
- const result = processor(childPath, index);
- if (result !== false) {
- const data = {
- parts,
- prevNode: lastChildNode,
- parentNode: node,
- options
- };
- if (!shouldNotPrePrintHardline(childNode, data)) {
- parts.push(hardline$7);
- if (
- shouldPrePrintDoubleHardline(childNode, data) ||
- shouldPrePrintTripleHardline(childNode, data)
- ) {
- parts.push(hardline$7);
- }
- if (shouldPrePrintTripleHardline(childNode, data)) {
- parts.push(hardline$7);
- }
- }
- parts.push(result);
- lastChildNode = childNode;
- }
- }, "children");
- return postprocessor(parts);
- }
- /** @return {false | 'next' | 'start' | 'end'} */
- function isPrettierIgnore(node) {
- if (node.type !== "html") {
- return false;
- }
- const match = node.value.match(
- /^<!--\s*prettier-ignore(?:-(start|end))?\s*-->$/
- );
- return match === null ? false : match[1] ? match[1] : "next";
- }
- function shouldNotPrePrintHardline(node, data) {
- const isFirstNode = data.parts.length === 0;
- const isInlineNode = INLINE_NODE_TYPES.indexOf(node.type) !== -1;
- const isInlineHTML =
- node.type === "html" &&
- INLINE_NODE_WRAPPER_TYPES.indexOf(data.parentNode.type) !== -1;
- return isFirstNode || isInlineNode || isInlineHTML;
- }
- function shouldPrePrintDoubleHardline(node, data) {
- const isSequence = (data.prevNode && data.prevNode.type) === node.type;
- const isSiblingNode =
- isSequence && SIBLING_NODE_TYPES.indexOf(node.type) !== -1;
- const isInTightListItem =
- data.parentNode.type === "listItem" && !data.parentNode.loose;
- const isPrevNodeLooseListItem =
- data.prevNode && data.prevNode.type === "listItem" && data.prevNode.loose;
- const isPrevNodePrettierIgnore = isPrettierIgnore(data.prevNode) === "next";
- return (
- isPrevNodeLooseListItem ||
- !(isSiblingNode || isInTightListItem || isPrevNodePrettierIgnore)
- );
- }
- function shouldPrePrintTripleHardline(node, data) {
- const isPrevNodeList = data.prevNode && data.prevNode.type === "list";
- const isIndentedCode =
- node.type === "code" &&
- /\s/.test(data.options.originalText[node.position.start.offset]);
- return isPrevNodeList && isIndentedCode;
- }
- function shouldRemainTheSameContent(path$$1) {
- const ancestorNode = getAncestorNode$1(path$$1, [
- "linkReference",
- "imageReference"
- ]);
- return (
- ancestorNode &&
- (ancestorNode.type !== "linkReference" ||
- ancestorNode.referenceType !== "full")
- );
- }
- function normalizeDoc(doc$$2) {
- return docUtils.mapDoc(doc$$2, currentDoc => {
- if (!currentDoc.parts) {
- return currentDoc;
- }
- if (currentDoc.type === "concat" && currentDoc.parts.length === 1) {
- return currentDoc.parts[0];
- }
- const parts = [];
- currentDoc.parts.forEach(part => {
- if (part.type === "concat") {
- parts.push.apply(parts, part.parts);
- } else if (part !== "") {
- parts.push(part);
- }
- });
- return Object.assign({}, currentDoc, {
- parts: normalizeParts(parts)
- });
- });
- }
- function printUrl(url$$1, dangerousCharOrChars) {
- const dangerousChars = [" "].concat(dangerousCharOrChars || []);
- return new RegExp(dangerousChars.map(x => `\\${x}`).join("|")).test(url$$1)
- ? `<${url$$1}>`
- : url$$1;
- }
- function printTitle(title, options) {
- if (!title) {
- return "";
- }
- if (title.includes('"') && title.includes("'") && !title.includes(")")) {
- return ` (${title})`; // avoid escaped quotes
- }
- // faster than using RegExps: https://jsperf.com/performance-of-match-vs-split
- const singleCount = title.split("'").length - 1;
- const doubleCount = title.split('"').length - 1;
- const quote =
- singleCount > doubleCount
- ? '"'
- : doubleCount > singleCount
- ? "'"
- : options.singleQuote
- ? "'"
- : '"';
- title = title.replace(new RegExp(`(${quote})`, "g"), "\\$1");
- return ` ${quote}${title}${quote}`;
- }
- function normalizeParts(parts) {
- return parts.reduce((current, part) => {
- const lastPart = util$1.getLast(current);
- if (typeof lastPart === "string" && typeof part === "string") {
- current.splice(-1, 1, lastPart + part);
- } else {
- current.push(part);
- }
- return current;
- }, []);
- }
- function clamp(value, min, max) {
- return value < min ? min : value > max ? max : value;
- }
- function clean$5(ast, newObj, parent) {
- // for codeblock
- if (ast.type === "code") {
- delete newObj.value;
- }
- // for whitespace: "\n" and " " are considered the same
- if (ast.type === "whitespace" && ast.value === "\n") {
- newObj.value = " ";
- }
- // for insert pragma
- if (
- parent &&
- parent.type === "root" &&
- (parent.children[0] === ast ||
- ((parent.children[0].type === "yaml" ||
- parent.children[0].type === "toml") &&
- parent.children[1] === ast)) &&
- ast.type === "html" &&
- pragma$2.startWithPragma(ast.value)
- ) {
- return null;
- }
- }
- function hasPrettierIgnore$1(path$$1) {
- const index = +path$$1.getName();
- if (index === 0) {
- return false;
- }
- const prevNode = path$$1.getParentNode().children[index - 1];
- return isPrettierIgnore(prevNode) === "next";
- }
- var printerMarkdown = {
- print: genericPrint$3,
- embed: embed_1$2,
- massageAstNode: clean$5,
- hasPrettierIgnore: hasPrettierIgnore$1,
- insertPragma: pragma$2.insertPragma
- };
- const CATEGORY_MARKDOWN = "Markdown";
- // format based on https://github.com/prettier/prettier/blob/master/src/common/support.js
- var options$8 = {
- proseWrap: {
- since: "1.8.2",
- category: CATEGORY_MARKDOWN,
- type: "choice",
- default: [
- { since: "1.8.2", value: true },
- { since: "1.9.0", value: "preserve" }
- ],
- description: "How to wrap prose. (markdown)",
- choices: [
- {
- since: "1.9.0",
- value: "always",
- description: "Wrap prose if it exceeds the print width."
- },
- {
- since: "1.9.0",
- value: "never",
- description: "Do not wrap prose."
- },
- {
- since: "1.9.0",
- value: "preserve",
- description: "Wrap prose as-is."
- },
- { value: false, deprecated: "1.9.0", redirect: "never" },
- { value: true, deprecated: "1.9.0", redirect: "always" }
- ]
- },
- singleQuote: options.singleQuote
- };
- // Based on:
- // https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
- const languages$4 = [
- {
- name: "Markdown",
- since: "1.8.0",
- parsers: ["remark"],
- aliases: ["pandoc"],
- aceMode: "markdown",
- codemirrorMode: "gfm",
- codemirrorMimeType: "text/x-gfm",
- wrap: true,
- extensions: [
- ".md",
- ".markdown",
- ".mdown",
- ".mdwn",
- ".mkd",
- ".mkdn",
- ".mkdown",
- ".ron",
- ".workbook"
- ],
- filenames: ["README"],
- tmScope: "source.gfm",
- linguistLanguageId: 222,
- vscodeLanguageIds: ["markdown"]
- }
- ];
- const remark = {
- get parse() {
- return require("./parser-markdown");
- },
- astFormat: "mdast",
- hasPragma: pragma$2.hasPragma,
- locStart: node => node.position.start.offset,
- locEnd: node => node.position.end.offset
- };
- const parsers$4 = {
- remark,
- // TODO: Delete this in 2.0
- markdown: remark
- };
- const printers$4 = {
- mdast: printerMarkdown
- };
- var languageMarkdown = {
- languages: languages$4,
- options: options$8,
- parsers: parsers$4,
- printers: printers$4
- };
- const docUtils$5 = doc.utils;
- const docBuilders$11 = doc.builders;
- const hardline$10 = docBuilders$11.hardline;
- const concat$11 = docBuilders$11.concat;
- function embed$4(path$$1, print, textToDoc, options) {
- const node = path$$1.getValue();
- switch (node.type) {
- case "text": {
- const parent = path$$1.getParentNode();
- // Inline JavaScript
- if (
- parent.type === "script" &&
- ((!parent.attribs.lang && !parent.attribs.lang) ||
- parent.attribs.type === "text/javascript" ||
- parent.attribs.type === "application/javascript")
- ) {
- const parser = options.parser === "flow" ? "flow" : "babylon";
- const doc$$2 = textToDoc(getText(options, node), { parser });
- return concat$11([hardline$10, doc$$2]);
- }
- // Inline TypeScript
- if (
- parent.type === "script" &&
- (parent.attribs.type === "application/x-typescript" ||
- parent.attribs.lang === "ts")
- ) {
- const doc$$2 = textToDoc(
- getText(options, node),
- { parser: "typescript" },
- options
- );
- return concat$11([hardline$10, doc$$2]);
- }
- // Inline Styles
- if (parent.type === "style") {
- const doc$$2 = textToDoc(getText(options, node), { parser: "css" });
- return concat$11([hardline$10, docUtils$5.stripTrailingHardline(doc$$2)]);
- }
- break;
- }
- case "attribute": {
- /*
- * Vue binding sytax: JS expressions
- * :class="{ 'some-key': value }"
- * v-bind:id="'list-' + id"
- * v-if="foo && !bar"
- * @click="someFunction()"
- */
- if (/(^@)|(^v-)|:/.test(node.key) && !/^\w+$/.test(node.value)) {
- const doc$$2 = textToDoc(node.value, {
- parser: parseJavaScriptExpression,
- // Use singleQuote since HTML attributes use double-quotes.
- // TODO(azz): We still need to do an entity escape on the attribute.
- singleQuote: true
- });
- return concat$11([
- node.key,
- '="',
- util$1.hasNewlineInRange(node.value, 0, node.value.length)
- ? doc$$2
- : docUtils$5.removeLines(doc$$2),
- '"'
- ]);
- }
- }
- }
- }
- function parseJavaScriptExpression(text, parsers) {
- // Force parsing as an expression
- const ast = parsers.babylon(`(${text})`);
- // Extract expression from the declaration
- return {
- type: "File",
- program: ast.program.body[0].expression
- };
- }
- function getText(options, node) {
- return options.originalText.slice(
- options.locStart(node),
- options.locEnd(node)
- );
- }
- var embed_1$4 = embed$4;
- const docBuilders$10 = doc.builders;
- const concat$10 = docBuilders$10.concat;
- const join$8 = docBuilders$10.join;
- const hardline$9 = docBuilders$10.hardline;
- const line$6 = docBuilders$10.line;
- const softline$7 = docBuilders$10.softline;
- const group$6 = docBuilders$10.group;
- const indent$7 = docBuilders$10.indent;
- // http://w3c.github.io/html/single-page.html#void-elements
- const voidTags$1 = {
- area: true,
- base: true,
- br: true,
- col: true,
- embed: true,
- hr: true,
- img: true,
- input: true,
- link: true,
- meta: true,
- param: true,
- source: true,
- track: true,
- wbr: true
- };
- function genericPrint$4(path$$1, options, print) {
- const n = path$$1.getValue();
- if (!n) {
- return "";
- }
- if (typeof n === "string") {
- return n;
- }
- switch (n.type) {
- case "root": {
- return printChildren$1(path$$1, print);
- }
- case "directive": {
- return concat$10(["<", n.data, ">", hardline$9]);
- }
- case "text": {
- return n.data.replace(/\s+/g, " ").trim();
- }
- case "script":
- case "style":
- case "tag": {
- const selfClose = voidTags$1[n.name] ? ">" : " />";
- const children = printChildren$1(path$$1, print);
- const hasNewline = util$1.hasNewlineInRange(
- options.originalText,
- options.locStart(n),
- options.locEnd(n)
- );
- return group$6(
- concat$10([
- hasNewline ? hardline$9 : "",
- "<",
- n.name,
- printAttributes(path$$1, print),
- n.children.length ? ">" : selfClose,
- n.name.toLowerCase() === "html"
- ? concat$10([hardline$9, children])
- : indent$7(children),
- n.children.length ? concat$10([softline$7, "</", n.name, ">"]) : hardline$9
- ])
- );
- }
- case "comment": {
- return concat$10(["<!-- ", n.data.trim(), " -->"]);
- }
- case "attribute": {
- if (!n.value) {
- return n.key;
- }
- return concat$10([n.key, '="', n.value, '"']);
- }
- default:
- /* istanbul ignore next */
- throw new Error("unknown htmlparser2 type: " + n.type);
- }
- }
- function printAttributes(path$$1, print) {
- const node = path$$1.getValue();
- return concat$10([
- node.attributes.length ? " " : "",
- indent$7(join$8(line$6, path$$1.map(print, "attributes")))
- ]);
- }
- function printChildren$1(path$$1, print) {
- const children = [];
- path$$1.each(childPath => {
- const child = childPath.getValue();
- if (child.type !== "text") {
- children.push(hardline$9);
- }
- children.push(childPath.call(print));
- }, "children");
- return concat$10(children);
- }
- var printerHtmlparser2 = {
- print: genericPrint$4,
- embed: embed_1$4,
- hasPrettierIgnore: util$1.hasIgnoreComment
- };
- // Based on:
- // https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
- const languages$5 = [
- {
- name: "HTML",
- since: null, // unreleased
- parsers: ["parse5"],
- group: "HTML",
- tmScope: "text.html.basic",
- aceMode: "html",
- codemirrorMode: "htmlmixed",
- codemirrorMimeType: "text/html",
- aliases: ["xhtml"],
- extensions: [".html", ".htm", ".html.hl", ".inc", ".st", ".xht", ".xhtml"],
- linguistLanguageId: 146,
- vscodeLanguageIds: ["html"]
- }
- ];
- const parsers$5 = {
- parse5: {
- get parse() {
- return require("./parser-parse5");
- },
- astFormat: "htmlparser2",
- locEnd: function(node) {
- return node.__location && node.__location.endOffset;
- },
- locStart: function(node) {
- return node.__location && node.__location.startOffset;
- }
- }
- };
- const printers$5 = {
- htmlparser2: printerHtmlparser2
- };
- var languageHtml = {
- languages: languages$5,
- parsers: parsers$5,
- printers: printers$5
- };
- const docBuilders$13 = doc.builders;
- const concat$13 = docBuilders$13.concat;
- const hardline$12 = docBuilders$13.hardline;
- function embed$6(path$$1, print, textToDoc, options) {
- const node = path$$1.getValue();
- const parent = path$$1.getParentNode();
- if (!parent || parent.tag !== "root" || node.unary) {
- return null;
- }
- let parser;
- if (node.tag === "style") {
- const langAttr = node.attrs.find(attr => attr.name === "lang");
- if (!langAttr || langAttr.value === "postcss") {
- parser = "css";
- } else if (langAttr.value === "scss") {
- parser = "scss";
- } else if (langAttr.value === "less") {
- parser = "less";
- }
- }
- if (node.tag === "script") {
- const langAttr = node.attrs.find(attr => attr.name === "lang");
- if (!langAttr) {
- parser = "babylon";
- } else if (langAttr.value === "ts" || langAttr.value === "tsx") {
- parser = "typescript";
- }
- }
- if (!parser) {
- return null;
- }
- return concat$13([
- options.originalText.slice(node.start, node.contentStart),
- hardline$12,
- textToDoc(options.originalText.slice(node.contentStart, node.contentEnd), {
- parser
- }),
- options.originalText.slice(node.contentEnd, node.end)
- ]);
- }
- var embed_1$6 = embed$6;
- const docBuilders$12 = doc.builders;
- const concat$12 = docBuilders$12.concat;
- const hardline$11 = docBuilders$12.hardline;
- function genericPrint$5(path$$1, options, print) {
- const n = path$$1.getValue();
- const res = [];
- let index = n.start;
- path$$1.each(childPath => {
- const child = childPath.getValue();
- res.push(options.originalText.slice(index, child.start));
- res.push(childPath.call(print));
- index = child.end;
- }, "children");
- // If there are no children, we just print the node from start to end.
- // Otherwise, index should point to the end of the last child, and we
- // need to print the closing tag.
- res.push(options.originalText.slice(index, n.end));
- // Only force a trailing newline if there were any contents.
- if (n.tag === "root" && n.children.length) {
- res.push(hardline$11);
- }
- return concat$12(res);
- }
- const clean$6 = (ast, newObj) => {
- delete newObj.contentStart;
- delete newObj.contentEnd;
- };
- var printerVue = {
- print: genericPrint$5,
- embed: embed_1$6,
- massageAstNode: clean$6
- };
- // Based on:
- // https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
- const languages$6 = [
- {
- name: "Vue",
- since: "1.10.0",
- parsers: ["vue"],
- group: "HTML",
- tmScope: "text.html.vue",
- aceMode: "html",
- codemirrorMode: "htmlmixed",
- codemirrorMimeType: "text/html",
- extensions: [".vue"],
- linguistLanguageId: 146,
- vscodeLanguageIds: ["vue"]
- }
- ];
- const parsers$6 = {
- vue: {
- get parse() {
- return require("./parser-vue");
- },
- astFormat: "vue"
- }
- };
- const printers$6 = {
- vue: printerVue
- };
- var languageVue = {
- languages: languages$6,
- parsers: parsers$6,
- printers: printers$6
- };
- function loadPlugins(plugins) {
- plugins = plugins || [];
- const internalPlugins = [
- languageJs,
- languageCss,
- languageHandlebars,
- languageGraphql,
- languageMarkdown,
- languageHtml,
- languageVue
- ];
- const externalPlugins = plugins
- .concat(
- getPluginsFromPackage(
- readPkgUp.sync({
- normalize: false
- }).pkg
- )
- )
- .map(plugin => {
- if (typeof plugin !== "string") {
- return plugin;
- }
- const pluginPath = resolve.sync(plugin, { basedir: process.cwd() });
- return Object.assign({ name: plugin }, require(pluginPath));
- });
- return deduplicate(internalPlugins.concat(externalPlugins));
- }
- function getPluginsFromPackage(pkg) {
- if (!pkg) {
- return [];
- }
- const deps = Object.assign({}, pkg.dependencies, pkg.devDependencies);
- return Object.keys(deps).filter(
- dep =>
- dep.startsWith("prettier-plugin-") || dep.startsWith("@prettier/plugin-")
- );
- }
- function deduplicate(items) {
- const uniqItems = [];
- for (const item of items) {
- if (uniqItems.indexOf(item) < 0) {
- uniqItems.push(item);
- }
- }
- return uniqItems;
- }
- var loadPlugins_1 = loadPlugins;
- const CATEGORY_CONFIG = "Config";
- const CATEGORY_EDITOR = "Editor";
- const CATEGORY_FORMAT = "Format";
- const CATEGORY_OTHER = "Other";
- const CATEGORY_OUTPUT = "Output";
- const categoryOrder = [
- CATEGORY_OUTPUT,
- CATEGORY_FORMAT,
- CATEGORY_CONFIG,
- CATEGORY_EDITOR,
- CATEGORY_OTHER
- ];
- /**
- * {
- * [optionName]: {
- * // The type of the option. For 'choice', see also `choices` below.
- * // When passing a type other than the ones listed below, the option is
- * // treated as taking any string as argument, and `--option <${type}>` will
- * // be displayed in --help.
- * type: "boolean" | "choice" | "int" | string;
- *
- * // Default value to be passed to the minimist option `default`.
- * default?: any;
- *
- * // Alias name to be passed to the minimist option `alias`.
- * alias?: string;
- *
- * // For grouping options by category in --help.
- * category?: string;
- *
- * // Description to be displayed in --help. If omitted, the option won't be
- * // shown at all in --help (but see also `oppositeDescription` below).
- * description?: string;
- *
- * // Description for `--no-${name}` to be displayed in --help. If omitted,
- * // `--no-${name}` won't be shown.
- * oppositeDescription?: string;
- *
- * // Indicate if this option is simply passed to the API.
- * // true: use camelified name as the API option name.
- * // string: use this value as the API option name.
- * forwardToApi?: boolean | string;
- *
- * // Indicate that a CLI flag should be an array when forwarded to the API.
- * array?: boolean;
- *
- * // Specify available choices for validation. They will also be displayed
- * // in --help as <a|b|c>.
- * // Use an object instead of a string if a choice is deprecated and should
- * // be treated as `redirect` instead, or if you'd like to add description for
- * // the choice.
- * choices?: Array<
- * | string
- * | { value: string, description?: string, deprecated?: boolean, redirect?: string }
- * >;
- *
- * // If the option has a value that is an exception to the regular value
- * // constraints, indicate that value here (or use a function for more
- * // flexibility).
- * exception?: ((value: any) => boolean);
- *
- * // Indicate that the option is deprecated. Use a string to add an extra
- * // message to --help for the option, for example to suggest a replacement
- * // option.
- * deprecated?: true | string;
- * }
- * }
- *
- * Note: The options below are sorted alphabetically.
- */
- const options$11 = {
- color: {
- // The supports-color package (a sub sub dependency) looks directly at
- // `process.argv` for `--no-color` and such-like options. The reason it is
- // listed here is to avoid "Ignored unknown option: --no-color" warnings.
- // See https://github.com/chalk/supports-color/#info for more information.
- type: "boolean",
- default: true,
- description: "Colorize error messages.",
- oppositeDescription: "Do not colorize error messages."
- },
- config: {
- type: "path",
- category: CATEGORY_CONFIG,
- description:
- "Path to a Prettier configuration file (.prettierrc, package.json, prettier.config.js).",
- oppositeDescription: "Do not look for a configuration file."
- },
- "config-precedence": {
- type: "choice",
- category: CATEGORY_CONFIG,
- default: "cli-override",
- choices: [
- {
- value: "cli-override",
- description: "CLI options take precedence over config file"
- },
- {
- value: "file-override",
- description: "Config file take precedence over CLI options"
- },
- {
- value: "prefer-file",
- description: dedent_1`
- If a config file is found will evaluate it and ignore other CLI options.
- If no config file is found CLI options will evaluate as normal.
- `
- }
- ],
- description:
- "Define in which order config files and CLI options should be evaluated."
- },
- "debug-check": {
- type: "boolean"
- },
- "debug-print-doc": {
- type: "boolean"
- },
- editorconfig: {
- type: "boolean",
- category: CATEGORY_CONFIG,
- description: "Take .editorconfig into account when parsing configuration.",
- oppositeDescription:
- "Don't take .editorconfig into account when parsing configuration.",
- default: true
- },
- "find-config-path": {
- type: "path",
- category: CATEGORY_CONFIG,
- description:
- "Find and print the path to a configuration file for the given input file."
- },
- help: {
- type: "flag",
- alias: "h",
- description: dedent_1`
- Show CLI usage, or details about the given flag.
- Example: --help write
- `
- },
- "ignore-path": {
- type: "path",
- category: CATEGORY_CONFIG,
- default: ".prettierignore",
- description: "Path to a file with patterns describing files to ignore."
- },
- "list-different": {
- type: "boolean",
- category: CATEGORY_OUTPUT,
- alias: "l",
- description:
- "Print the names of files that are different from Prettier's formatting."
- },
- loglevel: {
- type: "choice",
- description: "What level of logs to report.",
- default: "log",
- choices: ["silent", "error", "warn", "log", "debug"]
- },
- stdin: {
- type: "boolean",
- description: "Force reading input from stdin."
- },
- "support-info": {
- type: "boolean",
- description: "Print support information as JSON."
- },
- version: {
- type: "boolean",
- alias: "v",
- description: "Print Prettier version."
- },
- "with-node-modules": {
- type: "boolean",
- category: CATEGORY_CONFIG,
- description: "Process files inside 'node_modules' directory."
- },
- write: {
- type: "boolean",
- category: CATEGORY_OUTPUT,
- description: "Edit files in-place. (Beware!)"
- }
- };
- const usageSummary = dedent_1`
- Usage: prettier [options] [file/glob ...]
- By default, output is written to stdout.
- Stdin is read if it is piped to Prettier and no files are given.
- `;
- var constant = {
- CATEGORY_CONFIG,
- CATEGORY_EDITOR,
- CATEGORY_FORMAT,
- CATEGORY_OTHER,
- CATEGORY_OUTPUT,
- categoryOrder,
- options: options$11,
- usageSummary
- };
- var require$$0$11 = ( _package$1 && _package ) || _package$1;
- const currentVersion = require$$0$11.version;
- const CATEGORY_GLOBAL = "Global";
- const CATEGORY_SPECIAL = "Special";
- /**
- * @typedef {Object} OptionInfo
- * @property {string} since - available since version
- * @property {string} category
- * @property {'int' | 'boolean' | 'choice' | 'path'} type
- * @property {boolean} array - indicate it's an array of the specified type
- * @property {boolean?} deprecated - deprecated since version
- * @property {OptionRedirectInfo?} redirect - redirect deprecated option
- * @property {string} description
- * @property {string?} oppositeDescription - for `false` option
- * @property {OptionValueInfo} default
- * @property {OptionRangeInfo?} range - for type int
- * @property {OptionChoiceInfo?} choices - for type choice
- * @property {(value: any) => boolean} exception
- *
- * @typedef {number | boolean | string} OptionValue
- * @typedef {OptionValue | [{ value: OptionValue[] }] | Array<{ since: string, value: OptionValue}>} OptionValueInfo
- *
- * @typedef {Object} OptionRedirectInfo
- * @property {string} option
- * @property {OptionValue} value
- *
- * @typedef {Object} OptionRangeInfo
- * @property {number} start - recommended range start
- * @property {number} end - recommended range end
- * @property {number} step - recommended range step
- *
- * @typedef {Object} OptionChoiceInfo
- * @property {boolean | string} value - boolean for the option that is originally boolean type
- * @property {string?} description - undefined if redirect
- * @property {string?} since - undefined if available since the first version of the option
- * @property {string?} deprecated - deprecated since version
- * @property {OptionValueInfo?} redirect - redirect deprecated value
- *
- * @property {string?} cliName
- * @property {string?} cliCategory
- * @property {string?} cliDescription
- */
- /** @type {{ [name: string]: OptionInfo } */
- const supportOptions = {
- cursorOffset: {
- since: "1.4.0",
- category: CATEGORY_SPECIAL,
- type: "int",
- default: -1,
- range: { start: -1, end: Infinity, step: 1 },
- description: dedent_1`
- Print (to stderr) where a cursor at the given position would move to after formatting.
- This option cannot be used with --range-start and --range-end.
- `,
- cliCategory: constant.CATEGORY_EDITOR
- },
- filepath: {
- since: "1.4.0",
- category: CATEGORY_SPECIAL,
- type: "path",
- default: undefined,
- description:
- "Specify the input filepath. This will be used to do parser inference.",
- cliName: "stdin-filepath",
- cliCategory: constant.CATEGORY_OTHER,
- cliDescription: "Path to the file to pretend that stdin comes from."
- },
- insertPragma: {
- since: "1.8.0",
- category: CATEGORY_SPECIAL,
- type: "boolean",
- default: false,
- description: "Insert @format pragma into file's first docblock comment.",
- cliCategory: constant.CATEGORY_OTHER
- },
- parser: {
- since: "0.0.10",
- category: CATEGORY_GLOBAL,
- type: "choice",
- default: "babylon",
- description: "Which parser to use.",
- exception: value =>
- typeof value === "string" || typeof value === "function",
- choices: [
- { value: "flow", description: "Flow" },
- { value: "babylon", description: "JavaScript" },
- { value: "typescript", since: "1.4.0", description: "TypeScript" },
- { value: "css", since: "1.7.1", description: "CSS" },
- {
- value: "postcss",
- since: "1.4.0",
- description: "CSS/Less/SCSS",
- deprecated: "1.7.1",
- redirect: "css"
- },
- { value: "less", since: "1.7.1", description: "Less" },
- { value: "scss", since: "1.7.1", description: "SCSS" },
- { value: "json", since: "1.5.0", description: "JSON" },
- { value: "graphql", since: "1.5.0", description: "GraphQL" },
- { value: "markdown", since: "1.8.0", description: "Markdown" },
- { value: "vue", since: "1.10.0", description: "Vue" }
- ]
- },
- plugins: {
- since: "1.10.0",
- type: "path",
- array: true,
- default: [{ value: [] }],
- category: CATEGORY_GLOBAL,
- description:
- "Add a plugin. Multiple plugins can be passed as separate `--plugin`s.",
- exception: value => typeof value === "string" || typeof value === "object",
- cliName: "plugin",
- cliCategory: constant.CATEGORY_CONFIG
- },
- printWidth: {
- since: "0.0.0",
- category: CATEGORY_GLOBAL,
- type: "int",
- default: 80,
- description: "The line length where Prettier will try wrap.",
- range: { start: 0, end: Infinity, step: 1 }
- },
- rangeEnd: {
- since: "1.4.0",
- category: CATEGORY_SPECIAL,
- type: "int",
- default: Infinity,
- range: { start: 0, end: Infinity, step: 1 },
- description: dedent_1`
- Format code ending at a given character offset (exclusive).
- The range will extend forwards to the end of the selected statement.
- This option cannot be used with --cursor-offset.
- `,
- cliCategory: constant.CATEGORY_EDITOR
- },
- rangeStart: {
- since: "1.4.0",
- category: CATEGORY_SPECIAL,
- type: "int",
- default: 0,
- range: { start: 0, end: Infinity, step: 1 },
- description: dedent_1`
- Format code starting at a given character offset.
- The range will extend backwards to the start of the first line containing the selected statement.
- This option cannot be used with --cursor-offset.
- `,
- cliCategory: constant.CATEGORY_EDITOR
- },
- requirePragma: {
- since: "1.7.0",
- category: CATEGORY_SPECIAL,
- type: "boolean",
- default: false,
- description: dedent_1`
- Require either '@prettier' or '@format' to be present in the file's first docblock comment
- in order for it to be formatted.
- `,
- cliCategory: constant.CATEGORY_OTHER
- },
- tabWidth: {
- type: "int",
- category: CATEGORY_GLOBAL,
- default: 2,
- description: "Number of spaces per indentation level.",
- range: { start: 0, end: Infinity, step: 1 }
- },
- useFlowParser: {
- since: "0.0.0",
- category: CATEGORY_GLOBAL,
- type: "boolean",
- default: false,
- deprecated: "0.0.10",
- description: "Use flow parser.",
- redirect: { option: "parser", value: "flow" },
- cliName: "flow-parser"
- },
- useTabs: {
- since: "1.0.0",
- category: CATEGORY_GLOBAL,
- type: "boolean",
- default: false,
- description: "Indent with tabs instead of spaces."
- }
- };
- function getSupportInfo$1(version, opts) {
- opts = Object.assign(
- {
- plugins: [],
- pluginsLoaded: false,
- showUnreleased: false,
- showDeprecated: false,
- showInternal: false
- },
- opts
- );
- if (!version) {
- version = currentVersion;
- }
- const plugins = opts.pluginsLoaded ? opts.plugins : loadPlugins_1(opts.plugins);
- const options = util$1
- .arrayify(
- Object.assign(
- plugins.reduce(
- (currentOptions, plugin) =>
- Object.assign(currentOptions, plugin.options),
- {}
- ),
- supportOptions
- ),
- "name"
- )
- .sort((a, b) => (a.name === b.name ? 0 : a.name < b.name ? -1 : 1))
- .filter(filterSince)
- .filter(filterDeprecated)
- .map(mapDeprecated)
- .map(mapInternal)
- .map(option => {
- const newOption = Object.assign({}, option);
- if (Array.isArray(newOption.default)) {
- newOption.default =
- newOption.default.length === 1
- ? newOption.default[0].value
- : newOption.default
- .filter(filterSince)
- .sort((info1, info2) =>
- semver.compare(info2.since, info1.since)
- )[0].value;
- }
- if (Array.isArray(newOption.choices)) {
- newOption.choices = newOption.choices
- .filter(filterSince)
- .filter(filterDeprecated)
- .map(mapDeprecated);
- }
- return newOption;
- })
- .map(option => {
- const filteredPlugins = plugins.filter(
- plugin => plugin.defaultOptions && plugin.defaultOptions[option.name]
- );
- const pluginDefaults = filteredPlugins.reduce((reduced, plugin) => {
- reduced[plugin.name] = plugin.defaultOptions[option.name];
- return reduced;
- }, {});
- return Object.assign(option, { pluginDefaults });
- });
- const usePostCssParser = semver.lt(version, "1.7.1");
- const languages = plugins
- .reduce((all, plugin) => all.concat(plugin.languages), [])
- .filter(
- language =>
- language.since
- ? semver.gte(version, language.since)
- : language.since !== null
- )
- .map(language => {
- // Prevent breaking changes
- if (language.name === "Markdown") {
- return Object.assign({}, language, {
- parsers: ["markdown"]
- });
- }
- if (language.name === "TypeScript") {
- return Object.assign({}, language, {
- parsers: ["typescript"]
- });
- }
- if (usePostCssParser && language.group === "CSS") {
- return Object.assign({}, language, {
- parsers: ["postcss"]
- });
- }
- return language;
- });
- return { languages, options };
- function filterSince(object) {
- return (
- opts.showUnreleased ||
- !("since" in object) ||
- (object.since && semver.gte(version, object.since))
- );
- }
- function filterDeprecated(object) {
- return (
- opts.showDeprecated ||
- !("deprecated" in object) ||
- (object.deprecated && semver.lt(version, object.deprecated))
- );
- }
- function mapDeprecated(object) {
- if (!object.deprecated || opts.showDeprecated) {
- return object;
- }
- const newObject = Object.assign({}, object);
- delete newObject.deprecated;
- delete newObject.redirect;
- return newObject;
- }
- function mapInternal(object) {
- if (opts.showInternal) {
- return object;
- }
- const newObject = Object.assign({}, object);
- delete newObject.cliName;
- delete newObject.cliCategory;
- delete newObject.cliDescription;
- return newObject;
- }
- }
- var support = {
- getSupportInfo: getSupportInfo$1
- };
- function FastPath(value) {
- assert.ok(this instanceof FastPath);
- this.stack = [value];
- }
- // The name of the current property is always the penultimate element of
- // this.stack, and always a String.
- FastPath.prototype.getName = function getName() {
- const s = this.stack;
- const len = s.length;
- if (len > 1) {
- return s[len - 2];
- }
- // Since the name is always a string, null is a safe sentinel value to
- // return if we do not know the name of the (root) value.
- /* istanbul ignore next */
- return null;
- };
- // The value of the current property is always the final element of
- // this.stack.
- FastPath.prototype.getValue = function getValue() {
- const s = this.stack;
- return s[s.length - 1];
- };
- function getNodeHelper(path$$1, count) {
- const s = path$$1.stack;
- for (let i = s.length - 1; i >= 0; i -= 2) {
- const value = s[i];
- if (value && !Array.isArray(value) && --count < 0) {
- return value;
- }
- }
- return null;
- }
- FastPath.prototype.getNode = function getNode(count) {
- return getNodeHelper(this, ~~count);
- };
- FastPath.prototype.getParentNode = function getParentNode(count) {
- return getNodeHelper(this, ~~count + 1);
- };
- // Temporarily push properties named by string arguments given after the
- // callback function onto this.stack, then call the callback with a
- // reference to this (modified) FastPath object. Note that the stack will
- // be restored to its original state after the callback is finished, so it
- // is probably a mistake to retain a reference to the path.
- FastPath.prototype.call = function call(callback /*, name1, name2, ... */) {
- const s = this.stack;
- const origLen = s.length;
- let value = s[origLen - 1];
- const argc = arguments.length;
- for (let i = 1; i < argc; ++i) {
- const name = arguments[i];
- value = value[name];
- s.push(name, value);
- }
- const result = callback(this);
- s.length = origLen;
- return result;
- };
- // Similar to FastPath.prototype.call, except that the value obtained by
- // accessing this.getValue()[name1][name2]... should be array-like. The
- // callback will be called with a reference to this path object for each
- // element of the array.
- FastPath.prototype.each = function each(callback /*, name1, name2, ... */) {
- const s = this.stack;
- const origLen = s.length;
- let value = s[origLen - 1];
- const argc = arguments.length;
- for (let i = 1; i < argc; ++i) {
- const name = arguments[i];
- value = value[name];
- s.push(name, value);
- }
- for (let i = 0; i < value.length; ++i) {
- if (i in value) {
- s.push(i, value[i]);
- // If the callback needs to know the value of i, call
- // path.getName(), assuming path is the parameter name.
- callback(this);
- s.length -= 2;
- }
- }
- s.length = origLen;
- };
- // Similar to FastPath.prototype.each, except that the results of the
- // callback function invocations are stored in an array and returned at
- // the end of the iteration.
- FastPath.prototype.map = function map(callback /*, name1, name2, ... */) {
- const s = this.stack;
- const origLen = s.length;
- let value = s[origLen - 1];
- const argc = arguments.length;
- for (let i = 1; i < argc; ++i) {
- const name = arguments[i];
- value = value[name];
- s.push(name, value);
- }
- const result = new Array(value.length);
- for (let i = 0; i < value.length; ++i) {
- if (i in value) {
- s.push(i, value[i]);
- result[i] = callback(this, i);
- s.length -= 2;
- }
- }
- s.length = origLen;
- return result;
- };
- var fastPath = FastPath;
- /* eslint-disable no-nested-ternary */
- var arr = [];
- var charCodeCache = [];
- var leven = function (a, b) {
- if (a === b) {
- return 0;
- }
- var swap = a;
- // Swapping the strings if `a` is longer than `b` so we know which one is the
- // shortest & which one is the longest
- if (a.length > b.length) {
- a = b;
- b = swap;
- }
- var aLen = a.length;
- var bLen = b.length;
- if (aLen === 0) {
- return bLen;
- }
- if (bLen === 0) {
- return aLen;
- }
- // Performing suffix trimming:
- // We can linearly drop suffix common to both strings since they
- // don't increase distance at all
- // Note: `~-` is the bitwise way to perform a `- 1` operation
- while (aLen > 0 && (a.charCodeAt(~-aLen) === b.charCodeAt(~-bLen))) {
- aLen--;
- bLen--;
- }
- if (aLen === 0) {
- return bLen;
- }
- // Performing prefix trimming
- // We can linearly drop prefix common to both strings since they
- // don't increase distance at all
- var start = 0;
- while (start < aLen && (a.charCodeAt(start) === b.charCodeAt(start))) {
- start++;
- }
- aLen -= start;
- bLen -= start;
- if (aLen === 0) {
- return bLen;
- }
- var bCharCode;
- var ret;
- var tmp;
- var tmp2;
- var i = 0;
- var j = 0;
- while (i < aLen) {
- charCodeCache[start + i] = a.charCodeAt(start + i);
- arr[i] = ++i;
- }
- while (j < bLen) {
- bCharCode = b.charCodeAt(start + j);
- tmp = j++;
- ret = j;
- for (i = 0; i < aLen; i++) {
- tmp2 = bCharCode === charCodeCache[start + i] ? tmp : tmp + 1;
- tmp = arr[i];
- ret = arr[i] = tmp > ret ? tmp2 > ret ? ret + 1 : tmp2 : tmp2 > tmp ? tmp + 1 : tmp2;
- }
- }
- return ret;
- };
- function apiDescriptor(name, value) {
- return arguments.length === 1
- ? JSON.stringify(name)
- : `\`{ ${apiDescriptor(name)}: ${JSON.stringify(value)} }\``;
- }
- function cliDescriptor(name, value) {
- return value === false
- ? `\`--no-${name}\``
- : value === true || arguments.length === 1
- ? `\`--${name}\``
- : value === ""
- ? `\`--${name}\` without an argument`
- : `\`--${name}=${value}\``;
- }
- var optionsDescriptor = {
- apiDescriptor,
- cliDescriptor
- };
- function validateOption(value, optionInfo, opts) {
- opts = opts || {};
- const descriptor = opts.descriptor || optionsDescriptor.apiDescriptor;
- if (
- typeof optionInfo.exception === "function" &&
- optionInfo.exception(value)
- ) {
- return;
- }
- try {
- validateOptionType(value, optionInfo);
- } catch (error) {
- throw new Error(
- `Invalid \`${descriptor(optionInfo.name)}\` value. ${
- error.message
- }, but received \`${JSON.stringify(value)}\`.`
- );
- }
- }
- function validateOptionType(value, optionInfo) {
- if (optionInfo.array) {
- if (!Array.isArray(value)) {
- throw new Error(`Expected an array`);
- }
- value.forEach(v =>
- validateOptionType(v, Object.assign({}, optionInfo, { array: false }))
- );
- } else {
- switch (optionInfo.type) {
- case "int":
- validateIntOption(value);
- break;
- case "boolean":
- validateBooleanOption(value);
- break;
- case "choice":
- validateChoiceOption(value, optionInfo.choices);
- break;
- }
- }
- }
- function validateBooleanOption(value) {
- if (typeof value !== "boolean") {
- throw new Error(`Expected a boolean`);
- }
- }
- function validateIntOption(value) {
- if (
- !(
- typeof value === "number" &&
- Math.floor(value) === value &&
- value >= 0 &&
- value !== Infinity
- )
- ) {
- throw new Error(`Expected an integer`);
- }
- }
- function validateChoiceOption(value, choiceInfos) {
- if (!choiceInfos.some(choiceInfo => choiceInfo.value === value)) {
- const choices = choiceInfos
- .filter(choiceInfo => !choiceInfo.deprecated)
- .map(choiceInfo => JSON.stringify(choiceInfo.value))
- .sort();
- const head = choices.slice(0, -2);
- const tail = choices.slice(-2);
- throw new Error(`Expected ${head.concat(tail.join(" or ")).join(", ")}`);
- }
- }
- var optionsValidator = { validateOption };
- function normalizeOptions$1(options, optionInfos, opts) {
- opts = opts || {};
- const logger =
- opts.logger === false
- ? { warn() {} }
- : opts.logger !== undefined
- ? opts.logger
- : console;
- const descriptor = opts.descriptor || optionsDescriptor.apiDescriptor;
- const passThrough = opts.passThrough || [];
- const optionInfoMap = optionInfos.reduce(
- (reduced, optionInfo) =>
- Object.assign(reduced, { [optionInfo.name]: optionInfo }),
- {}
- );
- const normalizedOptions = Object.keys(options).reduce((newOptions, key) => {
- const optionInfo = optionInfoMap[key];
- let optionName = key;
- let optionValue = options[key];
- if (!optionInfo) {
- if (passThrough === true || passThrough.indexOf(optionName) !== -1) {
- newOptions[optionName] = optionValue;
- } else {
- logger.warn(
- createUnknownOptionMessage(
- optionName,
- optionValue,
- optionInfos,
- descriptor
- )
- );
- }
- return newOptions;
- }
- if (!optionInfo.deprecated) {
- optionValue = normalizeOption(optionValue, optionInfo);
- } else if (typeof optionInfo.redirect === "string") {
- logger.warn(createRedirectOptionMessage(optionInfo, descriptor));
- optionName = optionInfo.redirect;
- } else if (optionValue) {
- logger.warn(createRedirectOptionMessage(optionInfo, descriptor));
- optionValue = optionInfo.redirect.value;
- optionName = optionInfo.redirect.option;
- }
- if (optionInfo.choices) {
- const choiceInfo = optionInfo.choices.find(
- choice => choice.value === optionValue
- );
- if (choiceInfo && choiceInfo.deprecated) {
- logger.warn(
- createRedirectChoiceMessage(optionInfo, choiceInfo, descriptor)
- );
- optionValue = choiceInfo.redirect;
- }
- }
- if (optionInfo.array && !Array.isArray(optionValue)) {
- optionValue = [optionValue];
- }
- if (optionValue !== optionInfo.default) {
- optionsValidator.validateOption(optionValue, optionInfoMap[optionName], {
- descriptor
- });
- }
- newOptions[optionName] = optionValue;
- return newOptions;
- }, {});
- return normalizedOptions;
- }
- function normalizeOption(option, optionInfo) {
- return optionInfo.type === "int" ? Number(option) : option;
- }
- function createUnknownOptionMessage(key, value, optionInfos, descriptor) {
- const messages = [`Ignored unknown option ${descriptor(key, value)}.`];
- const suggestedOptionInfo = optionInfos.find(
- optionInfo => leven(optionInfo.name, key) < 3
- );
- if (suggestedOptionInfo) {
- messages.push(`Did you mean ${JSON.stringify(suggestedOptionInfo.name)}?`);
- }
- return messages.join(" ");
- }
- function createRedirectOptionMessage(optionInfo, descriptor) {
- return `${descriptor(
- optionInfo.name
- )} is deprecated. Prettier now treats it as ${
- typeof optionInfo.redirect === "string"
- ? descriptor(optionInfo.redirect)
- : descriptor(optionInfo.redirect.option, optionInfo.redirect.value)
- }.`;
- }
- function createRedirectChoiceMessage(optionInfo, choiceInfo, descriptor) {
- return `${descriptor(
- optionInfo.name,
- choiceInfo.value
- )} is deprecated. Prettier now treats it as ${descriptor(
- optionInfo.name,
- choiceInfo.redirect
- )}.`;
- }
- function normalizeApiOptions(options, optionInfos, opts) {
- return normalizeOptions$1(
- options,
- optionInfos,
- Object.assign({ descriptor: optionsDescriptor.apiDescriptor }, opts)
- );
- }
- function normalizeCliOptions(options, optionInfos, opts) {
- const args = options["_"] || [];
- const newOptions = normalizeOptions$1(
- Object.keys(options).reduce(
- (reduced, key) =>
- Object.assign(
- reduced,
- key.length === 1 // omit alias
- ? null
- : { [key]: options[key] }
- ),
- {}
- ),
- optionInfos,
- Object.assign({ descriptor: optionsDescriptor.cliDescriptor }, opts)
- );
- newOptions["_"] = args;
- return newOptions;
- }
- var optionsNormalizer = {
- normalizeApiOptions,
- normalizeCliOptions
- };
- class ConfigError$1 extends Error {}
- class DebugError extends Error {}
- var errors = {
- ConfigError: ConfigError$1,
- DebugError
- };
- var jsTokens = createCommonjsModule(function (module, exports) {
- // Copyright 2014, 2015, 2016, 2017 Simon Lydell
- // License: MIT. (See LICENSE.)
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- // This regex comes from regex.coffee, and is inserted here by generate-index.js
- // (run `npm run build`).
- exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyu]{1,5}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g;
- exports.matchToToken = function(match) {
- var token = {type: "invalid", value: match[0]};
- if (match[ 1]) token.type = "string" , token.closed = !!(match[3] || match[4]);
- else if (match[ 5]) token.type = "comment";
- else if (match[ 6]) token.type = "comment", token.closed = !!match[7];
- else if (match[ 8]) token.type = "regex";
- else if (match[ 9]) token.type = "number";
- else if (match[10]) token.type = "name";
- else if (match[11]) token.type = "punctuator";
- else if (match[12]) token.type = "whitespace";
- return token
- };
- });
- unwrapExports(jsTokens);
- var colorName = {
- "aliceblue": [240, 248, 255],
- "antiquewhite": [250, 235, 215],
- "aqua": [0, 255, 255],
- "aquamarine": [127, 255, 212],
- "azure": [240, 255, 255],
- "beige": [245, 245, 220],
- "bisque": [255, 228, 196],
- "black": [0, 0, 0],
- "blanchedalmond": [255, 235, 205],
- "blue": [0, 0, 255],
- "blueviolet": [138, 43, 226],
- "brown": [165, 42, 42],
- "burlywood": [222, 184, 135],
- "cadetblue": [95, 158, 160],
- "chartreuse": [127, 255, 0],
- "chocolate": [210, 105, 30],
- "coral": [255, 127, 80],
- "cornflowerblue": [100, 149, 237],
- "cornsilk": [255, 248, 220],
- "crimson": [220, 20, 60],
- "cyan": [0, 255, 255],
- "darkblue": [0, 0, 139],
- "darkcyan": [0, 139, 139],
- "darkgoldenrod": [184, 134, 11],
- "darkgray": [169, 169, 169],
- "darkgreen": [0, 100, 0],
- "darkgrey": [169, 169, 169],
- "darkkhaki": [189, 183, 107],
- "darkmagenta": [139, 0, 139],
- "darkolivegreen": [85, 107, 47],
- "darkorange": [255, 140, 0],
- "darkorchid": [153, 50, 204],
- "darkred": [139, 0, 0],
- "darksalmon": [233, 150, 122],
- "darkseagreen": [143, 188, 143],
- "darkslateblue": [72, 61, 139],
- "darkslategray": [47, 79, 79],
- "darkslategrey": [47, 79, 79],
- "darkturquoise": [0, 206, 209],
- "darkviolet": [148, 0, 211],
- "deeppink": [255, 20, 147],
- "deepskyblue": [0, 191, 255],
- "dimgray": [105, 105, 105],
- "dimgrey": [105, 105, 105],
- "dodgerblue": [30, 144, 255],
- "firebrick": [178, 34, 34],
- "floralwhite": [255, 250, 240],
- "forestgreen": [34, 139, 34],
- "fuchsia": [255, 0, 255],
- "gainsboro": [220, 220, 220],
- "ghostwhite": [248, 248, 255],
- "gold": [255, 215, 0],
- "goldenrod": [218, 165, 32],
- "gray": [128, 128, 128],
- "green": [0, 128, 0],
- "greenyellow": [173, 255, 47],
- "grey": [128, 128, 128],
- "honeydew": [240, 255, 240],
- "hotpink": [255, 105, 180],
- "indianred": [205, 92, 92],
- "indigo": [75, 0, 130],
- "ivory": [255, 255, 240],
- "khaki": [240, 230, 140],
- "lavender": [230, 230, 250],
- "lavenderblush": [255, 240, 245],
- "lawngreen": [124, 252, 0],
- "lemonchiffon": [255, 250, 205],
- "lightblue": [173, 216, 230],
- "lightcoral": [240, 128, 128],
- "lightcyan": [224, 255, 255],
- "lightgoldenrodyellow": [250, 250, 210],
- "lightgray": [211, 211, 211],
- "lightgreen": [144, 238, 144],
- "lightgrey": [211, 211, 211],
- "lightpink": [255, 182, 193],
- "lightsalmon": [255, 160, 122],
- "lightseagreen": [32, 178, 170],
- "lightskyblue": [135, 206, 250],
- "lightslategray": [119, 136, 153],
- "lightslategrey": [119, 136, 153],
- "lightsteelblue": [176, 196, 222],
- "lightyellow": [255, 255, 224],
- "lime": [0, 255, 0],
- "limegreen": [50, 205, 50],
- "linen": [250, 240, 230],
- "magenta": [255, 0, 255],
- "maroon": [128, 0, 0],
- "mediumaquamarine": [102, 205, 170],
- "mediumblue": [0, 0, 205],
- "mediumorchid": [186, 85, 211],
- "mediumpurple": [147, 112, 219],
- "mediumseagreen": [60, 179, 113],
- "mediumslateblue": [123, 104, 238],
- "mediumspringgreen": [0, 250, 154],
- "mediumturquoise": [72, 209, 204],
- "mediumvioletred": [199, 21, 133],
- "midnightblue": [25, 25, 112],
- "mintcream": [245, 255, 250],
- "mistyrose": [255, 228, 225],
- "moccasin": [255, 228, 181],
- "navajowhite": [255, 222, 173],
- "navy": [0, 0, 128],
- "oldlace": [253, 245, 230],
- "olive": [128, 128, 0],
- "olivedrab": [107, 142, 35],
- "orange": [255, 165, 0],
- "orangered": [255, 69, 0],
- "orchid": [218, 112, 214],
- "palegoldenrod": [238, 232, 170],
- "palegreen": [152, 251, 152],
- "paleturquoise": [175, 238, 238],
- "palevioletred": [219, 112, 147],
- "papayawhip": [255, 239, 213],
- "peachpuff": [255, 218, 185],
- "peru": [205, 133, 63],
- "pink": [255, 192, 203],
- "plum": [221, 160, 221],
- "powderblue": [176, 224, 230],
- "purple": [128, 0, 128],
- "rebeccapurple": [102, 51, 153],
- "red": [255, 0, 0],
- "rosybrown": [188, 143, 143],
- "royalblue": [65, 105, 225],
- "saddlebrown": [139, 69, 19],
- "salmon": [250, 128, 114],
- "sandybrown": [244, 164, 96],
- "seagreen": [46, 139, 87],
- "seashell": [255, 245, 238],
- "sienna": [160, 82, 45],
- "silver": [192, 192, 192],
- "skyblue": [135, 206, 235],
- "slateblue": [106, 90, 205],
- "slategray": [112, 128, 144],
- "slategrey": [112, 128, 144],
- "snow": [255, 250, 250],
- "springgreen": [0, 255, 127],
- "steelblue": [70, 130, 180],
- "tan": [210, 180, 140],
- "teal": [0, 128, 128],
- "thistle": [216, 191, 216],
- "tomato": [255, 99, 71],
- "turquoise": [64, 224, 208],
- "violet": [238, 130, 238],
- "wheat": [245, 222, 179],
- "white": [255, 255, 255],
- "whitesmoke": [245, 245, 245],
- "yellow": [255, 255, 0],
- "yellowgreen": [154, 205, 50]
- };
- var conversions = createCommonjsModule(function (module) {
- /* MIT license */
- // NOTE: conversions should only return primitive values (i.e. arrays, or
- // values that give correct `typeof` results).
- // do not use box values types (i.e. Number(), String(), etc.)
- var reverseKeywords = {};
- for (var key in colorName) {
- if (colorName.hasOwnProperty(key)) {
- reverseKeywords[colorName[key]] = key;
- }
- }
- var convert = module.exports = {
- rgb: {channels: 3, labels: 'rgb'},
- hsl: {channels: 3, labels: 'hsl'},
- hsv: {channels: 3, labels: 'hsv'},
- hwb: {channels: 3, labels: 'hwb'},
- cmyk: {channels: 4, labels: 'cmyk'},
- xyz: {channels: 3, labels: 'xyz'},
- lab: {channels: 3, labels: 'lab'},
- lch: {channels: 3, labels: 'lch'},
- hex: {channels: 1, labels: ['hex']},
- keyword: {channels: 1, labels: ['keyword']},
- ansi16: {channels: 1, labels: ['ansi16']},
- ansi256: {channels: 1, labels: ['ansi256']},
- hcg: {channels: 3, labels: ['h', 'c', 'g']},
- apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
- gray: {channels: 1, labels: ['gray']}
- };
- // hide .channels and .labels properties
- for (var model in convert) {
- if (convert.hasOwnProperty(model)) {
- if (!('channels' in convert[model])) {
- throw new Error('missing channels property: ' + model);
- }
- if (!('labels' in convert[model])) {
- throw new Error('missing channel labels property: ' + model);
- }
- if (convert[model].labels.length !== convert[model].channels) {
- throw new Error('channel and label counts mismatch: ' + model);
- }
- var channels = convert[model].channels;
- var labels = convert[model].labels;
- delete convert[model].channels;
- delete convert[model].labels;
- Object.defineProperty(convert[model], 'channels', {value: channels});
- Object.defineProperty(convert[model], 'labels', {value: labels});
- }
- }
- convert.rgb.hsl = function (rgb) {
- var r = rgb[0] / 255;
- var g = rgb[1] / 255;
- var b = rgb[2] / 255;
- var min = Math.min(r, g, b);
- var max = Math.max(r, g, b);
- var delta = max - min;
- var h;
- var s;
- var l;
- if (max === min) {
- h = 0;
- } else if (r === max) {
- h = (g - b) / delta;
- } else if (g === max) {
- h = 2 + (b - r) / delta;
- } else if (b === max) {
- h = 4 + (r - g) / delta;
- }
- h = Math.min(h * 60, 360);
- if (h < 0) {
- h += 360;
- }
- l = (min + max) / 2;
- if (max === min) {
- s = 0;
- } else if (l <= 0.5) {
- s = delta / (max + min);
- } else {
- s = delta / (2 - max - min);
- }
- return [h, s * 100, l * 100];
- };
- convert.rgb.hsv = function (rgb) {
- var r = rgb[0];
- var g = rgb[1];
- var b = rgb[2];
- var min = Math.min(r, g, b);
- var max = Math.max(r, g, b);
- var delta = max - min;
- var h;
- var s;
- var v;
- if (max === 0) {
- s = 0;
- } else {
- s = (delta / max * 1000) / 10;
- }
- if (max === min) {
- h = 0;
- } else if (r === max) {
- h = (g - b) / delta;
- } else if (g === max) {
- h = 2 + (b - r) / delta;
- } else if (b === max) {
- h = 4 + (r - g) / delta;
- }
- h = Math.min(h * 60, 360);
- if (h < 0) {
- h += 360;
- }
- v = ((max / 255) * 1000) / 10;
- return [h, s, v];
- };
- convert.rgb.hwb = function (rgb) {
- var r = rgb[0];
- var g = rgb[1];
- var b = rgb[2];
- var h = convert.rgb.hsl(rgb)[0];
- var w = 1 / 255 * Math.min(r, Math.min(g, b));
- b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
- return [h, w * 100, b * 100];
- };
- convert.rgb.cmyk = function (rgb) {
- var r = rgb[0] / 255;
- var g = rgb[1] / 255;
- var b = rgb[2] / 255;
- var c;
- var m;
- var y;
- var k;
- k = Math.min(1 - r, 1 - g, 1 - b);
- c = (1 - r - k) / (1 - k) || 0;
- m = (1 - g - k) / (1 - k) || 0;
- y = (1 - b - k) / (1 - k) || 0;
- return [c * 100, m * 100, y * 100, k * 100];
- };
- /**
- * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
- * */
- function comparativeDistance(x, y) {
- return (
- Math.pow(x[0] - y[0], 2) +
- Math.pow(x[1] - y[1], 2) +
- Math.pow(x[2] - y[2], 2)
- );
- }
- convert.rgb.keyword = function (rgb) {
- var reversed = reverseKeywords[rgb];
- if (reversed) {
- return reversed;
- }
- var currentClosestDistance = Infinity;
- var currentClosestKeyword;
- for (var keyword in colorName) {
- if (colorName.hasOwnProperty(keyword)) {
- var value = colorName[keyword];
- // Compute comparative distance
- var distance = comparativeDistance(rgb, value);
- // Check if its less, if so set as closest
- if (distance < currentClosestDistance) {
- currentClosestDistance = distance;
- currentClosestKeyword = keyword;
- }
- }
- }
- return currentClosestKeyword;
- };
- convert.keyword.rgb = function (keyword) {
- return colorName[keyword];
- };
- convert.rgb.xyz = function (rgb) {
- var r = rgb[0] / 255;
- var g = rgb[1] / 255;
- var b = rgb[2] / 255;
- // assume sRGB
- r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
- g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
- b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
- var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
- var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
- var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
- return [x * 100, y * 100, z * 100];
- };
- convert.rgb.lab = function (rgb) {
- var xyz = convert.rgb.xyz(rgb);
- var x = xyz[0];
- var y = xyz[1];
- var z = xyz[2];
- var l;
- var a;
- var b;
- x /= 95.047;
- y /= 100;
- z /= 108.883;
- x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
- l = (116 * y) - 16;
- a = 500 * (x - y);
- b = 200 * (y - z);
- return [l, a, b];
- };
- convert.hsl.rgb = function (hsl) {
- var h = hsl[0] / 360;
- var s = hsl[1] / 100;
- var l = hsl[2] / 100;
- var t1;
- var t2;
- var t3;
- var rgb;
- var val;
- if (s === 0) {
- val = l * 255;
- return [val, val, val];
- }
- if (l < 0.5) {
- t2 = l * (1 + s);
- } else {
- t2 = l + s - l * s;
- }
- t1 = 2 * l - t2;
- rgb = [0, 0, 0];
- for (var i = 0; i < 3; i++) {
- t3 = h + 1 / 3 * -(i - 1);
- if (t3 < 0) {
- t3++;
- }
- if (t3 > 1) {
- t3--;
- }
- if (6 * t3 < 1) {
- val = t1 + (t2 - t1) * 6 * t3;
- } else if (2 * t3 < 1) {
- val = t2;
- } else if (3 * t3 < 2) {
- val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
- } else {
- val = t1;
- }
- rgb[i] = val * 255;
- }
- return rgb;
- };
- convert.hsl.hsv = function (hsl) {
- var h = hsl[0];
- var s = hsl[1] / 100;
- var l = hsl[2] / 100;
- var smin = s;
- var lmin = Math.max(l, 0.01);
- var sv;
- var v;
- l *= 2;
- s *= (l <= 1) ? l : 2 - l;
- smin *= lmin <= 1 ? lmin : 2 - lmin;
- v = (l + s) / 2;
- sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
- return [h, sv * 100, v * 100];
- };
- convert.hsv.rgb = function (hsv) {
- var h = hsv[0] / 60;
- var s = hsv[1] / 100;
- var v = hsv[2] / 100;
- var hi = Math.floor(h) % 6;
- var f = h - Math.floor(h);
- var p = 255 * v * (1 - s);
- var q = 255 * v * (1 - (s * f));
- var t = 255 * v * (1 - (s * (1 - f)));
- v *= 255;
- switch (hi) {
- case 0:
- return [v, t, p];
- case 1:
- return [q, v, p];
- case 2:
- return [p, v, t];
- case 3:
- return [p, q, v];
- case 4:
- return [t, p, v];
- case 5:
- return [v, p, q];
- }
- };
- convert.hsv.hsl = function (hsv) {
- var h = hsv[0];
- var s = hsv[1] / 100;
- var v = hsv[2] / 100;
- var vmin = Math.max(v, 0.01);
- var lmin;
- var sl;
- var l;
- l = (2 - s) * v;
- lmin = (2 - s) * vmin;
- sl = s * vmin;
- sl /= (lmin <= 1) ? lmin : 2 - lmin;
- sl = sl || 0;
- l /= 2;
- return [h, sl * 100, l * 100];
- };
- // http://dev.w3.org/csswg/css-color/#hwb-to-rgb
- convert.hwb.rgb = function (hwb) {
- var h = hwb[0] / 360;
- var wh = hwb[1] / 100;
- var bl = hwb[2] / 100;
- var ratio = wh + bl;
- var i;
- var v;
- var f;
- var n;
- // wh + bl cant be > 1
- if (ratio > 1) {
- wh /= ratio;
- bl /= ratio;
- }
- i = Math.floor(6 * h);
- v = 1 - bl;
- f = 6 * h - i;
- if ((i & 0x01) !== 0) {
- f = 1 - f;
- }
- n = wh + f * (v - wh); // linear interpolation
- var r;
- var g;
- var b;
- switch (i) {
- default:
- case 6:
- case 0: r = v; g = n; b = wh; break;
- case 1: r = n; g = v; b = wh; break;
- case 2: r = wh; g = v; b = n; break;
- case 3: r = wh; g = n; b = v; break;
- case 4: r = n; g = wh; b = v; break;
- case 5: r = v; g = wh; b = n; break;
- }
- return [r * 255, g * 255, b * 255];
- };
- convert.cmyk.rgb = function (cmyk) {
- var c = cmyk[0] / 100;
- var m = cmyk[1] / 100;
- var y = cmyk[2] / 100;
- var k = cmyk[3] / 100;
- var r;
- var g;
- var b;
- r = 1 - Math.min(1, c * (1 - k) + k);
- g = 1 - Math.min(1, m * (1 - k) + k);
- b = 1 - Math.min(1, y * (1 - k) + k);
- return [r * 255, g * 255, b * 255];
- };
- convert.xyz.rgb = function (xyz) {
- var x = xyz[0] / 100;
- var y = xyz[1] / 100;
- var z = xyz[2] / 100;
- var r;
- var g;
- var b;
- r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
- g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
- b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
- // assume sRGB
- r = r > 0.0031308
- ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
- : r * 12.92;
- g = g > 0.0031308
- ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
- : g * 12.92;
- b = b > 0.0031308
- ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
- : b * 12.92;
- r = Math.min(Math.max(0, r), 1);
- g = Math.min(Math.max(0, g), 1);
- b = Math.min(Math.max(0, b), 1);
- return [r * 255, g * 255, b * 255];
- };
- convert.xyz.lab = function (xyz) {
- var x = xyz[0];
- var y = xyz[1];
- var z = xyz[2];
- var l;
- var a;
- var b;
- x /= 95.047;
- y /= 100;
- z /= 108.883;
- x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
- y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
- z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
- l = (116 * y) - 16;
- a = 500 * (x - y);
- b = 200 * (y - z);
- return [l, a, b];
- };
- convert.lab.xyz = function (lab) {
- var l = lab[0];
- var a = lab[1];
- var b = lab[2];
- var x;
- var y;
- var z;
- y = (l + 16) / 116;
- x = a / 500 + y;
- z = y - b / 200;
- var y2 = Math.pow(y, 3);
- var x2 = Math.pow(x, 3);
- var z2 = Math.pow(z, 3);
- y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
- x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
- z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
- x *= 95.047;
- y *= 100;
- z *= 108.883;
- return [x, y, z];
- };
- convert.lab.lch = function (lab) {
- var l = lab[0];
- var a = lab[1];
- var b = lab[2];
- var hr;
- var h;
- var c;
- hr = Math.atan2(b, a);
- h = hr * 360 / 2 / Math.PI;
- if (h < 0) {
- h += 360;
- }
- c = Math.sqrt(a * a + b * b);
- return [l, c, h];
- };
- convert.lch.lab = function (lch) {
- var l = lch[0];
- var c = lch[1];
- var h = lch[2];
- var a;
- var b;
- var hr;
- hr = h / 360 * 2 * Math.PI;
- a = c * Math.cos(hr);
- b = c * Math.sin(hr);
- return [l, a, b];
- };
- convert.rgb.ansi16 = function (args) {
- var r = args[0];
- var g = args[1];
- var b = args[2];
- var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization
- value = Math.round(value / 50);
- if (value === 0) {
- return 30;
- }
- var ansi = 30
- + ((Math.round(b / 255) << 2)
- | (Math.round(g / 255) << 1)
- | Math.round(r / 255));
- if (value === 2) {
- ansi += 60;
- }
- return ansi;
- };
- convert.hsv.ansi16 = function (args) {
- // optimization here; we already know the value and don't need to get
- // it converted for us.
- return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
- };
- convert.rgb.ansi256 = function (args) {
- var r = args[0];
- var g = args[1];
- var b = args[2];
- // we use the extended greyscale palette here, with the exception of
- // black and white. normal palette only has 4 greyscale shades.
- if (r === g && g === b) {
- if (r < 8) {
- return 16;
- }
- if (r > 248) {
- return 231;
- }
- return Math.round(((r - 8) / 247) * 24) + 232;
- }
- var ansi = 16
- + (36 * Math.round(r / 255 * 5))
- + (6 * Math.round(g / 255 * 5))
- + Math.round(b / 255 * 5);
- return ansi;
- };
- convert.ansi16.rgb = function (args) {
- var color = args % 10;
- // handle greyscale
- if (color === 0 || color === 7) {
- if (args > 50) {
- color += 3.5;
- }
- color = color / 10.5 * 255;
- return [color, color, color];
- }
- var mult = (~~(args > 50) + 1) * 0.5;
- var r = ((color & 1) * mult) * 255;
- var g = (((color >> 1) & 1) * mult) * 255;
- var b = (((color >> 2) & 1) * mult) * 255;
- return [r, g, b];
- };
- convert.ansi256.rgb = function (args) {
- // handle greyscale
- if (args >= 232) {
- var c = (args - 232) * 10 + 8;
- return [c, c, c];
- }
- args -= 16;
- var rem;
- var r = Math.floor(args / 36) / 5 * 255;
- var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
- var b = (rem % 6) / 5 * 255;
- return [r, g, b];
- };
- convert.rgb.hex = function (args) {
- var integer = ((Math.round(args[0]) & 0xFF) << 16)
- + ((Math.round(args[1]) & 0xFF) << 8)
- + (Math.round(args[2]) & 0xFF);
- var string = integer.toString(16).toUpperCase();
- return '000000'.substring(string.length) + string;
- };
- convert.hex.rgb = function (args) {
- var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
- if (!match) {
- return [0, 0, 0];
- }
- var colorString = match[0];
- if (match[0].length === 3) {
- colorString = colorString.split('').map(function (char) {
- return char + char;
- }).join('');
- }
- var integer = parseInt(colorString, 16);
- var r = (integer >> 16) & 0xFF;
- var g = (integer >> 8) & 0xFF;
- var b = integer & 0xFF;
- return [r, g, b];
- };
- convert.rgb.hcg = function (rgb) {
- var r = rgb[0] / 255;
- var g = rgb[1] / 255;
- var b = rgb[2] / 255;
- var max = Math.max(Math.max(r, g), b);
- var min = Math.min(Math.min(r, g), b);
- var chroma = (max - min);
- var grayscale;
- var hue;
- if (chroma < 1) {
- grayscale = min / (1 - chroma);
- } else {
- grayscale = 0;
- }
- if (chroma <= 0) {
- hue = 0;
- } else
- if (max === r) {
- hue = ((g - b) / chroma) % 6;
- } else
- if (max === g) {
- hue = 2 + (b - r) / chroma;
- } else {
- hue = 4 + (r - g) / chroma + 4;
- }
- hue /= 6;
- hue %= 1;
- return [hue * 360, chroma * 100, grayscale * 100];
- };
- convert.hsl.hcg = function (hsl) {
- var s = hsl[1] / 100;
- var l = hsl[2] / 100;
- var c = 1;
- var f = 0;
- if (l < 0.5) {
- c = 2.0 * s * l;
- } else {
- c = 2.0 * s * (1.0 - l);
- }
- if (c < 1.0) {
- f = (l - 0.5 * c) / (1.0 - c);
- }
- return [hsl[0], c * 100, f * 100];
- };
- convert.hsv.hcg = function (hsv) {
- var s = hsv[1] / 100;
- var v = hsv[2] / 100;
- var c = s * v;
- var f = 0;
- if (c < 1.0) {
- f = (v - c) / (1 - c);
- }
- return [hsv[0], c * 100, f * 100];
- };
- convert.hcg.rgb = function (hcg) {
- var h = hcg[0] / 360;
- var c = hcg[1] / 100;
- var g = hcg[2] / 100;
- if (c === 0.0) {
- return [g * 255, g * 255, g * 255];
- }
- var pure = [0, 0, 0];
- var hi = (h % 1) * 6;
- var v = hi % 1;
- var w = 1 - v;
- var mg = 0;
- switch (Math.floor(hi)) {
- case 0:
- pure[0] = 1; pure[1] = v; pure[2] = 0; break;
- case 1:
- pure[0] = w; pure[1] = 1; pure[2] = 0; break;
- case 2:
- pure[0] = 0; pure[1] = 1; pure[2] = v; break;
- case 3:
- pure[0] = 0; pure[1] = w; pure[2] = 1; break;
- case 4:
- pure[0] = v; pure[1] = 0; pure[2] = 1; break;
- default:
- pure[0] = 1; pure[1] = 0; pure[2] = w;
- }
- mg = (1.0 - c) * g;
- return [
- (c * pure[0] + mg) * 255,
- (c * pure[1] + mg) * 255,
- (c * pure[2] + mg) * 255
- ];
- };
- convert.hcg.hsv = function (hcg) {
- var c = hcg[1] / 100;
- var g = hcg[2] / 100;
- var v = c + g * (1.0 - c);
- var f = 0;
- if (v > 0.0) {
- f = c / v;
- }
- return [hcg[0], f * 100, v * 100];
- };
- convert.hcg.hsl = function (hcg) {
- var c = hcg[1] / 100;
- var g = hcg[2] / 100;
- var l = g * (1.0 - c) + 0.5 * c;
- var s = 0;
- if (l > 0.0 && l < 0.5) {
- s = c / (2 * l);
- } else
- if (l >= 0.5 && l < 1.0) {
- s = c / (2 * (1 - l));
- }
- return [hcg[0], s * 100, l * 100];
- };
- convert.hcg.hwb = function (hcg) {
- var c = hcg[1] / 100;
- var g = hcg[2] / 100;
- var v = c + g * (1.0 - c);
- return [hcg[0], (v - c) * 100, (1 - v) * 100];
- };
- convert.hwb.hcg = function (hwb) {
- var w = hwb[1] / 100;
- var b = hwb[2] / 100;
- var v = 1 - b;
- var c = v - w;
- var g = 0;
- if (c < 1) {
- g = (v - c) / (1 - c);
- }
- return [hwb[0], c * 100, g * 100];
- };
- convert.apple.rgb = function (apple) {
- return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
- };
- convert.rgb.apple = function (rgb) {
- return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
- };
- convert.gray.rgb = function (args) {
- return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
- };
- convert.gray.hsl = convert.gray.hsv = function (args) {
- return [0, 0, args[0]];
- };
- convert.gray.hwb = function (gray) {
- return [0, 100, gray[0]];
- };
- convert.gray.cmyk = function (gray) {
- return [0, 0, 0, gray[0]];
- };
- convert.gray.lab = function (gray) {
- return [gray[0], 0, 0];
- };
- convert.gray.hex = function (gray) {
- var val = Math.round(gray[0] / 100 * 255) & 0xFF;
- var integer = (val << 16) + (val << 8) + val;
- var string = integer.toString(16).toUpperCase();
- return '000000'.substring(string.length) + string;
- };
- convert.rgb.gray = function (rgb) {
- var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
- return [val / 255 * 100];
- };
- });
- /*
- this function routes a model to all other models.
- all functions that are routed have a property `.conversion` attached
- to the returned synthetic function. This property is an array
- of strings, each with the steps in between the 'from' and 'to'
- color models (inclusive).
- conversions that are not possible simply are not included.
- */
- // https://jsperf.com/object-keys-vs-for-in-with-closure/3
- var models$1 = Object.keys(conversions);
- function buildGraph() {
- var graph = {};
- for (var len = models$1.length, i = 0; i < len; i++) {
- graph[models$1[i]] = {
- // http://jsperf.com/1-vs-infinity
- // micro-opt, but this is simple.
- distance: -1,
- parent: null
- };
- }
- return graph;
- }
- // https://en.wikipedia.org/wiki/Breadth-first_search
- function deriveBFS(fromModel) {
- var graph = buildGraph();
- var queue = [fromModel]; // unshift -> queue -> pop
- graph[fromModel].distance = 0;
- while (queue.length) {
- var current = queue.pop();
- var adjacents = Object.keys(conversions[current]);
- for (var len = adjacents.length, i = 0; i < len; i++) {
- var adjacent = adjacents[i];
- var node = graph[adjacent];
- if (node.distance === -1) {
- node.distance = graph[current].distance + 1;
- node.parent = current;
- queue.unshift(adjacent);
- }
- }
- }
- return graph;
- }
- function link(from, to) {
- return function (args) {
- return to(from(args));
- };
- }
- function wrapConversion(toModel, graph) {
- var path$$1 = [graph[toModel].parent, toModel];
- var fn = conversions[graph[toModel].parent][toModel];
- var cur = graph[toModel].parent;
- while (graph[cur].parent) {
- path$$1.unshift(graph[cur].parent);
- fn = link(conversions[graph[cur].parent][cur], fn);
- cur = graph[cur].parent;
- }
- fn.conversion = path$$1;
- return fn;
- }
- var route = function (fromModel) {
- var graph = deriveBFS(fromModel);
- var conversion = {};
- var models = Object.keys(graph);
- for (var len = models.length, i = 0; i < len; i++) {
- var toModel = models[i];
- var node = graph[toModel];
- if (node.parent === null) {
- // no possible conversion, or this node is the source model.
- continue;
- }
- conversion[toModel] = wrapConversion(toModel, graph);
- }
- return conversion;
- };
- var convert = {};
- var models = Object.keys(conversions);
- function wrapRaw(fn) {
- var wrappedFn = function (args) {
- if (args === undefined || args === null) {
- return args;
- }
- if (arguments.length > 1) {
- args = Array.prototype.slice.call(arguments);
- }
- return fn(args);
- };
- // preserve .conversion property if there is one
- if ('conversion' in fn) {
- wrappedFn.conversion = fn.conversion;
- }
- return wrappedFn;
- }
- function wrapRounded(fn) {
- var wrappedFn = function (args) {
- if (args === undefined || args === null) {
- return args;
- }
- if (arguments.length > 1) {
- args = Array.prototype.slice.call(arguments);
- }
- var result = fn(args);
- // we're assuming the result is an array here.
- // see notice in conversions.js; don't use box types
- // in conversion functions.
- if (typeof result === 'object') {
- for (var len = result.length, i = 0; i < len; i++) {
- result[i] = Math.round(result[i]);
- }
- }
- return result;
- };
- // preserve .conversion property if there is one
- if ('conversion' in fn) {
- wrappedFn.conversion = fn.conversion;
- }
- return wrappedFn;
- }
- models.forEach(function (fromModel) {
- convert[fromModel] = {};
- Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
- Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
- var routes = route(fromModel);
- var routeModels = Object.keys(routes);
- routeModels.forEach(function (toModel) {
- var fn = routes[toModel];
- convert[fromModel][toModel] = wrapRounded(fn);
- convert[fromModel][toModel].raw = wrapRaw(fn);
- });
- });
- var colorConvert = convert;
- var ansiStyles = createCommonjsModule(function (module) {
- 'use strict';
- const wrapAnsi16 = (fn, offset) => function () {
- const code = fn.apply(colorConvert, arguments);
- return `\u001B[${code + offset}m`;
- };
- const wrapAnsi256 = (fn, offset) => function () {
- const code = fn.apply(colorConvert, arguments);
- return `\u001B[${38 + offset};5;${code}m`;
- };
- const wrapAnsi16m = (fn, offset) => function () {
- const rgb = fn.apply(colorConvert, arguments);
- return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
- };
- function assembleStyles() {
- const styles = {
- modifier: {
- reset: [0, 0],
- // 21 isn't widely supported and 22 does the same thing
- bold: [1, 22],
- dim: [2, 22],
- italic: [3, 23],
- underline: [4, 24],
- inverse: [7, 27],
- hidden: [8, 28],
- strikethrough: [9, 29]
- },
- color: {
- black: [30, 39],
- red: [31, 39],
- green: [32, 39],
- yellow: [33, 39],
- blue: [34, 39],
- magenta: [35, 39],
- cyan: [36, 39],
- white: [37, 39],
- gray: [90, 39],
- // Bright color
- redBright: [91, 39],
- greenBright: [92, 39],
- yellowBright: [93, 39],
- blueBright: [94, 39],
- magentaBright: [95, 39],
- cyanBright: [96, 39],
- whiteBright: [97, 39]
- },
- bgColor: {
- bgBlack: [40, 49],
- bgRed: [41, 49],
- bgGreen: [42, 49],
- bgYellow: [43, 49],
- bgBlue: [44, 49],
- bgMagenta: [45, 49],
- bgCyan: [46, 49],
- bgWhite: [47, 49],
- // Bright color
- bgBlackBright: [100, 49],
- bgRedBright: [101, 49],
- bgGreenBright: [102, 49],
- bgYellowBright: [103, 49],
- bgBlueBright: [104, 49],
- bgMagentaBright: [105, 49],
- bgCyanBright: [106, 49],
- bgWhiteBright: [107, 49]
- }
- };
- // Fix humans
- styles.color.grey = styles.color.gray;
- Object.keys(styles).forEach(groupName => {
- const group = styles[groupName];
- Object.keys(group).forEach(styleName => {
- const style = group[styleName];
- styles[styleName] = {
- open: `\u001B[${style[0]}m`,
- close: `\u001B[${style[1]}m`
- };
- group[styleName] = styles[styleName];
- });
- Object.defineProperty(styles, groupName, {
- value: group,
- enumerable: false
- });
- });
- const rgb2rgb = (r, g, b) => [r, g, b];
- styles.color.close = '\u001B[39m';
- styles.bgColor.close = '\u001B[49m';
- styles.color.ansi = {};
- styles.color.ansi256 = {};
- styles.color.ansi16m = {
- rgb: wrapAnsi16m(rgb2rgb, 0)
- };
- styles.bgColor.ansi = {};
- styles.bgColor.ansi256 = {};
- styles.bgColor.ansi16m = {
- rgb: wrapAnsi16m(rgb2rgb, 10)
- };
- for (const key of Object.keys(colorConvert)) {
- if (typeof colorConvert[key] !== 'object') {
- continue;
- }
- const suite = colorConvert[key];
- if ('ansi16' in suite) {
- styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);
- styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);
- }
- if ('ansi256' in suite) {
- styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);
- styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);
- }
- if ('rgb' in suite) {
- styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);
- styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);
- }
- }
- return styles;
- }
- Object.defineProperty(module, 'exports', {
- enumerable: true,
- get: assembleStyles
- });
- });
- var hasFlag = function (flag, argv) {
- argv = argv || process.argv;
- var terminatorPos = argv.indexOf('--');
- var prefix = /^-{1,2}/.test(flag) ? '' : '--';
- var pos = argv.indexOf(prefix + flag);
- return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
- };
- var supportsColor = createCommonjsModule(function (module) {
- 'use strict';
- const env = process.env;
- const support = level => {
- if (level === 0) {
- return false;
- }
- return {
- level,
- hasBasic: true,
- has256: level >= 2,
- has16m: level >= 3
- };
- };
- let supportLevel = (() => {
- if (hasFlag('no-color') ||
- hasFlag('no-colors') ||
- hasFlag('color=false')) {
- return 0;
- }
- if (hasFlag('color=16m') ||
- hasFlag('color=full') ||
- hasFlag('color=truecolor')) {
- return 3;
- }
- if (hasFlag('color=256')) {
- return 2;
- }
- if (hasFlag('color') ||
- hasFlag('colors') ||
- hasFlag('color=true') ||
- hasFlag('color=always')) {
- return 1;
- }
- if (process.stdout && !process.stdout.isTTY) {
- return 0;
- }
- if (process.platform === 'win32') {
- // Node.js 7.5.0 is the first version of Node.js to include a patch to
- // libuv that enables 256 color output on Windows. Anything earlier and it
- // won't work. However, here we target Node.js 8 at minimum as it is an LTS
- // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows
- // release that supports 256 colors.
- const osRelease = os.release().split('.');
- if (
- Number(process.version.split('.')[0]) >= 8 &&
- Number(osRelease[0]) >= 10 &&
- Number(osRelease[2]) >= 10586
- ) {
- return 2;
- }
- return 1;
- }
- if ('CI' in env) {
- if ('TRAVIS' in env || env.CI === 'Travis' || 'CIRCLECI' in env) {
- return 1;
- }
- return 0;
- }
- if ('TEAMCITY_VERSION' in env) {
- return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
- }
- if ('TERM_PROGRAM' in env) {
- const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
- switch (env.TERM_PROGRAM) {
- case 'iTerm.app':
- return version >= 3 ? 3 : 2;
- case 'Hyper':
- return 3;
- case 'Apple_Terminal':
- return 2;
- // No default
- }
- }
- if (/^(screen|xterm)-256(?:color)?/.test(env.TERM)) {
- return 2;
- }
- if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(env.TERM)) {
- return 1;
- }
- if ('COLORTERM' in env) {
- return 1;
- }
- if (env.TERM === 'dumb') {
- return 0;
- }
- return 0;
- })();
- if ('FORCE_COLOR' in env) {
- supportLevel = parseInt(env.FORCE_COLOR, 10) === 0 ? 0 : (supportLevel || 1);
- }
- module.exports = process && support(supportLevel);
- });
- var templates = createCommonjsModule(function (module) {
- 'use strict';
- const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
- const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
- const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
- const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi;
- const ESCAPES = new Map([
- ['n', '\n'],
- ['r', '\r'],
- ['t', '\t'],
- ['b', '\b'],
- ['f', '\f'],
- ['v', '\v'],
- ['0', '\0'],
- ['\\', '\\'],
- ['e', '\u001B'],
- ['a', '\u0007']
- ]);
- function unescape(c) {
- if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) {
- return String.fromCharCode(parseInt(c.slice(1), 16));
- }
- return ESCAPES.get(c) || c;
- }
- function parseArguments(name, args) {
- const results = [];
- const chunks = args.trim().split(/\s*,\s*/g);
- let matches;
- for (const chunk of chunks) {
- if (!isNaN(chunk)) {
- results.push(Number(chunk));
- } else if ((matches = chunk.match(STRING_REGEX))) {
- results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr));
- } else {
- throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
- }
- }
- return results;
- }
- function parseStyle(style) {
- STYLE_REGEX.lastIndex = 0;
- const results = [];
- let matches;
- while ((matches = STYLE_REGEX.exec(style)) !== null) {
- const name = matches[1];
- if (matches[2]) {
- const args = parseArguments(name, matches[2]);
- results.push([name].concat(args));
- } else {
- results.push([name]);
- }
- }
- return results;
- }
- function buildStyle(chalk, styles) {
- const enabled = {};
- for (const layer of styles) {
- for (const style of layer.styles) {
- enabled[style[0]] = layer.inverse ? null : style.slice(1);
- }
- }
- let current = chalk;
- for (const styleName of Object.keys(enabled)) {
- if (Array.isArray(enabled[styleName])) {
- if (!(styleName in current)) {
- throw new Error(`Unknown Chalk style: ${styleName}`);
- }
- if (enabled[styleName].length > 0) {
- current = current[styleName].apply(current, enabled[styleName]);
- } else {
- current = current[styleName];
- }
- }
- }
- return current;
- }
- module.exports = (chalk, tmp) => {
- const styles = [];
- const chunks = [];
- let chunk = [];
- // eslint-disable-next-line max-params
- tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => {
- if (escapeChar) {
- chunk.push(unescape(escapeChar));
- } else if (style) {
- const str = chunk.join('');
- chunk = [];
- chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str));
- styles.push({inverse, styles: parseStyle(style)});
- } else if (close) {
- if (styles.length === 0) {
- throw new Error('Found extraneous } in Chalk template literal');
- }
- chunks.push(buildStyle(chalk, styles)(chunk.join('')));
- chunk = [];
- styles.pop();
- } else {
- chunk.push(chr);
- }
- });
- chunks.push(chunk.join(''));
- if (styles.length > 0) {
- const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`;
- throw new Error(errMsg);
- }
- return chunks.join('');
- };
- });
- var chalk = createCommonjsModule(function (module) {
- 'use strict';
- const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm');
- // `supportsColor.level` → `ansiStyles.color[name]` mapping
- const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m'];
- // `color-convert` models to exclude from the Chalk API due to conflicts and such
- const skipModels = new Set(['gray']);
- const styles = Object.create(null);
- function applyOptions(obj, options) {
- options = options || {};
- // Detect level if not set manually
- const scLevel = supportsColor ? supportsColor.level : 0;
- obj.level = options.level === undefined ? scLevel : options.level;
- obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;
- }
- function Chalk(options) {
- // We check for this.template here since calling `chalk.constructor()`
- // by itself will have a `this` of a previously constructed chalk object
- if (!this || !(this instanceof Chalk) || this.template) {
- const chalk = {};
- applyOptions(chalk, options);
- chalk.template = function () {
- const args = [].slice.call(arguments);
- return chalkTag.apply(null, [chalk.template].concat(args));
- };
- Object.setPrototypeOf(chalk, Chalk.prototype);
- Object.setPrototypeOf(chalk.template, chalk);
- chalk.template.constructor = Chalk;
- return chalk.template;
- }
- applyOptions(this, options);
- }
- // Use bright blue on Windows as the normal blue color is illegible
- if (isSimpleWindowsTerm) {
- ansiStyles.blue.open = '\u001B[94m';
- }
- for (const key of Object.keys(ansiStyles)) {
- ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
- styles[key] = {
- get() {
- const codes = ansiStyles[key];
- return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);
- }
- };
- }
- styles.visible = {
- get() {
- return build.call(this, this._styles || [], true, 'visible');
- }
- };
- ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g');
- for (const model of Object.keys(ansiStyles.color.ansi)) {
- if (skipModels.has(model)) {
- continue;
- }
- styles[model] = {
- get() {
- const level = this.level;
- return function () {
- const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments);
- const codes = {
- open,
- close: ansiStyles.color.close,
- closeRe: ansiStyles.color.closeRe
- };
- return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
- };
- }
- };
- }
- ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g');
- for (const model of Object.keys(ansiStyles.bgColor.ansi)) {
- if (skipModels.has(model)) {
- continue;
- }
- const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
- styles[bgModel] = {
- get() {
- const level = this.level;
- return function () {
- const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments);
- const codes = {
- open,
- close: ansiStyles.bgColor.close,
- closeRe: ansiStyles.bgColor.closeRe
- };
- return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
- };
- }
- };
- }
- const proto = Object.defineProperties(() => {}, styles);
- function build(_styles, _empty, key) {
- const builder = function () {
- return applyStyle.apply(builder, arguments);
- };
- builder._styles = _styles;
- builder._empty = _empty;
- const self = this;
- Object.defineProperty(builder, 'level', {
- enumerable: true,
- get() {
- return self.level;
- },
- set(level) {
- self.level = level;
- }
- });
- Object.defineProperty(builder, 'enabled', {
- enumerable: true,
- get() {
- return self.enabled;
- },
- set(enabled) {
- self.enabled = enabled;
- }
- });
- // See below for fix regarding invisible grey/dim combination on Windows
- builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey';
- // `__proto__` is used because we must return a function, but there is
- // no way to create a function with a different prototype
- builder.__proto__ = proto; // eslint-disable-line no-proto
- return builder;
- }
- function applyStyle() {
- // Support varags, but simply cast to string in case there's only one arg
- const args = arguments;
- const argsLen = args.length;
- let str = String(arguments[0]);
- if (argsLen === 0) {
- return '';
- }
- if (argsLen > 1) {
- // Don't slice `arguments`, it prevents V8 optimizations
- for (let a = 1; a < argsLen; a++) {
- str += ' ' + args[a];
- }
- }
- if (!this.enabled || this.level <= 0 || !str) {
- return this._empty ? '' : str;
- }
- // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
- // see https://github.com/chalk/chalk/issues/58
- // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
- const originalDim = ansiStyles.dim.open;
- if (isSimpleWindowsTerm && this.hasGrey) {
- ansiStyles.dim.open = '';
- }
- for (const code of this._styles.slice().reverse()) {
- // Replace any instances already present with a re-opening code
- // otherwise only the part of the string until said closing code
- // will be colored, and the rest will simply be 'plain'.
- str = code.open + str.replace(code.closeRe, code.open) + code.close;
- // Close the styling before a linebreak and reopen
- // after next line to fix a bleed issue on macOS
- // https://github.com/chalk/chalk/pull/92
- str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`);
- }
- // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue
- ansiStyles.dim.open = originalDim;
- return str;
- }
- function chalkTag(chalk, strings) {
- if (!Array.isArray(strings)) {
- // If chalk() was called by itself or with a string,
- // return the string itself as a string.
- return [].slice.call(arguments, 1).join(' ');
- }
- const args = [].slice.call(arguments, 2);
- const parts = [strings.raw[0]];
- for (let i = 1; i < strings.length; i++) {
- parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&'));
- parts.push(String(strings.raw[i]));
- }
- return templates(chalk, parts.join(''));
- }
- Object.defineProperties(Chalk.prototype, styles);
- module.exports = Chalk(); // eslint-disable-line new-cap
- module.exports.supportsColor = supportsColor;
- module.exports.default = module.exports; // For TypeScript
- });
- var lib$5 = createCommonjsModule(function (module, exports) {
- "use strict";
- exports.__esModule = true;
- exports.shouldHighlight = shouldHighlight;
- exports.getChalk = getChalk;
- exports.default = highlight;
- var _jsTokens = _interopRequireWildcard(jsTokens);
- var _esutils = _interopRequireDefault(utils$2);
- var _chalk = _interopRequireDefault(chalk);
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
- function getDefs(chalk$$1) {
- return {
- keyword: chalk$$1.cyan,
- capitalized: chalk$$1.yellow,
- jsx_tag: chalk$$1.yellow,
- punctuator: chalk$$1.yellow,
- number: chalk$$1.magenta,
- string: chalk$$1.green,
- regex: chalk$$1.magenta,
- comment: chalk$$1.grey,
- invalid: chalk$$1.white.bgRed.bold
- };
- }
- var NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
- var JSX_TAG = /^[a-z][\w-]*$/i;
- var BRACKET = /^[()[\]{}]$/;
- function getTokenType(match) {
- var _match$slice = match.slice(-2),
- offset = _match$slice[0],
- text = _match$slice[1];
- var token = (0, _jsTokens.matchToToken)(match);
- if (token.type === "name") {
- if (_esutils.default.keyword.isReservedWordES6(token.value)) {
- return "keyword";
- }
- if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.substr(offset - 2, 2) == "</")) {
- return "jsx_tag";
- }
- if (token.value[0] !== token.value[0].toLowerCase()) {
- return "capitalized";
- }
- }
- if (token.type === "punctuator" && BRACKET.test(token.value)) {
- return "bracket";
- }
- if (token.type === "invalid" && (token.value === "@" || token.value === "#")) {
- return "punctuator";
- }
- return token.type;
- }
- function highlightTokens(defs, text) {
- return text.replace(_jsTokens.default, function () {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
- var type = getTokenType(args);
- var colorize = defs[type];
- if (colorize) {
- return args[0].split(NEWLINE).map(function (str) {
- return colorize(str);
- }).join("\n");
- } else {
- return args[0];
- }
- });
- }
- function shouldHighlight(options) {
- return _chalk.default.supportsColor || options.forceColor;
- }
- function getChalk(options) {
- var chalk$$1 = _chalk.default;
- if (options.forceColor) {
- chalk$$1 = new _chalk.default.constructor({
- enabled: true,
- level: 1
- });
- }
- return chalk$$1;
- }
- function highlight(code, options) {
- if (options === void 0) {
- options = {};
- }
- if (shouldHighlight(options)) {
- var chalk$$1 = getChalk(options);
- var defs = getDefs(chalk$$1);
- return highlightTokens(defs, code);
- } else {
- return code;
- }
- }
- });
- unwrapExports(lib$5);
- var lib$4 = createCommonjsModule(function (module, exports) {
- "use strict";
- exports.__esModule = true;
- exports.codeFrameColumns = codeFrameColumns;
- exports.default = _default;
- var _highlight = _interopRequireWildcard(lib$5);
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
- var deprecationWarningShown = false;
- function getDefs(chalk) {
- return {
- gutter: chalk.grey,
- marker: chalk.red.bold,
- message: chalk.red.bold
- };
- }
- var NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
- function getMarkerLines(loc, source, opts) {
- var startLoc = Object.assign({}, {
- column: 0,
- line: -1
- }, loc.start);
- var endLoc = Object.assign({}, startLoc, loc.end);
- var _ref = opts || {},
- _ref$linesAbove = _ref.linesAbove,
- linesAbove = _ref$linesAbove === void 0 ? 2 : _ref$linesAbove,
- _ref$linesBelow = _ref.linesBelow,
- linesBelow = _ref$linesBelow === void 0 ? 3 : _ref$linesBelow;
- var startLine = startLoc.line;
- var startColumn = startLoc.column;
- var endLine = endLoc.line;
- var endColumn = endLoc.column;
- var start = Math.max(startLine - (linesAbove + 1), 0);
- var end = Math.min(source.length, endLine + linesBelow);
- if (startLine === -1) {
- start = 0;
- }
- if (endLine === -1) {
- end = source.length;
- }
- var lineDiff = endLine - startLine;
- var markerLines = {};
- if (lineDiff) {
- for (var i = 0; i <= lineDiff; i++) {
- var lineNumber = i + startLine;
- if (!startColumn) {
- markerLines[lineNumber] = true;
- } else if (i === 0) {
- var sourceLength = source[lineNumber - 1].length;
- markerLines[lineNumber] = [startColumn, sourceLength - startColumn];
- } else if (i === lineDiff) {
- markerLines[lineNumber] = [0, endColumn];
- } else {
- var _sourceLength = source[lineNumber - i].length;
- markerLines[lineNumber] = [0, _sourceLength];
- }
- }
- } else {
- if (startColumn === endColumn) {
- if (startColumn) {
- markerLines[startLine] = [startColumn, 0];
- } else {
- markerLines[startLine] = true;
- }
- } else {
- markerLines[startLine] = [startColumn, endColumn - startColumn];
- }
- }
- return {
- start: start,
- end: end,
- markerLines: markerLines
- };
- }
- function codeFrameColumns(rawLines, loc, opts) {
- if (opts === void 0) {
- opts = {};
- }
- var highlighted = (opts.highlightCode || opts.forceColor) && (0, _highlight.shouldHighlight)(opts);
- var chalk = (0, _highlight.getChalk)(opts);
- var defs = getDefs(chalk);
- var maybeHighlight = function maybeHighlight(chalkFn, string) {
- return highlighted ? chalkFn(string) : string;
- };
- if (highlighted) rawLines = (0, _highlight.default)(rawLines, opts);
- var lines = rawLines.split(NEWLINE);
- var _getMarkerLines = getMarkerLines(loc, lines, opts),
- start = _getMarkerLines.start,
- end = _getMarkerLines.end,
- markerLines = _getMarkerLines.markerLines;
- var hasColumns = loc.start && typeof loc.start.column === "number";
- var numberMaxWidth = String(end).length;
- var frame = lines.slice(start, end).map(function (line, index) {
- var number = start + 1 + index;
- var paddedNumber = (" " + number).slice(-numberMaxWidth);
- var gutter = " " + paddedNumber + " | ";
- var hasMarker = markerLines[number];
- var lastMarkerLine = !markerLines[number + 1];
- if (hasMarker) {
- var markerLine = "";
- if (Array.isArray(hasMarker)) {
- var markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " ");
- var numberOfMarkers = hasMarker[1] || 1;
- markerLine = ["\n ", maybeHighlight(defs.gutter, gutter.replace(/\d/g, " ")), markerSpacing, maybeHighlight(defs.marker, "^").repeat(numberOfMarkers)].join("");
- if (lastMarkerLine && opts.message) {
- markerLine += " " + maybeHighlight(defs.message, opts.message);
- }
- }
- return [maybeHighlight(defs.marker, ">"), maybeHighlight(defs.gutter, gutter), line, markerLine].join("");
- } else {
- return " " + maybeHighlight(defs.gutter, gutter) + line;
- }
- }).join("\n");
- if (opts.message && !hasColumns) {
- frame = "" + " ".repeat(numberMaxWidth + 1) + opts.message + "\n" + frame;
- }
- if (highlighted) {
- return chalk.reset(frame);
- } else {
- return frame;
- }
- }
- function _default(rawLines, lineNumber, colNumber, opts) {
- if (opts === void 0) {
- opts = {};
- }
- if (!deprecationWarningShown) {
- deprecationWarningShown = true;
- var deprecationError = new Error("Passing lineNumber and colNumber is deprecated to @babel/code-frame. Please use `codeFrameColumns`.");
- deprecationError.name = "DeprecationWarning";
- if (process.emitWarning) {
- process.emitWarning(deprecationError);
- } else {
- console.warn(deprecationError);
- }
- }
- colNumber = Math.max(colNumber, 0);
- var location = {
- start: {
- column: colNumber,
- line: lineNumber
- }
- };
- return codeFrameColumns(rawLines, location, opts);
- }
- });
- unwrapExports(lib$4);
- const ConfigError = errors.ConfigError;
- const locStart$1 = languageJs.locStart;
- const locEnd$1 = languageJs.locEnd;
- function getParsers(options) {
- return options.plugins.reduce(
- (parsers, plugin) => Object.assign({}, parsers, plugin.parsers),
- {}
- );
- }
- function resolveParser$1(opts, parsers) {
- parsers = parsers || getParsers(opts);
- if (typeof opts.parser === "function") {
- // Custom parser API always works with JavaScript.
- return {
- parse: opts.parser,
- astFormat: "estree",
- locStart: locStart$1,
- locEnd: locEnd$1
- };
- }
- if (typeof opts.parser === "string") {
- if (parsers.hasOwnProperty(opts.parser)) {
- return parsers[opts.parser];
- }
- try {
- return {
- parse: require(path.resolve(process.cwd(), opts.parser)),
- astFormat: "estree",
- locStart: locStart$1,
- locEnd: locEnd$1
- };
- } catch (err) {
- /* istanbul ignore next */
- throw new ConfigError(`Couldn't resolve parser "${opts.parser}"`);
- }
- }
- /* istanbul ignore next */
- return parsers.babylon;
- }
- function parse$3(text, opts) {
- const parsers = getParsers(opts);
- // Copy the "parse" function from parser to a new object whose values are
- // functions. Use defineProperty()/getOwnPropertyDescriptor() such that we
- // don't invoke the parser.parse getters.
- const parsersForCustomParserApi = Object.keys(parsers).reduce(
- (object, parserName) =>
- Object.defineProperty(
- object,
- parserName,
- Object.getOwnPropertyDescriptor(parsers[parserName], "parse")
- ),
- {}
- );
- const parser = resolveParser$1(opts, parsers);
- try {
- if (parser.preprocess) {
- text = parser.preprocess(text, opts);
- }
- return {
- text,
- ast: parser.parse(text, parsersForCustomParserApi, opts)
- };
- } catch (error) {
- const loc = error.loc;
- if (loc) {
- const codeFrame = lib$4;
- error.codeFrame = codeFrame.codeFrameColumns(text, loc, {
- highlightCode: true
- });
- error.message += "\n" + error.codeFrame;
- throw error;
- }
- /* istanbul ignore next */
- throw error.stack;
- }
- }
- var parser$3 = { parse: parse$3, resolveParser: resolveParser$1 };
- function getPlugin(options) {
- const astFormat = options.astFormat;
- if (!astFormat) {
- throw new Error("getPlugin() requires astFormat to be set");
- }
- const printerPlugin = options.plugins.find(
- plugin => plugin.printers[astFormat]
- );
- if (!printerPlugin) {
- throw new Error(`Couldn't find plugin for AST format "${astFormat}"`);
- }
- return printerPlugin;
- }
- var getPlugin_1 = getPlugin;
- const getSupportInfo$2 = support.getSupportInfo;
- const resolveParser = parser$3.resolveParser;
- const hiddenDefaults = {
- astFormat: "estree",
- printer: {},
- locStart: null,
- locEnd: null
- };
- // Copy options and fill in default values.
- function normalize$2(options, opts) {
- opts = opts || {};
- const rawOptions = Object.assign({}, options);
- const plugins = loadPlugins_1(rawOptions.plugins);
- rawOptions.plugins = plugins;
- const supportOptions = getSupportInfo$2(null, {
- plugins,
- pluginsLoaded: true,
- showUnreleased: true,
- showDeprecated: true
- }).options;
- const defaults = supportOptions.reduce(
- (reduced, optionInfo) =>
- Object.assign(reduced, { [optionInfo.name]: optionInfo.default }),
- Object.assign({}, hiddenDefaults)
- );
- if (opts.inferParser !== false) {
- if (
- rawOptions.filepath &&
- (!rawOptions.parser || rawOptions.parser === defaults.parser)
- ) {
- const inferredParser = inferParser(
- rawOptions.filepath,
- rawOptions.plugins
- );
- if (inferredParser) {
- rawOptions.parser = inferredParser;
- }
- }
- }
- const parser = resolveParser(
- !rawOptions.parser
- ? rawOptions
- : // handle deprecated parsers
- optionsNormalizer.normalizeApiOptions(
- rawOptions,
- [supportOptions.find(x => x.name === "parser")],
- { passThrough: true, logger: false }
- )
- );
- rawOptions.astFormat = parser.astFormat;
- rawOptions.locEnd = parser.locEnd;
- rawOptions.locStart = parser.locStart;
- const plugin = getPlugin_1(rawOptions);
- rawOptions.printer = plugin.printers[rawOptions.astFormat];
- const pluginDefaults = supportOptions
- .filter(
- optionInfo =>
- optionInfo.pluginDefaults && optionInfo.pluginDefaults[plugin.name]
- )
- .reduce(
- (reduced, optionInfo) =>
- Object.assign(reduced, {
- [optionInfo.name]: optionInfo.pluginDefaults[plugin.name]
- }),
- {}
- );
- const mixedDefaults = Object.assign({}, defaults, pluginDefaults);
- Object.keys(mixedDefaults).forEach(k => {
- if (rawOptions[k] == null) {
- rawOptions[k] = mixedDefaults[k];
- }
- });
- if (rawOptions.parser === "json") {
- rawOptions.trailingComma = "none";
- }
- return optionsNormalizer.normalizeApiOptions(
- rawOptions,
- supportOptions,
- Object.assign({ passThrough: Object.keys(hiddenDefaults) }, opts)
- );
- }
- function inferParser(filepath, plugins) {
- const extension = path.extname(filepath);
- const filename = path.basename(filepath).toLowerCase();
- const language = getSupportInfo$2(null, {
- plugins,
- pluginsLoaded: true
- }).languages.find(
- language =>
- language.since !== null &&
- (language.extensions.indexOf(extension) > -1 ||
- (language.filenames &&
- language.filenames.find(name => name.toLowerCase() === filename)))
- );
- return language && language.parsers[0];
- }
- var options$12 = { normalize: normalize$2, hiddenDefaults };
- const normalize$1 = options$12.normalize;
- function printSubtree(path$$1, print, options) {
- if (options.printer.embed) {
- return options.printer.embed(
- path$$1,
- print,
- (text, partialNextOptions) =>
- textToDoc(text, partialNextOptions, options),
- options
- );
- }
- }
- function textToDoc(text, partialNextOptions, parentOptions) {
- const nextOptions = normalize$1(
- Object.assign({}, parentOptions, partialNextOptions, {
- parentParser: parentOptions.parser,
- originalText: text
- }),
- { passThrough: true, inferParser: false }
- );
- const result = parser$3.parse(text, nextOptions);
- const ast = result.ast;
- text = result.text;
- const astComments = ast.comments;
- delete ast.comments;
- comments.attach(astComments, ast, text, nextOptions);
- return astToDoc(ast, nextOptions);
- }
- var multiparser = {
- printSubtree
- };
- const doc$3 = doc;
- const docBuilders$14 = doc$3.builders;
- const concat$14 = docBuilders$14.concat;
- const hardline$13 = docBuilders$14.hardline;
- const addAlignmentToDoc$2 = docBuilders$14.addAlignmentToDoc;
- const docUtils$6 = doc$3.utils;
- function printAstToDoc(ast, options, addAlignmentSize) {
- addAlignmentSize = addAlignmentSize || 0;
- const printer = options.printer;
- const cache = new Map();
- function printGenerically(path$$1, args) {
- const node = path$$1.getValue();
- const shouldCache = node && typeof node === "object" && args === undefined;
- if (shouldCache && cache.has(node)) {
- return cache.get(node);
- }
- // We let JSXElement print its comments itself because it adds () around
- // UnionTypeAnnotation has to align the child without the comments
- let res;
- if (printer.willPrintOwnComments && printer.willPrintOwnComments(path$$1)) {
- res = genericPrint$6(path$$1, options, printGenerically, args);
- } else {
- res = comments.printComments(
- path$$1,
- p => genericPrint$6(p, options, printGenerically, args),
- options,
- args && args.needsSemi
- );
- }
- if (shouldCache) {
- cache.set(node, res);
- }
- return res;
- }
- let doc$$2 = printGenerically(new fastPath(ast));
- if (addAlignmentSize > 0) {
- // Add a hardline to make the indents take effect
- // It should be removed in index.js format()
- doc$$2 = addAlignmentToDoc$2(
- docUtils$6.removeLines(concat$14([hardline$13, doc$$2])),
- addAlignmentSize,
- options.tabWidth
- );
- }
- docUtils$6.propagateBreaks(doc$$2);
- if (options.parser === "json") {
- doc$$2 = concat$14([doc$$2, hardline$13]);
- }
- return doc$$2;
- }
- function genericPrint$6(path$$1, options, printPath, args) {
- assert.ok(path$$1 instanceof fastPath);
- const node = path$$1.getValue();
- const printer = options.printer;
- // Escape hatch
- if (printer.hasPrettierIgnore && printer.hasPrettierIgnore(path$$1)) {
- return options.originalText.slice(
- options.locStart(node),
- options.locEnd(node)
- );
- }
- if (node) {
- try {
- // Potentially switch to a different parser
- const sub = multiparser.printSubtree(path$$1, printPath, options);
- if (sub) {
- return sub;
- }
- } catch (error) {
- /* istanbul ignore if */
- if (process.env.PRETTIER_DEBUG) {
- throw error;
- }
- // Continue with current parser
- }
- }
- return printer.print(path$$1, options, printPath, args);
- }
- var astToDoc = printAstToDoc;
- var concatMap = function (xs, fn) {
- var res = [];
- for (var i = 0; i < xs.length; i++) {
- var x = fn(xs[i], i);
- if (isArray(x)) res.push.apply(res, x);
- else res.push(x);
- }
- return res;
- };
- var isArray = Array.isArray || function (xs) {
- return Object.prototype.toString.call(xs) === '[object Array]';
- };
- var balancedMatch = balanced;
- function balanced(a, b, str) {
- if (a instanceof RegExp) a = maybeMatch(a, str);
- if (b instanceof RegExp) b = maybeMatch(b, str);
- var r = range(a, b, str);
- return r && {
- start: r[0],
- end: r[1],
- pre: str.slice(0, r[0]),
- body: str.slice(r[0] + a.length, r[1]),
- post: str.slice(r[1] + b.length)
- };
- }
- function maybeMatch(reg, str) {
- var m = str.match(reg);
- return m ? m[0] : null;
- }
- balanced.range = range;
- function range(a, b, str) {
- var begs, beg, left, right, result;
- var ai = str.indexOf(a);
- var bi = str.indexOf(b, ai + 1);
- var i = ai;
- if (ai >= 0 && bi > 0) {
- begs = [];
- left = str.length;
- while (i >= 0 && !result) {
- if (i == ai) {
- begs.push(i);
- ai = str.indexOf(a, i + 1);
- } else if (begs.length == 1) {
- result = [ begs.pop(), bi ];
- } else {
- beg = begs.pop();
- if (beg < left) {
- left = beg;
- right = bi;
- }
- bi = str.indexOf(b, i + 1);
- }
- i = ai < bi && ai >= 0 ? ai : bi;
- }
- if (begs.length) {
- result = [ left, right ];
- }
- }
- return result;
- }
- var braceExpansion = expandTop;
- var escSlash = '\0SLASH'+Math.random()+'\0';
- var escOpen = '\0OPEN'+Math.random()+'\0';
- var escClose = '\0CLOSE'+Math.random()+'\0';
- var escComma = '\0COMMA'+Math.random()+'\0';
- var escPeriod = '\0PERIOD'+Math.random()+'\0';
- function numeric(str) {
- return parseInt(str, 10) == str
- ? parseInt(str, 10)
- : str.charCodeAt(0);
- }
- function escapeBraces(str) {
- return str.split('\\\\').join(escSlash)
- .split('\\{').join(escOpen)
- .split('\\}').join(escClose)
- .split('\\,').join(escComma)
- .split('\\.').join(escPeriod);
- }
- function unescapeBraces(str) {
- return str.split(escSlash).join('\\')
- .split(escOpen).join('{')
- .split(escClose).join('}')
- .split(escComma).join(',')
- .split(escPeriod).join('.');
- }
- // Basically just str.split(","), but handling cases
- // where we have nested braced sections, which should be
- // treated as individual members, like {a,{b,c},d}
- function parseCommaParts(str) {
- if (!str)
- return [''];
- var parts = [];
- var m = balancedMatch('{', '}', str);
- if (!m)
- return str.split(',');
- var pre = m.pre;
- var body = m.body;
- var post = m.post;
- var p = pre.split(',');
- p[p.length-1] += '{' + body + '}';
- var postParts = parseCommaParts(post);
- if (post.length) {
- p[p.length-1] += postParts.shift();
- p.push.apply(p, postParts);
- }
- parts.push.apply(parts, p);
- return parts;
- }
- function expandTop(str) {
- if (!str)
- return [];
- // I don't know why Bash 4.3 does this, but it does.
- // Anything starting with {} will have the first two bytes preserved
- // but *only* at the top level, so {},a}b will not expand to anything,
- // but a{},b}c will be expanded to [a}c,abc].
- // One could argue that this is a bug in Bash, but since the goal of
- // this module is to match Bash's rules, we escape a leading {}
- if (str.substr(0, 2) === '{}') {
- str = '\\{\\}' + str.substr(2);
- }
- return expand(escapeBraces(str), true).map(unescapeBraces);
- }
- function embrace(str) {
- return '{' + str + '}';
- }
- function isPadded(el) {
- return /^-?0\d/.test(el);
- }
- function lte(i, y) {
- return i <= y;
- }
- function gte(i, y) {
- return i >= y;
- }
- function expand(str, isTop) {
- var expansions = [];
- var m = balancedMatch('{', '}', str);
- if (!m || /\$$/.test(m.pre)) return [str];
- var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
- var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
- var isSequence = isNumericSequence || isAlphaSequence;
- var isOptions = m.body.indexOf(',') >= 0;
- if (!isSequence && !isOptions) {
- // {a},b}
- if (m.post.match(/,.*\}/)) {
- str = m.pre + '{' + m.body + escClose + m.post;
- return expand(str);
- }
- return [str];
- }
- var n;
- if (isSequence) {
- n = m.body.split(/\.\./);
- } else {
- n = parseCommaParts(m.body);
- if (n.length === 1) {
- // x{{a,b}}y ==> x{a}y x{b}y
- n = expand(n[0], false).map(embrace);
- if (n.length === 1) {
- var post = m.post.length
- ? expand(m.post, false)
- : [''];
- return post.map(function(p) {
- return m.pre + n[0] + p;
- });
- }
- }
- }
- // at this point, n is the parts, and we know it's not a comma set
- // with a single entry.
- // no need to expand pre, since it is guaranteed to be free of brace-sets
- var pre = m.pre;
- var post = m.post.length
- ? expand(m.post, false)
- : [''];
- var N;
- if (isSequence) {
- var x = numeric(n[0]);
- var y = numeric(n[1]);
- var width = Math.max(n[0].length, n[1].length);
- var incr = n.length == 3
- ? Math.abs(numeric(n[2]))
- : 1;
- var test = lte;
- var reverse = y < x;
- if (reverse) {
- incr *= -1;
- test = gte;
- }
- var pad = n.some(isPadded);
- N = [];
- for (var i = x; test(i, y); i += incr) {
- var c;
- if (isAlphaSequence) {
- c = String.fromCharCode(i);
- if (c === '\\')
- c = '';
- } else {
- c = String(i);
- if (pad) {
- var need = width - c.length;
- if (need > 0) {
- var z = new Array(need + 1).join('0');
- if (i < 0)
- c = '-' + z + c.slice(1);
- else
- c = z + c;
- }
- }
- }
- N.push(c);
- }
- } else {
- N = concatMap(n, function(el) { return expand(el, false) });
- }
- for (var j = 0; j < N.length; j++) {
- for (var k = 0; k < post.length; k++) {
- var expansion = pre + N[j] + post[k];
- if (!isTop || isSequence || expansion)
- expansions.push(expansion);
- }
- }
- return expansions;
- }
- var minimatch_1 = minimatch;
- minimatch.Minimatch = Minimatch;
- var path$3 = { sep: '/' };
- try {
- path$3 = path;
- } catch (er) {}
- var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {};
- var plTypes = {
- '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
- '?': { open: '(?:', close: ')?' },
- '+': { open: '(?:', close: ')+' },
- '*': { open: '(?:', close: ')*' },
- '@': { open: '(?:', close: ')' }
- };
- // any single thing other than /
- // don't need to escape / when using new RegExp()
- var qmark = '[^/]';
- // * => any number of characters
- var star = qmark + '*?';
- // ** when dots are allowed. Anything goes, except .. and .
- // not (^ or / followed by one or two dots followed by $ or /),
- // followed by anything, any number of times.
- var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?';
- // not a ^ or / followed by a dot,
- // followed by anything, any number of times.
- var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?';
- // characters that need to be escaped in RegExp.
- var reSpecials = charSet('().*{}+?[]^$\\!');
- // "abc" -> { a:true, b:true, c:true }
- function charSet (s) {
- return s.split('').reduce(function (set, c) {
- set[c] = true;
- return set
- }, {})
- }
- // normalizes slashes.
- var slashSplit = /\/+/;
- minimatch.filter = filter;
- function filter (pattern, options) {
- options = options || {};
- return function (p, i, list) {
- return minimatch(p, pattern, options)
- }
- }
- function ext (a, b) {
- a = a || {};
- b = b || {};
- var t = {};
- Object.keys(b).forEach(function (k) {
- t[k] = b[k];
- });
- Object.keys(a).forEach(function (k) {
- t[k] = a[k];
- });
- return t
- }
- minimatch.defaults = function (def) {
- if (!def || !Object.keys(def).length) return minimatch
- var orig = minimatch;
- var m = function minimatch (p, pattern, options) {
- return orig.minimatch(p, pattern, ext(def, options))
- };
- m.Minimatch = function Minimatch (pattern, options) {
- return new orig.Minimatch(pattern, ext(def, options))
- };
- return m
- };
- Minimatch.defaults = function (def) {
- if (!def || !Object.keys(def).length) return Minimatch
- return minimatch.defaults(def).Minimatch
- };
- function minimatch (p, pattern, options) {
- if (typeof pattern !== 'string') {
- throw new TypeError('glob pattern string required')
- }
- if (!options) options = {};
- // shortcut: comments match nothing.
- if (!options.nocomment && pattern.charAt(0) === '#') {
- return false
- }
- // "" only matches ""
- if (pattern.trim() === '') return p === ''
- return new Minimatch(pattern, options).match(p)
- }
- function Minimatch (pattern, options) {
- if (!(this instanceof Minimatch)) {
- return new Minimatch(pattern, options)
- }
- if (typeof pattern !== 'string') {
- throw new TypeError('glob pattern string required')
- }
- if (!options) options = {};
- pattern = pattern.trim();
- // windows support: need to use /, not \
- if (path$3.sep !== '/') {
- pattern = pattern.split(path$3.sep).join('/');
- }
- this.options = options;
- this.set = [];
- this.pattern = pattern;
- this.regexp = null;
- this.negate = false;
- this.comment = false;
- this.empty = false;
- // make the set of regexps etc.
- this.make();
- }
- Minimatch.prototype.debug = function () {};
- Minimatch.prototype.make = make;
- function make () {
- // don't do it more than once.
- if (this._made) return
- var pattern = this.pattern;
- var options = this.options;
- // empty patterns and comments match nothing.
- if (!options.nocomment && pattern.charAt(0) === '#') {
- this.comment = true;
- return
- }
- if (!pattern) {
- this.empty = true;
- return
- }
- // step 1: figure out negation, etc.
- this.parseNegate();
- // step 2: expand braces
- var set = this.globSet = this.braceExpand();
- if (options.debug) this.debug = console.error;
- this.debug(this.pattern, set);
- // step 3: now we have a set, so turn each one into a series of path-portion
- // matching patterns.
- // These will be regexps, except in the case of "**", which is
- // set to the GLOBSTAR object for globstar behavior,
- // and will not contain any / characters
- set = this.globParts = set.map(function (s) {
- return s.split(slashSplit)
- });
- this.debug(this.pattern, set);
- // glob --> regexps
- set = set.map(function (s, si, set) {
- return s.map(this.parse, this)
- }, this);
- this.debug(this.pattern, set);
- // filter out everything that didn't compile properly.
- set = set.filter(function (s) {
- return s.indexOf(false) === -1
- });
- this.debug(this.pattern, set);
- this.set = set;
- }
- Minimatch.prototype.parseNegate = parseNegate;
- function parseNegate () {
- var pattern = this.pattern;
- var negate = false;
- var options = this.options;
- var negateOffset = 0;
- if (options.nonegate) return
- for (var i = 0, l = pattern.length
- ; i < l && pattern.charAt(i) === '!'
- ; i++) {
- negate = !negate;
- negateOffset++;
- }
- if (negateOffset) this.pattern = pattern.substr(negateOffset);
- this.negate = negate;
- }
- // Brace expansion:
- // a{b,c}d -> abd acd
- // a{b,}c -> abc ac
- // a{0..3}d -> a0d a1d a2d a3d
- // a{b,c{d,e}f}g -> abg acdfg acefg
- // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
- //
- // Invalid sets are not expanded.
- // a{2..}b -> a{2..}b
- // a{b}c -> a{b}c
- minimatch.braceExpand = function (pattern, options) {
- return braceExpand(pattern, options)
- };
- Minimatch.prototype.braceExpand = braceExpand;
- function braceExpand (pattern, options) {
- if (!options) {
- if (this instanceof Minimatch) {
- options = this.options;
- } else {
- options = {};
- }
- }
- pattern = typeof pattern === 'undefined'
- ? this.pattern : pattern;
- if (typeof pattern === 'undefined') {
- throw new TypeError('undefined pattern')
- }
- if (options.nobrace ||
- !pattern.match(/\{.*\}/)) {
- // shortcut. no need to expand.
- return [pattern]
- }
- return braceExpansion(pattern)
- }
- // parse a component of the expanded set.
- // At this point, no pattern may contain "/" in it
- // so we're going to return a 2d array, where each entry is the full
- // pattern, split on '/', and then turned into a regular expression.
- // A regexp is made at the end which joins each array with an
- // escaped /, and another full one which joins each regexp with |.
- //
- // Following the lead of Bash 4.1, note that "**" only has special meaning
- // when it is the *only* thing in a path portion. Otherwise, any series
- // of * is equivalent to a single *. Globstar behavior is enabled by
- // default, and can be disabled by setting options.noglobstar.
- Minimatch.prototype.parse = parse$4;
- var SUBPARSE = {};
- function parse$4 (pattern, isSub) {
- if (pattern.length > 1024 * 64) {
- throw new TypeError('pattern is too long')
- }
- var options = this.options;
- // shortcuts
- if (!options.noglobstar && pattern === '**') return GLOBSTAR
- if (pattern === '') return ''
- var re = '';
- var hasMagic = !!options.nocase;
- var escaping = false;
- // ? => one single character
- var patternListStack = [];
- var negativeLists = [];
- var stateChar;
- var inClass = false;
- var reClassStart = -1;
- var classStart = -1;
- // . and .. never match anything that doesn't start with .,
- // even when options.dot is set.
- var patternStart = pattern.charAt(0) === '.' ? '' // anything
- // not (start or / followed by . or .. followed by / or end)
- : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
- : '(?!\\.)';
- var self = this;
- function clearStateChar () {
- if (stateChar) {
- // we had some state-tracking character
- // that wasn't consumed by this pass.
- switch (stateChar) {
- case '*':
- re += star;
- hasMagic = true;
- break
- case '?':
- re += qmark;
- hasMagic = true;
- break
- default:
- re += '\\' + stateChar;
- break
- }
- self.debug('clearStateChar %j %j', stateChar, re);
- stateChar = false;
- }
- }
- for (var i = 0, len = pattern.length, c
- ; (i < len) && (c = pattern.charAt(i))
- ; i++) {
- this.debug('%s\t%s %s %j', pattern, i, re, c);
- // skip over any that are escaped.
- if (escaping && reSpecials[c]) {
- re += '\\' + c;
- escaping = false;
- continue
- }
- switch (c) {
- case '/':
- // completely not allowed, even escaped.
- // Should already be path-split by now.
- return false
- case '\\':
- clearStateChar();
- escaping = true;
- continue
- // the various stateChar values
- // for the "extglob" stuff.
- case '?':
- case '*':
- case '+':
- case '@':
- case '!':
- this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c);
- // all of those are literals inside a class, except that
- // the glob [!a] means [^a] in regexp
- if (inClass) {
- this.debug(' in class');
- if (c === '!' && i === classStart + 1) c = '^';
- re += c;
- continue
- }
- // if we already have a stateChar, then it means
- // that there was something like ** or +? in there.
- // Handle the stateChar, then proceed with this one.
- self.debug('call clearStateChar %j', stateChar);
- clearStateChar();
- stateChar = c;
- // if extglob is disabled, then +(asdf|foo) isn't a thing.
- // just clear the statechar *now*, rather than even diving into
- // the patternList stuff.
- if (options.noext) clearStateChar();
- continue
- case '(':
- if (inClass) {
- re += '(';
- continue
- }
- if (!stateChar) {
- re += '\\(';
- continue
- }
- patternListStack.push({
- type: stateChar,
- start: i - 1,
- reStart: re.length,
- open: plTypes[stateChar].open,
- close: plTypes[stateChar].close
- });
- // negation is (?:(?!js)[^/]*)
- re += stateChar === '!' ? '(?:(?!(?:' : '(?:';
- this.debug('plType %j %j', stateChar, re);
- stateChar = false;
- continue
- case ')':
- if (inClass || !patternListStack.length) {
- re += '\\)';
- continue
- }
- clearStateChar();
- hasMagic = true;
- var pl = patternListStack.pop();
- // negation is (?:(?!js)[^/]*)
- // The others are (?:<pattern>)<type>
- re += pl.close;
- if (pl.type === '!') {
- negativeLists.push(pl);
- }
- pl.reEnd = re.length;
- continue
- case '|':
- if (inClass || !patternListStack.length || escaping) {
- re += '\\|';
- escaping = false;
- continue
- }
- clearStateChar();
- re += '|';
- continue
- // these are mostly the same in regexp and glob
- case '[':
- // swallow any state-tracking char before the [
- clearStateChar();
- if (inClass) {
- re += '\\' + c;
- continue
- }
- inClass = true;
- classStart = i;
- reClassStart = re.length;
- re += c;
- continue
- case ']':
- // a right bracket shall lose its special
- // meaning and represent itself in
- // a bracket expression if it occurs
- // first in the list. -- POSIX.2 2.8.3.2
- if (i === classStart + 1 || !inClass) {
- re += '\\' + c;
- escaping = false;
- continue
- }
- // handle the case where we left a class open.
- // "[z-a]" is valid, equivalent to "\[z-a\]"
- if (inClass) {
- // split where the last [ was, make sure we don't have
- // an invalid re. if so, re-walk the contents of the
- // would-be class to re-translate any characters that
- // were passed through as-is
- // TODO: It would probably be faster to determine this
- // without a try/catch and a new RegExp, but it's tricky
- // to do safely. For now, this is safe and works.
- var cs = pattern.substring(classStart + 1, i);
- try {
- RegExp('[' + cs + ']');
- } catch (er) {
- // not a valid class!
- var sp = this.parse(cs, SUBPARSE);
- re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]';
- hasMagic = hasMagic || sp[1];
- inClass = false;
- continue
- }
- }
- // finish up the class.
- hasMagic = true;
- inClass = false;
- re += c;
- continue
- default:
- // swallow any state char that wasn't consumed
- clearStateChar();
- if (escaping) {
- // no need
- escaping = false;
- } else if (reSpecials[c]
- && !(c === '^' && inClass)) {
- re += '\\';
- }
- re += c;
- } // switch
- } // for
- // handle the case where we left a class open.
- // "[abc" is valid, equivalent to "\[abc"
- if (inClass) {
- // split where the last [ was, and escape it
- // this is a huge pita. We now have to re-walk
- // the contents of the would-be class to re-translate
- // any characters that were passed through as-is
- cs = pattern.substr(classStart + 1);
- sp = this.parse(cs, SUBPARSE);
- re = re.substr(0, reClassStart) + '\\[' + sp[0];
- hasMagic = hasMagic || sp[1];
- }
- // handle the case where we had a +( thing at the *end*
- // of the pattern.
- // each pattern list stack adds 3 chars, and we need to go through
- // and escape any | chars that were passed through as-is for the regexp.
- // Go through and escape them, taking care not to double-escape any
- // | chars that were already escaped.
- for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
- var tail = re.slice(pl.reStart + pl.open.length);
- this.debug('setting tail', re, pl);
- // maybe some even number of \, then maybe 1 \, followed by a |
- tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
- if (!$2) {
- // the | isn't already escaped, so escape it.
- $2 = '\\';
- }
- // need to escape all those slashes *again*, without escaping the
- // one that we need for escaping the | character. As it works out,
- // escaping an even number of slashes can be done by simply repeating
- // it exactly after itself. That's why this trick works.
- //
- // I am sorry that you have to see this.
- return $1 + $1 + $2 + '|'
- });
- this.debug('tail=%j\n %s', tail, tail, pl, re);
- var t = pl.type === '*' ? star
- : pl.type === '?' ? qmark
- : '\\' + pl.type;
- hasMagic = true;
- re = re.slice(0, pl.reStart) + t + '\\(' + tail;
- }
- // handle trailing things that only matter at the very end.
- clearStateChar();
- if (escaping) {
- // trailing \\
- re += '\\\\';
- }
- // only need to apply the nodot start if the re starts with
- // something that could conceivably capture a dot
- var addPatternStart = false;
- switch (re.charAt(0)) {
- case '.':
- case '[':
- case '(': addPatternStart = true;
- }
- // Hack to work around lack of negative lookbehind in JS
- // A pattern like: *.!(x).!(y|z) needs to ensure that a name
- // like 'a.xyz.yz' doesn't match. So, the first negative
- // lookahead, has to look ALL the way ahead, to the end of
- // the pattern.
- for (var n = negativeLists.length - 1; n > -1; n--) {
- var nl = negativeLists[n];
- var nlBefore = re.slice(0, nl.reStart);
- var nlFirst = re.slice(nl.reStart, nl.reEnd - 8);
- var nlLast = re.slice(nl.reEnd - 8, nl.reEnd);
- var nlAfter = re.slice(nl.reEnd);
- nlLast += nlAfter;
- // Handle nested stuff like *(*.js|!(*.json)), where open parens
- // mean that we should *not* include the ) in the bit that is considered
- // "after" the negated section.
- var openParensBefore = nlBefore.split('(').length - 1;
- var cleanAfter = nlAfter;
- for (i = 0; i < openParensBefore; i++) {
- cleanAfter = cleanAfter.replace(/\)[+*?]?/, '');
- }
- nlAfter = cleanAfter;
- var dollar = '';
- if (nlAfter === '' && isSub !== SUBPARSE) {
- dollar = '$';
- }
- var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast;
- re = newRe;
- }
- // if the re is not "" at this point, then we need to make sure
- // it doesn't match against an empty path part.
- // Otherwise a/* will match a/, which it should not.
- if (re !== '' && hasMagic) {
- re = '(?=.)' + re;
- }
- if (addPatternStart) {
- re = patternStart + re;
- }
- // parsing just a piece of a larger pattern.
- if (isSub === SUBPARSE) {
- return [re, hasMagic]
- }
- // skip the regexp for non-magical patterns
- // unescape anything in it, though, so that it'll be
- // an exact match against a file etc.
- if (!hasMagic) {
- return globUnescape(pattern)
- }
- var flags = options.nocase ? 'i' : '';
- try {
- var regExp = new RegExp('^' + re + '$', flags);
- } catch (er) {
- // If it was an invalid regular expression, then it can't match
- // anything. This trick looks for a character after the end of
- // the string, which is of course impossible, except in multi-line
- // mode, but it's not a /m regex.
- return new RegExp('$.')
- }
- regExp._glob = pattern;
- regExp._src = re;
- return regExp
- }
- minimatch.makeRe = function (pattern, options) {
- return new Minimatch(pattern, options || {}).makeRe()
- };
- Minimatch.prototype.makeRe = makeRe;
- function makeRe () {
- if (this.regexp || this.regexp === false) return this.regexp
- // at this point, this.set is a 2d array of partial
- // pattern strings, or "**".
- //
- // It's better to use .match(). This function shouldn't
- // be used, really, but it's pretty convenient sometimes,
- // when you just want to work with a regex.
- var set = this.set;
- if (!set.length) {
- this.regexp = false;
- return this.regexp
- }
- var options = this.options;
- var twoStar = options.noglobstar ? star
- : options.dot ? twoStarDot
- : twoStarNoDot;
- var flags = options.nocase ? 'i' : '';
- var re = set.map(function (pattern) {
- return pattern.map(function (p) {
- return (p === GLOBSTAR) ? twoStar
- : (typeof p === 'string') ? regExpEscape(p)
- : p._src
- }).join('\\\/')
- }).join('|');
- // must match entire pattern
- // ending in a * or ** will make it less strict.
- re = '^(?:' + re + ')$';
- // can match anything, as long as it's not this.
- if (this.negate) re = '^(?!' + re + ').*$';
- try {
- this.regexp = new RegExp(re, flags);
- } catch (ex) {
- this.regexp = false;
- }
- return this.regexp
- }
- minimatch.match = function (list, pattern, options) {
- options = options || {};
- var mm = new Minimatch(pattern, options);
- list = list.filter(function (f) {
- return mm.match(f)
- });
- if (mm.options.nonull && !list.length) {
- list.push(pattern);
- }
- return list
- };
- Minimatch.prototype.match = match;
- function match (f, partial) {
- this.debug('match', f, this.pattern);
- // short-circuit in the case of busted things.
- // comments, etc.
- if (this.comment) return false
- if (this.empty) return f === ''
- if (f === '/' && partial) return true
- var options = this.options;
- // windows: need to use /, not \
- if (path$3.sep !== '/') {
- f = f.split(path$3.sep).join('/');
- }
- // treat the test path as a set of pathparts.
- f = f.split(slashSplit);
- this.debug(this.pattern, 'split', f);
- // just ONE of the pattern sets in this.set needs to match
- // in order for it to be valid. If negating, then just one
- // match means that we have failed.
- // Either way, return on the first hit.
- var set = this.set;
- this.debug(this.pattern, 'set', set);
- // Find the basename of the path by looking for the last non-empty segment
- var filename;
- var i;
- for (i = f.length - 1; i >= 0; i--) {
- filename = f[i];
- if (filename) break
- }
- for (i = 0; i < set.length; i++) {
- var pattern = set[i];
- var file = f;
- if (options.matchBase && pattern.length === 1) {
- file = [filename];
- }
- var hit = this.matchOne(file, pattern, partial);
- if (hit) {
- if (options.flipNegate) return true
- return !this.negate
- }
- }
- // didn't get any hits. this is success if it's a negative
- // pattern, failure otherwise.
- if (options.flipNegate) return false
- return this.negate
- }
- // set partial to true to test if, for example,
- // "/a/b" matches the start of "/*/b/*/d"
- // Partial means, if you run out of file before you run
- // out of pattern, then that's fine, as long as all
- // the parts match.
- Minimatch.prototype.matchOne = function (file, pattern, partial) {
- var options = this.options;
- this.debug('matchOne',
- { 'this': this, file: file, pattern: pattern });
- this.debug('matchOne', file.length, pattern.length);
- for (var fi = 0,
- pi = 0,
- fl = file.length,
- pl = pattern.length
- ; (fi < fl) && (pi < pl)
- ; fi++, pi++) {
- this.debug('matchOne loop');
- var p = pattern[pi];
- var f = file[fi];
- this.debug(pattern, p, f);
- // should be impossible.
- // some invalid regexp stuff in the set.
- if (p === false) return false
- if (p === GLOBSTAR) {
- this.debug('GLOBSTAR', [pattern, p, f]);
- // "**"
- // a/**/b/**/c would match the following:
- // a/b/x/y/z/c
- // a/x/y/z/b/c
- // a/b/x/b/x/c
- // a/b/c
- // To do this, take the rest of the pattern after
- // the **, and see if it would match the file remainder.
- // If so, return success.
- // If not, the ** "swallows" a segment, and try again.
- // This is recursively awful.
- //
- // a/**/b/**/c matching a/b/x/y/z/c
- // - a matches a
- // - doublestar
- // - matchOne(b/x/y/z/c, b/**/c)
- // - b matches b
- // - doublestar
- // - matchOne(x/y/z/c, c) -> no
- // - matchOne(y/z/c, c) -> no
- // - matchOne(z/c, c) -> no
- // - matchOne(c, c) yes, hit
- var fr = fi;
- var pr = pi + 1;
- if (pr === pl) {
- this.debug('** at the end');
- // a ** at the end will just swallow the rest.
- // We have found a match.
- // however, it will not swallow /.x, unless
- // options.dot is set.
- // . and .. are *never* matched by **, for explosively
- // exponential reasons.
- for (; fi < fl; fi++) {
- if (file[fi] === '.' || file[fi] === '..' ||
- (!options.dot && file[fi].charAt(0) === '.')) return false
- }
- return true
- }
- // ok, let's see if we can swallow whatever we can.
- while (fr < fl) {
- var swallowee = file[fr];
- this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
- // XXX remove this slice. Just pass the start index.
- if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
- this.debug('globstar found match!', fr, fl, swallowee);
- // found a match.
- return true
- } else {
- // can't swallow "." or ".." ever.
- // can only swallow ".foo" when explicitly asked.
- if (swallowee === '.' || swallowee === '..' ||
- (!options.dot && swallowee.charAt(0) === '.')) {
- this.debug('dot detected!', file, fr, pattern, pr);
- break
- }
- // ** swallows a segment, and continue.
- this.debug('globstar swallow a segment, and continue');
- fr++;
- }
- }
- // no match was found.
- // However, in partial mode, we can't say this is necessarily over.
- // If there's more *pattern* left, then
- if (partial) {
- // ran out of file
- this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
- if (fr === fl) return true
- }
- return false
- }
- // something other than **
- // non-magic patterns just have to match exactly
- // patterns with magic have been turned into regexps.
- var hit;
- if (typeof p === 'string') {
- if (options.nocase) {
- hit = f.toLowerCase() === p.toLowerCase();
- } else {
- hit = f === p;
- }
- this.debug('string match', p, f, hit);
- } else {
- hit = f.match(p);
- this.debug('pattern match', p, f, hit);
- }
- if (!hit) return false
- }
- // Note: ending in / means that we'll get a final ""
- // at the end of the pattern. This can only match a
- // corresponding "" at the end of the file.
- // If the file ends in /, then it can only match a
- // a pattern that ends in /, unless the pattern just
- // doesn't have any more for it. But, a/b/ should *not*
- // match "a/b/*", even though "" matches against the
- // [^/]*? pattern, except in partial mode, where it might
- // simply not be reached yet.
- // However, a/b/ should still satisfy a/*
- // now either we fell off the end of the pattern, or we're done.
- if (fi === fl && pi === pl) {
- // ran out of pattern and filename at the same time.
- // an exact hit!
- return true
- } else if (fi === fl) {
- // ran out of file, but still had pattern left.
- // this is ok if we're doing the match as part of
- // a glob fs traversal.
- return partial
- } else if (pi === pl) {
- // ran out of pattern, still have file left.
- // this is only acceptable if we're on the very last
- // empty segment of a file with a trailing slash.
- // a/* should match a/b/
- var emptyFileEnd = (fi === fl - 1) && (file[fi] === '');
- return emptyFileEnd
- }
- // should be unreachable.
- throw new Error('wtf?')
- };
- // replace stuff like \* with *
- function globUnescape (s) {
- return s.replace(/\\(.)/g, '$1')
- }
- function regExpEscape (s) {
- return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
- }
- var mimicFn = (to, from) => {
- // TODO: use `Reflect.ownKeys()` when targeting Node.js 6
- for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) {
- Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop));
- }
- };
- var mem = createCommonjsModule(function (module) {
- 'use strict';
- const cacheStore = new WeakMap();
- const defaultCacheKey = function (x) {
- if (arguments.length === 1 && (x === null || x === undefined || (typeof x !== 'function' && typeof x !== 'object'))) {
- return x;
- }
- return JSON.stringify(arguments);
- };
- module.exports = (fn, opts) => {
- opts = Object.assign({
- cacheKey: defaultCacheKey,
- cache: new Map()
- }, opts);
- const memoized = function () {
- const cache = cacheStore.get(memoized);
- const key = opts.cacheKey.apply(null, arguments);
- if (cache.has(key)) {
- const c = cache.get(key);
- if (typeof opts.maxAge !== 'number' || Date.now() < c.maxAge) {
- return c.data;
- }
- }
- const ret = fn.apply(null, arguments);
- cache.set(key, {
- data: ret,
- maxAge: Date.now() + (opts.maxAge || 0)
- });
- return ret;
- };
- mimicFn(memoized, fn);
- cacheStore.set(memoized, opts.cache);
- return memoized;
- };
- module.exports.clear = fn => {
- const cache = cacheStore.get(fn);
- if (cache && typeof cache.clear === 'function') {
- cache.clear();
- }
- };
- });
- var semver$3 = createCommonjsModule(function (module, exports) {
- exports = module.exports = SemVer;
- // The debug function is excluded entirely from the minified version.
- /* nomin */ var debug;
- /* nomin */ if (typeof process === 'object' &&
- /* nomin */ process.env &&
- /* nomin */ process.env.NODE_DEBUG &&
- /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG))
- /* nomin */ debug = function() {
- /* nomin */ var args = Array.prototype.slice.call(arguments, 0);
- /* nomin */ args.unshift('SEMVER');
- /* nomin */ console.log.apply(console, args);
- /* nomin */ };
- /* nomin */ else
- /* nomin */ debug = function() {};
- // Note: this is the semver.org version of the spec that it implements
- // Not necessarily the package version of this code.
- exports.SEMVER_SPEC_VERSION = '2.0.0';
- var MAX_LENGTH = 256;
- var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
- // Max safe segment length for coercion.
- var MAX_SAFE_COMPONENT_LENGTH = 16;
- // The actual regexps go on exports.re
- var re = exports.re = [];
- var src = exports.src = [];
- var R = 0;
- // The following Regular Expressions can be used for tokenizing,
- // validating, and parsing SemVer version strings.
- // ## Numeric Identifier
- // A single `0`, or a non-zero digit followed by zero or more digits.
- var NUMERICIDENTIFIER = R++;
- src[NUMERICIDENTIFIER] = '0|[1-9]\\d*';
- var NUMERICIDENTIFIERLOOSE = R++;
- src[NUMERICIDENTIFIERLOOSE] = '[0-9]+';
- // ## Non-numeric Identifier
- // Zero or more digits, followed by a letter or hyphen, and then zero or
- // more letters, digits, or hyphens.
- var NONNUMERICIDENTIFIER = R++;
- src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*';
- // ## Main Version
- // Three dot-separated numeric identifiers.
- var MAINVERSION = R++;
- src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
- '(' + src[NUMERICIDENTIFIER] + ')\\.' +
- '(' + src[NUMERICIDENTIFIER] + ')';
- var MAINVERSIONLOOSE = R++;
- src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
- '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
- '(' + src[NUMERICIDENTIFIERLOOSE] + ')';
- // ## Pre-release Version Identifier
- // A numeric identifier, or a non-numeric identifier.
- var PRERELEASEIDENTIFIER = R++;
- src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
- '|' + src[NONNUMERICIDENTIFIER] + ')';
- var PRERELEASEIDENTIFIERLOOSE = R++;
- src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
- '|' + src[NONNUMERICIDENTIFIER] + ')';
- // ## Pre-release Version
- // Hyphen, followed by one or more dot-separated pre-release version
- // identifiers.
- var PRERELEASE = R++;
- src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
- '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))';
- var PRERELEASELOOSE = R++;
- src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
- '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';
- // ## Build Metadata Identifier
- // Any combination of digits, letters, or hyphens.
- var BUILDIDENTIFIER = R++;
- src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';
- // ## Build Metadata
- // Plus sign, followed by one or more period-separated build metadata
- // identifiers.
- var BUILD = R++;
- src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
- '(?:\\.' + src[BUILDIDENTIFIER] + ')*))';
- // ## Full Version String
- // A main version, followed optionally by a pre-release version and
- // build metadata.
- // Note that the only major, minor, patch, and pre-release sections of
- // the version string are capturing groups. The build metadata is not a
- // capturing group, because it should not ever be used in version
- // comparison.
- var FULL = R++;
- var FULLPLAIN = 'v?' + src[MAINVERSION] +
- src[PRERELEASE] + '?' +
- src[BUILD] + '?';
- src[FULL] = '^' + FULLPLAIN + '$';
- // like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
- // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
- // common in the npm registry.
- var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
- src[PRERELEASELOOSE] + '?' +
- src[BUILD] + '?';
- var LOOSE = R++;
- src[LOOSE] = '^' + LOOSEPLAIN + '$';
- var GTLT = R++;
- src[GTLT] = '((?:<|>)?=?)';
- // Something like "2.*" or "1.2.x".
- // Note that "x.x" is a valid xRange identifer, meaning "any version"
- // Only the first item is strictly required.
- var XRANGEIDENTIFIERLOOSE = R++;
- src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
- var XRANGEIDENTIFIER = R++;
- src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*';
- var XRANGEPLAIN = R++;
- src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
- '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
- '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
- '(?:' + src[PRERELEASE] + ')?' +
- src[BUILD] + '?' +
- ')?)?';
- var XRANGEPLAINLOOSE = R++;
- src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
- '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
- '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
- '(?:' + src[PRERELEASELOOSE] + ')?' +
- src[BUILD] + '?' +
- ')?)?';
- var XRANGE = R++;
- src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
- var XRANGELOOSE = R++;
- src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$';
- // Coercion.
- // Extract anything that could conceivably be a part of a valid semver
- var COERCE = R++;
- src[COERCE] = '(?:^|[^\\d])' +
- '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
- '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
- '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
- '(?:$|[^\\d])';
- // Tilde ranges.
- // Meaning is "reasonably at or greater than"
- var LONETILDE = R++;
- src[LONETILDE] = '(?:~>?)';
- var TILDETRIM = R++;
- src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
- re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
- var tildeTrimReplace = '$1~';
- var TILDE = R++;
- src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
- var TILDELOOSE = R++;
- src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
- // Caret ranges.
- // Meaning is "at least and backwards compatible with"
- var LONECARET = R++;
- src[LONECARET] = '(?:\\^)';
- var CARETTRIM = R++;
- src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
- re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
- var caretTrimReplace = '$1^';
- var CARET = R++;
- src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
- var CARETLOOSE = R++;
- src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
- // A simple gt/lt/eq thing, or just "" to indicate "any version"
- var COMPARATORLOOSE = R++;
- src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$';
- var COMPARATOR = R++;
- src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$';
- // An expression to strip any whitespace between the gtlt and the thing
- // it modifies, so that `> 1.2.3` ==> `>1.2.3`
- var COMPARATORTRIM = R++;
- src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
- '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';
- // this one has to use the /g flag
- re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');
- var comparatorTrimReplace = '$1$2$3';
- // Something like `1.2.3 - 1.2.4`
- // Note that these all use the loose form, because they'll be
- // checked against either the strict or loose comparator form
- // later.
- var HYPHENRANGE = R++;
- src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
- '\\s+-\\s+' +
- '(' + src[XRANGEPLAIN] + ')' +
- '\\s*$';
- var HYPHENRANGELOOSE = R++;
- src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
- '\\s+-\\s+' +
- '(' + src[XRANGEPLAINLOOSE] + ')' +
- '\\s*$';
- // Star ranges basically just allow anything at all.
- var STAR = R++;
- src[STAR] = '(<|>)?=?\\s*\\*';
- // Compile to actual regexp objects.
- // All are flag-free, unless they were created above with a flag.
- for (var i = 0; i < R; i++) {
- debug(i, src[i]);
- if (!re[i])
- re[i] = new RegExp(src[i]);
- }
- exports.parse = parse;
- function parse(version, loose) {
- if (version instanceof SemVer)
- return version;
- if (typeof version !== 'string')
- return null;
- if (version.length > MAX_LENGTH)
- return null;
- var r = loose ? re[LOOSE] : re[FULL];
- if (!r.test(version))
- return null;
- try {
- return new SemVer(version, loose);
- } catch (er) {
- return null;
- }
- }
- exports.valid = valid;
- function valid(version, loose) {
- var v = parse(version, loose);
- return v ? v.version : null;
- }
- exports.clean = clean;
- function clean(version, loose) {
- var s = parse(version.trim().replace(/^[=v]+/, ''), loose);
- return s ? s.version : null;
- }
- exports.SemVer = SemVer;
- function SemVer(version, loose) {
- if (version instanceof SemVer) {
- if (version.loose === loose)
- return version;
- else
- version = version.version;
- } else if (typeof version !== 'string') {
- throw new TypeError('Invalid Version: ' + version);
- }
- if (version.length > MAX_LENGTH)
- throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
- if (!(this instanceof SemVer))
- return new SemVer(version, loose);
- debug('SemVer', version, loose);
- this.loose = loose;
- var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);
- if (!m)
- throw new TypeError('Invalid Version: ' + version);
- this.raw = version;
- // these are actually numbers
- this.major = +m[1];
- this.minor = +m[2];
- this.patch = +m[3];
- if (this.major > MAX_SAFE_INTEGER || this.major < 0)
- throw new TypeError('Invalid major version')
- if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)
- throw new TypeError('Invalid minor version')
- if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)
- throw new TypeError('Invalid patch version')
- // numberify any prerelease numeric ids
- if (!m[4])
- this.prerelease = [];
- else
- this.prerelease = m[4].split('.').map(function(id) {
- if (/^[0-9]+$/.test(id)) {
- var num = +id;
- if (num >= 0 && num < MAX_SAFE_INTEGER)
- return num;
- }
- return id;
- });
- this.build = m[5] ? m[5].split('.') : [];
- this.format();
- }
- SemVer.prototype.format = function() {
- this.version = this.major + '.' + this.minor + '.' + this.patch;
- if (this.prerelease.length)
- this.version += '-' + this.prerelease.join('.');
- return this.version;
- };
- SemVer.prototype.toString = function() {
- return this.version;
- };
- SemVer.prototype.compare = function(other) {
- debug('SemVer.compare', this.version, this.loose, other);
- if (!(other instanceof SemVer))
- other = new SemVer(other, this.loose);
- return this.compareMain(other) || this.comparePre(other);
- };
- SemVer.prototype.compareMain = function(other) {
- if (!(other instanceof SemVer))
- other = new SemVer(other, this.loose);
- return compareIdentifiers(this.major, other.major) ||
- compareIdentifiers(this.minor, other.minor) ||
- compareIdentifiers(this.patch, other.patch);
- };
- SemVer.prototype.comparePre = function(other) {
- if (!(other instanceof SemVer))
- other = new SemVer(other, this.loose);
- // NOT having a prerelease is > having one
- if (this.prerelease.length && !other.prerelease.length)
- return -1;
- else if (!this.prerelease.length && other.prerelease.length)
- return 1;
- else if (!this.prerelease.length && !other.prerelease.length)
- return 0;
- var i = 0;
- do {
- var a = this.prerelease[i];
- var b = other.prerelease[i];
- debug('prerelease compare', i, a, b);
- if (a === undefined && b === undefined)
- return 0;
- else if (b === undefined)
- return 1;
- else if (a === undefined)
- return -1;
- else if (a === b)
- continue;
- else
- return compareIdentifiers(a, b);
- } while (++i);
- };
- // preminor will bump the version up to the next minor release, and immediately
- // down to pre-release. premajor and prepatch work the same way.
- SemVer.prototype.inc = function(release, identifier) {
- switch (release) {
- case 'premajor':
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor = 0;
- this.major++;
- this.inc('pre', identifier);
- break;
- case 'preminor':
- this.prerelease.length = 0;
- this.patch = 0;
- this.minor++;
- this.inc('pre', identifier);
- break;
- case 'prepatch':
- // If this is already a prerelease, it will bump to the next version
- // drop any prereleases that might already exist, since they are not
- // relevant at this point.
- this.prerelease.length = 0;
- this.inc('patch', identifier);
- this.inc('pre', identifier);
- break;
- // If the input is a non-prerelease version, this acts the same as
- // prepatch.
- case 'prerelease':
- if (this.prerelease.length === 0)
- this.inc('patch', identifier);
- this.inc('pre', identifier);
- break;
- case 'major':
- // If this is a pre-major version, bump up to the same major version.
- // Otherwise increment major.
- // 1.0.0-5 bumps to 1.0.0
- // 1.1.0 bumps to 2.0.0
- if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)
- this.major++;
- this.minor = 0;
- this.patch = 0;
- this.prerelease = [];
- break;
- case 'minor':
- // If this is a pre-minor version, bump up to the same minor version.
- // Otherwise increment minor.
- // 1.2.0-5 bumps to 1.2.0
- // 1.2.1 bumps to 1.3.0
- if (this.patch !== 0 || this.prerelease.length === 0)
- this.minor++;
- this.patch = 0;
- this.prerelease = [];
- break;
- case 'patch':
- // If this is not a pre-release version, it will increment the patch.
- // If it is a pre-release it will bump up to the same patch version.
- // 1.2.0-5 patches to 1.2.0
- // 1.2.0 patches to 1.2.1
- if (this.prerelease.length === 0)
- this.patch++;
- this.prerelease = [];
- break;
- // This probably shouldn't be used publicly.
- // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
- case 'pre':
- if (this.prerelease.length === 0)
- this.prerelease = [0];
- else {
- var i = this.prerelease.length;
- while (--i >= 0) {
- if (typeof this.prerelease[i] === 'number') {
- this.prerelease[i]++;
- i = -2;
- }
- }
- if (i === -1) // didn't increment anything
- this.prerelease.push(0);
- }
- if (identifier) {
- // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
- // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
- if (this.prerelease[0] === identifier) {
- if (isNaN(this.prerelease[1]))
- this.prerelease = [identifier, 0];
- } else
- this.prerelease = [identifier, 0];
- }
- break;
- default:
- throw new Error('invalid increment argument: ' + release);
- }
- this.format();
- this.raw = this.version;
- return this;
- };
- exports.inc = inc;
- function inc(version, release, loose, identifier) {
- if (typeof(loose) === 'string') {
- identifier = loose;
- loose = undefined;
- }
- try {
- return new SemVer(version, loose).inc(release, identifier).version;
- } catch (er) {
- return null;
- }
- }
- exports.diff = diff;
- function diff(version1, version2) {
- if (eq(version1, version2)) {
- return null;
- } else {
- var v1 = parse(version1);
- var v2 = parse(version2);
- if (v1.prerelease.length || v2.prerelease.length) {
- for (var key in v1) {
- if (key === 'major' || key === 'minor' || key === 'patch') {
- if (v1[key] !== v2[key]) {
- return 'pre'+key;
- }
- }
- }
- return 'prerelease';
- }
- for (var key in v1) {
- if (key === 'major' || key === 'minor' || key === 'patch') {
- if (v1[key] !== v2[key]) {
- return key;
- }
- }
- }
- }
- }
- exports.compareIdentifiers = compareIdentifiers;
- var numeric = /^[0-9]+$/;
- function compareIdentifiers(a, b) {
- var anum = numeric.test(a);
- var bnum = numeric.test(b);
- if (anum && bnum) {
- a = +a;
- b = +b;
- }
- return (anum && !bnum) ? -1 :
- (bnum && !anum) ? 1 :
- a < b ? -1 :
- a > b ? 1 :
- 0;
- }
- exports.rcompareIdentifiers = rcompareIdentifiers;
- function rcompareIdentifiers(a, b) {
- return compareIdentifiers(b, a);
- }
- exports.major = major;
- function major(a, loose) {
- return new SemVer(a, loose).major;
- }
- exports.minor = minor;
- function minor(a, loose) {
- return new SemVer(a, loose).minor;
- }
- exports.patch = patch;
- function patch(a, loose) {
- return new SemVer(a, loose).patch;
- }
- exports.compare = compare;
- function compare(a, b, loose) {
- return new SemVer(a, loose).compare(new SemVer(b, loose));
- }
- exports.compareLoose = compareLoose;
- function compareLoose(a, b) {
- return compare(a, b, true);
- }
- exports.rcompare = rcompare;
- function rcompare(a, b, loose) {
- return compare(b, a, loose);
- }
- exports.sort = sort;
- function sort(list, loose) {
- return list.sort(function(a, b) {
- return exports.compare(a, b, loose);
- });
- }
- exports.rsort = rsort;
- function rsort(list, loose) {
- return list.sort(function(a, b) {
- return exports.rcompare(a, b, loose);
- });
- }
- exports.gt = gt;
- function gt(a, b, loose) {
- return compare(a, b, loose) > 0;
- }
- exports.lt = lt;
- function lt(a, b, loose) {
- return compare(a, b, loose) < 0;
- }
- exports.eq = eq;
- function eq(a, b, loose) {
- return compare(a, b, loose) === 0;
- }
- exports.neq = neq;
- function neq(a, b, loose) {
- return compare(a, b, loose) !== 0;
- }
- exports.gte = gte;
- function gte(a, b, loose) {
- return compare(a, b, loose) >= 0;
- }
- exports.lte = lte;
- function lte(a, b, loose) {
- return compare(a, b, loose) <= 0;
- }
- exports.cmp = cmp;
- function cmp(a, op, b, loose) {
- var ret;
- switch (op) {
- case '===':
- if (typeof a === 'object') a = a.version;
- if (typeof b === 'object') b = b.version;
- ret = a === b;
- break;
- case '!==':
- if (typeof a === 'object') a = a.version;
- if (typeof b === 'object') b = b.version;
- ret = a !== b;
- break;
- case '': case '=': case '==': ret = eq(a, b, loose); break;
- case '!=': ret = neq(a, b, loose); break;
- case '>': ret = gt(a, b, loose); break;
- case '>=': ret = gte(a, b, loose); break;
- case '<': ret = lt(a, b, loose); break;
- case '<=': ret = lte(a, b, loose); break;
- default: throw new TypeError('Invalid operator: ' + op);
- }
- return ret;
- }
- exports.Comparator = Comparator;
- function Comparator(comp, loose) {
- if (comp instanceof Comparator) {
- if (comp.loose === loose)
- return comp;
- else
- comp = comp.value;
- }
- if (!(this instanceof Comparator))
- return new Comparator(comp, loose);
- debug('comparator', comp, loose);
- this.loose = loose;
- this.parse(comp);
- if (this.semver === ANY)
- this.value = '';
- else
- this.value = this.operator + this.semver.version;
- debug('comp', this);
- }
- var ANY = {};
- Comparator.prototype.parse = function(comp) {
- var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
- var m = comp.match(r);
- if (!m)
- throw new TypeError('Invalid comparator: ' + comp);
- this.operator = m[1];
- if (this.operator === '=')
- this.operator = '';
- // if it literally is just '>' or '' then allow anything.
- if (!m[2])
- this.semver = ANY;
- else
- this.semver = new SemVer(m[2], this.loose);
- };
- Comparator.prototype.toString = function() {
- return this.value;
- };
- Comparator.prototype.test = function(version) {
- debug('Comparator.test', version, this.loose);
- if (this.semver === ANY)
- return true;
- if (typeof version === 'string')
- version = new SemVer(version, this.loose);
- return cmp(version, this.operator, this.semver, this.loose);
- };
- Comparator.prototype.intersects = function(comp, loose) {
- if (!(comp instanceof Comparator)) {
- throw new TypeError('a Comparator is required');
- }
- var rangeTmp;
- if (this.operator === '') {
- rangeTmp = new Range(comp.value, loose);
- return satisfies(this.value, rangeTmp, loose);
- } else if (comp.operator === '') {
- rangeTmp = new Range(this.value, loose);
- return satisfies(comp.semver, rangeTmp, loose);
- }
- var sameDirectionIncreasing =
- (this.operator === '>=' || this.operator === '>') &&
- (comp.operator === '>=' || comp.operator === '>');
- var sameDirectionDecreasing =
- (this.operator === '<=' || this.operator === '<') &&
- (comp.operator === '<=' || comp.operator === '<');
- var sameSemVer = this.semver.version === comp.semver.version;
- var differentDirectionsInclusive =
- (this.operator === '>=' || this.operator === '<=') &&
- (comp.operator === '>=' || comp.operator === '<=');
- var oppositeDirectionsLessThan =
- cmp(this.semver, '<', comp.semver, loose) &&
- ((this.operator === '>=' || this.operator === '>') &&
- (comp.operator === '<=' || comp.operator === '<'));
- var oppositeDirectionsGreaterThan =
- cmp(this.semver, '>', comp.semver, loose) &&
- ((this.operator === '<=' || this.operator === '<') &&
- (comp.operator === '>=' || comp.operator === '>'));
- return sameDirectionIncreasing || sameDirectionDecreasing ||
- (sameSemVer && differentDirectionsInclusive) ||
- oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
- };
- exports.Range = Range;
- function Range(range, loose) {
- if (range instanceof Range) {
- if (range.loose === loose) {
- return range;
- } else {
- return new Range(range.raw, loose);
- }
- }
- if (range instanceof Comparator) {
- return new Range(range.value, loose);
- }
- if (!(this instanceof Range))
- return new Range(range, loose);
- this.loose = loose;
- // First, split based on boolean or ||
- this.raw = range;
- this.set = range.split(/\s*\|\|\s*/).map(function(range) {
- return this.parseRange(range.trim());
- }, this).filter(function(c) {
- // throw out any that are not relevant for whatever reason
- return c.length;
- });
- if (!this.set.length) {
- throw new TypeError('Invalid SemVer Range: ' + range);
- }
- this.format();
- }
- Range.prototype.format = function() {
- this.range = this.set.map(function(comps) {
- return comps.join(' ').trim();
- }).join('||').trim();
- return this.range;
- };
- Range.prototype.toString = function() {
- return this.range;
- };
- Range.prototype.parseRange = function(range) {
- var loose = this.loose;
- range = range.trim();
- debug('range', range, loose);
- // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
- var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
- range = range.replace(hr, hyphenReplace);
- debug('hyphen replace', range);
- // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
- range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
- debug('comparator trim', range, re[COMPARATORTRIM]);
- // `~ 1.2.3` => `~1.2.3`
- range = range.replace(re[TILDETRIM], tildeTrimReplace);
- // `^ 1.2.3` => `^1.2.3`
- range = range.replace(re[CARETTRIM], caretTrimReplace);
- // normalize spaces
- range = range.split(/\s+/).join(' ');
- // At this point, the range is completely trimmed and
- // ready to be split into comparators.
- var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
- var set = range.split(' ').map(function(comp) {
- return parseComparator(comp, loose);
- }).join(' ').split(/\s+/);
- if (this.loose) {
- // in loose mode, throw out any that are not valid comparators
- set = set.filter(function(comp) {
- return !!comp.match(compRe);
- });
- }
- set = set.map(function(comp) {
- return new Comparator(comp, loose);
- });
- return set;
- };
- Range.prototype.intersects = function(range, loose) {
- if (!(range instanceof Range)) {
- throw new TypeError('a Range is required');
- }
- return this.set.some(function(thisComparators) {
- return thisComparators.every(function(thisComparator) {
- return range.set.some(function(rangeComparators) {
- return rangeComparators.every(function(rangeComparator) {
- return thisComparator.intersects(rangeComparator, loose);
- });
- });
- });
- });
- };
- // Mostly just for testing and legacy API reasons
- exports.toComparators = toComparators;
- function toComparators(range, loose) {
- return new Range(range, loose).set.map(function(comp) {
- return comp.map(function(c) {
- return c.value;
- }).join(' ').trim().split(' ');
- });
- }
- // comprised of xranges, tildes, stars, and gtlt's at this point.
- // already replaced the hyphen ranges
- // turn into a set of JUST comparators.
- function parseComparator(comp, loose) {
- debug('comp', comp);
- comp = replaceCarets(comp, loose);
- debug('caret', comp);
- comp = replaceTildes(comp, loose);
- debug('tildes', comp);
- comp = replaceXRanges(comp, loose);
- debug('xrange', comp);
- comp = replaceStars(comp, loose);
- debug('stars', comp);
- return comp;
- }
- function isX(id) {
- return !id || id.toLowerCase() === 'x' || id === '*';
- }
- // ~, ~> --> * (any, kinda silly)
- // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
- // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
- // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
- // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
- // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
- function replaceTildes(comp, loose) {
- return comp.trim().split(/\s+/).map(function(comp) {
- return replaceTilde(comp, loose);
- }).join(' ');
- }
- function replaceTilde(comp, loose) {
- var r = loose ? re[TILDELOOSE] : re[TILDE];
- return comp.replace(r, function(_, M, m, p, pr) {
- debug('tilde', comp, _, M, m, p, pr);
- var ret;
- if (isX(M))
- ret = '';
- else if (isX(m))
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
- else if (isX(p))
- // ~1.2 == >=1.2.0 <1.3.0
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
- else if (pr) {
- debug('replaceTilde pr', pr);
- if (pr.charAt(0) !== '-')
- pr = '-' + pr;
- ret = '>=' + M + '.' + m + '.' + p + pr +
- ' <' + M + '.' + (+m + 1) + '.0';
- } else
- // ~1.2.3 == >=1.2.3 <1.3.0
- ret = '>=' + M + '.' + m + '.' + p +
- ' <' + M + '.' + (+m + 1) + '.0';
- debug('tilde return', ret);
- return ret;
- });
- }
- // ^ --> * (any, kinda silly)
- // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
- // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
- // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
- // ^1.2.3 --> >=1.2.3 <2.0.0
- // ^1.2.0 --> >=1.2.0 <2.0.0
- function replaceCarets(comp, loose) {
- return comp.trim().split(/\s+/).map(function(comp) {
- return replaceCaret(comp, loose);
- }).join(' ');
- }
- function replaceCaret(comp, loose) {
- debug('caret', comp, loose);
- var r = loose ? re[CARETLOOSE] : re[CARET];
- return comp.replace(r, function(_, M, m, p, pr) {
- debug('caret', comp, _, M, m, p, pr);
- var ret;
- if (isX(M))
- ret = '';
- else if (isX(m))
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
- else if (isX(p)) {
- if (M === '0')
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
- else
- ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';
- } else if (pr) {
- debug('replaceCaret pr', pr);
- if (pr.charAt(0) !== '-')
- pr = '-' + pr;
- if (M === '0') {
- if (m === '0')
- ret = '>=' + M + '.' + m + '.' + p + pr +
- ' <' + M + '.' + m + '.' + (+p + 1);
- else
- ret = '>=' + M + '.' + m + '.' + p + pr +
- ' <' + M + '.' + (+m + 1) + '.0';
- } else
- ret = '>=' + M + '.' + m + '.' + p + pr +
- ' <' + (+M + 1) + '.0.0';
- } else {
- debug('no pr');
- if (M === '0') {
- if (m === '0')
- ret = '>=' + M + '.' + m + '.' + p +
- ' <' + M + '.' + m + '.' + (+p + 1);
- else
- ret = '>=' + M + '.' + m + '.' + p +
- ' <' + M + '.' + (+m + 1) + '.0';
- } else
- ret = '>=' + M + '.' + m + '.' + p +
- ' <' + (+M + 1) + '.0.0';
- }
- debug('caret return', ret);
- return ret;
- });
- }
- function replaceXRanges(comp, loose) {
- debug('replaceXRanges', comp, loose);
- return comp.split(/\s+/).map(function(comp) {
- return replaceXRange(comp, loose);
- }).join(' ');
- }
- function replaceXRange(comp, loose) {
- comp = comp.trim();
- var r = loose ? re[XRANGELOOSE] : re[XRANGE];
- return comp.replace(r, function(ret, gtlt, M, m, p, pr) {
- debug('xRange', comp, ret, gtlt, M, m, p, pr);
- var xM = isX(M);
- var xm = xM || isX(m);
- var xp = xm || isX(p);
- var anyX = xp;
- if (gtlt === '=' && anyX)
- gtlt = '';
- if (xM) {
- if (gtlt === '>' || gtlt === '<') {
- // nothing is allowed
- ret = '<0.0.0';
- } else {
- // nothing is forbidden
- ret = '*';
- }
- } else if (gtlt && anyX) {
- // replace X with 0
- if (xm)
- m = 0;
- if (xp)
- p = 0;
- if (gtlt === '>') {
- // >1 => >=2.0.0
- // >1.2 => >=1.3.0
- // >1.2.3 => >= 1.2.4
- gtlt = '>=';
- if (xm) {
- M = +M + 1;
- m = 0;
- p = 0;
- } else if (xp) {
- m = +m + 1;
- p = 0;
- }
- } else if (gtlt === '<=') {
- // <=0.7.x is actually <0.8.0, since any 0.7.x should
- // pass. Similarly, <=7.x is actually <8.0.0, etc.
- gtlt = '<';
- if (xm)
- M = +M + 1;
- else
- m = +m + 1;
- }
- ret = gtlt + M + '.' + m + '.' + p;
- } else if (xm) {
- ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
- } else if (xp) {
- ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
- }
- debug('xRange return', ret);
- return ret;
- });
- }
- // Because * is AND-ed with everything else in the comparator,
- // and '' means "any version", just remove the *s entirely.
- function replaceStars(comp, loose) {
- debug('replaceStars', comp, loose);
- // Looseness is ignored here. star is always as loose as it gets!
- return comp.trim().replace(re[STAR], '');
- }
- // This function is passed to string.replace(re[HYPHENRANGE])
- // M, m, patch, prerelease, build
- // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
- // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
- // 1.2 - 3.4 => >=1.2.0 <3.5.0
- function hyphenReplace($0,
- from, fM, fm, fp, fpr, fb,
- to, tM, tm, tp, tpr, tb) {
- if (isX(fM))
- from = '';
- else if (isX(fm))
- from = '>=' + fM + '.0.0';
- else if (isX(fp))
- from = '>=' + fM + '.' + fm + '.0';
- else
- from = '>=' + from;
- if (isX(tM))
- to = '';
- else if (isX(tm))
- to = '<' + (+tM + 1) + '.0.0';
- else if (isX(tp))
- to = '<' + tM + '.' + (+tm + 1) + '.0';
- else if (tpr)
- to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
- else
- to = '<=' + to;
- return (from + ' ' + to).trim();
- }
- // if ANY of the sets match ALL of its comparators, then pass
- Range.prototype.test = function(version) {
- if (!version)
- return false;
- if (typeof version === 'string')
- version = new SemVer(version, this.loose);
- for (var i = 0; i < this.set.length; i++) {
- if (testSet(this.set[i], version))
- return true;
- }
- return false;
- };
- function testSet(set, version) {
- for (var i = 0; i < set.length; i++) {
- if (!set[i].test(version))
- return false;
- }
- if (version.prerelease.length) {
- // Find the set of versions that are allowed to have prereleases
- // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
- // That should allow `1.2.3-pr.2` to pass.
- // However, `1.2.4-alpha.notready` should NOT be allowed,
- // even though it's within the range set by the comparators.
- for (var i = 0; i < set.length; i++) {
- debug(set[i].semver);
- if (set[i].semver === ANY)
- continue;
- if (set[i].semver.prerelease.length > 0) {
- var allowed = set[i].semver;
- if (allowed.major === version.major &&
- allowed.minor === version.minor &&
- allowed.patch === version.patch)
- return true;
- }
- }
- // Version has a -pre, but it's not one of the ones we like.
- return false;
- }
- return true;
- }
- exports.satisfies = satisfies;
- function satisfies(version, range, loose) {
- try {
- range = new Range(range, loose);
- } catch (er) {
- return false;
- }
- return range.test(version);
- }
- exports.maxSatisfying = maxSatisfying;
- function maxSatisfying(versions, range, loose) {
- var max = null;
- var maxSV = null;
- try {
- var rangeObj = new Range(range, loose);
- } catch (er) {
- return null;
- }
- versions.forEach(function (v) {
- if (rangeObj.test(v)) { // satisfies(v, range, loose)
- if (!max || maxSV.compare(v) === -1) { // compare(max, v, true)
- max = v;
- maxSV = new SemVer(max, loose);
- }
- }
- });
- return max;
- }
- exports.minSatisfying = minSatisfying;
- function minSatisfying(versions, range, loose) {
- var min = null;
- var minSV = null;
- try {
- var rangeObj = new Range(range, loose);
- } catch (er) {
- return null;
- }
- versions.forEach(function (v) {
- if (rangeObj.test(v)) { // satisfies(v, range, loose)
- if (!min || minSV.compare(v) === 1) { // compare(min, v, true)
- min = v;
- minSV = new SemVer(min, loose);
- }
- }
- });
- return min;
- }
- exports.validRange = validRange;
- function validRange(range, loose) {
- try {
- // Return '*' instead of '' so that truthiness works.
- // This will throw if it's invalid anyway
- return new Range(range, loose).range || '*';
- } catch (er) {
- return null;
- }
- }
- // Determine if version is less than all the versions possible in the range
- exports.ltr = ltr;
- function ltr(version, range, loose) {
- return outside(version, range, '<', loose);
- }
- // Determine if version is greater than all the versions possible in the range.
- exports.gtr = gtr;
- function gtr(version, range, loose) {
- return outside(version, range, '>', loose);
- }
- exports.outside = outside;
- function outside(version, range, hilo, loose) {
- version = new SemVer(version, loose);
- range = new Range(range, loose);
- var gtfn, ltefn, ltfn, comp, ecomp;
- switch (hilo) {
- case '>':
- gtfn = gt;
- ltefn = lte;
- ltfn = lt;
- comp = '>';
- ecomp = '>=';
- break;
- case '<':
- gtfn = lt;
- ltefn = gte;
- ltfn = gt;
- comp = '<';
- ecomp = '<=';
- break;
- default:
- throw new TypeError('Must provide a hilo val of "<" or ">"');
- }
- // If it satisifes the range it is not outside
- if (satisfies(version, range, loose)) {
- return false;
- }
- // From now on, variable terms are as if we're in "gtr" mode.
- // but note that everything is flipped for the "ltr" function.
- for (var i = 0; i < range.set.length; ++i) {
- var comparators = range.set[i];
- var high = null;
- var low = null;
- comparators.forEach(function(comparator) {
- if (comparator.semver === ANY) {
- comparator = new Comparator('>=0.0.0');
- }
- high = high || comparator;
- low = low || comparator;
- if (gtfn(comparator.semver, high.semver, loose)) {
- high = comparator;
- } else if (ltfn(comparator.semver, low.semver, loose)) {
- low = comparator;
- }
- });
- // If the edge version comparator has a operator then our version
- // isn't outside it
- if (high.operator === comp || high.operator === ecomp) {
- return false;
- }
- // If the lowest version comparator has an operator and our version
- // is less than it then it isn't higher than the range
- if ((!low.operator || low.operator === comp) &&
- ltefn(version, low.semver)) {
- return false;
- } else if (low.operator === ecomp && ltfn(version, low.semver)) {
- return false;
- }
- }
- return true;
- }
- exports.prerelease = prerelease;
- function prerelease(version, loose) {
- var parsed = parse(version, loose);
- return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;
- }
- exports.intersects = intersects;
- function intersects(r1, r2, loose) {
- r1 = new Range(r1, loose);
- r2 = new Range(r2, loose);
- return r1.intersects(r2)
- }
- exports.coerce = coerce;
- function coerce(version) {
- if (version instanceof SemVer)
- return version;
- if (typeof version !== 'string')
- return null;
- var match = version.match(re[COERCE]);
- if (match == null)
- return null;
- return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0'));
- }
- });
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- var pseudomap = PseudoMap;
- function PseudoMap (set) {
- if (!(this instanceof PseudoMap)) // whyyyyyyy
- throw new TypeError("Constructor PseudoMap requires 'new'")
- this.clear();
- if (set) {
- if ((set instanceof PseudoMap) ||
- (typeof Map === 'function' && set instanceof Map))
- set.forEach(function (value, key) {
- this.set(key, value);
- }, this);
- else if (Array.isArray(set))
- set.forEach(function (kv) {
- this.set(kv[0], kv[1]);
- }, this);
- else
- throw new TypeError('invalid argument')
- }
- }
- PseudoMap.prototype.forEach = function (fn, thisp) {
- thisp = thisp || this;
- Object.keys(this._data).forEach(function (k) {
- if (k !== 'size')
- fn.call(thisp, this._data[k].value, this._data[k].key);
- }, this);
- };
- PseudoMap.prototype.has = function (k) {
- return !!find(this._data, k)
- };
- PseudoMap.prototype.get = function (k) {
- var res = find(this._data, k);
- return res && res.value
- };
- PseudoMap.prototype.set = function (k, v) {
- set(this._data, k, v);
- };
- PseudoMap.prototype.delete = function (k) {
- var res = find(this._data, k);
- if (res) {
- delete this._data[res._index];
- this._data.size--;
- }
- };
- PseudoMap.prototype.clear = function () {
- var data = Object.create(null);
- data.size = 0;
- Object.defineProperty(this, '_data', {
- value: data,
- enumerable: false,
- configurable: true,
- writable: false
- });
- };
- Object.defineProperty(PseudoMap.prototype, 'size', {
- get: function () {
- return this._data.size
- },
- set: function (n) {},
- enumerable: true,
- configurable: true
- });
- PseudoMap.prototype.values =
- PseudoMap.prototype.keys =
- PseudoMap.prototype.entries = function () {
- throw new Error('iterators are not implemented in this version')
- };
- // Either identical, or both NaN
- function same (a, b) {
- return a === b || a !== a && b !== b
- }
- function Entry$1 (k, v, i) {
- this.key = k;
- this.value = v;
- this._index = i;
- }
- function find (data, k) {
- for (var i = 0, s = '_' + k, key = s;
- hasOwnProperty.call(data, key);
- key = s + i++) {
- if (same(data[key].key, k))
- return data[key]
- }
- }
- function set (data, k, v) {
- for (var i = 0, s = '_' + k, key = s;
- hasOwnProperty.call(data, key);
- key = s + i++) {
- if (same(data[key].key, k)) {
- data[key].value = v;
- return
- }
- }
- data.size++;
- data[key] = new Entry$1(k, v, key);
- }
- var map = createCommonjsModule(function (module) {
- if (process.env.npm_package_name === 'pseudomap' &&
- process.env.npm_lifecycle_script === 'test')
- process.env.TEST_PSEUDOMAP = 'true';
- if (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {
- module.exports = Map;
- } else {
- module.exports = pseudomap;
- }
- });
- var yallist = Yallist;
- Yallist.Node = Node;
- Yallist.create = Yallist;
- function Yallist (list) {
- var self = this;
- if (!(self instanceof Yallist)) {
- self = new Yallist();
- }
- self.tail = null;
- self.head = null;
- self.length = 0;
- if (list && typeof list.forEach === 'function') {
- list.forEach(function (item) {
- self.push(item);
- });
- } else if (arguments.length > 0) {
- for (var i = 0, l = arguments.length; i < l; i++) {
- self.push(arguments[i]);
- }
- }
- return self
- }
- Yallist.prototype.removeNode = function (node) {
- if (node.list !== this) {
- throw new Error('removing node which does not belong to this list')
- }
- var next = node.next;
- var prev = node.prev;
- if (next) {
- next.prev = prev;
- }
- if (prev) {
- prev.next = next;
- }
- if (node === this.head) {
- this.head = next;
- }
- if (node === this.tail) {
- this.tail = prev;
- }
- node.list.length--;
- node.next = null;
- node.prev = null;
- node.list = null;
- };
- Yallist.prototype.unshiftNode = function (node) {
- if (node === this.head) {
- return
- }
- if (node.list) {
- node.list.removeNode(node);
- }
- var head = this.head;
- node.list = this;
- node.next = head;
- if (head) {
- head.prev = node;
- }
- this.head = node;
- if (!this.tail) {
- this.tail = node;
- }
- this.length++;
- };
- Yallist.prototype.pushNode = function (node) {
- if (node === this.tail) {
- return
- }
- if (node.list) {
- node.list.removeNode(node);
- }
- var tail = this.tail;
- node.list = this;
- node.prev = tail;
- if (tail) {
- tail.next = node;
- }
- this.tail = node;
- if (!this.head) {
- this.head = node;
- }
- this.length++;
- };
- Yallist.prototype.push = function () {
- for (var i = 0, l = arguments.length; i < l; i++) {
- push(this, arguments[i]);
- }
- return this.length
- };
- Yallist.prototype.unshift = function () {
- for (var i = 0, l = arguments.length; i < l; i++) {
- unshift(this, arguments[i]);
- }
- return this.length
- };
- Yallist.prototype.pop = function () {
- if (!this.tail) {
- return undefined
- }
- var res = this.tail.value;
- this.tail = this.tail.prev;
- if (this.tail) {
- this.tail.next = null;
- } else {
- this.head = null;
- }
- this.length--;
- return res
- };
- Yallist.prototype.shift = function () {
- if (!this.head) {
- return undefined
- }
- var res = this.head.value;
- this.head = this.head.next;
- if (this.head) {
- this.head.prev = null;
- } else {
- this.tail = null;
- }
- this.length--;
- return res
- };
- Yallist.prototype.forEach = function (fn, thisp) {
- thisp = thisp || this;
- for (var walker = this.head, i = 0; walker !== null; i++) {
- fn.call(thisp, walker.value, i, this);
- walker = walker.next;
- }
- };
- Yallist.prototype.forEachReverse = function (fn, thisp) {
- thisp = thisp || this;
- for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {
- fn.call(thisp, walker.value, i, this);
- walker = walker.prev;
- }
- };
- Yallist.prototype.get = function (n) {
- for (var i = 0, walker = this.head; walker !== null && i < n; i++) {
- // abort out of the list early if we hit a cycle
- walker = walker.next;
- }
- if (i === n && walker !== null) {
- return walker.value
- }
- };
- Yallist.prototype.getReverse = function (n) {
- for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {
- // abort out of the list early if we hit a cycle
- walker = walker.prev;
- }
- if (i === n && walker !== null) {
- return walker.value
- }
- };
- Yallist.prototype.map = function (fn, thisp) {
- thisp = thisp || this;
- var res = new Yallist();
- for (var walker = this.head; walker !== null;) {
- res.push(fn.call(thisp, walker.value, this));
- walker = walker.next;
- }
- return res
- };
- Yallist.prototype.mapReverse = function (fn, thisp) {
- thisp = thisp || this;
- var res = new Yallist();
- for (var walker = this.tail; walker !== null;) {
- res.push(fn.call(thisp, walker.value, this));
- walker = walker.prev;
- }
- return res
- };
- Yallist.prototype.reduce = function (fn, initial) {
- var acc;
- var walker = this.head;
- if (arguments.length > 1) {
- acc = initial;
- } else if (this.head) {
- walker = this.head.next;
- acc = this.head.value;
- } else {
- throw new TypeError('Reduce of empty list with no initial value')
- }
- for (var i = 0; walker !== null; i++) {
- acc = fn(acc, walker.value, i);
- walker = walker.next;
- }
- return acc
- };
- Yallist.prototype.reduceReverse = function (fn, initial) {
- var acc;
- var walker = this.tail;
- if (arguments.length > 1) {
- acc = initial;
- } else if (this.tail) {
- walker = this.tail.prev;
- acc = this.tail.value;
- } else {
- throw new TypeError('Reduce of empty list with no initial value')
- }
- for (var i = this.length - 1; walker !== null; i--) {
- acc = fn(acc, walker.value, i);
- walker = walker.prev;
- }
- return acc
- };
- Yallist.prototype.toArray = function () {
- var arr = new Array(this.length);
- for (var i = 0, walker = this.head; walker !== null; i++) {
- arr[i] = walker.value;
- walker = walker.next;
- }
- return arr
- };
- Yallist.prototype.toArrayReverse = function () {
- var arr = new Array(this.length);
- for (var i = 0, walker = this.tail; walker !== null; i++) {
- arr[i] = walker.value;
- walker = walker.prev;
- }
- return arr
- };
- Yallist.prototype.slice = function (from, to) {
- to = to || this.length;
- if (to < 0) {
- to += this.length;
- }
- from = from || 0;
- if (from < 0) {
- from += this.length;
- }
- var ret = new Yallist();
- if (to < from || to < 0) {
- return ret
- }
- if (from < 0) {
- from = 0;
- }
- if (to > this.length) {
- to = this.length;
- }
- for (var i = 0, walker = this.head; walker !== null && i < from; i++) {
- walker = walker.next;
- }
- for (; walker !== null && i < to; i++, walker = walker.next) {
- ret.push(walker.value);
- }
- return ret
- };
- Yallist.prototype.sliceReverse = function (from, to) {
- to = to || this.length;
- if (to < 0) {
- to += this.length;
- }
- from = from || 0;
- if (from < 0) {
- from += this.length;
- }
- var ret = new Yallist();
- if (to < from || to < 0) {
- return ret
- }
- if (from < 0) {
- from = 0;
- }
- if (to > this.length) {
- to = this.length;
- }
- for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {
- walker = walker.prev;
- }
- for (; walker !== null && i > from; i--, walker = walker.prev) {
- ret.push(walker.value);
- }
- return ret
- };
- Yallist.prototype.reverse = function () {
- var head = this.head;
- var tail = this.tail;
- for (var walker = head; walker !== null; walker = walker.prev) {
- var p = walker.prev;
- walker.prev = walker.next;
- walker.next = p;
- }
- this.head = tail;
- this.tail = head;
- return this
- };
- function push (self, item) {
- self.tail = new Node(item, self.tail, null, self);
- if (!self.head) {
- self.head = self.tail;
- }
- self.length++;
- }
- function unshift (self, item) {
- self.head = new Node(item, null, self.head, self);
- if (!self.tail) {
- self.tail = self.head;
- }
- self.length++;
- }
- function Node (value, prev, next, list) {
- if (!(this instanceof Node)) {
- return new Node(value, prev, next, list)
- }
- this.list = list;
- this.value = value;
- if (prev) {
- prev.next = this;
- this.prev = prev;
- } else {
- this.prev = null;
- }
- if (next) {
- next.prev = this;
- this.next = next;
- } else {
- this.next = null;
- }
- }
- var lruCache = LRUCache;
- // This will be a proper iterable 'Map' in engines that support it,
- // or a fakey-fake PseudoMap in older versions.
- // A linked list to keep track of recently-used-ness
- // use symbols if possible, otherwise just _props
- var hasSymbol = typeof Symbol === 'function';
- var makeSymbol;
- if (hasSymbol) {
- makeSymbol = function (key) {
- return Symbol.for(key)
- };
- } else {
- makeSymbol = function (key) {
- return '_' + key
- };
- }
- var MAX = makeSymbol('max');
- var LENGTH = makeSymbol('length');
- var LENGTH_CALCULATOR = makeSymbol('lengthCalculator');
- var ALLOW_STALE = makeSymbol('allowStale');
- var MAX_AGE = makeSymbol('maxAge');
- var DISPOSE = makeSymbol('dispose');
- var NO_DISPOSE_ON_SET = makeSymbol('noDisposeOnSet');
- var LRU_LIST = makeSymbol('lruList');
- var CACHE = makeSymbol('cache');
- function naiveLength () { return 1 }
- // lruList is a yallist where the head is the youngest
- // item, and the tail is the oldest. the list contains the Hit
- // objects as the entries.
- // Each Hit object has a reference to its Yallist.Node. This
- // never changes.
- //
- // cache is a Map (or PseudoMap) that matches the keys to
- // the Yallist.Node object.
- function LRUCache (options) {
- if (!(this instanceof LRUCache)) {
- return new LRUCache(options)
- }
- if (typeof options === 'number') {
- options = { max: options };
- }
- if (!options) {
- options = {};
- }
- var max = this[MAX] = options.max;
- // Kind of weird to have a default max of Infinity, but oh well.
- if (!max ||
- !(typeof max === 'number') ||
- max <= 0) {
- this[MAX] = Infinity;
- }
- var lc = options.length || naiveLength;
- if (typeof lc !== 'function') {
- lc = naiveLength;
- }
- this[LENGTH_CALCULATOR] = lc;
- this[ALLOW_STALE] = options.stale || false;
- this[MAX_AGE] = options.maxAge || 0;
- this[DISPOSE] = options.dispose;
- this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false;
- this.reset();
- }
- // resize the cache when the max changes.
- Object.defineProperty(LRUCache.prototype, 'max', {
- set: function (mL) {
- if (!mL || !(typeof mL === 'number') || mL <= 0) {
- mL = Infinity;
- }
- this[MAX] = mL;
- trim(this);
- },
- get: function () {
- return this[MAX]
- },
- enumerable: true
- });
- Object.defineProperty(LRUCache.prototype, 'allowStale', {
- set: function (allowStale) {
- this[ALLOW_STALE] = !!allowStale;
- },
- get: function () {
- return this[ALLOW_STALE]
- },
- enumerable: true
- });
- Object.defineProperty(LRUCache.prototype, 'maxAge', {
- set: function (mA) {
- if (!mA || !(typeof mA === 'number') || mA < 0) {
- mA = 0;
- }
- this[MAX_AGE] = mA;
- trim(this);
- },
- get: function () {
- return this[MAX_AGE]
- },
- enumerable: true
- });
- // resize the cache when the lengthCalculator changes.
- Object.defineProperty(LRUCache.prototype, 'lengthCalculator', {
- set: function (lC) {
- if (typeof lC !== 'function') {
- lC = naiveLength;
- }
- if (lC !== this[LENGTH_CALCULATOR]) {
- this[LENGTH_CALCULATOR] = lC;
- this[LENGTH] = 0;
- this[LRU_LIST].forEach(function (hit) {
- hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key);
- this[LENGTH] += hit.length;
- }, this);
- }
- trim(this);
- },
- get: function () { return this[LENGTH_CALCULATOR] },
- enumerable: true
- });
- Object.defineProperty(LRUCache.prototype, 'length', {
- get: function () { return this[LENGTH] },
- enumerable: true
- });
- Object.defineProperty(LRUCache.prototype, 'itemCount', {
- get: function () { return this[LRU_LIST].length },
- enumerable: true
- });
- LRUCache.prototype.rforEach = function (fn, thisp) {
- thisp = thisp || this;
- for (var walker = this[LRU_LIST].tail; walker !== null;) {
- var prev = walker.prev;
- forEachStep(this, fn, walker, thisp);
- walker = prev;
- }
- };
- function forEachStep (self, fn, node, thisp) {
- var hit = node.value;
- if (isStale(self, hit)) {
- del(self, node);
- if (!self[ALLOW_STALE]) {
- hit = undefined;
- }
- }
- if (hit) {
- fn.call(thisp, hit.value, hit.key, self);
- }
- }
- LRUCache.prototype.forEach = function (fn, thisp) {
- thisp = thisp || this;
- for (var walker = this[LRU_LIST].head; walker !== null;) {
- var next = walker.next;
- forEachStep(this, fn, walker, thisp);
- walker = next;
- }
- };
- LRUCache.prototype.keys = function () {
- return this[LRU_LIST].toArray().map(function (k) {
- return k.key
- }, this)
- };
- LRUCache.prototype.values = function () {
- return this[LRU_LIST].toArray().map(function (k) {
- return k.value
- }, this)
- };
- LRUCache.prototype.reset = function () {
- if (this[DISPOSE] &&
- this[LRU_LIST] &&
- this[LRU_LIST].length) {
- this[LRU_LIST].forEach(function (hit) {
- this[DISPOSE](hit.key, hit.value);
- }, this);
- }
- this[CACHE] = new map(); // hash of items by key
- this[LRU_LIST] = new yallist(); // list of items in order of use recency
- this[LENGTH] = 0; // length of items in the list
- };
- LRUCache.prototype.dump = function () {
- return this[LRU_LIST].map(function (hit) {
- if (!isStale(this, hit)) {
- return {
- k: hit.key,
- v: hit.value,
- e: hit.now + (hit.maxAge || 0)
- }
- }
- }, this).toArray().filter(function (h) {
- return h
- })
- };
- LRUCache.prototype.dumpLru = function () {
- return this[LRU_LIST]
- };
- LRUCache.prototype.inspect = function (n, opts) {
- var str = 'LRUCache {';
- var extras = false;
- var as = this[ALLOW_STALE];
- if (as) {
- str += '\n allowStale: true';
- extras = true;
- }
- var max = this[MAX];
- if (max && max !== Infinity) {
- if (extras) {
- str += ',';
- }
- str += '\n max: ' + util.inspect(max, opts);
- extras = true;
- }
- var maxAge = this[MAX_AGE];
- if (maxAge) {
- if (extras) {
- str += ',';
- }
- str += '\n maxAge: ' + util.inspect(maxAge, opts);
- extras = true;
- }
- var lc = this[LENGTH_CALCULATOR];
- if (lc && lc !== naiveLength) {
- if (extras) {
- str += ',';
- }
- str += '\n length: ' + util.inspect(this[LENGTH], opts);
- extras = true;
- }
- var didFirst = false;
- this[LRU_LIST].forEach(function (item) {
- if (didFirst) {
- str += ',\n ';
- } else {
- if (extras) {
- str += ',\n';
- }
- didFirst = true;
- str += '\n ';
- }
- var key = util.inspect(item.key).split('\n').join('\n ');
- var val = { value: item.value };
- if (item.maxAge !== maxAge) {
- val.maxAge = item.maxAge;
- }
- if (lc !== naiveLength) {
- val.length = item.length;
- }
- if (isStale(this, item)) {
- val.stale = true;
- }
- val = util.inspect(val, opts).split('\n').join('\n ');
- str += key + ' => ' + val;
- });
- if (didFirst || extras) {
- str += '\n';
- }
- str += '}';
- return str
- };
- LRUCache.prototype.set = function (key, value, maxAge) {
- maxAge = maxAge || this[MAX_AGE];
- var now = maxAge ? Date.now() : 0;
- var len = this[LENGTH_CALCULATOR](value, key);
- if (this[CACHE].has(key)) {
- if (len > this[MAX]) {
- del(this, this[CACHE].get(key));
- return false
- }
- var node = this[CACHE].get(key);
- var item = node.value;
- // dispose of the old one before overwriting
- // split out into 2 ifs for better coverage tracking
- if (this[DISPOSE]) {
- if (!this[NO_DISPOSE_ON_SET]) {
- this[DISPOSE](key, item.value);
- }
- }
- item.now = now;
- item.maxAge = maxAge;
- item.value = value;
- this[LENGTH] += len - item.length;
- item.length = len;
- this.get(key);
- trim(this);
- return true
- }
- var hit = new Entry(key, value, len, now, maxAge);
- // oversized objects fall out of cache automatically.
- if (hit.length > this[MAX]) {
- if (this[DISPOSE]) {
- this[DISPOSE](key, value);
- }
- return false
- }
- this[LENGTH] += hit.length;
- this[LRU_LIST].unshift(hit);
- this[CACHE].set(key, this[LRU_LIST].head);
- trim(this);
- return true
- };
- LRUCache.prototype.has = function (key) {
- if (!this[CACHE].has(key)) return false
- var hit = this[CACHE].get(key).value;
- if (isStale(this, hit)) {
- return false
- }
- return true
- };
- LRUCache.prototype.get = function (key) {
- return get(this, key, true)
- };
- LRUCache.prototype.peek = function (key) {
- return get(this, key, false)
- };
- LRUCache.prototype.pop = function () {
- var node = this[LRU_LIST].tail;
- if (!node) return null
- del(this, node);
- return node.value
- };
- LRUCache.prototype.del = function (key) {
- del(this, this[CACHE].get(key));
- };
- LRUCache.prototype.load = function (arr) {
- // reset the cache
- this.reset();
- var now = Date.now();
- // A previous serialized cache has the most recent items first
- for (var l = arr.length - 1; l >= 0; l--) {
- var hit = arr[l];
- var expiresAt = hit.e || 0;
- if (expiresAt === 0) {
- // the item was created without expiration in a non aged cache
- this.set(hit.k, hit.v);
- } else {
- var maxAge = expiresAt - now;
- // dont add already expired items
- if (maxAge > 0) {
- this.set(hit.k, hit.v, maxAge);
- }
- }
- }
- };
- LRUCache.prototype.prune = function () {
- var self = this;
- this[CACHE].forEach(function (value, key) {
- get(self, key, false);
- });
- };
- function get (self, key, doUse) {
- var node = self[CACHE].get(key);
- if (node) {
- var hit = node.value;
- if (isStale(self, hit)) {
- del(self, node);
- if (!self[ALLOW_STALE]) hit = undefined;
- } else {
- if (doUse) {
- self[LRU_LIST].unshiftNode(node);
- }
- }
- if (hit) hit = hit.value;
- }
- return hit
- }
- function isStale (self, hit) {
- if (!hit || (!hit.maxAge && !self[MAX_AGE])) {
- return false
- }
- var stale = false;
- var diff = Date.now() - hit.now;
- if (hit.maxAge) {
- stale = diff > hit.maxAge;
- } else {
- stale = self[MAX_AGE] && (diff > self[MAX_AGE]);
- }
- return stale
- }
- function trim (self) {
- if (self[LENGTH] > self[MAX]) {
- for (var walker = self[LRU_LIST].tail;
- self[LENGTH] > self[MAX] && walker !== null;) {
- // We know that we're about to delete this one, and also
- // what the next least recently used key will be, so just
- // go ahead and set it now.
- var prev = walker.prev;
- del(self, walker);
- walker = prev;
- }
- }
- }
- function del (self, node) {
- if (node) {
- var hit = node.value;
- if (self[DISPOSE]) {
- self[DISPOSE](hit.key, hit.value);
- }
- self[LENGTH] -= hit.length;
- self[CACHE].delete(hit.key);
- self[LRU_LIST].removeNode(node);
- }
- }
- // classy, since V8 prefers predictable objects.
- function Entry (key, value, length, now, maxAge) {
- this.key = key;
- this.value = value;
- this.length = length;
- this.now = now;
- this.maxAge = maxAge || 0;
- }
- var sigmund_1 = sigmund;
- function sigmund (subject, maxSessions) {
- maxSessions = maxSessions || 10;
- var notes = [];
- var analysis = '';
- var RE = RegExp;
- function psychoAnalyze (subject, session) {
- if (session > maxSessions) return;
- if (typeof subject === 'function' ||
- typeof subject === 'undefined') {
- return;
- }
- if (typeof subject !== 'object' || !subject ||
- (subject instanceof RE)) {
- analysis += subject;
- return;
- }
- if (notes.indexOf(subject) !== -1 || session === maxSessions) return;
- notes.push(subject);
- analysis += '{';
- Object.keys(subject).forEach(function (issue, _, __) {
- // pseudo-private values. skip those.
- if (issue.charAt(0) === '_') return;
- var to = typeof subject[issue];
- if (to === 'function' || to === 'undefined') return;
- analysis += issue;
- psychoAnalyze(subject[issue], session + 1);
- });
- }
- psychoAnalyze(subject, 0);
- return analysis;
- }
- // vim: set softtabstop=4 shiftwidth=4:
- var fnmatch = createCommonjsModule(function (module, exports) {
- // Based on minimatch.js by isaacs <https://npmjs.org/package/minimatch>
- var platform = typeof process === "object" ? process.platform : "win32";
- if (module) module.exports = minimatch;
- else exports.minimatch = minimatch;
- minimatch.Minimatch = Minimatch;
- var cache = minimatch.cache = new lruCache({max: 100})
- , GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {};
- var qmark = "[^/]"
- // * => any number of characters
- , star = qmark + "*?"
- // ** when dots are allowed. Anything goes, except .. and .
- // not (^ or / followed by one or two dots followed by $ or /),
- // followed by anything, any number of times.
- , twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?"
- // not a ^ or / followed by a dot,
- // followed by anything, any number of times.
- , twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?"
- // characters that need to be escaped in RegExp.
- , reSpecials = charSet("().*{}+?[]^$\\!");
- // "abc" -> { a:true, b:true, c:true }
- function charSet (s) {
- return s.split("").reduce(function (set, c) {
- set[c] = true;
- return set
- }, {})
- }
- // normalizes slashes.
- var slashSplit = /\/+/;
- minimatch.monkeyPatch = monkeyPatch;
- function monkeyPatch () {
- var desc = Object.getOwnPropertyDescriptor(String.prototype, "match");
- var orig = desc.value;
- desc.value = function (p) {
- if (p instanceof Minimatch) return p.match(this)
- return orig.call(this, p)
- };
- Object.defineProperty(String.prototype, desc);
- }
- minimatch.filter = filter;
- function filter (pattern, options) {
- options = options || {};
- return function (p, i, list) {
- return minimatch(p, pattern, options)
- }
- }
- function ext (a, b) {
- a = a || {};
- b = b || {};
- var t = {};
- Object.keys(b).forEach(function (k) {
- t[k] = b[k];
- });
- Object.keys(a).forEach(function (k) {
- t[k] = a[k];
- });
- return t
- }
- minimatch.defaults = function (def) {
- if (!def || !Object.keys(def).length) return minimatch
- var orig = minimatch;
- var m = function minimatch (p, pattern, options) {
- return orig.minimatch(p, pattern, ext(def, options))
- };
- m.Minimatch = function Minimatch (pattern, options) {
- return new orig.Minimatch(pattern, ext(def, options))
- };
- return m
- };
- Minimatch.defaults = function (def) {
- if (!def || !Object.keys(def).length) return Minimatch
- return minimatch.defaults(def).Minimatch
- };
- function minimatch (p, pattern, options) {
- if (typeof pattern !== "string") {
- throw new TypeError("glob pattern string required")
- }
- if (!options) options = {};
- // shortcut: comments match nothing.
- if (!options.nocomment && pattern.charAt(0) === "#") {
- return false
- }
- // "" only matches ""
- if (pattern.trim() === "") return p === ""
- return new Minimatch(pattern, options).match(p)
- }
- function Minimatch (pattern, options) {
- if (!(this instanceof Minimatch)) {
- return new Minimatch(pattern, options, cache)
- }
- if (typeof pattern !== "string") {
- throw new TypeError("glob pattern string required")
- }
- if (!options) options = {};
- // windows: need to use /, not \
- // On other platforms, \ is a valid (albeit bad) filename char.
- if (platform === "win32") {
- pattern = pattern.split("\\").join("/");
- }
- // lru storage.
- // these things aren't particularly big, but walking down the string
- // and turning it into a regexp can get pretty costly.
- var cacheKey = pattern + "\n" + sigmund_1(options);
- var cached = minimatch.cache.get(cacheKey);
- if (cached) return cached
- minimatch.cache.set(cacheKey, this);
- this.options = options;
- this.set = [];
- this.pattern = pattern;
- this.regexp = null;
- this.negate = false;
- this.comment = false;
- this.empty = false;
- // make the set of regexps etc.
- this.make();
- }
- Minimatch.prototype.make = make;
- function make () {
- // don't do it more than once.
- if (this._made) return
- var pattern = this.pattern;
- var options = this.options;
- // empty patterns and comments match nothing.
- if (!options.nocomment && pattern.charAt(0) === "#") {
- this.comment = true;
- return
- }
- if (!pattern) {
- this.empty = true;
- return
- }
- // step 1: figure out negation, etc.
- this.parseNegate();
- // step 2: expand braces
- var set = this.globSet = this.braceExpand();
- if (options.debug) console.error(this.pattern, set);
- // step 3: now we have a set, so turn each one into a series of path-portion
- // matching patterns.
- // These will be regexps, except in the case of "**", which is
- // set to the GLOBSTAR object for globstar behavior,
- // and will not contain any / characters
- set = this.globParts = set.map(function (s) {
- return s.split(slashSplit)
- });
- if (options.debug) console.error(this.pattern, set);
- // glob --> regexps
- set = set.map(function (s, si, set) {
- return s.map(this.parse, this)
- }, this);
- if (options.debug) console.error(this.pattern, set);
- // filter out everything that didn't compile properly.
- set = set.filter(function (s) {
- return -1 === s.indexOf(false)
- });
- if (options.debug) console.error(this.pattern, set);
- this.set = set;
- }
- Minimatch.prototype.parseNegate = parseNegate;
- function parseNegate () {
- var pattern = this.pattern
- , negate = false
- , options = this.options
- , negateOffset = 0;
- if (options.nonegate) return
- for ( var i = 0, l = pattern.length
- ; i < l && pattern.charAt(i) === "!"
- ; i ++) {
- negate = !negate;
- negateOffset ++;
- }
- if (negateOffset) this.pattern = pattern.substr(negateOffset);
- this.negate = negate;
- }
- // Brace expansion:
- // a{b,c}d -> abd acd
- // a{b,}c -> abc ac
- // a{0..3}d -> a0d a1d a2d a3d
- // a{b,c{d,e}f}g -> abg acdfg acefg
- // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
- //
- // Invalid sets are not expanded.
- // a{2..}b -> a{2..}b
- // a{b}c -> a{b}c
- minimatch.braceExpand = function (pattern, options) {
- return new Minimatch(pattern, options).braceExpand()
- };
- Minimatch.prototype.braceExpand = braceExpand;
- function braceExpand (pattern, options) {
- options = options || this.options;
- pattern = typeof pattern === "undefined"
- ? this.pattern : pattern;
- if (typeof pattern === "undefined") {
- throw new Error("undefined pattern")
- }
- if (options.nobrace ||
- !pattern.match(/\{.*\}/)) {
- // shortcut. no need to expand.
- return [pattern]
- }
- var escaping = false;
- // examples and comments refer to this crazy pattern:
- // a{b,c{d,e},{f,g}h}x{y,z}
- // expected:
- // abxy
- // abxz
- // acdxy
- // acdxz
- // acexy
- // acexz
- // afhxy
- // afhxz
- // aghxy
- // aghxz
- // everything before the first \{ is just a prefix.
- // So, we pluck that off, and work with the rest,
- // and then prepend it to everything we find.
- if (pattern.charAt(0) !== "{") {
- // console.error(pattern)
- var prefix = null;
- for (var i = 0, l = pattern.length; i < l; i ++) {
- var c = pattern.charAt(i);
- // console.error(i, c)
- if (c === "\\") {
- escaping = !escaping;
- } else if (c === "{" && !escaping) {
- prefix = pattern.substr(0, i);
- break
- }
- }
- // actually no sets, all { were escaped.
- if (prefix === null) {
- // console.error("no sets")
- return [pattern]
- }
- var tail = braceExpand(pattern.substr(i), options);
- return tail.map(function (t) {
- return prefix + t
- })
- }
- // now we have something like:
- // {b,c{d,e},{f,g}h}x{y,z}
- // walk through the set, expanding each part, until
- // the set ends. then, we'll expand the suffix.
- // If the set only has a single member, then'll put the {} back
- // first, handle numeric sets, since they're easier
- var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/);
- if (numset) {
- // console.error("numset", numset[1], numset[2])
- var suf = braceExpand(pattern.substr(numset[0].length), options)
- , start = +numset[1]
- , end = +numset[2]
- , inc = start > end ? -1 : 1
- , set = [];
- for (var i = start; i != (end + inc); i += inc) {
- // append all the suffixes
- for (var ii = 0, ll = suf.length; ii < ll; ii ++) {
- set.push(i + suf[ii]);
- }
- }
- return set
- }
- // ok, walk through the set
- // We hope, somewhat optimistically, that there
- // will be a } at the end.
- // If the closing brace isn't found, then the pattern is
- // interpreted as braceExpand("\\" + pattern) so that
- // the leading \{ will be interpreted literally.
- var i = 1 // skip the \{
- , depth = 1
- , set = []
- , member = ""
- , sawEnd = false
- , escaping = false;
- function addMember () {
- set.push(member);
- member = "";
- }
- // console.error("Entering for")
- FOR: for (i = 1, l = pattern.length; i < l; i ++) {
- var c = pattern.charAt(i);
- // console.error("", i, c)
- if (escaping) {
- escaping = false;
- member += "\\" + c;
- } else {
- switch (c) {
- case "\\":
- escaping = true;
- continue
- case "{":
- depth ++;
- member += "{";
- continue
- case "}":
- depth --;
- // if this closes the actual set, then we're done
- if (depth === 0) {
- addMember();
- // pluck off the close-brace
- i ++;
- break FOR
- } else {
- member += c;
- continue
- }
- case ",":
- if (depth === 1) {
- addMember();
- } else {
- member += c;
- }
- continue
- default:
- member += c;
- continue
- } // switch
- } // else
- } // for
- // now we've either finished the set, and the suffix is
- // pattern.substr(i), or we have *not* closed the set,
- // and need to escape the leading brace
- if (depth !== 0) {
- // console.error("didn't close", pattern)
- return braceExpand("\\" + pattern, options)
- }
- // x{y,z} -> ["xy", "xz"]
- // console.error("set", set)
- // console.error("suffix", pattern.substr(i))
- var suf = braceExpand(pattern.substr(i), options);
- // ["b", "c{d,e}","{f,g}h"] ->
- // [["b"], ["cd", "ce"], ["fh", "gh"]]
- var addBraces = set.length === 1;
- // console.error("set pre-expanded", set)
- set = set.map(function (p) {
- return braceExpand(p, options)
- });
- // console.error("set expanded", set)
- // [["b"], ["cd", "ce"], ["fh", "gh"]] ->
- // ["b", "cd", "ce", "fh", "gh"]
- set = set.reduce(function (l, r) {
- return l.concat(r)
- });
- if (addBraces) {
- set = set.map(function (s) {
- return "{" + s + "}"
- });
- }
- // now attach the suffixes.
- var ret = [];
- for (var i = 0, l = set.length; i < l; i ++) {
- for (var ii = 0, ll = suf.length; ii < ll; ii ++) {
- ret.push(set[i] + suf[ii]);
- }
- }
- return ret
- }
- // parse a component of the expanded set.
- // At this point, no pattern may contain "/" in it
- // so we're going to return a 2d array, where each entry is the full
- // pattern, split on '/', and then turned into a regular expression.
- // A regexp is made at the end which joins each array with an
- // escaped /, and another full one which joins each regexp with |.
- //
- // Following the lead of Bash 4.1, note that "**" only has special meaning
- // when it is the *only* thing in a path portion. Otherwise, any series
- // of * is equivalent to a single *. Globstar behavior is enabled by
- // default, and can be disabled by setting options.noglobstar.
- Minimatch.prototype.parse = parse;
- var SUBPARSE = {};
- function parse (pattern, isSub) {
- var options = this.options;
- // shortcuts
- if (!options.noglobstar && pattern === "**") return GLOBSTAR
- if (pattern === "") return ""
- var re = ""
- , hasMagic = !!options.nocase
- , escaping = false
- // ? => one single character
- , patternListStack = []
- , plType
- , stateChar
- , inClass = false
- , reClassStart = -1
- , classStart = -1
- // . and .. never match anything that doesn't start with .,
- // even when options.dot is set.
- , patternStart = pattern.charAt(0) === "." ? "" // anything
- // not (start or / followed by . or .. followed by / or end)
- : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
- : "(?!\\.)";
- function clearStateChar () {
- if (stateChar) {
- // we had some state-tracking character
- // that wasn't consumed by this pass.
- switch (stateChar) {
- case "*":
- re += star;
- hasMagic = true;
- break
- case "?":
- re += qmark;
- hasMagic = true;
- break
- default:
- re += "\\"+stateChar;
- break
- }
- stateChar = false;
- }
- }
- for ( var i = 0, len = pattern.length, c
- ; (i < len) && (c = pattern.charAt(i))
- ; i ++ ) {
- if (options.debug) {
- console.error("%s\t%s %s %j", pattern, i, re, c);
- }
- // skip over any that are escaped.
- if (escaping && reSpecials[c]) {
- re += "\\" + c;
- escaping = false;
- continue
- }
- SWITCH: switch (c) {
- case "/":
- // completely not allowed, even escaped.
- // Should already be path-split by now.
- return false
- case "\\":
- clearStateChar();
- escaping = true;
- continue
- // the various stateChar values
- // for the "extglob" stuff.
- case "?":
- case "*":
- case "+":
- case "@":
- case "!":
- if (options.debug) {
- console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c);
- }
- // all of those are literals inside a class, except that
- // the glob [!a] means [^a] in regexp
- if (inClass) {
- if (c === "!" && i === classStart + 1) c = "^";
- re += c;
- continue
- }
- // if we already have a stateChar, then it means
- // that there was something like ** or +? in there.
- // Handle the stateChar, then proceed with this one.
- clearStateChar();
- stateChar = c;
- // if extglob is disabled, then +(asdf|foo) isn't a thing.
- // just clear the statechar *now*, rather than even diving into
- // the patternList stuff.
- if (options.noext) clearStateChar();
- continue
- case "(":
- if (inClass) {
- re += "(";
- continue
- }
- if (!stateChar) {
- re += "\\(";
- continue
- }
- plType = stateChar;
- patternListStack.push({ type: plType
- , start: i - 1
- , reStart: re.length });
- // negation is (?:(?!js)[^/]*)
- re += stateChar === "!" ? "(?:(?!" : "(?:";
- stateChar = false;
- continue
- case ")":
- if (inClass || !patternListStack.length) {
- re += "\\)";
- continue
- }
- hasMagic = true;
- re += ")";
- plType = patternListStack.pop().type;
- // negation is (?:(?!js)[^/]*)
- // The others are (?:<pattern>)<type>
- switch (plType) {
- case "!":
- re += "[^/]*?)";
- break
- case "?":
- case "+":
- case "*": re += plType;
- case "@": break // the default anyway
- }
- continue
- case "|":
- if (inClass || !patternListStack.length || escaping) {
- re += "\\|";
- escaping = false;
- continue
- }
- re += "|";
- continue
- // these are mostly the same in regexp and glob
- case "[":
- // swallow any state-tracking char before the [
- clearStateChar();
- if (inClass) {
- re += "\\" + c;
- continue
- }
- inClass = true;
- classStart = i;
- reClassStart = re.length;
- re += c;
- continue
- case "]":
- // a right bracket shall lose its special
- // meaning and represent itself in
- // a bracket expression if it occurs
- // first in the list. -- POSIX.2 2.8.3.2
- if (i === classStart + 1 || !inClass) {
- re += "\\" + c;
- escaping = false;
- continue
- }
- // finish up the class.
- hasMagic = true;
- inClass = false;
- re += c;
- continue
- default:
- // swallow any state char that wasn't consumed
- clearStateChar();
- if (escaping) {
- // no need
- escaping = false;
- } else if (reSpecials[c]
- && !(c === "^" && inClass)) {
- re += "\\";
- }
- re += c;
- } // switch
- } // for
- // handle the case where we left a class open.
- // "[abc" is valid, equivalent to "\[abc"
- if (inClass) {
- // split where the last [ was, and escape it
- // this is a huge pita. We now have to re-walk
- // the contents of the would-be class to re-translate
- // any characters that were passed through as-is
- var cs = pattern.substr(classStart + 1)
- , sp = this.parse(cs, SUBPARSE);
- re = re.substr(0, reClassStart) + "\\[" + sp[0];
- hasMagic = hasMagic || sp[1];
- }
- // handle the case where we had a +( thing at the *end*
- // of the pattern.
- // each pattern list stack adds 3 chars, and we need to go through
- // and escape any | chars that were passed through as-is for the regexp.
- // Go through and escape them, taking care not to double-escape any
- // | chars that were already escaped.
- var pl;
- while (pl = patternListStack.pop()) {
- var tail = re.slice(pl.reStart + 3);
- // maybe some even number of \, then maybe 1 \, followed by a |
- tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) {
- if (!$2) {
- // the | isn't already escaped, so escape it.
- $2 = "\\";
- }
- // need to escape all those slashes *again*, without escaping the
- // one that we need for escaping the | character. As it works out,
- // escaping an even number of slashes can be done by simply repeating
- // it exactly after itself. That's why this trick works.
- //
- // I am sorry that you have to see this.
- return $1 + $1 + $2 + "|"
- });
- // console.error("tail=%j\n %s", tail, tail)
- var t = pl.type === "*" ? star
- : pl.type === "?" ? qmark
- : "\\" + pl.type;
- hasMagic = true;
- re = re.slice(0, pl.reStart)
- + t + "\\("
- + tail;
- }
- // handle trailing things that only matter at the very end.
- clearStateChar();
- if (escaping) {
- // trailing \\
- re += "\\\\";
- }
- // only need to apply the nodot start if the re starts with
- // something that could conceivably capture a dot
- var addPatternStart = false;
- switch (re.charAt(0)) {
- case ".":
- case "[":
- case "(": addPatternStart = true;
- }
- // if the re is not "" at this point, then we need to make sure
- // it doesn't match against an empty path part.
- // Otherwise a/* will match a/, which it should not.
- if (re !== "" && hasMagic) re = "(?=.)" + re;
- if (addPatternStart) re = patternStart + re;
- // parsing just a piece of a larger pattern.
- if (isSub === SUBPARSE) {
- return [ re, hasMagic ]
- }
- // skip the regexp for non-magical patterns
- // unescape anything in it, though, so that it'll be
- // an exact match against a file etc.
- if (!hasMagic) {
- return globUnescape(pattern)
- }
- var flags = options.nocase ? "i" : ""
- , regExp = new RegExp("^" + re + "$", flags);
- regExp._glob = pattern;
- regExp._src = re;
- return regExp
- }
- minimatch.makeRe = function (pattern, options) {
- return new Minimatch(pattern, options || {}).makeRe()
- };
- Minimatch.prototype.makeRe = makeRe;
- function makeRe () {
- if (this.regexp || this.regexp === false) return this.regexp
- // at this point, this.set is a 2d array of partial
- // pattern strings, or "**".
- //
- // It's better to use .match(). This function shouldn't
- // be used, really, but it's pretty convenient sometimes,
- // when you just want to work with a regex.
- var set = this.set;
- if (!set.length) return this.regexp = false
- var options = this.options;
- var twoStar = options.noglobstar ? star
- : options.dot ? twoStarDot
- : twoStarNoDot
- , flags = options.nocase ? "i" : "";
- var re = set.map(function (pattern) {
- return pattern.map(function (p) {
- return (p === GLOBSTAR) ? twoStar
- : (typeof p === "string") ? regExpEscape(p)
- : p._src
- }).join("\\\/")
- }).join("|");
- // must match entire pattern
- // ending in a * or ** will make it less strict.
- re = "^(?:" + re + ")$";
- // can match anything, as long as it's not this.
- if (this.negate) re = "^(?!" + re + ").*$";
- try {
- return this.regexp = new RegExp(re, flags)
- } catch (ex) {
- return this.regexp = false
- }
- }
- minimatch.match = function (list, pattern, options) {
- var mm = new Minimatch(pattern, options);
- list = list.filter(function (f) {
- return mm.match(f)
- });
- if (options.nonull && !list.length) {
- list.push(pattern);
- }
- return list
- };
- Minimatch.prototype.match = match;
- function match (f, partial) {
- // console.error("match", f, this.pattern)
- // short-circuit in the case of busted things.
- // comments, etc.
- if (this.comment) return false
- if (this.empty) return f === ""
- if (f === "/" && partial) return true
- var options = this.options;
- // windows: need to use /, not \
- // On other platforms, \ is a valid (albeit bad) filename char.
- if (platform === "win32") {
- f = f.split("\\").join("/");
- }
- // treat the test path as a set of pathparts.
- f = f.split(slashSplit);
- if (options.debug) {
- console.error(this.pattern, "split", f);
- }
- // just ONE of the pattern sets in this.set needs to match
- // in order for it to be valid. If negating, then just one
- // match means that we have failed.
- // Either way, return on the first hit.
- var set = this.set;
- // console.error(this.pattern, "set", set)
- for (var i = 0, l = set.length; i < l; i ++) {
- var pattern = set[i];
- var hit = this.matchOne(f, pattern, partial);
- if (hit) {
- if (options.flipNegate) return true
- return !this.negate
- }
- }
- // didn't get any hits. this is success if it's a negative
- // pattern, failure otherwise.
- if (options.flipNegate) return false
- return this.negate
- }
- // set partial to true to test if, for example,
- // "/a/b" matches the start of "/*/b/*/d"
- // Partial means, if you run out of file before you run
- // out of pattern, then that's fine, as long as all
- // the parts match.
- Minimatch.prototype.matchOne = function (file, pattern, partial) {
- var options = this.options;
- if (options.debug) {
- console.error("matchOne",
- { "this": this
- , file: file
- , pattern: pattern });
- }
- if (options.matchBase && pattern.length === 1) {
- file = path.basename(file.join("/")).split("/");
- }
- if (options.debug) {
- console.error("matchOne", file.length, pattern.length);
- }
- for ( var fi = 0
- , pi = 0
- , fl = file.length
- , pl = pattern.length
- ; (fi < fl) && (pi < pl)
- ; fi ++, pi ++ ) {
- if (options.debug) {
- console.error("matchOne loop");
- }
- var p = pattern[pi]
- , f = file[fi];
- if (options.debug) {
- console.error(pattern, p, f);
- }
- // should be impossible.
- // some invalid regexp stuff in the set.
- if (p === false) return false
- if (p === GLOBSTAR) {
- if (options.debug)
- console.error('GLOBSTAR', [pattern, p, f]);
- // "**"
- // a/**/b/**/c would match the following:
- // a/b/x/y/z/c
- // a/x/y/z/b/c
- // a/b/x/b/x/c
- // a/b/c
- // To do this, take the rest of the pattern after
- // the **, and see if it would match the file remainder.
- // If so, return success.
- // If not, the ** "swallows" a segment, and try again.
- // This is recursively awful.
- //
- // a/**/b/**/c matching a/b/x/y/z/c
- // - a matches a
- // - doublestar
- // - matchOne(b/x/y/z/c, b/**/c)
- // - b matches b
- // - doublestar
- // - matchOne(x/y/z/c, c) -> no
- // - matchOne(y/z/c, c) -> no
- // - matchOne(z/c, c) -> no
- // - matchOne(c, c) yes, hit
- var fr = fi
- , pr = pi + 1;
- if (pr === pl) {
- if (options.debug)
- console.error('** at the end');
- // a ** at the end will just swallow the rest.
- // We have found a match.
- // however, it will not swallow /.x, unless
- // options.dot is set.
- // . and .. are *never* matched by **, for explosively
- // exponential reasons.
- for ( ; fi < fl; fi ++) {
- if (file[fi] === "." || file[fi] === ".." ||
- (!options.dot && file[fi].charAt(0) === ".")) return false
- }
- return true
- }
- // ok, let's see if we can swallow whatever we can.
- WHILE: while (fr < fl) {
- var swallowee = file[fr];
- if (options.debug) {
- console.error('\nglobstar while',
- file, fr, pattern, pr, swallowee);
- }
- // XXX remove this slice. Just pass the start index.
- if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
- if (options.debug)
- console.error('globstar found match!', fr, fl, swallowee);
- // found a match.
- return true
- } else {
- // can't swallow "." or ".." ever.
- // can only swallow ".foo" when explicitly asked.
- if (swallowee === "." || swallowee === ".." ||
- (!options.dot && swallowee.charAt(0) === ".")) {
- if (options.debug)
- console.error("dot detected!", file, fr, pattern, pr);
- break WHILE
- }
- // ** swallows a segment, and continue.
- if (options.debug)
- console.error('globstar swallow a segment, and continue');
- fr ++;
- }
- }
- // no match was found.
- // However, in partial mode, we can't say this is necessarily over.
- // If there's more *pattern* left, then
- if (partial) {
- // ran out of file
- // console.error("\n>>> no match, partial?", file, fr, pattern, pr)
- if (fr === fl) return true
- }
- return false
- }
- // something other than **
- // non-magic patterns just have to match exactly
- // patterns with magic have been turned into regexps.
- var hit;
- if (typeof p === "string") {
- if (options.nocase) {
- hit = f.toLowerCase() === p.toLowerCase();
- } else {
- hit = f === p;
- }
- if (options.debug) {
- console.error("string match", p, f, hit);
- }
- } else {
- hit = f.match(p);
- if (options.debug) {
- console.error("pattern match", p, f, hit);
- }
- }
- if (!hit) return false
- }
- // Note: ending in / means that we'll get a final ""
- // at the end of the pattern. This can only match a
- // corresponding "" at the end of the file.
- // If the file ends in /, then it can only match a
- // a pattern that ends in /, unless the pattern just
- // doesn't have any more for it. But, a/b/ should *not*
- // match "a/b/*", even though "" matches against the
- // [^/]*? pattern, except in partial mode, where it might
- // simply not be reached yet.
- // However, a/b/ should still satisfy a/*
- // now either we fell off the end of the pattern, or we're done.
- if (fi === fl && pi === pl) {
- // ran out of pattern and filename at the same time.
- // an exact hit!
- return true
- } else if (fi === fl) {
- // ran out of file, but still had pattern left.
- // this is ok if we're doing the match as part of
- // a glob fs traversal.
- return partial
- } else if (pi === pl) {
- // ran out of pattern, still have file left.
- // this is only acceptable if we're on the very last
- // empty segment of a file with a trailing slash.
- // a/* should match a/b/
- var emptyFileEnd = (fi === fl - 1) && (file[fi] === "");
- return emptyFileEnd
- }
- // should be unreachable.
- throw new Error("wtf?")
- };
- // replace stuff like \* with *
- function globUnescape (s) {
- return s.replace(/\\(.)/g, "$1")
- }
- function regExpEscape (s) {
- return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
- }
- });
- var ini = createCommonjsModule(function (module, exports) {
- "use strict";
- // Based on iniparser by shockie <https://npmjs.org/package/iniparser>
- var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
- };
- var __generator = (commonjsGlobal && commonjsGlobal.__generator) || function (thisArg, body) {
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
- function verb(n) { return function (v) { return step([n, v]); }; }
- function step(op) {
- if (f) throw new TypeError("Generator is already executing.");
- while (_) try {
- if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
- if (y = 0, t) op = [0, t.value];
- switch (op[0]) {
- case 0: case 1: t = op; break;
- case 4: _.label++; return { value: op[1], done: false };
- case 5: _.label++; y = op[1]; op = [0]; continue;
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
- default:
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
- if (t[2]) _.ops.pop();
- _.trys.pop(); continue;
- }
- op = body.call(thisArg, _);
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
- }
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- /**
- * define the possible values:
- * section: [section]
- * param: key=value
- * comment: ;this is a comment
- */
- var regex = {
- section: /^\s*\[(([^#;]|\\#|\\;)+)\]\s*([#;].*)?$/,
- param: /^\s*([\w\.\-\_]+)\s*[=:]\s*(.*?)\s*([#;].*)?$/,
- comment: /^\s*[#;].*$/,
- };
- /**
- * Parses an .ini file
- * @param file The location of the .ini file
- */
- function parse(file) {
- return __awaiter(this, void 0, void 0, function () {
- return __generator(this, function (_a) {
- return [2 /*return*/, new Promise(function (resolve, reject) {
- fs.readFile(file, 'utf8', function (err, data) {
- if (err) {
- reject(err);
- return;
- }
- resolve(parseString(data));
- });
- })];
- });
- });
- }
- exports.parse = parse;
- function parseSync(file) {
- return parseString(fs.readFileSync(file, 'utf8'));
- }
- exports.parseSync = parseSync;
- function parseString(data) {
- var sectionBody = {};
- var sectionName = null;
- var value = [[sectionName, sectionBody]];
- var lines = data.split(/\r\n|\r|\n/);
- lines.forEach(function (line) {
- var match;
- if (regex.comment.test(line)) {
- return;
- }
- if (regex.param.test(line)) {
- match = line.match(regex.param);
- sectionBody[match[1]] =
- match[2];
- }
- else if (regex.section.test(line)) {
- match = line.match(regex.section);
- sectionName = match[1];
- sectionBody = {};
- value.push([sectionName, sectionBody]);
- }
- });
- return value;
- }
- exports.parseString = parseString;
- });
- unwrapExports(ini);
- var name$1 = "editorconfig";
- var version$2 = "0.15.0";
- var description$1 = "EditorConfig File Locator and Interpreter for Node.js";
- var keywords = ["editorconfig","core"];
- var main$1 = "index.js";
- var bin$1 = {"editorconfig":"bin/editorconfig"};
- var contributors = ["Hong Xu (topbug.net)","Jed Mao (https://github.com/jedmao/)","Trey Hunner (http://treyhunner.com)"];
- var directories = {"bin":"./bin","lib":"./lib"};
- var scripts$1 = {"clean":"rimraf dist","prebuild":"npm run clean","build":"tsc","pretest":"npm run lint && npm run build && npm run copy && cmake .","test":"ctest .","pretest:ci":"npm run pretest","test:ci":"ctest -VV --output-on-failure .","lint":"npm run eclint && npm run tslint","eclint":"eclint check --indent_size ignore \"src/**\"","tslint":"tslint --project tslint.json","copy":"cpy package.json .npmignore LICENSE README.md CHANGELOG.md dist && cpy src/bin/* dist/bin && cpy src/lib/fnmatch*.* dist/lib","prepub":"npm run lint && npm run build && npm run copy","pub":"npm publish ./dist"};
- var repository$1 = {"type":"git","url":"git://github.com/editorconfig/editorconfig-core-js.git"};
- var bugs$1 = "https://github.com/editorconfig/editorconfig-core-js/issues";
- var author$1 = "EditorConfig Team";
- var license$1 = "MIT";
- var dependencies$1 = {"@types/commander":"^2.11.0","@types/semver":"^5.4.0","commander":"^2.11.0","lru-cache":"^4.1.1","semver":"^5.4.1","sigmund":"^1.0.1"};
- var devDependencies$1 = {"@types/mocha":"^2.2.43","cpy-cli":"^1.0.1","eclint":"^2.4.3","mocha":"^4.0.1","rimraf":"^2.6.2","should":"^13.1.2","tslint":"^5.7.0","typescript":"^2.5.3"};
- var _package$2 = {
- name: name$1,
- version: version$2,
- description: description$1,
- keywords: keywords,
- main: main$1,
- bin: bin$1,
- contributors: contributors,
- directories: directories,
- scripts: scripts$1,
- repository: repository$1,
- bugs: bugs$1,
- author: author$1,
- license: license$1,
- dependencies: dependencies$1,
- devDependencies: devDependencies$1
- };
- var _package$3 = Object.freeze({
- name: name$1,
- version: version$2,
- description: description$1,
- keywords: keywords,
- main: main$1,
- bin: bin$1,
- contributors: contributors,
- directories: directories,
- scripts: scripts$1,
- repository: repository$1,
- bugs: bugs$1,
- author: author$1,
- license: license$1,
- dependencies: dependencies$1,
- devDependencies: devDependencies$1,
- default: _package$2
- });
- var pkg = ( _package$3 && _package$2 ) || _package$3;
- var editorconfig = createCommonjsModule(function (module, exports) {
- "use strict";
- var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) {
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
- };
- var __generator = (commonjsGlobal && commonjsGlobal.__generator) || function (thisArg, body) {
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
- function verb(n) { return function (v) { return step([n, v]); }; }
- function step(op) {
- if (f) throw new TypeError("Generator is already executing.");
- while (_) try {
- if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
- if (y = 0, t) op = [0, t.value];
- switch (op[0]) {
- case 0: case 1: t = op; break;
- case 4: _.label++; return { value: op[1], done: false };
- case 5: _.label++; y = op[1]; op = [0]; continue;
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
- default:
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
- if (t[2]) _.ops.pop();
- _.trys.pop(); continue;
- }
- op = body.call(thisArg, _);
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
- }
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.parseString = ini.parseString;
- // tslint:disable-next-line:no-var-requires
- var knownProps = {
- end_of_line: true,
- indent_style: true,
- indent_size: true,
- insert_final_newline: true,
- trim_trailing_whitespace: true,
- charset: true,
- };
- function fnmatch$$1(filepath, glob) {
- var matchOptions = { matchBase: true, dot: true, noext: true };
- glob = glob.replace(/\*\*/g, '{*,**/**/**}');
- return fnmatch(filepath, glob, matchOptions);
- }
- function getConfigFileNames(filepath, options) {
- var paths = [];
- do {
- filepath = path.dirname(filepath);
- paths.push(path.join(filepath, options.config));
- } while (filepath !== options.root);
- return paths;
- }
- function processMatches(matches, version) {
- // Set indent_size to 'tab' if indent_size is unspecified and
- // indent_style is set to 'tab'.
- if ('indent_style' in matches
- && matches.indent_style === 'tab'
- && !('indent_size' in matches)
- && semver$3.gte(version, '0.10.0')) {
- matches.indent_size = 'tab';
- }
- // Set tab_width to indent_size if indent_size is specified and
- // tab_width is unspecified
- if ('indent_size' in matches
- && !('tab_width' in matches)
- && matches.indent_size !== 'tab') {
- matches.tab_width = matches.indent_size;
- }
- // Set indent_size to tab_width if indent_size is 'tab'
- if ('indent_size' in matches
- && 'tab_width' in matches
- && matches.indent_size === 'tab') {
- matches.indent_size = matches.tab_width;
- }
- return matches;
- }
- function processOptions(options, filepath) {
- if (options === void 0) { options = {}; }
- return {
- config: options.config || '.editorconfig',
- version: options.version || pkg.version,
- root: path.resolve(options.root || path.parse(filepath).root),
- };
- }
- function buildFullGlob(pathPrefix, glob) {
- switch (glob.indexOf('/')) {
- case -1:
- glob = '**/' + glob;
- break;
- case 0:
- glob = glob.substring(1);
- break;
- default:
- break;
- }
- return path.join(pathPrefix, glob);
- }
- function extendProps(props, options) {
- if (props === void 0) { props = {}; }
- if (options === void 0) { options = {}; }
- for (var key in options) {
- if (options.hasOwnProperty(key)) {
- var value = options[key];
- var key2 = key.toLowerCase();
- var value2 = value;
- if (knownProps[key2]) {
- value2 = value.toLowerCase();
- }
- try {
- value2 = JSON.parse(value);
- }
- catch (e) { }
- if (typeof value === 'undefined' || value === null) {
- // null and undefined are values specific to JSON (no special meaning
- // in editorconfig) & should just be returned as regular strings.
- value2 = String(value);
- }
- props[key2] = value2;
- }
- }
- return props;
- }
- function parseFromConfigs(configs, filepath, options) {
- return processMatches(configs
- .reverse()
- .reduce(function (matches, file) {
- var pathPrefix = path.dirname(file.name);
- file.contents.forEach(function (section) {
- var glob = section[0];
- var options2 = section[1];
- if (!glob) {
- return;
- }
- var fullGlob = buildFullGlob(pathPrefix, glob);
- if (!fnmatch$$1(filepath, fullGlob)) {
- return;
- }
- matches = extendProps(matches, options2);
- });
- return matches;
- }, {}), options.version);
- }
- function getConfigsForFiles(files) {
- var configs = [];
- for (var i in files) {
- if (files.hasOwnProperty(i)) {
- var file = files[i];
- var contents = ini.parseString(file.contents);
- configs.push({
- name: file.name,
- contents: contents,
- });
- if ((contents[0][1].root || '').toLowerCase() === 'true') {
- break;
- }
- }
- }
- return configs;
- }
- function readConfigFiles(filepaths) {
- return __awaiter(this, void 0, void 0, function () {
- return __generator(this, function (_a) {
- return [2 /*return*/, Promise.all(filepaths.map(function (name) { return new Promise(function (resolve) {
- fs.readFile(name, 'utf8', function (err, data) {
- resolve({
- name: name,
- contents: err ? '' : data,
- });
- });
- }); }))];
- });
- });
- }
- function readConfigFilesSync(filepaths) {
- var files = [];
- var file;
- filepaths.forEach(function (filepath) {
- try {
- file = fs.readFileSync(filepath, 'utf8');
- }
- catch (e) {
- file = '';
- }
- files.push({
- name: filepath,
- contents: file,
- });
- });
- return files;
- }
- function opts(filepath, options) {
- if (options === void 0) { options = {}; }
- var resolvedFilePath = path.resolve(filepath);
- return [
- resolvedFilePath,
- processOptions(options, resolvedFilePath),
- ];
- }
- function parseFromFiles(filepath, files, options) {
- if (options === void 0) { options = {}; }
- return __awaiter(this, void 0, void 0, function () {
- var _a, resolvedFilePath, processedOptions;
- return __generator(this, function (_b) {
- _a = opts(filepath, options), resolvedFilePath = _a[0], processedOptions = _a[1];
- return [2 /*return*/, files.then(getConfigsForFiles)
- .then(function (configs) { return parseFromConfigs(configs, resolvedFilePath, processedOptions); })];
- });
- });
- }
- exports.parseFromFiles = parseFromFiles;
- function parseFromFilesSync(filepath, files, options) {
- if (options === void 0) { options = {}; }
- var _a = opts(filepath, options), resolvedFilePath = _a[0], processedOptions = _a[1];
- return parseFromConfigs(getConfigsForFiles(files), resolvedFilePath, processedOptions);
- }
- exports.parseFromFilesSync = parseFromFilesSync;
- function parse(_filepath, _options) {
- if (_options === void 0) { _options = {}; }
- return __awaiter(this, void 0, void 0, function () {
- var _a, resolvedFilePath, processedOptions, filepaths;
- return __generator(this, function (_b) {
- _a = opts(_filepath, _options), resolvedFilePath = _a[0], processedOptions = _a[1];
- filepaths = getConfigFileNames(resolvedFilePath, processedOptions);
- return [2 /*return*/, readConfigFiles(filepaths)
- .then(getConfigsForFiles)
- .then(function (configs) { return parseFromConfigs(configs, resolvedFilePath, processedOptions); })];
- });
- });
- }
- exports.parse = parse;
- function parseSync(_filepath, _options) {
- if (_options === void 0) { _options = {}; }
- var _a = opts(_filepath, _options), resolvedFilePath = _a[0], processedOptions = _a[1];
- var filepaths = getConfigFileNames(resolvedFilePath, processedOptions);
- var files = readConfigFilesSync(filepaths);
- return parseFromConfigs(getConfigsForFiles(files), resolvedFilePath, processedOptions);
- }
- exports.parseSync = parseSync;
- });
- unwrapExports(editorconfig);
- var editorconfigToPrettier = editorConfigToPrettier;
- function editorConfigToPrettier(editorConfig) {
- if (!editorConfig || Object.keys(editorConfig).length === 0) {
- return null;
- }
- const result = {};
- if (editorConfig.indent_style) {
- result.useTabs = editorConfig.indent_style === "tab";
- }
- if (editorConfig.indent_size === "tab") {
- result.useTabs = true;
- }
- if (result.useTabs && editorConfig.tab_width) {
- result.tabWidth = editorConfig.tab_width;
- } else if (
- editorConfig.indent_style === "space" &&
- editorConfig.indent_size &&
- editorConfig.indent_size !== "tab"
- ) {
- result.tabWidth = editorConfig.indent_size;
- } else if (editorConfig.tab_width !== undefined) {
- result.tabWidth = editorConfig.tab_width;
- }
- if (editorConfig.max_line_length && editorConfig.max_line_length !== "off") {
- result.printWidth = editorConfig.max_line_length;
- }
- if (editorConfig.quote_type === "single") {
- result.singleQuote = true;
- } else if (editorConfig.quote_type === "double") {
- result.singleQuote = false;
- }
- return result;
- }
- function markerExists (files, markers) {
- return markers.some(function(marker) {
- return files.some(function(file) {
- return file === marker;
- });
- });
- }
- function traverseFolder (directory, levels, markers) {
- var files = fs.readdirSync(directory);
- if (levels === 0) {
- return null;
- } else if (markerExists(files, markers)) {
- return directory;
- } else {
- return traverseFolder(path.resolve(directory, '..'), levels - 1, markers);
- }
- }
- var findProjectRoot = function findRoot(dir, opts) {
- if (!dir) throw new Error("Directory not defined");
- opts = opts || {};
- var levels = opts.maxDepth || findRoot.MAX_DEPTH;
- var markers = opts.markers || findRoot.MARKERS;
- return traverseFolder(dir, levels, markers);
- };
- var MAX_DEPTH = 9;
- var MARKERS = [ '.git', '.hg' ];
- findProjectRoot.MAX_DEPTH = MAX_DEPTH;
- findProjectRoot.MARKERS = MARKERS;
- var resolveConfigEditorconfig = createCommonjsModule(function (module) {
- "use strict";
- const maybeParse = (filePath, config, parse) => {
- const root = findProjectRoot(path.dirname(path.resolve(filePath)));
- return filePath && parse(filePath, { root });
- };
- const editorconfigAsyncNoCache = (filePath, config) => {
- return Promise.resolve(maybeParse(filePath, config, editorconfig.parse)).then(
- editorconfigToPrettier
- );
- };
- const editorconfigAsyncWithCache = mem(editorconfigAsyncNoCache);
- const editorconfigSyncNoCache = (filePath, config) => {
- return editorconfigToPrettier(
- maybeParse(filePath, config, editorconfig.parseSync)
- );
- };
- const editorconfigSyncWithCache = mem(editorconfigSyncNoCache);
- function getLoadFunction(opts) {
- if (!opts.editorconfig) {
- return () => null;
- }
- if (opts.sync) {
- return opts.cache ? editorconfigSyncWithCache : editorconfigSyncNoCache;
- }
- return opts.cache ? editorconfigAsyncWithCache : editorconfigAsyncNoCache;
- }
- function clearCache() {
- mem.clear(editorconfigSyncWithCache);
- mem.clear(editorconfigAsyncWithCache);
- }
- module.exports = {
- getLoadFunction,
- clearCache
- };
- });
- var thirdParty$1 = ( thirdParty && thirdParty__default ) || thirdParty;
- var resolveConfig_1 = createCommonjsModule(function (module) {
- "use strict";
- const getExplorerMemoized = mem(opts =>
- thirdParty$1.cosmiconfig("prettier", {
- sync: opts.sync,
- cache: opts.cache,
- rcExtensions: true,
- transform: result => {
- if (result && result.config) {
- delete result.config.$schema;
- }
- return result;
- }
- })
- );
- /** @param {{ cache: boolean, sync: boolean }} opts */
- function getLoadFunction(opts) {
- // Normalize opts before passing to a memoized function
- opts = Object.assign({ sync: false, cache: false }, opts);
- return getExplorerMemoized(opts).load;
- }
- function _resolveConfig(filePath, opts, sync) {
- opts = Object.assign({ useCache: true }, opts);
- const loadOpts = {
- cache: !!opts.useCache,
- sync: !!sync,
- editorconfig: !!opts.editorconfig
- };
- const load = getLoadFunction(loadOpts);
- const loadEditorConfig = resolveConfigEditorconfig.getLoadFunction(loadOpts);
- const arr = [load, loadEditorConfig].map(l => l(filePath, opts.config));
- const unwrapAndMerge = arr => {
- const result = arr[0];
- const editorConfigured = arr[1];
- const merged = Object.assign(
- {},
- editorConfigured,
- mergeOverrides(Object.assign({}, result), filePath)
- );
- if (!result && !editorConfigured) {
- return null;
- }
- return merged;
- };
- if (loadOpts.sync) {
- return unwrapAndMerge(arr);
- }
- return Promise.all(arr).then(unwrapAndMerge);
- }
- const resolveConfig = (filePath, opts) => _resolveConfig(filePath, opts, false);
- resolveConfig.sync = (filePath, opts) => _resolveConfig(filePath, opts, true);
- function clearCache() {
- mem.clear(getExplorerMemoized);
- resolveConfigEditorconfig.clearCache();
- }
- function resolveConfigFile(filePath) {
- const load = getLoadFunction({ sync: false });
- return load(filePath).then(result => {
- return result ? result.filepath : null;
- });
- }
- resolveConfigFile.sync = filePath => {
- const load = getLoadFunction({ sync: true });
- const result = load(filePath);
- return result ? result.filepath : null;
- };
- function mergeOverrides(configResult, filePath) {
- const options = Object.assign({}, configResult.config);
- if (filePath && options.overrides) {
- const relativeFilePath = path.relative(
- path.dirname(configResult.filepath),
- filePath
- );
- for (const override of options.overrides) {
- if (
- pathMatchesGlobs(
- relativeFilePath,
- override.files,
- override.excludeFiles
- )
- ) {
- Object.assign(options, override.options);
- }
- }
- }
- delete options.overrides;
- return options;
- }
- // Based on eslint: https://github.com/eslint/eslint/blob/master/lib/config/config-ops.js
- function pathMatchesGlobs(filePath, patterns, excludedPatterns) {
- const patternList = [].concat(patterns);
- const excludedPatternList = [].concat(excludedPatterns || []);
- const opts = { matchBase: true };
- return (
- patternList.some(pattern => minimatch_1(filePath, pattern, opts)) &&
- !excludedPatternList.some(excludedPattern =>
- minimatch_1(filePath, excludedPattern, opts)
- )
- );
- }
- module.exports = {
- resolveConfig,
- resolveConfigFile,
- clearCache
- };
- });
- const version = require$$0$11.version;
- const getSupportInfo = support.getSupportInfo;
- const normalizeOptions = options$12.normalize;
- const printDocToString = doc.printer.printDocToString;
- const printDocToDebug = doc.debug.printDocToDebug;
- function guessLineEnding(text) {
- const index = text.indexOf("\n");
- if (index >= 0 && text.charAt(index - 1) === "\r") {
- return "\r\n";
- }
- return "\n";
- }
- function attachComments(text, ast, opts) {
- const astComments = ast.comments;
- if (astComments) {
- delete ast.comments;
- comments.attach(astComments, ast, text, opts);
- }
- ast.tokens = [];
- opts.originalText = text.trimRight();
- return astComments;
- }
- function ensureAllCommentsPrinted(astComments) {
- if (!astComments) {
- return;
- }
- for (let i = 0; i < astComments.length; ++i) {
- if (astComments[i].value.trim() === "prettier-ignore") {
- // If there's a prettier-ignore, we're not printing that sub-tree so we
- // don't know if the comments was printed or not.
- return;
- }
- }
- astComments.forEach(comment => {
- if (!comment.printed) {
- throw new Error(
- 'Comment "' +
- comment.value.trim() +
- '" was not printed. Please report this error!'
- );
- }
- delete comment.printed;
- });
- }
- function formatWithCursor(text, opts, addAlignmentSize) {
- const selectedParser = parser$3.resolveParser(opts);
- const hasPragma = !selectedParser.hasPragma || selectedParser.hasPragma(text);
- if (opts.requirePragma && !hasPragma) {
- return { formatted: text };
- }
- const UTF8BOM = 0xfeff;
- const hasUnicodeBOM = text.charCodeAt(0) === UTF8BOM;
- if (hasUnicodeBOM) {
- text = text.substring(1);
- }
- if (
- opts.insertPragma &&
- opts.printer.insertPragma &&
- !hasPragma &&
- opts.rangeStart === 0 &&
- opts.rangeEnd === Infinity
- ) {
- text = opts.printer.insertPragma(text);
- }
- addAlignmentSize = addAlignmentSize || 0;
- const result = parser$3.parse(text, opts);
- const ast = result.ast;
- text = result.text;
- const formattedRangeOnly = formatRange(text, opts, ast);
- if (formattedRangeOnly) {
- return { formatted: formattedRangeOnly };
- }
- let cursorOffset;
- if (opts.cursorOffset >= 0) {
- const cursorNodeAndParents = findNodeAtOffset(ast, opts.cursorOffset, opts);
- const cursorNode = cursorNodeAndParents.node;
- if (cursorNode) {
- cursorOffset = opts.cursorOffset - opts.locStart(cursorNode);
- opts.cursorNode = cursorNode;
- }
- }
- const astComments = attachComments(text, ast, opts);
- const doc$$1 = astToDoc(ast, opts, addAlignmentSize);
- opts.newLine = guessLineEnding(text);
- const toStringResult = printDocToString(doc$$1, opts);
- let str = toStringResult.formatted;
- if (hasUnicodeBOM) {
- str = String.fromCharCode(UTF8BOM) + str;
- }
- const cursorOffsetResult = toStringResult.cursor;
- ensureAllCommentsPrinted(astComments);
- // Remove extra leading indentation as well as the added indentation after last newline
- if (addAlignmentSize > 0) {
- return { formatted: str.trim() + opts.newLine };
- }
- if (cursorOffset !== undefined) {
- return {
- formatted: str,
- cursorOffset: cursorOffsetResult + cursorOffset
- };
- }
- return { formatted: str };
- }
- function format(text, opts, addAlignmentSize) {
- return formatWithCursor(text, opts, addAlignmentSize).formatted;
- }
- function findSiblingAncestors(startNodeAndParents, endNodeAndParents, opts) {
- let resultStartNode = startNodeAndParents.node;
- let resultEndNode = endNodeAndParents.node;
- if (resultStartNode === resultEndNode) {
- return {
- startNode: resultStartNode,
- endNode: resultEndNode
- };
- }
- for (const endParent of endNodeAndParents.parentNodes) {
- if (
- endParent.type !== "Program" &&
- endParent.type !== "File" &&
- opts.locStart(endParent) >= opts.locStart(startNodeAndParents.node)
- ) {
- resultEndNode = endParent;
- } else {
- break;
- }
- }
- for (const startParent of startNodeAndParents.parentNodes) {
- if (
- startParent.type !== "Program" &&
- startParent.type !== "File" &&
- opts.locEnd(startParent) <= opts.locEnd(endNodeAndParents.node)
- ) {
- resultStartNode = startParent;
- } else {
- break;
- }
- }
- return {
- startNode: resultStartNode,
- endNode: resultEndNode
- };
- }
- function findNodeAtOffset(node, offset, options, predicate, parentNodes) {
- predicate = predicate || (() => true);
- parentNodes = parentNodes || [];
- const start = options.locStart(node, options.locStart);
- const end = options.locEnd(node, options.locEnd);
- if (start <= offset && offset <= end) {
- for (const childNode of comments.getSortedChildNodes(
- node,
- undefined /* text */,
- options
- )) {
- const childResult = findNodeAtOffset(
- childNode,
- offset,
- options,
- predicate,
- [node].concat(parentNodes)
- );
- if (childResult) {
- return childResult;
- }
- }
- if (predicate(node)) {
- return {
- node: node,
- parentNodes: parentNodes
- };
- }
- }
- }
- // See https://www.ecma-international.org/ecma-262/5.1/#sec-A.5
- function isSourceElement(opts, node) {
- if (node == null) {
- return false;
- }
- // JS and JS like to avoid repetitions
- const jsSourceElements = [
- "FunctionDeclaration",
- "BlockStatement",
- "BreakStatement",
- "ContinueStatement",
- "DebuggerStatement",
- "DoWhileStatement",
- "EmptyStatement",
- "ExpressionStatement",
- "ForInStatement",
- "ForStatement",
- "IfStatement",
- "LabeledStatement",
- "ReturnStatement",
- "SwitchStatement",
- "ThrowStatement",
- "TryStatement",
- "VariableDeclaration",
- "WhileStatement",
- "WithStatement",
- "ClassDeclaration", // ES 2015
- "ImportDeclaration", // Module
- "ExportDefaultDeclaration", // Module
- "ExportNamedDeclaration", // Module
- "ExportAllDeclaration", // Module
- "TypeAlias", // Flow
- "InterfaceDeclaration", // Flow, TypeScript
- "TypeAliasDeclaration", // TypeScript
- "ExportAssignment", // TypeScript
- "ExportDeclaration" // TypeScript
- ];
- const jsonSourceElements = [
- "ObjectExpression",
- "ArrayExpression",
- "StringLiteral",
- "NumericLiteral",
- "BooleanLiteral",
- "NullLiteral"
- ];
- const graphqlSourceElements = [
- "OperationDefinition",
- "FragmentDefinition",
- "VariableDefinition",
- "TypeExtensionDefinition",
- "ObjectTypeDefinition",
- "FieldDefinition",
- "DirectiveDefinition",
- "EnumTypeDefinition",
- "EnumValueDefinition",
- "InputValueDefinition",
- "InputObjectTypeDefinition",
- "SchemaDefinition",
- "OperationTypeDefinition",
- "InterfaceTypeDefinition",
- "UnionTypeDefinition",
- "ScalarTypeDefinition"
- ];
- switch (opts.parser) {
- case "flow":
- case "babylon":
- case "typescript":
- return jsSourceElements.indexOf(node.type) > -1;
- case "json":
- return jsonSourceElements.indexOf(node.type) > -1;
- case "graphql":
- return graphqlSourceElements.indexOf(node.kind) > -1;
- }
- return false;
- }
- function calculateRange(text, opts, ast) {
- // Contract the range so that it has non-whitespace characters at its endpoints.
- // This ensures we can format a range that doesn't end on a node.
- const rangeStringOrig = text.slice(opts.rangeStart, opts.rangeEnd);
- const startNonWhitespace = Math.max(
- opts.rangeStart + rangeStringOrig.search(/\S/),
- opts.rangeStart
- );
- let endNonWhitespace;
- for (
- endNonWhitespace = opts.rangeEnd;
- endNonWhitespace > opts.rangeStart;
- --endNonWhitespace
- ) {
- if (text[endNonWhitespace - 1].match(/\S/)) {
- break;
- }
- }
- const startNodeAndParents = findNodeAtOffset(
- ast,
- startNonWhitespace,
- opts,
- node => isSourceElement(opts, node)
- );
- const endNodeAndParents = findNodeAtOffset(
- ast,
- endNonWhitespace,
- opts,
- node => isSourceElement(opts, node)
- );
- if (!startNodeAndParents || !endNodeAndParents) {
- return {
- rangeStart: 0,
- rangeEnd: 0
- };
- }
- const siblingAncestors = findSiblingAncestors(
- startNodeAndParents,
- endNodeAndParents,
- opts
- );
- const startNode = siblingAncestors.startNode;
- const endNode = siblingAncestors.endNode;
- const rangeStart = Math.min(
- opts.locStart(startNode, opts.locStart),
- opts.locStart(endNode, opts.locStart)
- );
- const rangeEnd = Math.max(
- opts.locEnd(startNode, opts.locEnd),
- opts.locEnd(endNode, opts.locEnd)
- );
- return {
- rangeStart: rangeStart,
- rangeEnd: rangeEnd
- };
- }
- function formatRange(text, opts, ast) {
- if (opts.rangeStart <= 0 && text.length <= opts.rangeEnd) {
- return;
- }
- const range = calculateRange(text, opts, ast);
- const rangeStart = range.rangeStart;
- const rangeEnd = range.rangeEnd;
- const rangeString = text.slice(rangeStart, rangeEnd);
- // Try to extend the range backwards to the beginning of the line.
- // This is so we can detect indentation correctly and restore it.
- // Use `Math.min` since `lastIndexOf` returns 0 when `rangeStart` is 0
- const rangeStart2 = Math.min(
- rangeStart,
- text.lastIndexOf("\n", rangeStart) + 1
- );
- const indentString = text.slice(rangeStart2, rangeStart);
- const alignmentSize = util$1.getAlignmentSize(
- indentString,
- opts.tabWidth
- );
- const rangeFormatted = format(
- rangeString,
- Object.assign({}, opts, {
- rangeStart: 0,
- rangeEnd: Infinity,
- printWidth: opts.printWidth - alignmentSize
- }),
- alignmentSize
- );
- // Since the range contracts to avoid trailing whitespace,
- // we need to remove the newline that was inserted by the `format` call.
- const rangeTrimmed = rangeFormatted.trimRight();
- return text.slice(0, rangeStart) + rangeTrimmed + text.slice(rangeEnd);
- }
- var prettier = {
- formatWithCursor: function(text, opts) {
- return formatWithCursor(text, normalizeOptions(opts));
- },
- format: function(text, opts) {
- return format(text, normalizeOptions(opts));
- },
- check: function(text, opts) {
- try {
- const formatted = format(text, normalizeOptions(opts));
- return formatted === text;
- } catch (e) {
- return false;
- }
- },
- doc,
- resolveConfig: resolveConfig_1.resolveConfig,
- clearConfigCache: resolveConfig_1.clearCache,
- getSupportInfo,
- version,
- util: utilShared,
- /* istanbul ignore next */
- __debug: {
- parse: function(text, opts) {
- opts = normalizeOptions(opts);
- return parser$3.parse(text, opts);
- },
- formatAST: function(ast, opts) {
- opts = normalizeOptions(opts);
- const doc$$1 = astToDoc(ast, opts);
- const str = printDocToString(doc$$1, opts);
- return str;
- },
- // Doesn't handle shebang for now
- formatDoc: function(doc$$1, opts) {
- opts = normalizeOptions(opts);
- const debug = printDocToDebug(doc$$1);
- const str = format(debug, opts);
- return str;
- },
- printToDoc: function(text, opts) {
- opts = normalizeOptions(opts);
- const result = parser$3.parse(text, opts);
- const ast = result.ast;
- text = result.text;
- attachComments(text, ast, opts);
- const doc$$1 = astToDoc(ast, opts);
- return doc$$1;
- },
- printDocToString: function(doc$$1, opts) {
- opts = normalizeOptions(opts);
- const str = printDocToString(doc$$1, opts);
- return str;
- }
- }
- };
- module.exports = prettier;
|